diff --git a/.clang-format b/.clang-format index b4abfa0..d65f1ce 100644 --- a/.clang-format +++ b/.clang-format @@ -1,7 +1,6 @@ --- BasedOnStyle: Google IndentWidth: 4 ---- Language: Cpp ColumnLimit: 100 PointerAlignment: Right @@ -12,7 +11,6 @@ SortIncludes: false SpaceAfterCStyleCast: true AllowShortCaseLabelsOnASingleLine: false AllowAllArgumentsOnNextLine: false -AllowAllParametersOfDeclarationOnNextLine: false AllowShortBlocksOnASingleLine: Never AllowShortFunctionsOnASingleLine: None BinPackArguments: false diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index a141a2d..2bbff60 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -19,8 +19,8 @@ Describe your issue in as much detail as possible here. ## Steps to reproduce -* Tell us how to reproduce this issue
-* Where the issue is, if you know
+* Tell us how to reproduce this issue +* Where the issue is, if you know * Which commands triggered the issue, if any ## Expected behaviour @@ -37,4 +37,5 @@ Please paste any logs here that demonstrate the issue, if they exist ## Proposed solution -If you have an idea of how to fix this issue, please write it down here, so we can begin discussing it \ No newline at end of file +If you have an idea of how to fix this issue, please write it down here, +so we can begin discussing it diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 031ba33..af1481d 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,6 +1,6 @@ --- name: Feature report -about: Suggest an idea for this project +about: Suggest an idea for this project title: 'Add [Subject of the issue]' labels: 'enhancement' assignees: '' diff --git a/.github/ISSUE_TEMPLATE/network_request.md b/.github/ISSUE_TEMPLATE/network_request.md index 369f21e..ee5115a 100644 --- a/.github/ISSUE_TEMPLATE/network_request.md +++ b/.github/ISSUE_TEMPLATE/network_request.md @@ -1,6 +1,6 @@ --- name: Network request -about: Request of new chain or network +about: Request of new chain or network title: 'Add {NameChain} network ({SYMBOL})' labels: 'enhancement, chain/network' assignees: '' @@ -8,12 +8,13 @@ assignees: '' --- ## Description -- [ ] Symbol: -- [ ] ChainId: -- [ ] Website: -- [ ] Block-Explorer: -- [ ] [slip-0044](https://github.com/satoshilabs/slips/blob/master/slip-0044.md) type: + +- [ ] Symbol: +- [ ] ChainId: +- [ ] Website: +- [ ] Block-Explorer: +- [ ] [slip-0044](https://github.com/satoshilabs/slips/blob/master/slip-0044.md) type: ## Additional comments -Please post additional comments in this section if you have them, otherwise delete it. \ No newline at end of file +Please post additional comments in this section if you have them, otherwise delete it. diff --git a/.github/actions/commit-changes/action.yml b/.github/actions/commit-changes/action.yml deleted file mode 100644 index f572b32..0000000 --- a/.github/actions/commit-changes/action.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: 'Commit and push if the version file has changed' - -inputs: - name: - description: 'The name of the commiter' - required: true - default: 'github-actions[bot]' - email: - description: 'The email of the commiter' - required: true - default: 'github-actions[bot]@users.noreply.github.com' - message: - description: 'The commit message' - required: true - default: 'New release version(s)' - files: - description: 'The file(s) to add in the commit' - required: true - default: '*' - directory: - description: 'The directory in which the action will be performed' - required: true - default: '.' - src_branch: - description: 'Checkout (or create) a specific branch before commit/push. Defaults to current branch' - required: false - default: '' - dst_branch: - description: 'Push the created commit on a specific branch. Defaults to current branch' - required: false - default: '' - secret: - description: 'A token allowing to push the commit on the repository' - required: true - default: '.' - repository: - description: 'The repository where to push' - required: true - default: '' - -runs: - using: 'composite' - steps: - - name: Commit the changes - id: commit - run: | - git config --global user.name ${{ inputs.name }} - ORIGIN="$(pwd)" - cd ${{ inputs.directory }} - - CURRENT_BRANCH=${GITHUB_REF#refs/heads/}; - # calculating source branch - if [ -n "${{ inputs.src_branch }}" ]; \ - then \ - git switch ${{ inputs.src_branch }} 2>/dev/null || git switch -c ${{ inputs.src_branch }}; \ - SRC_BRANCH=${{ inputs.src_branch }}; \ - else \ - SRC_BRANCH=`git branch --show-current`; \ - if [ -z "$SRC_BRANCH" ]; \ - then \ - SRC_BRANCH=$CURRENT_BRANCH; \ - fi \ - fi - - # calculating destination branch - if [ -n "${{ inputs.dst_branch }}" ]; \ - then \ - DST_BRANCH=${{ inputs.dst_branch }}; \ - else \ - DST_BRANCH=`git branch --show-current`; \ - if [ -z "$DST_BRANCH" ]; \ - then \ - DST_BRANCH=$CURRENT_BRANCH; \ - fi \ - fi - - echo "-----------------------------------------------------------" - echo "Initial repo status" - git status - # checking changes, commit if needed - CHANGES="$(git status --porcelain ${{ inputs.files }})" - if [ -n "${CHANGES}" ]; \ - then \ - echo -e "Changes:\n${CHANGES}"; \ - git add ${{ inputs.files }}; \ - echo "-----------------------------------------------------------"; \ - echo "Repo status before commit"; \ - git status; \ - git commit -am "${{ inputs.message }}"; \ - fi - - # compute if a push is needed - if [ -n "${CHANGES}" -o "$SRC_BRANCH" != "$DST_BRANCH" ]; \ - then \ - PUSH="YES"; \ - else \ - PUSH="NO"; \ - fi - - git log -n 2 - cd "${ORIGIN}" - - echo " -- Env SRC_BRANCH: $SRC_BRANCH"; - echo " -- Env DST_BRANCH: $DST_BRANCH"; - echo " -- Env PUSH: $PUSH" - # exporting these variables for next steps - echo "##[set-output name=src_branch;]$(echo $SRC_BRANCH)"; - echo "##[set-output name=dst_branch;]$(echo $DST_BRANCH)"; - echo "##[set-output name=push;]$(echo $PUSH)"; - shell: bash - - - name: Push commit - if: steps.commit.outputs.push == 'YES' - uses: ad-m/github-push-action@master - with: - github_token: ${{ inputs.secret }} - branch: ${{ steps.commit.outputs.dst_branch }} - directory: ${{ inputs.directory }} - repository: ${{ inputs.repository }} diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 4024641..b17d695 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,6 +1,6 @@ ## Description -Please provide a detailed description of what was done in this PR. +Please provide a detailed description of what was done in this PR. (And mentioned if linked to an issue [docs](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)) ## Changes include @@ -18,4 +18,4 @@ Please complete this section if any breaking changes have been made, otherwise d ## Additional comments -Please post additional comments in this section if you have them, otherwise delete it. \ No newline at end of file +Please post additional comments in this section if you have them, otherwise delete it. diff --git a/.github/workflows/auto-author-assign.yml b/.github/workflows/auto-author-assign.yml deleted file mode 100644 index 82adf17..0000000 --- a/.github/workflows/auto-author-assign.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -name: 'Auto Author Assign' - -on: - pull_request_target: - types: [opened, reopened] - -permissions: - pull-requests: write - -jobs: - assign-author: - runs-on: ubuntu-latest - steps: - - uses: toshimaru/auto-author-assign@v1.6.1 diff --git a/.github/workflows/build_and_functional_tests.yml b/.github/workflows/build_and_functional_tests.yml new file mode 100644 index 0000000..974ee5f --- /dev/null +++ b/.github/workflows/build_and_functional_tests.yml @@ -0,0 +1,52 @@ +name: Build and run functional tests using ragger through reusable workflow + +# This workflow will build the app and then run functional tests using the Ragger framework upon Speculos emulation. +# It calls a reusable workflow developed by Ledger's internal developer team to build the application and upload the +# resulting binaries. +# It then calls another reusable workflow to run the Ragger tests on the compiled application binary. +# +# While this workflow is optional, having functional testing on your application is mandatory and this workflow and +# tooling environment is meant to be easy to use and adapt after forking your application + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + build_application: + name: Build application using the reusable workflow + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_build.yml@v1 + with: + upload_app_binaries_artifact: "ragger_elfs" + flags: "CAL_TEST_KEY=1 DOMAIN_NAME_TEST_KEY=1 SET_PLUGIN_TEST_KEY=1 NFT_TEST_KEY=1" + + ragger_tests: + name: Run ragger tests using the reusable workflow + needs: build_application + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_ragger_tests.yml@v1 + with: + download_app_binaries_artifact: "ragger_elfs" + + build_clone_app: + name: Build Clone app using the reusable workflow + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_build.yml@v1 + with: + flags: "CHAIN=thundercore" + upload_app_binaries_artifact: "clone_elfs" + + ragger_clone_tests: + name: Run ragger Clone tests using the reusable workflow + needs: + - build_application + - build_clone_app + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_ragger_tests.yml@v1 + with: + download_app_binaries_artifact: "ragger_elfs" + additional_app_binaries_artifact: "clone_elfs" + additional_app_binaries_artifact_dir: ./tests/ragger/.test_dependencies/clone/build/ + test_options: "--with_lib_mode" diff --git a/.github/workflows/check_sdk.yml b/.github/workflows/check_sdk.yml new file mode 100644 index 0000000..8a26b45 --- /dev/null +++ b/.github/workflows/check_sdk.yml @@ -0,0 +1,16 @@ +--- +name: Check SDK submodule version + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + job_check_SDK: + name: Check Ethereum plugin SDK submodule is up-to-date + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_check_ethereum_sdk.yml@v1 diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml deleted file mode 100644 index b785a7e..0000000 --- a/.github/workflows/ci-workflow.yml +++ /dev/null @@ -1,201 +0,0 @@ ---- -name: Tests - -on: - workflow_dispatch: - push: - branches: - - master - - develop - pull_request: - -jobs: - - # ===================================================== - # ZEMU TESTS - # ===================================================== - - building_for_e2e_zemu_tests: - name: Building binaries for E2E Zemu tests - runs-on: ubuntu-latest - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite:latest - - steps: - - uses: actions/checkout@v3 - - - name: Build testing binaries - run: | - git config --global --add safe.directory "$GITHUB_WORKSPACE" - cd tests/zemu/ && ./build_local_test_elfs.sh - - - name: Upload app binaries - uses: actions/upload-artifact@v3 - with: - name: e2e_zemu_elfs - path: ./tests/zemu/elfs/ - - jobs-e2e-zemu-tests: - name: E2E Zemu tests - needs: [building_for_e2e_zemu_tests] - runs-on: ubuntu-latest - - steps: - - name: Test - run: | - id - echo $HOME - echo $DISPLAY - - - name: Checkout - uses: actions/checkout@v3 - - - run: sudo apt-get update -y && sudo apt-get install -y libusb-1.0.0 libudev-dev - - - name: Install NodeJS - uses: actions/setup-node@v3 - with: - node-version: "16" - - - name: Install yarn - run: npm install -g yarn - - - name: Build/Install build js deps - run: cd tests/zemu/ && yarn install - - - name: Create tmp folder for artifacts - run: mkdir tests/zemu/elfs - - - name: Download app binaries - uses: actions/download-artifact@v3 - with: - path: tmp/ - - - name: Gather elfs - run: cp `find tmp/e2e_zemu_elfs/ -name "*.elf"` tests/zemu/elfs/ - - - name: Run zemu tests - run: cd tests/zemu/ && yarn test - - # ===================================================== - # SPECULOS TESTS - # ===================================================== - - - building_for_e2e_speculos_tests: - name: Building binaries for E2E Speculos tests - runs-on: ubuntu-latest - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite:latest - - steps: - - uses: actions/checkout@v3 - - - name: Build testing binaries - run: | - mkdir tests/speculos/elfs - make clean && make -j DEBUG=1 NFT_STAGING_KEY=1 BOLOS_SDK=$NANOS_SDK && mv bin/app.elf tests/speculos/elfs/nanos.elf - make clean && make -j DEBUG=1 NFT_STAGING_KEY=1 BOLOS_SDK=$NANOX_SDK && mv bin/app.elf tests/speculos/elfs/nanox.elf - make clean && make -j DEBUG=1 NFT_STAGING_KEY=1 BOLOS_SDK=$NANOSP_SDK && mv bin/app.elf tests/speculos/elfs/nanosp.elf - - - name: Upload app binaries - uses: actions/upload-artifact@v3 - with: - name: e2e_speculos_elfs - path: ./tests/speculos/elfs - - - jobs-e2e-speculos-tests: - name: Speculos tests - strategy: - fail-fast: false - matrix: - model: ["nanosp", "nanos", "nanox"] - - needs: [building_for_e2e_speculos_tests] - runs-on: ubuntu-latest - - steps: - - name: Clone - uses: actions/checkout@v3 - - - name: Create tmp folder for artifacts - run: mkdir tests/speculos/elfs - - - name: Download app binaries - uses: actions/download-artifact@v3 - with: - path: tmp/ - - - name: Gather elfs - run: cp `find tmp/e2e_speculos_elfs/ -name "*.elf"` tests/speculos/elfs/ - - - name: Install dependencies - run: | - cd tests/speculos - sudo apt-get update && sudo apt-get install -y qemu-user-static - pip install -r requirements.txt - - - name: Run speculos tests - run: | - cd tests/speculos - pytest --model ${{ matrix.model }} --path ./elfs/${{ matrix.model }}.elf --display headless - - - # ===================================================== - # RAGGER TESTS - # ===================================================== - - build_ragger_elfs: - name: Build app for Ragger tests - uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_build.yml@v1 - with: - upload_app_binaries_artifact: "ragger_elfs" - flags: "DEBUG=1 CAL_TEST_KEY=1 DOMAIN_NAME_TEST_KEY=1 SET_PLUGIN_TEST_KEY=1 NFT_TEST_KEY=1" - - jobs-ragger-tests: - name: Run Ragger tests - needs: build_ragger_elfs - uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_ragger_tests.yml@v1 - with: - download_app_binaries_artifact: "ragger_elfs" - - # ===================================================== - # STATIC ANALYSIS - # ===================================================== - - # Static analysis on the main ETH chain is covered by the guidelines enforcer - scan-build: - name: Clang Static Analyzer on altcoin - runs-on: ubuntu-latest - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest - strategy: - fail-fast: false - matrix: - device: ["nanos", "nanos2", "nanox", "stax"] - - steps: - - name: Clone - uses: actions/checkout@v3 - with: - submodules: recursive - - - name: Build with Clang Static Analyzer - run: | - eval "BOLOS_SDK=\$$(echo ${{ matrix.device }} | tr [:lower:] [:upper:])_SDK" && \ - echo "BOLOS_SDK value will be: ${BOLOS_SDK}" && \ - make -j ENABLE_SDK_WERROR=1 BOLOS_SDK=${BOLOS_SDK} CHAIN=polygon scan-build - - - uses: actions/upload-artifact@v3 - if: failure() - with: - name: scan-build - path: scan-build - - - name: Upload scan result - if: failure() - uses: actions/upload-artifact@v3 - with: - name: scan-build - path: scan-build diff --git a/.github/workflows/codeql_checks.yml b/.github/workflows/codeql_checks.yml new file mode 100644 index 0000000..7b492d9 --- /dev/null +++ b/.github/workflows/codeql_checks.yml @@ -0,0 +1,47 @@ +name: "CodeQL" + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + # Excluded path: add the paths you want to ignore instead of deleting the workflow + paths-ignore: + - '.github/workflows/*.yml' + - 'tests/*' + +jobs: + analyse: + name: Analyse + strategy: + fail-fast: false + matrix: + sdk: ["$NANOS_SDK", "$NANOX_SDK", "$NANOSP_SDK", "$STAX_SDK", "$FLEX_SDK"] + # 'cpp' covers C and C++ + language: ['cpp'] + runs-on: ubuntu-latest + container: + image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-legacy:latest + + steps: + - name: Clone + uses: actions/checkout@v4 + with: + submodules: true + + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + queries: security-and-quality + + # CodeQL will create the database during the compilation + - name: Build + run: | + make BOLOS_SDK=${{ matrix.sdk }} + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml new file mode 100644 index 0000000..c591393 --- /dev/null +++ b/.github/workflows/codespell.yml @@ -0,0 +1,26 @@ +name: Misspellings CI + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + misspell: + name: Check misspellings + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - name: Check misspellings + uses: codespell-project/actions-codespell@v2 + with: + builtin: clear,rare + check_filenames: true + path: src, src_bagl, src_features, src_nbgl, src_plugin_sdk, src_plugins, doc, client diff --git a/.github/workflows/guidelines_enforcer.yml b/.github/workflows/guidelines_enforcer.yml new file mode 100644 index 0000000..fdaf9f2 --- /dev/null +++ b/.github/workflows/guidelines_enforcer.yml @@ -0,0 +1,23 @@ +name: Ensure compliance with Ledger guidelines + +# This workflow is mandatory in all applications +# It calls a reusable workflow guidelines_enforcer developed by Ledger's internal developer team. +# The successful completion of the reusable workflow is a mandatory step for an app to be available on the Ledger +# application store. +# +# More information on the guidelines can be found in the repository: +# LedgerHQ/ledger-app-workflows/ + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + guidelines_enforcer: + name: Call Ledger guidelines_enforcer + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_guidelines_enforcer.yml@v1 diff --git a/.github/workflows/lint-workflow.yml b/.github/workflows/lint-workflow.yml index ca32687..583bb6e 100644 --- a/.github/workflows/lint-workflow.yml +++ b/.github/workflows/lint-workflow.yml @@ -24,3 +24,10 @@ jobs: source: './' extensions: 'h,c' version: 12 + + yamllint: + name: Check yaml files + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: yamllint . diff --git a/.github/workflows/pr_on_all_plugins.yml b/.github/workflows/pr_on_all_plugins.yml index 3db1bbe..f24a663 100644 --- a/.github/workflows/pr_on_all_plugins.yml +++ b/.github/workflows/pr_on_all_plugins.yml @@ -39,8 +39,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout SDK repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: + submodules: true repository: LedgerHQ/ethereum-plugin-sdk ref: develop - name: Retrieve SDK reference @@ -96,7 +97,7 @@ jobs: steps: - name: Checkout plugin repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: LedgerHQ/${{ matrix.repo }} submodules: recursive @@ -144,7 +145,7 @@ jobs: gh label create 'auto' --color 'b4a8d1' --description 'Automatically created' fi - - name: Create pull request and commment on SDK issue + - name: Create pull request and comment on SDK issue run: | # Github limits the number of possible PR being opened in a given time window. # The limits are 20 creation per minute and 150 per hour. diff --git a/.github/workflows/python-client.yml b/.github/workflows/python-client.yml index 248c804..21a0abd 100644 --- a/.github/workflows/python-client.yml +++ b/.github/workflows/python-client.yml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Clone - uses: actions/checkout@v3 + uses: actions/checkout@v4 - run: pip install flake8 flake8-pyproject - name: Flake8 lint Python code run: (cd client && flake8 src/) @@ -33,7 +33,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Clone - uses: actions/checkout@v3 + uses: actions/checkout@v4 - run: pip install mypy - name: Mypy type checking run: (cd client && mypy src/) @@ -44,37 +44,37 @@ jobs: needs: [lint, mypy] steps: - - name: Clone - uses: actions/checkout@v3 - with: - fetch-depth: 0 + - name: Clone + uses: actions/checkout@v4 + with: + fetch-depth: 0 - - name: Build Python package - run: | - pip install --upgrade pip build twine - cd client/ - python -m build; - python -m twine check dist/* - pip install .; - echo "TAG_VERSION=$(python -c 'from ledger_app_clients.ethereum import __version__; print(__version__)')" >> "$GITHUB_ENV" + - name: Build Python package + run: | + pip install --upgrade pip build twine + cd client/ + python -m build; + python -m twine check dist/* + pip install .; + echo "TAG_VERSION=$(python -c 'from ledger_app_clients.ethereum import __version__; print(__version__)')" >> "$GITHUB_ENV" - - name: Check version against CHANGELOG - if: startsWith(github.ref, 'refs/tags/') - run: | - CHANGELOG_VERSION=$(grep -Po '(?<=## \[)(\d+\.)+[^\]]' client/CHANGELOG.md | head -n 1) - if [ "${{ env.TAG_VERSION }}" == "${CHANGELOG_VERSION}" ]; - then - echo 'Package and CHANGELOG versions match!'; - exit 0; - else - echo "Tag '${{ env.TAG_VERSION }}' and CHANGELOG '${CHANGELOG_VERSION}' versions mismatch!"; - exit 1; - fi + - name: Check version against CHANGELOG + if: startsWith(github.ref, 'refs/tags/') + run: | + CHANGELOG_VERSION=$(grep -Po '(?<=## \[)(\d+\.)+[^\]]' client/CHANGELOG.md | head -n 1) + if [ "${{ env.TAG_VERSION }}" == "${CHANGELOG_VERSION}" ]; + then + echo 'Package and CHANGELOG versions match!'; + exit 0; + else + echo "Tag '${{ env.TAG_VERSION }}' and CHANGELOG '${CHANGELOG_VERSION}' versions mismatch!"; + exit 1; + fi - - name: Publish Python package on pypi.org - if: success() && github.event_name == 'push' - run: (cd client && python -m twine upload --verbose dist/*) - env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: ${{ secrets.PYPI_PUBLIC_API_TOKEN }} - TWINE_NON_INTERACTIVE: 1 + - name: Publish Python package on pypi.org + if: success() && github.event_name == 'push' + run: (cd client && python -m twine upload --verbose dist/*) + env: + TWINE_USERNAME: __token__ + TWINE_PASSWORD: ${{ secrets.PYPI_PUBLIC_API_TOKEN }} + TWINE_NON_INTERACTIVE: 1 diff --git a/.github/workflows/sdk-generation.yml b/.github/workflows/sdk-generation.yml deleted file mode 100644 index 363c89b..0000000 --- a/.github/workflows/sdk-generation.yml +++ /dev/null @@ -1,52 +0,0 @@ ---- -name: Updating the SDK - -on: - workflow_dispatch: - push: - branches: - - master - - develop - -jobs: - updating_SDK: - name: Updating the SDK - runs-on: ubuntu-latest - - steps: - - name: Clone - uses: actions/checkout@v3 - with: - # by default the action uses fetch-depth = 1, which creates - # shallow repositories from which we can't push - fetch-depth: 0 - submodules: recursive - # needed, else the push inside the action will use default credentials - # instead of provided ones - persist-credentials: false - - - name: Build new SDK - run: ./tools/build_sdk.sh - - - name: Extract branch name - shell: bash - run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" - id: extract_branch - - - name: Commit & push changes in the SDK if any - uses: ./.github/actions/commit-changes - with: - name: 'ldg-github-ci' - directory: ethereum-plugin-sdk - dst_branch: ${{ steps.extract_branch.outputs.branch }} - message: "[update] Branch ${{ steps.extract_branch.outputs.branch }} | Commit ${GITHUB_SHA}" - secret: ${{ secrets.CI_BOT_TOKEN }} - repository: LedgerHQ/ethereum-plugin-sdk - - - name: Create SDK update pull request - uses: peter-evans/create-pull-request@v4 - with: - branch: sdk/update-submodule - delete-branch: true - title: Update the SDK submodule - reviewers: apailler-ledger diff --git a/.gitignore b/.gitignore index 49c5a99..20f25ff 100644 --- a/.gitignore +++ b/.gitignore @@ -1,22 +1,17 @@ # Compilation of Ledger's app -src/glyphs.c -src/glyphs.h bin/ debug/ -dep/ -obj/ build/ +# Unit tests and code coverage +tests/unit/build/ +tests/unit/coverage/ +tests/unit/coverage.* + # Python +venv/ *.pyc __version__.py -# JS -tests/node_modules -tests/lib -tests/yarn-error.log -tests/elfs/* -tests/snapshots-tmp - .vscode -.idea \ No newline at end of file +.idea diff --git a/.mdl.rb b/.mdl.rb new file mode 100644 index 0000000..0b971f6 --- /dev/null +++ b/.mdl.rb @@ -0,0 +1,11 @@ +# Style file for mdl +# https://github.com/markdownlint/markdownlint/blob/main/docs/creating_styles.md + +# Include all rules +all + +# Disable specific rules +#exclude_rule 'MD012' + +# Update rules configuration +rule 'MD013', :line_length => 120 diff --git a/.mdlrc b/.mdlrc new file mode 100644 index 0000000..dd25d91 --- /dev/null +++ b/.mdlrc @@ -0,0 +1,14 @@ +# markdownlint config file + +# Use custom style file +style "#{File.dirname(__FILE__)}/.mdl.rb" + +# MD002 - First header in file should be a top level header +# MD005 - Inconsistent indentation for list items at the same level +# MD007 - Unordered list indentation +# MD014 - Dollar signs used before commands without showing output +# MD024 - Multiple headers with the same content +# MD029 - Ordered list item prefix +# MD033 - Inline HTML +# MD041 - First line in file should be a top level header +rules "~MD002,~MD005,~MD007,~MD014,~MD024,~MD029,~MD033,~MD041" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..06afa81 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,47 @@ +# To install hooks, run: +# pre-commit install --hook-type pre-commit +# pre-commit install --hook-type commit-msg + +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: mixed-line-ending + - id: check-added-large-files + - id: check-merge-conflict + - id: check-case-conflict + + - repo: https://github.com/codespell-project/codespell + rev: v2.2.6 + hooks: + - id: codespell + args: ['--ignore-words-list', 'ontop,shft,hte', '--skip', 'makefile_conf/chain/*,tests/ragger/eip712_input_files/*'] + + - repo: https://github.com/pre-commit/mirrors-clang-format + rev: v12.0.1 + hooks: + - id: clang-format + types_or: [c] + + - repo: https://github.com/Mateusz-Grzelinski/actionlint-py + rev: v1.6.27.13 + hooks: + - id: actionlint + types_or: [yaml] + args: [-shellcheck='' -pyflakes=''] + + - repo: https://github.com/markdownlint/markdownlint + rev: v0.12.0 + hooks: + - id: markdownlint + types_or: [markdown] + + - repo: https://github.com/PyCQA/pylint + rev: v2.16.2 + hooks: + - id: pylint + types: [python] + args: ['--jobs=0', '--rcfile=tests/ragger/setup.cfg'] + files: '^tests/ragger/.*$' diff --git a/.yamllint.yml b/.yamllint.yml new file mode 100644 index 0000000..cbd9dc5 --- /dev/null +++ b/.yamllint.yml @@ -0,0 +1,7 @@ +--- +extends: default + +rules: + document-start: disable + line-length: disable + truthy: disable diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b3afd1..a9866b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,52 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). -## [1.10.4](https://github.com/ledgerhq/app-ethereum/compare/1.10.3...1.10.4) - 2023-03-08 +## [1.11.0](https://github.com/ledgerhq/app-ethereum/compare/1.10.4...1.11.0) - 2024-07-24 + +### Added + +- (network) Base Sepolia +- (network) Blast +- (network) Blast Sepolia +- (network) Mantle +- (network) Mantle Sepolia +- (network) Arbitrum Sepolia +- (network) Linea Sepolia +- (network) OP Sepolia +- (network) Etherlink Mainnet +- (network) ZetaChain +- (network) Astar zkEVM +- (network) Lisk +- (network) Lisk Sepolia +- (network) ZKsync +- (network) BOB +- (network) Electroneum +- New EIP-712 filtering modes (datetime, amount-join) +- New blind-signing warning flow before every blind-signed transaction flow +- New "From" field in transactions containing the wallet's derived address +- Ledger Flex support + +### Removed +- (clone) Flare +- (clone) Flare Coston +- (clone) Eth Goerli +- (clone) Eth Ropsten +- Wallet ID support +- U2F support +- Blind-signing setting + +### Changed + +- Renamed Optimism to OP Mainnet +- Can now store up to 5 assets information (instead of 2) +- Can now buffer & show multiple EIP-712 fields on one page for NBGL devices +- Renamed the "Address" field in transactions to "To" + +### Fixed + +- Handling of EIP-712 empty arrays within nested structs + +## [1.10.4](https://github.com/ledgerhq/app-ethereum/compare/1.10.3...1.10.4) - 2024-03-08 ### Added @@ -122,7 +167,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed -- EIP-191 improvements, now lets the user see the entire message one chunk at a time (255 characters for LNX & LNS+, 99 for LNS) +- EIP-191 improvements, now lets the user see the entire message one chunk at a time + (255 characters for LNX & LNS+, 99 for LNS) ### Fixed @@ -143,7 +189,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed -- EIP-191 signatures now show (up to 99 characters on LNS and 255 on LNX & LNS+) the actual data contained in the message (clear-signing) +- EIP-191 signatures now show (up to 99 characters on LNS and 255 on LNX & LNS+) the actual data + contained in the message (clear-signing) ### Fixed @@ -209,7 +256,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Added -- Provide network ticker to plugins (especialy helpful for Paraswap plugin) +- Provide network ticker to plugins (especially helpful for Paraswap plugin) - Polygon variant ## [1.9.10](https://github.com/ledgerhq/app-ethereum/compare/1.9.9...1.9.10) - 2021-10-08 @@ -254,7 +301,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Added -- When blind signing is disabled in settings, and a transaction with smart conract interactions is sent to the app, a new warning screen pops to let the user know that the setting must be enabled to sign this kind of transactions. +- When blind signing is disabled in settings, and a transaction with smart conract interactions is sent to the app, + a new warning screen pops to let the user know that the setting must be enabled to sign this kind of transactions. ## [1.9.4](https://github.com/ledgerhq/app-ethereum/compare/1.9.3...1.9.4) - 2021-9-14 diff --git a/Makefile b/Makefile index b192be0..a0bc4e1 100644 --- a/Makefile +++ b/Makefile @@ -21,292 +21,41 @@ endif include $(BOLOS_SDK)/Makefile.defines -DEFINES_LIB = USE_LIB_ETHEREUM -APP_LOAD_PARAMS = --curve secp256k1 $(COMMON_LOAD_PARAMS) -# Allow the app to use path 45 for multi-sig (see BIP45). -APP_LOAD_PARAMS += --path "45'" -# Samsung temporary implementation for wallet ID on 0xda7aba5e/0xc1a551c5 -APP_LOAD_PARAMS += --path "1517992542'/1101353413'" - -################## -# Define Version # -################## - -APPVERSION_M = 1 -APPVERSION_N = 10 -APPVERSION_P = 4 -APPVERSION = $(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) -APP_LOAD_FLAGS = --appFlags 0xa40 --dep Ethereum:$(APPVERSION) - -########################### -# Set Chain environnement # -########################### +######################################## +# Mandatory configuration # +######################################## ifeq ($(CHAIN),) CHAIN = ethereum + # Temporary definition to ensure VSCode extension works... To be cleaned later + APPNAME = Ethereum endif SUPPORTED_CHAINS = $(shell find makefile_conf/chain/ -type f -name '*.mk'| sed 's/.*\/\(.*\).mk/\1/g' | sort) - -# Check if chain is available -ifeq ($(shell test -s ./makefile_conf/chain/$(CHAIN).mk && echo -n yes), yes) - include ./makefile_conf/chain/$(CHAIN).mk -else - $(error Unsupported CHAIN - use $(SUPPORTED_CHAINS)) +ifneq ($(CHAIN),$(filter $(CHAIN),$(SUPPORTED_CHAINS))) + $(error Unsupported CHAIN. Use one of: $(SUPPORTED_CHAINS)) endif -CFLAGS += -DAPPNAME=\"$(APPNAME)\" -DEFINES += CHAINID_COINNAME=\"$(TICKER)\" CHAIN_ID=$(CHAIN_ID) +include ./makefile_conf/chain/$(CHAIN).mk -######### -# Other # -######### +APPVERSION_M = 1 +APPVERSION_N = 11 +APPVERSION_P = 0 +APPVERSION = $(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) -APP_LOAD_PARAMS += $(APP_LOAD_FLAGS) --path "44'/1'" -DEFINES += $(DEFINES_LIB) - -#prepare hsm generation -ifeq ($(TARGET_NAME),TARGET_NANOS) - ICONNAME = icons/nanos_app_chain_$(CHAIN_ID).gif -else ifeq ($(TARGET_NAME),TARGET_STAX) - ICONNAME = icons/stax_app_chain_$(CHAIN_ID).gif - DEFINES += ICONGLYPH=C_stax_chain_$(CHAIN_ID)_64px - DEFINES += ICONBITMAP=C_stax_chain_$(CHAIN_ID)_64px_bitmap - DEFINES += ICONGLYPH_SMALL=C_stax_chain_$(CHAIN_ID) - GLYPH_FILES += $(ICONNAME) -else - ICONNAME = icons/nanox_app_chain_$(CHAIN_ID).gif -endif - -################ -# Default rule # -################ -all: default - -############ -# Platform # -############ - -DEFINES += OS_IO_SEPROXYHAL -DEFINES += HAVE_SPRINTF HAVE_SNPRINTF_FORMAT_U -DEFINES += HAVE_IO_USB HAVE_L4_USBLIB IO_USB_MAX_ENDPOINTS=4 IO_HID_EP_LENGTH=64 HAVE_USB_APDU -DEFINES += LEDGER_MAJOR_VERSION=$(APPVERSION_M) LEDGER_MINOR_VERSION=$(APPVERSION_N) LEDGER_PATCH_VERSION=$(APPVERSION_P) -DEFINES += BUILD_YEAR=\"$(shell date +%Y)\" - -# U2F -DEFINES += HAVE_U2F HAVE_IO_U2F -DEFINES += U2F_PROXY_MAGIC=\"w0w\" -DEFINES += USB_SEGMENT_SIZE=64 -DEFINES += BLE_SEGMENT_SIZE=32 #max MTU, min 20 -DEFINES += APPVERSION=\"$(APPVERSION)\" - -#WEBUSB_URL = www.ledgerwallet.com -#DEFINES += HAVE_WEBUSB WEBUSB_URL_SIZE_B=$(shell echo -n $(WEBUSB_URL) | wc -c) WEBUSB_URL=$(shell echo -n $(WEBUSB_URL) | sed -e "s/./\\\'\0\\\',/g") - -DEFINES += HAVE_WEBUSB WEBUSB_URL_SIZE_B=0 WEBUSB_URL="" - -ifneq (,$(filter $(TARGET_NAME),TARGET_NANOX TARGET_STAX)) - DEFINES += HAVE_BLE BLE_COMMAND_TIMEOUT_MS=2000 - DEFINES += HAVE_BLE_APDU # basic ledger apdu transport over BLE - SDK_SOURCE_PATH += lib_blewbxx lib_blewbxx_impl -endif - -ifeq ($(TARGET_NAME),TARGET_NANOS) - DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=128 -else - DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=300 -endif - -ifeq ($(TARGET_NAME),TARGET_STAX) - DEFINES += NBGL_QRCODE - SDK_SOURCE_PATH += qrcode -else - DEFINES += HAVE_BAGL - DEFINES += HAVE_UX_FLOW - ifeq ($(TARGET_NAME),TARGET_NANOS) - DEFINES += HAVE_WALLET_ID_SDK - DEFINES += BAGL_WIDTH=128 BAGL_HEIGHT=32 - else - DEFINES += HAVE_GLO096 - DEFINES += BAGL_WIDTH=128 BAGL_HEIGHT=64 - DEFINES += HAVE_BAGL_ELLIPSIS # long label truncation feature - DEFINES += HAVE_BAGL_FONT_OPEN_SANS_REGULAR_11PX - DEFINES += HAVE_BAGL_FONT_OPEN_SANS_EXTRABOLD_11PX - DEFINES += HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX - endif -endif - -#################### -# Enabled Features # -#################### - -# Enables direct data signing without having to specify it in the settings. Useful when testing with speculos. -ALLOW_DATA ?= 0 -ifneq ($(ALLOW_DATA),0) - DEFINES += HAVE_ALLOW_DATA -endif - -# Bypass the signature verification for setExternalPlugin, setPlugin, provideERC20TokenInfo and provideNFTInfo calls -BYPASS_SIGNATURES ?= 0 -ifneq ($(BYPASS_SIGNATURES),0) - DEFINES += HAVE_BYPASS_SIGNATURES -endif - -# Enable the SET_PLUGIN test key -SET_PLUGIN_TEST_KEY ?= 0 -ifneq ($(SET_PLUGIN_TEST_KEY),0) - DEFINES += HAVE_SET_PLUGIN_TEST_KEY -endif - -# NFTs -ifneq ($(TARGET_NAME),TARGET_NANOS) - DEFINES += HAVE_NFT_SUPPORT - NFT_TEST_KEY ?= 0 - ifneq ($(NFT_TEST_KEY),0) - DEFINES += HAVE_NFT_TEST_KEY - endif - NFT_STAGING_KEY ?= 0 - ifneq ($(NFT_STAGING_KEY),0) - # Key used by the staging backend - DEFINES += HAVE_NFT_STAGING_KEY - endif -endif -ifneq (,$(filter $(DEFINES),HAVE_NFT_TEST_KEY)) - ifneq (, $(filter $(DEFINES),HAVE_NFT_STAGING_KEY)) - $(error Multiple alternative NFT keys set at once) - endif -endif - -# Dynamic memory allocator -ifneq ($(TARGET_NAME),TARGET_NANOS) - DEFINES += HAVE_DYN_MEM_ALLOC -endif - -# EIP-712 -ifneq ($(TARGET_NAME),TARGET_NANOS) - DEFINES += HAVE_EIP712_FULL_SUPPORT -endif - -# CryptoAssetsList key -CAL_TEST_KEY ?= 0 -ifneq ($(CAL_TEST_KEY),0) - # Key used in our test framework - DEFINES += HAVE_CAL_TEST_KEY -endif -CAL_STAGING_KEY ?= 0 -ifneq ($(CAL_STAGING_KEY),0) - # Key used by the staging CAL - DEFINES += HAVE_CAL_STAGING_KEY -endif -ifneq (,$(filter $(DEFINES),HAVE_CAL_TEST_KEY)) - ifneq (, $(filter $(DEFINES),HAVE_CAL_STAGING_KEY)) - # Can't use both the staging and testing keys - $(error Multiple alternative CAL keys set at once) - endif -endif - -# ENS -ifneq ($(TARGET_NAME),TARGET_NANOS) - DEFINES += HAVE_DOMAIN_NAME - DOMAIN_NAME_TEST_KEY ?= 0 - ifneq ($(DOMAIN_NAME_TEST_KEY),0) - DEFINES += HAVE_DOMAIN_NAME_TEST_KEY - endif -endif - -# Enabling debug PRINTF -ifneq ($(DEBUG),0) - DEFINES += HAVE_STACK_OVERFLOW_CHECK - ifeq ($(TARGET_NAME),TARGET_NANOS) - DEFINES += HAVE_PRINTF PRINTF=screen_printf - else - DEFINES += HAVE_PRINTF PRINTF=mcu_usb_printf - endif -else - DEFINES += PRINTF\(...\)= -endif - -ifneq ($(NOCONSENT),) - DEFINES += NO_CONSENT -endif - -############## -# Compiler # -############## - -ifneq ($(BOLOS_ENV),) - $(info BOLOS_ENV=$(BOLOS_ENV)) - CLANGPATH := $(BOLOS_ENV)/clang-arm-fropi/bin/ - GCCPATH := $(BOLOS_ENV)/gcc-arm-none-eabi-5_3-2016q1/bin/ -else - $(info BOLOS_ENV is not set: falling back to CLANGPATH and GCCPATH) -endif -ifeq ($(CLANGPATH),) - $(info CLANGPATH is not set: clang will be used from PATH) -endif -ifeq ($(GCCPATH),) - $(info GCCPATH is not set: arm-none-eabi-* will be used from PATH) -endif - -CC := $(CLANGPATH)clang -CFLAGS += -Wno-format-invalid-specifier -Wno-format-extra-args -AS := $(GCCPATH)arm-none-eabi-gcc -LD := $(GCCPATH)arm-none-eabi-gcc -LDLIBS += -lm -lgcc -lc - -# import rules to compile glyphs(/pone) -include $(BOLOS_SDK)/Makefile.glyphs - -### variables processed by the common makefile.rules of the SDK to grab source files and include dirs -APP_SOURCE_PATH += src_common src src_features src_plugins -SDK_SOURCE_PATH += lib_stusb lib_stusb_impl lib_u2f -ifeq ($(TARGET_NAME),TARGET_STAX) +# Application source files +APP_SOURCE_PATH += src src_features src_plugins +ifeq ($(TARGET_NAME),$(filter $(TARGET_NAME),TARGET_STAX TARGET_FLEX)) APP_SOURCE_PATH += src_nbgl else - SDK_SOURCE_PATH += lib_ux APP_SOURCE_PATH += src_bagl endif - -# Allow usage of function from lib_standard_app/crypto_helpers.c +APP_SOURCE_FILES += $(filter-out ./ethereum-plugin-sdk/src/main.c, $(wildcard ./ethereum-plugin-sdk/src/*.c)) +INCLUDES_PATH += ./ethereum-plugin-sdk/src APP_SOURCE_FILES += ${BOLOS_SDK}/lib_standard_app/crypto_helpers.c +APP_SOURCE_FILES += ${BOLOS_SDK}/lib_standard_app/format.c +INCLUDES_PATH += ${BOLOS_SDK}/lib_standard_app -### initialize plugin SDK submodule if needed, rebuild it, and warn if a difference is noticed -ifeq ($(CHAIN),ethereum) - ifneq ($(shell git submodule status | grep '^[-+]'),) - $(info INFO: Need to reinitialize git submodules) - $(shell git submodule update --init) - endif - - # rebuild SDK - $(shell ./tools/build_sdk.sh) - - # check if a difference is noticed (fail if it happens in CI build) - ifneq ($(shell git status | grep 'ethereum-plugin-sdk'),) - ifneq ($(JENKINS_URL),) - $(error ERROR: please update ethereum-plugin-sdk submodule first) - else - $(warning WARNING: please update ethereum-plugin-sdk submodule first) - endif - endif -endif - -load: all - python3 -m ledgerblue.loadApp $(APP_LOAD_PARAMS) - -delete: - python3 -m ledgerblue.deleteApp $(COMMON_DELETE_PARAMS) - -install_tests: - cd tests/zemu/ && (yarn install || sudo yarn install) - -run_tests: - cd tests/zemu/ && (yarn test || sudo yarn test) - -test: install_tests run_tests - -unit-test: - make -C tests/unit - -ifeq ($(TARGET_NAME),TARGET_STAX) +ifeq ($(TARGET_NAME),$(filter $(TARGET_NAME),TARGET_STAX TARGET_FLEX)) NETWORK_ICONS_FILE = $(GEN_SRC_DIR)/net_icons.gen.c NETWORK_ICONS_DIR = $(shell dirname "$(NETWORK_ICONS_FILE)") @@ -316,11 +65,103 @@ $(NETWORK_ICONS_FILE): APP_SOURCE_FILES += $(NETWORK_ICONS_FILE) endif -# import generic rules from the sdk -include $(BOLOS_SDK)/Makefile.rules +# Application icons following guidelines: +# https://developers.ledger.com/docs/embedded-app/design-requirements/#device-icon +ICON_NANOS = icons/nanos_app_chain_$(CHAIN_ID).gif +ICON_NANOX = icons/nanox_app_chain_$(CHAIN_ID).gif +ICON_NANOSP = icons/nanox_app_chain_$(CHAIN_ID).gif +ICON_STAX = icons/stax_app_chain_$(CHAIN_ID).gif +ICON_FLEX = icons/flex_app_chain_$(CHAIN_ID).gif -#add dependency on custom makefile filename -dep/%.d: %.c Makefile +#prepare hsm generation +ifeq ($(TARGET_NAME),$(filter $(TARGET_NAME),TARGET_STAX TARGET_FLEX)) + DEFINES += ICONGLYPH=C_chain_$(CHAIN_ID)_64px + DEFINES += ICONBITMAP=C_chain_$(CHAIN_ID)_64px_bitmap + DEFINES += ICONGLYPH_SMALL=C_chain_$(CHAIN_ID) +endif -listvariants: - @echo VARIANTS CHAIN $(SUPPORTED_CHAINS) + +# Application allowed derivation curves. +# Possibles curves are: secp256k1, secp256r1, ed25519 and bls12381g1 +# If your app needs it, you can specify multiple curves by using: +# `CURVE_APP_LOAD_PARAMS = ` +CURVE_APP_LOAD_PARAMS += secp256k1 + +# Application allowed derivation paths. +# You should request a specific path for your app. +# This serve as an isolation mechanism. +# Most application will have to request a path according to the BIP-0044 +# and SLIP-0044 standards. +# If your app needs it, you can specify multiple path by using: +# `PATH_APP_LOAD_PARAMS = "44'/1'" "45'/1'"` +PATH_APP_LOAD_PARAMS += "45'" "44'/1'" + +# Setting to allow building variant applications +# - is the name of the parameter which should be set +# to specify the variant that should be build. +# - a list of variant that can be build using this app code. +# * It must at least contains one value. +# * Values can be the app ticker or anything else but should be unique. +VARIANT_PARAM = CHAIN +VARIANT_VALUES = $(SUPPORTED_CHAINS) + +# Activate dependency only for specific CHAIN +ifneq ($(CHAIN),ethereum) + DEP_APP_LOAD_PARAMS = Ethereum:$(APPVERSION) + DEFINES_LIB = USE_LIB_ETHEREUM +endif + +# Enabling DEBUG flag will enable PRINTF and disable optimizations +#DEBUG = 1 + +######################################## +# Application custom permissions # +######################################## +# See SDK `include/appflags.h` for the purpose of each permission +#HAVE_APPLICATION_FLAG_DERIVE_MASTER = 1 +HAVE_APPLICATION_FLAG_GLOBAL_PIN = 1 +HAVE_APPLICATION_FLAG_BOLOS_SETTINGS = 1 +HAVE_APPLICATION_FLAG_LIBRARY = 1 + +######################################## +# Application communication interfaces # +######################################## +ENABLE_BLUETOOTH = 1 +#ENABLE_NFC = 1 + +######################################## +# NBGL custom features # +######################################## +ENABLE_NBGL_QRCODE = 1 +#ENABLE_NBGL_KEYBOARD = 1 +#ENABLE_NBGL_KEYPAD = 1 + +######################################## +# Features disablers # +######################################## +# These advanced settings allow to disable some feature that are by +# default enabled in the SDK `Makefile.standard_app`. +DISABLE_STANDARD_APP_FILES = 1 +#DISABLE_DEFAULT_IO_SEPROXY_BUFFER_SIZE = 1 # To allow custom size declaration +#DISABLE_STANDARD_APP_DEFINES = 1 # Will set all the following disablers +#DISABLE_STANDARD_SNPRINTF = 1 +#DISABLE_STANDARD_USB = 1 +#DISABLE_STANDARD_WEBUSB = 1 +#DISABLE_STANDARD_BAGL_UX_FLOW = 1 +#DISABLE_DEBUG_LEDGER_ASSERT = 1 +#DISABLE_DEBUG_THROW = 1 + +######################################## +# Main app configuration # +######################################## + +DEFINES += CHAINID_COINNAME=\"$(TICKER)\" CHAIN_ID=$(CHAIN_ID) +DEFINES += BUILD_YEAR=\"$(shell date +%Y)\" + +# Enabled Features # +include makefile_conf/features.mk + +######################### + +# Import generic rules from the SDK +include $(BOLOS_SDK)/Makefile.standard_app diff --git a/README.md b/README.md index 637e3d3..f356b91 100644 --- a/README.md +++ b/README.md @@ -25,24 +25,22 @@ - [About the project](#about-the-project) - [Documentation](#documentation) - [Plugins](#plugins) -- [Testing](#testing) - - [Requirements](#requirements) - - [Build the applications required by the test suite](#build-the-applications-required-by-the-test-suite) - - [Running all tests](#running-all-tests) - - [With Makefile](#with-makefile) - - [With yarn](#with-yarn) - - [Running a specific tests](#running-a-specific-tests) - - [Adding tests](#adding-tests) - - [Zemu](#zemu) - - [Update binaries](#update-binaries) +- [Quick start guide](#quick-start-guide) + - [With VSCode](#with-vscode) + - [With a terminal](#with-a-terminal) +- [Compilation and load](#compilation-and-load) + - [Compilation](#compilation) + - [Loading on a physical device](#loading-on-a-physical-device) +- [Tests](#tests) + - [Functional Tests (Ragger based)](#functional-tests-ragger-based) + - [Unit Tests](#unit-tests) - [Contributing](#contributing) - ## About the project -Ethereum wallet application framework for Nano S, Nano S Plus and Nano X. +Ethereum wallet application framework for Nano S, Nano S Plus and Nano X. Ledger Blue is not maintained anymore, but the app can still be compiled for this target using the branch [`blue-final-release`](https://github.com/LedgerHQ/app-ethereum/tree/blue-final-release). ## Documentation @@ -53,101 +51,223 @@ To compile it and load it on a device, please check out our [developer portal](h ### Plugins -We have the concept of plugins in the ETH app. -Find the documentations here: +We have the concept of plugins in the ETH app. +Find the documentations here: + - [Blog Ethereum plugins](https://blog.ledger.com/ethereum-plugins/) - [Ethereum application Plugins : Technical Specifications](https://github.com/LedgerHQ/app-ethereum/blob/master/doc/ethapp_plugins.asc) - [Plugin guide](https://hackmd.io/300Ukv5gSbCbVcp3cZuwRQ) - [Boilerplate plugin](https://github.com/LedgerHQ/app-plugin-boilerplate) -## Testing +## Quick start guide -Testing is done via the open-source framework [zemu](https://github.com/Zondax/zemu). +### With VSCode -### Requirements +You can quickly setup a convenient environment to build and test your application by using +[Ledger's VSCode developer tools extension](https://marketplace.visualstudio.com/items?itemName=LedgerHQ.ledger-dev-tools) +which leverages the [ledger-app-dev-tools](https://github.com/LedgerHQ/ledger-app-builder/pkgs/container/ledger-app-builder%2Fledger-app-dev-tools) +docker image. -- [nodeJS == 16](https://github.com/nvm-sh/nvm) -- [yarn](https://classic.yarnpkg.com/lang/en/docs/install/#debian-stable) -- [build environnement](https://github.com/LedgerHQ/ledger-app-builder/blob/master/Dockerfile) +It will allow you, whether you are developing on macOS, Windows or Linux, +to quickly **build** your apps, **test** them on **Speculos** and **load** them on any supported device. -#### Build the applications required by the test suite +- Install and run [Docker](https://www.docker.com/products/docker-desktop/). +- Make sure you have an X11 server running: + - On Ubuntu Linux, it should be running by default. + - On macOS, install and launch [XQuartz](https://www.xquartz.org/) + (make sure to go to XQuartz > Preferences > Security and check "Allow client connections"). + - On Windows, install and launch [VcXsrv](https://sourceforge.net/projects/vcxsrv/) + (make sure to configure it to disable access control). +- Install [VScode](https://code.visualstudio.com/download) and add [Ledger's extension](https://marketplace.visualstudio.com/items?itemName=LedgerHQ.ledger-dev-tools). +- Open a terminal and clone `app-ethereum` with `git clone git@github.com:LedgerHQ/app-ethereum.git`. +- Open the `app-ethereum` folder with VSCode. +- Use Ledger extension's sidebar menu or open the tasks menu with `ctrl + shift + b` + (`command + shift + b` on a Mac) to conveniently execute actions: + - Build the app for the device model of your choice with `Build`. + - Test your binary on [Speculos](https://github.com/LedgerHQ/speculos) with `Run with Speculos`. + - You can also run functional tests, load the app on a physical device, and more. -1. Add your BOLOS SDKs path to: - - `NANOS_SDK` and `NANOX_SDK` +> The terminal tab of VSCode will show you what commands the extension runs behind the scene. -2. Go to the `tests` folder and run `./build_local_test_elfs.sh` - - ```sh - cd tests - # This helper script will build the applications required by the test suite and move them at the right place. - yarn install - ./build_local_test_elfs.sh - ``` +### With a terminal -### Running all tests -#### With Makefile +The [ledger-app-dev-tools](https://github.com/LedgerHQ/ledger-app-builder/pkgs/container/ledger-app-builder%2Fledger-app-dev-tools) +docker image contains all the required tools and libraries to **build**, **test** and **load** an application. -1. Then you can install and run tests by simply running on the `root` of the repo: - - ```sh - make test - ``` - - This will run `make install_tests` and `make run_tests` +You can download it from the ghcr.io docker repository: -#### With yarn - -1. Go to the `tests` folder and run: - - ```sh - yarn test - ``` - -### Running a specific tests - -1. Go to the `tests` folder and run: - - ```sh - yarn jest --runInBand --detectOpenHandles {YourTestFile} - ``` -2. For example with the `send test`: - - ```sh - yarn jest --runInBand --detectOpenHandles src/send.test.js - ``` - - -### Adding tests - -#### Zemu - -To add tests, copy one of the already existing test files in `tests/src/`. -You then need to adapt the `buffer` and `tx` variables to adapt to the APDU you wish to send. - -- Adapt the expected screen flow. Please create a folder under `tests/snapshots` with the name of the test you're performing. -- Then adapt the `ORIGINAL_SNAPSHOT_PATH_PREFIX` with the name of the folder you just created. -- To create the snapshots, modify the `SNAPSHOT_PATH_PREFIX` and set it to be equal to `ORIGINAL_SNAPSHOT_PATH_PREFIX`. -- Run the tests once, this will create all the snapshots in the folder you created. -- Put back your `SNAPSHOT_PATH_PREFIX` to `snapshots/tmp/`. - -Finally make sure you adapt the expected signature! - -#### Update binaries - -Don't forget to update the binaries in the test folder. To do so, compile with those environement variables: - -```sh -make DEBUG=1 ALLOW_DATA=1 +```shell +sudo docker pull ghcr.io/ledgerhq/ledger-app-builder/ledger-app-dev-tools:latest ``` -Then copy the binary to the `tests/elfs` folder (in this case, compiled with SDK for nanoS): +You can then enter this development environment by executing the following command +from the root directory of the application `git` repository: -```sh -cp bin/app.elf tests/elfs/ethereum_nanos.elf +#### Linux (Ubuntu) + +```shell +sudo docker run --rm -ti --user "$(id -u):$(id -g)" --privileged -v "/dev/bus/usb:/dev/bus/usb" -v "$(realpath .):/app" ghcr.io/ledgerhq/ledger-app-builder/ledger-app-dev-tools:latest ``` -Repeat the operation for a binary compiled with nanoX SDK and change for `ethereum_nanox.elf`. +#### macOS +```shell +sudo docker run --rm -ti --user "$(id -u):$(id -g)" --privileged -v "$(pwd -P):/app" ghcr.io/ledgerhq/ledger-app-builder/ledger-app-dev-tools:latest +``` + +#### Windows (with PowerShell) + +```shell +docker run --rm -ti --privileged -v "$(Get-Location):/app" ghcr.io/ledgerhq/ledger-app-builder/ledger-app-dev-tools:latest +``` + +The application's code will be available from inside the docker container, +you can proceed to the following compilation steps to build your app. + +## Compilation and load + +To easily setup a development environment for compilation and loading on a physical device, you can use the [VSCode integration](#with-vscode) +whether you are on Linux, macOS or Windows. + +If you prefer using a terminal to perform the steps manually, you can use the guide below. + +### Compilation + +Setup a compilation environment by following the [shell with docker approach](#with-a-terminal). + +Be sure you checkout the submodule: + +```shell +git submodule update --init +``` + +From inside the container, use the following command to build the app: + +```shell +make DEBUG=1 # compile optionally with PRINTF +``` + +You can choose which device to compile and load for by setting the `BOLOS_SDK` environment variable to the following values: + +- `BOLOS_SDK=$NANOS_SDK` +- `BOLOS_SDK=$NANOX_SDK` +- `BOLOS_SDK=$NANOSP_SDK` +- `BOLOS_SDK=$STAX_SDK` + +### Loading on a physical device + +This step will vary slightly depending on your platform. + +> Your physical device must be connected, unlocked and the screen showing the dashboard (not inside an application). + +#### Linux (Ubuntu) + +First make sure you have the proper udev rules added on your host. +See [udev-rules](https://github.com/LedgerHQ/udev-rules) + +Then once you have [opened a terminal](#with-a-terminal) in the `app-builder` image and [built the app](#compilation-and-load) +for the device you want, run the following command: + +```shell +# Run this command from the app-builder container terminal. +make load # load the app on a Nano S by default +``` + +[Setting the BOLOS_SDK environment variable](#compilation-and-load) will allow you to load +on whichever supported device you want. + +#### macOS / Windows (with PowerShell) + +> It is assumed you have [Python](https://www.python.org/downloads/) installed on your computer. + +Run these commands on your host from the app's source folder once you have [built the app](#compilation-and-load) +for the device you want: + +```shell +# Install Python virtualenv +python3 -m pip install virtualenv +# Create the 'ledger' virtualenv +python3 -m virtualenv ledger +``` + +Enter the Python virtual environment + +- macOS: `source ledger/bin/activate` +- Windows: `.\ledger\Scripts\Activate.ps1` + +```shell +# Install Ledgerblue (tool to load the app) +python3 -m pip install ledgerblue +# Load the app. +python3 -m ledgerblue.runScript --scp --fileName bin/app.apdu --elfFile bin/app.elf +``` + +## Tests + +The Ethereum app comes with different tests: + +- Functional Tests implemented with Ledger's [Ragger](https://github.com/LedgerHQ/ragger) test framework. +- Unit Tests, allowing to test basic simple functions + +### Functional Tests (Ragger based) + +#### Linux (Ubuntu) + +On Linux, you can use [Ledger's VS Code extension](#with-vscode) to run the tests. +If you prefer not to, open a terminal and follow the steps below. + +Install the tests requirements: + +```shell +pip install -r tests/ragger/requirements.txt +``` + +Then you can: + +Run the functional tests (here for nanos but available for any device once you have built the binaries): + +```shell +pytest tests/ragger/ --tb=short -v --device nanos +``` + +Please see the corresponding ducomentation [USAGE](tests/ragger/usage.md) + +Or run your app directly with Speculos + +```shell +speculos --model nanos build/nanos/bin/app.elf +``` + +#### macOS / Windows + +To test your app on macOS or Windows, it is recommended to use [Ledger's VS Code extension](#with-vscode) +to quickly setup a working test environment. + +You can use the following sequence of tasks and commands (all accessible in the **extension sidebar menu**): + +- `Select build target` +- `Build app` + +Then you can choose to execute the functional tests: + +- Use `Run tests`. + +Or simply run the app on the Speculos emulator: + +- `Run with Speculos`. + +### Unit Tests + +Those tests are available in the directory `tests/unit`. Please see the corresponding [README](tests/unit/README.md) +to compile and run them. ## Contributing -Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**. +Contributions are what makes the open source community such an amazing place to learn, inspire, and create. +Any contributions you make are **greatly appreciated**. -If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag `enhancement`. +If you have a suggestion that would make this better, please fork the repo and create a pull request. +You can also simply open an issue with the tag `enhancement`. 1. Fork the Project 2. Create your Feature Branch (`git checkout -b feature/my-feature`) diff --git a/client/CHANGELOG.md b/client/CHANGELOG.md index 094bcd6..3a5f925 100644 --- a/client/CHANGELOG.md +++ b/client/CHANGELOG.md @@ -5,6 +5,29 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.4.1] - 2024-04-15 + +### Added + +- Add new function `send_raw`, allowing to send a raw payload APDU +- Add new error code definition + +### Fixed + +- Encoding of EIP-712 bytes elements + +## [0.4.0] - 2024-04-03 + +### Added + +- Changed `sync` functions of the client to not use an `async` syntax anymore + +## [0.3.1] - 2024-03-12 + +### Fixed + +- `recover_transaction` & `recover_message` util functions + ## [0.3.0] - 2024-02-13 ### Added diff --git a/client/pyproject.toml b/client/pyproject.toml index 3a91961..e68d1a3 100644 --- a/client/pyproject.toml +++ b/client/pyproject.toml @@ -48,4 +48,4 @@ Home = "https://github.com/LedgerHQ/app-ethereum" ignore_missing_imports = true [tool.flake8] -max-line-length = 120 \ No newline at end of file +max-line-length = 120 diff --git a/client/src/ledger_app_clients/ethereum/__init__.py b/client/src/ledger_app_clients/ethereum/__init__.py index ce05207..1f628c4 100644 --- a/client/src/ledger_app_clients/ethereum/__init__.py +++ b/client/src/ledger_app_clients/ethereum/__init__.py @@ -1,4 +1,4 @@ try: - from ledger_app_clients.ethereum.__version__ import __version__ # noqa + from __version__ import __version__ # noqa except ImportError: __version__ = "unknown version" # noqa diff --git a/client/src/ledger_app_clients/ethereum/client.py b/client/src/ledger_app_clients/ethereum/client.py index aa2b27b..a09bd41 100644 --- a/client/src/ledger_app_clients/ethereum/client.py +++ b/client/src/ledger_app_clients/ethereum/client.py @@ -21,6 +21,7 @@ class StatusWord(IntEnum): INVALID_P1_P2 = 0x6b00 CONDITION_NOT_SATISFIED = 0x6985 REF_DATA_NOT_FOUND = 0x6a88 + EXCEPTION_OVERFLOW = 0x6807 class DomainNameTag(IntEnum): @@ -40,14 +41,26 @@ class EthAppClient: self._client = client self._cmd_builder = CommandBuilder() - def _send(self, payload: bytes): + def _exchange_async(self, payload: bytes): return self._client.exchange_async_raw(payload) + def _exchange(self, payload: bytes): + return self._client.exchange_raw(payload) + def response(self) -> Optional[RAPDU]: return self._client.last_async_response + def send_raw(self, cla: int, ins: int, p1: int, p2: int, payload: bytes): + header = bytearray() + header.append(cla) + header.append(ins) + header.append(p1) + header.append(p2) + header.append(len(payload)) + return self._exchange(header + payload) + def eip712_send_struct_def_struct_name(self, name: str): - return self._send(self._cmd_builder.eip712_send_struct_def_struct_name(name)) + return self._exchange_async(self._cmd_builder.eip712_send_struct_def_struct_name(name)) def eip712_send_struct_def_struct_field(self, field_type: EIP712FieldType, @@ -55,7 +68,7 @@ class EthAppClient: type_size: int, array_levels: list, key_name: str): - return self._send(self._cmd_builder.eip712_send_struct_def_struct_field( + return self._exchange_async(self._cmd_builder.eip712_send_struct_def_struct_field( field_type, type_name, type_size, @@ -63,37 +76,50 @@ class EthAppClient: key_name)) def eip712_send_struct_impl_root_struct(self, name: str): - return self._send(self._cmd_builder.eip712_send_struct_impl_root_struct(name)) + return self._exchange_async(self._cmd_builder.eip712_send_struct_impl_root_struct(name)) def eip712_send_struct_impl_array(self, size: int): - return self._send(self._cmd_builder.eip712_send_struct_impl_array(size)) + return self._exchange_async(self._cmd_builder.eip712_send_struct_impl_array(size)) def eip712_send_struct_impl_struct_field(self, raw_value: bytes): chunks = self._cmd_builder.eip712_send_struct_impl_struct_field(bytearray(raw_value)) for chunk in chunks[:-1]: - with self._send(chunk): - pass - return self._send(chunks[-1]) + self._exchange(chunk) + return self._exchange_async(chunks[-1]) def eip712_sign_new(self, bip32_path: str): - return self._send(self._cmd_builder.eip712_sign_new(bip32_path)) + return self._exchange_async(self._cmd_builder.eip712_sign_new(bip32_path)) def eip712_sign_legacy(self, bip32_path: str, domain_hash: bytes, message_hash: bytes): - return self._send(self._cmd_builder.eip712_sign_legacy(bip32_path, - domain_hash, - message_hash)) + return self._exchange_async(self._cmd_builder.eip712_sign_legacy(bip32_path, + domain_hash, + message_hash)) def eip712_filtering_activate(self): - return self._send(self._cmd_builder.eip712_filtering_activate()) + return self._exchange_async(self._cmd_builder.eip712_filtering_activate()) def eip712_filtering_message_info(self, name: str, filters_count: int, sig: bytes): - return self._send(self._cmd_builder.eip712_filtering_message_info(name, filters_count, sig)) + return self._exchange_async(self._cmd_builder.eip712_filtering_message_info(name, + filters_count, + sig)) - def eip712_filtering_show_field(self, name: str, sig: bytes): - return self._send(self._cmd_builder.eip712_filtering_show_field(name, sig)) + def eip712_filtering_amount_join_token(self, token_idx: int, sig: bytes): + return self._exchange_async(self._cmd_builder.eip712_filtering_amount_join_token(token_idx, + sig)) + + def eip712_filtering_amount_join_value(self, token_idx: int, name: str, sig: bytes): + return self._exchange_async(self._cmd_builder.eip712_filtering_amount_join_value(token_idx, + name, + sig)) + + def eip712_filtering_datetime(self, name: str, sig: bytes): + return self._exchange_async(self._cmd_builder.eip712_filtering_datetime(name, sig)) + + def eip712_filtering_raw(self, name: str, sig: bytes): + return self._exchange_async(self._cmd_builder.eip712_filtering_raw(name, sig)) def sign(self, bip32_path: str, @@ -111,24 +137,37 @@ class EthAppClient: tx = prefix + rlp.encode(decoded + suffix) chunks = self._cmd_builder.sign(bip32_path, tx, suffix) for chunk in chunks[:-1]: - with self._send(chunk): - pass - return self._send(chunks[-1]) + self._exchange(chunk) + return self._exchange_async(chunks[-1]) def get_challenge(self): - return self._send(self._cmd_builder.get_challenge()) + return self._exchange(self._cmd_builder.get_challenge()) def get_public_addr(self, display: bool = True, chaincode: bool = False, bip32_path: str = "m/44'/60'/0'/0/0", - chain_id: Optional[int] = None): - return self._send(self._cmd_builder.get_public_addr(display, - chaincode, - bip32_path, - chain_id)) + chain_id: Optional[int] = None) -> RAPDU: + return self._exchange_async(self._cmd_builder.get_public_addr(display, + chaincode, + bip32_path, + chain_id)) - def provide_domain_name(self, challenge: int, name: str, addr: bytes): + def get_eth2_public_addr(self, + display: bool = True, + bip32_path: str = "m/12381/3600/0/0"): + return self._exchange_async(self._cmd_builder.get_eth2_public_addr(display, + bip32_path)) + + def perform_privacy_operation(self, + display: bool = True, + bip32_path: str = "m/44'/60'/0'/0/0", + pubkey: bytes = bytes()): + return self._exchange(self._cmd_builder.perform_privacy_operation(display, + bip32_path, + pubkey)) + + def provide_domain_name(self, challenge: int, name: str, addr: bytes) -> RAPDU: payload = format_tlv(DomainNameTag.STRUCTURE_TYPE, 3) # TrustedDomainName payload += format_tlv(DomainNameTag.STRUCTURE_VERSION, 1) payload += format_tlv(DomainNameTag.SIGNER_KEY_ID, 0) # test key @@ -142,9 +181,8 @@ class EthAppClient: chunks = self._cmd_builder.provide_domain_name(payload) for chunk in chunks[:-1]: - with self._send(chunk): - pass - return self._send(chunks[-1]) + self._exchange(chunk) + return self._exchange(chunks[-1]) def set_plugin(self, plugin_name: str, @@ -155,7 +193,7 @@ class EthAppClient: version: int = 1, key_id: int = 2, algo_id: int = 1, - sig: Optional[bytes] = None): + sig: Optional[bytes] = None) -> RAPDU: if sig is None: # Temporarily get a command with an empty signature to extract the payload and # compute the signature on it @@ -170,15 +208,15 @@ class EthAppClient: bytes()) # skip APDU header & empty sig sig = sign_data(Key.SET_PLUGIN, tmp[5:-1]) - return self._send(self._cmd_builder.set_plugin(type_, - version, - plugin_name, - contract_addr, - selector, - chain_id, - key_id, - algo_id, - sig)) + return self._exchange(self._cmd_builder.set_plugin(type_, + version, + plugin_name, + contract_addr, + selector, + chain_id, + key_id, + algo_id, + sig)) def provide_nft_metadata(self, collection: str, @@ -188,7 +226,7 @@ class EthAppClient: version: int = 1, key_id: int = 1, algo_id: int = 1, - sig: Optional[bytes] = None): + sig: Optional[bytes] = None) -> RAPDU: if sig is None: # Temporarily get a command with an empty signature to extract the payload and # compute the signature on it @@ -202,20 +240,20 @@ class EthAppClient: bytes()) # skip APDU header & empty sig sig = sign_data(Key.NFT, tmp[5:-1]) - return self._send(self._cmd_builder.provide_nft_information(type_, - version, - collection, - addr, - chain_id, - key_id, - algo_id, - sig)) + return self._exchange(self._cmd_builder.provide_nft_information(type_, + version, + collection, + addr, + chain_id, + key_id, + algo_id, + sig)) def set_external_plugin(self, plugin_name: str, contract_address: bytes, method_selelector: bytes, - sig: Optional[bytes] = None): + sig: Optional[bytes] = None) -> RAPDU: if sig is None: # Temporarily get a command with an empty signature to extract the payload and # compute the signature on it @@ -223,21 +261,23 @@ class EthAppClient: # skip APDU header & empty sig sig = sign_data(Key.CAL, tmp[5:]) - return self._send(self._cmd_builder.set_external_plugin(plugin_name, contract_address, method_selelector, sig)) + return self._exchange(self._cmd_builder.set_external_plugin(plugin_name, + contract_address, + method_selelector, + sig)) def personal_sign(self, path: str, msg: bytes): chunks = self._cmd_builder.personal_sign(path, msg) for chunk in chunks[:-1]: - with self._send(chunk): - pass - return self._send(chunks[-1]) + self._exchange(chunk) + return self._exchange_async(chunks[-1]) def provide_token_metadata(self, ticker: str, addr: bytes, decimals: int, chain_id: int, - sig: Optional[bytes] = None): + sig: Optional[bytes] = None) -> RAPDU: if sig is None: # Temporarily get a command with an empty signature to extract the payload and # compute the signature on it @@ -248,8 +288,8 @@ class EthAppClient: bytes()) # skip APDU header & empty sig sig = sign_data(Key.CAL, tmp[6:]) - return self._send(self._cmd_builder.provide_erc20_token_information(ticker, - addr, - decimals, - chain_id, - sig)) + return self._exchange(self._cmd_builder.provide_erc20_token_information(ticker, + addr, + decimals, + chain_id, + sig)) diff --git a/client/src/ledger_app_clients/ethereum/command_builder.py b/client/src/ledger_app_clients/ethereum/command_builder.py index 0ba0809..bcd505c 100644 --- a/client/src/ledger_app_clients/ethereum/command_builder.py +++ b/client/src/ledger_app_clients/ethereum/command_builder.py @@ -11,11 +11,13 @@ from .eip712 import EIP712FieldType class InsType(IntEnum): GET_PUBLIC_ADDR = 0x02 + GET_ETH2_PUBLIC_ADDR = 0x0e SIGN = 0x04 PERSONAL_SIGN = 0x08 PROVIDE_ERC20_TOKEN_INFORMATION = 0x0a PROVIDE_NFT_INFORMATION = 0x14 SET_PLUGIN = 0x16 + PERFORM_PRIVACY_OPERATION = 0x18 EIP712_SEND_STRUCT_DEF = 0x1a EIP712_SEND_STRUCT_IMPL = 0x1c EIP712_SEND_FILTERING = 0x1e @@ -39,8 +41,11 @@ class P2Type(IntEnum): LEGACY_IMPLEM = 0x00 NEW_IMPLEM = 0x01 FILTERING_ACTIVATE = 0x00 - FILTERING_CONTRACT_NAME = 0x0f - FILTERING_FIELD_NAME = 0xff + FILTERING_MESSAGE_INFO = 0x0f + FILTERING_DATETIME = 0xfc + FILTERING_TOKEN_ADDR_CHECK = 0xfd + FILTERING_AMOUNT_FIELD = 0xfe + FILTERING_RAW = 0xff class CommandBuilder: @@ -60,17 +65,11 @@ class CommandBuilder: header.append(len(cdata)) return header + cdata - def _string_to_bytes(self, string: str) -> bytes: - data = bytearray() - for char in string: - data.append(ord(char)) - return data - def eip712_send_struct_def_struct_name(self, name: str) -> bytes: return self._serialize(InsType.EIP712_SEND_STRUCT_DEF, P1Type.COMPLETE_SEND, P2Type.STRUCT_NAME, - self._string_to_bytes(name)) + name.encode()) def eip712_send_struct_def_struct_field(self, field_type: EIP712FieldType, @@ -86,7 +85,7 @@ class CommandBuilder: data.append(typedesc) if field_type == EIP712FieldType.CUSTOM: data.append(len(type_name)) - data += self._string_to_bytes(type_name) + data += type_name.encode() if type_size is not None: data.append(type_size) if len(array_levels) > 0: @@ -96,7 +95,7 @@ class CommandBuilder: if level is not None: data.append(level) data.append(len(key_name)) - data += self._string_to_bytes(key_name) + data += key_name.encode() return self._serialize(InsType.EIP712_SEND_STRUCT_DEF, P1Type.COMPLETE_SEND, P2Type.STRUCT_FIELD, @@ -106,7 +105,7 @@ class CommandBuilder: return self._serialize(InsType.EIP712_SEND_STRUCT_IMPL, P1Type.COMPLETE_SEND, P2Type.STRUCT_NAME, - self._string_to_bytes(name)) + name.encode()) def eip712_send_struct_impl_array(self, size: int) -> bytes: data = bytearray() @@ -160,7 +159,7 @@ class CommandBuilder: def _eip712_filtering_send_name(self, name: str, sig: bytes) -> bytes: data = bytearray() data.append(len(name)) - data += self._string_to_bytes(name) + data += name.encode() data.append(len(sig)) data += sig return data @@ -168,25 +167,53 @@ class CommandBuilder: def eip712_filtering_message_info(self, name: str, filters_count: int, sig: bytes) -> bytes: data = bytearray() data.append(len(name)) - data += self._string_to_bytes(name) + data += name.encode() data.append(filters_count) data.append(len(sig)) data += sig return self._serialize(InsType.EIP712_SEND_FILTERING, P1Type.COMPLETE_SEND, - P2Type.FILTERING_CONTRACT_NAME, + P2Type.FILTERING_MESSAGE_INFO, data) - def eip712_filtering_show_field(self, name: str, sig: bytes) -> bytes: + def eip712_filtering_amount_join_token(self, token_idx: int, sig: bytes) -> bytes: + data = bytearray() + data.append(token_idx) + data.append(len(sig)) + data += sig return self._serialize(InsType.EIP712_SEND_FILTERING, P1Type.COMPLETE_SEND, - P2Type.FILTERING_FIELD_NAME, + P2Type.FILTERING_TOKEN_ADDR_CHECK, + data) + + def eip712_filtering_amount_join_value(self, token_idx: int, name: str, sig: bytes) -> bytes: + data = bytearray() + data.append(len(name)) + data += name.encode() + data.append(token_idx) + data.append(len(sig)) + data += sig + return self._serialize(InsType.EIP712_SEND_FILTERING, + P1Type.COMPLETE_SEND, + P2Type.FILTERING_AMOUNT_FIELD, + data) + + def eip712_filtering_datetime(self, name: str, sig: bytes) -> bytes: + return self._serialize(InsType.EIP712_SEND_FILTERING, + P1Type.COMPLETE_SEND, + P2Type.FILTERING_DATETIME, + self._eip712_filtering_send_name(name, sig)) + + def eip712_filtering_raw(self, name: str, sig: bytes) -> bytes: + return self._serialize(InsType.EIP712_SEND_FILTERING, + P1Type.COMPLETE_SEND, + P2Type.FILTERING_RAW, self._eip712_filtering_send_name(name, sig)) def set_external_plugin(self, plugin_name: str, contract_address: bytes, selector: bytes, sig: bytes) -> bytes: data = bytearray() data.append(len(plugin_name)) - data += self._string_to_bytes(plugin_name) + data += plugin_name.encode() data += contract_address data += selector data += sig @@ -250,6 +277,25 @@ class CommandBuilder: int(chaincode), payload) + def get_eth2_public_addr(self, + display: bool, + bip32_path: str) -> bytes: + payload = pack_derivation_path(bip32_path) + return self._serialize(InsType.GET_ETH2_PUBLIC_ADDR, + int(display), + 0x00, + payload) + + def perform_privacy_operation(self, + display: bool, + bip32_path: str, + pubkey: bytes) -> bytes: + payload = pack_derivation_path(bip32_path) + return self._serialize(InsType.PERFORM_PRIVACY_OPERATION, + int(display), + 0x01 if pubkey else 0x00, + payload + pubkey) + def set_plugin(self, type_: int, version: int, diff --git a/client/src/ledger_app_clients/ethereum/eip712/InputData.py b/client/src/ledger_app_clients/ethereum/eip712/InputData.py index a19ccf3..4981abd 100644 --- a/client/src/ledger_app_clients/ethereum/eip712/InputData.py +++ b/client/src/ledger_app_clients/ethereum/eip712/InputData.py @@ -4,11 +4,13 @@ import re import signal import sys import copy -from typing import Any, Callable, Optional +from typing import Any, Callable, Optional, Union +import struct -from ledger_app_clients.ethereum import keychain -from ledger_app_clients.ethereum.client import EthAppClient, EIP712FieldType +from client import keychain +from client.client import EthAppClient, EIP712FieldType +from ragger.firmware import Firmware # global variables app_client: EthAppClient = None @@ -22,6 +24,7 @@ def default_handler(): autonext_handler: Callable = default_handler +is_golden_run: bool # From a string typename, extract the type and all the array depth @@ -118,69 +121,60 @@ def send_struct_def_field(typename, keyname): return (typename, type_enum, typesize, array_lvls) -def encode_integer(value, typesize): - data = bytearray() - +def encode_integer(value: Union[str, int], typesize: int) -> bytes: # Some are already represented as integers in the JSON, but most as strings if isinstance(value, str): - base = 10 - if value.startswith("0x"): - base = 16 - value = int(value, base) + value = int(value, 0) if value == 0: - data.append(0) + data = b'\x00' else: - if value < 0: # negative number, send it as unsigned - mask = 0 - for i in range(typesize): # make a mask as big as the typesize - mask = (mask << 8) | 0xff - value &= mask - while value > 0: - data.append(value & 0xff) - value >>= 8 - data.reverse() + # biggest uint type accepted by struct.pack + uint64_mask = 0xffffffffffffffff + data = struct.pack(">QQQQ", + (value >> 192) & uint64_mask, + (value >> 128) & uint64_mask, + (value >> 64) & uint64_mask, + value & uint64_mask) + data = data[len(data) - typesize:] + data = data.lstrip(b'\x00') return data -def encode_int(value, typesize): +def encode_int(value: str, typesize: int) -> bytes: return encode_integer(value, typesize) -def encode_uint(value, typesize): +def encode_uint(value: str, typesize: int) -> bytes: return encode_integer(value, typesize) -def encode_hex_string(value, size): - data = bytearray() - value = value[2:] # skip 0x - byte_idx = 0 - while byte_idx < size: - data.append(int(value[(byte_idx * 2):(byte_idx * 2 + 2)], 16)) - byte_idx += 1 - return data +def encode_hex_string(value: str, size: int) -> bytes: + assert value.startswith("0x") + value = value[2:] + if len(value) < (size * 2): + value = value.rjust(size * 2, "0") + assert len(value) == (size * 2) + return bytes.fromhex(value) -def encode_address(value, typesize): +def encode_address(value: str, typesize: int) -> bytes: return encode_hex_string(value, 20) -def encode_bool(value, typesize): - return encode_integer(value, typesize) +def encode_bool(value: str, typesize: int) -> bytes: + return encode_integer(value, 1) -def encode_string(value, typesize): - data = bytearray() - for char in value: - data.append(ord(char)) - return data +def encode_string(value: str, typesize: int) -> bytes: + return value.encode() -def encode_bytes_fix(value, typesize): +def encode_bytes_fix(value: str, typesize: int) -> bytes: return encode_hex_string(value, typesize) -def encode_bytes_dyn(value, typesize): +def encode_bytes_dyn(value: str, typesize: int) -> bytes: # length of the value string # - the length of 0x (2) # / by the length of one byte in a hex string (2) @@ -208,7 +202,22 @@ def send_struct_impl_field(value, field): if filtering_paths: path = ".".join(current_path) if path in filtering_paths.keys(): - send_filtering_show_field(filtering_paths[path]) + if filtering_paths[path]["type"] == "amount_join_token": + send_filtering_amount_join_token(filtering_paths[path]["token"]) + elif filtering_paths[path]["type"] == "amount_join_value": + if "token" in filtering_paths[path].keys(): + token = filtering_paths[path]["token"] + else: + # Permit (ERC-2612) + token = 0xff + send_filtering_amount_join_value(token, + filtering_paths[path]["name"]) + elif filtering_paths[path]["type"] == "datetime": + send_filtering_datetime(filtering_paths[path]["name"]) + elif filtering_paths[path]["type"] == "raw": + send_filtering_raw(filtering_paths[path]["name"]) + else: + assert False with app_client.eip712_send_struct_impl_struct_field(data): enable_autonext() @@ -259,18 +268,24 @@ def send_struct_impl(structs, data, structname): return True +def start_signature_payload(ctx: dict, magic: int) -> bytearray: + to_sign = bytearray() + # magic number so that signature for one type of filter can't possibly be + # valid for another, defined in APDU specs + to_sign.append(magic) + to_sign += ctx["chainid"] + to_sign += ctx["caddr"] + to_sign += ctx["schema_hash"] + return to_sign + + # ledgerjs doesn't actually sign anything, and instead uses already pre-computed signatures def send_filtering_message_info(display_name: str, filters_count: int): global sig_ctx - to_sign = bytearray() - to_sign.append(183) - to_sign += sig_ctx["chainid"] - to_sign += sig_ctx["caddr"] - to_sign += sig_ctx["schema_hash"] + to_sign = start_signature_payload(sig_ctx, 183) to_sign.append(filters_count) - for char in display_name: - to_sign.append(ord(char)) + to_sign += display_name.encode() sig = keychain.sign_data(keychain.Key.CAL, to_sign) with app_client.eip712_filtering_message_info(display_name, filters_count, sig): @@ -278,23 +293,57 @@ def send_filtering_message_info(display_name: str, filters_count: int): disable_autonext() -# ledgerjs doesn't actually sign anything, and instead uses already pre-computed signatures -def send_filtering_show_field(display_name): +def send_filtering_amount_join_token(token_idx: int): global sig_ctx path_str = ".".join(current_path) - to_sign = bytearray() - to_sign.append(72) - to_sign += sig_ctx["chainid"] - to_sign += sig_ctx["caddr"] - to_sign += sig_ctx["schema_hash"] - for char in path_str: - to_sign.append(ord(char)) - for char in display_name: - to_sign.append(ord(char)) + to_sign = start_signature_payload(sig_ctx, 11) + to_sign += path_str.encode() + to_sign.append(token_idx) sig = keychain.sign_data(keychain.Key.CAL, to_sign) - with app_client.eip712_filtering_show_field(display_name, sig): + with app_client.eip712_filtering_amount_join_token(token_idx, sig): + pass + + +def send_filtering_amount_join_value(token_idx: int, display_name: str): + global sig_ctx + + path_str = ".".join(current_path) + + to_sign = start_signature_payload(sig_ctx, 22) + to_sign += path_str.encode() + to_sign += display_name.encode() + to_sign.append(token_idx) + sig = keychain.sign_data(keychain.Key.CAL, to_sign) + with app_client.eip712_filtering_amount_join_value(token_idx, display_name, sig): + pass + + +def send_filtering_datetime(display_name: str): + global sig_ctx + + path_str = ".".join(current_path) + + to_sign = start_signature_payload(sig_ctx, 33) + to_sign += path_str.encode() + to_sign += display_name.encode() + sig = keychain.sign_data(keychain.Key.CAL, to_sign) + with app_client.eip712_filtering_datetime(display_name, sig): + pass + + +# ledgerjs doesn't actually sign anything, and instead uses already pre-computed signatures +def send_filtering_raw(display_name): + global sig_ctx + + path_str = ".".join(current_path) + + to_sign = start_signature_payload(sig_ctx, 72) + to_sign += path_str.encode() + to_sign += display_name.encode() + sig = keychain.sign_data(keychain.Key.CAL, to_sign) + with app_client.eip712_filtering_raw(display_name, sig): pass @@ -305,6 +354,12 @@ def prepare_filtering(filtr_data, message): filtering_paths = filtr_data["fields"] else: filtering_paths = {} + if "tokens" in filtr_data: + for token in filtr_data["tokens"]: + app_client.provide_token_metadata(token["ticker"], + bytes.fromhex(token["addr"][2:]), + token["decimals"], + token["chain_id"]) def handle_optional_domain_values(domain): @@ -337,10 +392,16 @@ def next_timeout(_signum: int, _frame): def enable_autonext(): - if app_client._client.firmware.device == 'stax': # Stax Speculos is slow - delay = 1.5 + if app_client._client.firmware in (Firmware.STAX, Firmware.FLEX): + delay = 1/3 else: delay = 1/4 + + # golden run has to be slower to make sure we take good snapshots + # and not processing/loading screens + if is_golden_run: + delay *= 3 + signal.setitimer(signal.ITIMER_REAL, delay, delay) @@ -351,10 +412,12 @@ def disable_autonext(): def process_data(aclient: EthAppClient, data_json: dict, filters: Optional[dict] = None, - autonext: Optional[Callable] = None) -> bool: + autonext: Optional[Callable] = None, + golden_run: bool = False) -> bool: global sig_ctx global app_client global autonext_handler + global is_golden_run # deepcopy because this function modifies the dict data_json = copy.deepcopy(data_json) @@ -369,6 +432,8 @@ def process_data(aclient: EthAppClient, autonext_handler = autonext signal.signal(signal.SIGALRM, next_timeout) + is_golden_run = golden_run + if filters: init_signature_context(types, domain) diff --git a/client/src/ledger_app_clients/ethereum/settings.py b/client/src/ledger_app_clients/ethereum/settings.py index 6bd73e9..158a46c 100644 --- a/client/src/ledger_app_clients/ethereum/settings.py +++ b/client/src/ledger_app_clients/ethereum/settings.py @@ -5,49 +5,55 @@ from typing import Union class SettingID(Enum): - BLIND_SIGNING = auto() - DEBUG_DATA = auto() - NONCE = auto() - VERBOSE_EIP712 = auto() VERBOSE_ENS = auto() + VERBOSE_EIP712 = auto() + NONCE = auto() + DEBUG_DATA = auto() -def get_device_settings(device: str) -> list[SettingID]: - if device == "nanos": +def get_device_settings(firmware: Firmware) -> list[SettingID]: + if firmware == Firmware.NANOS: return [ - SettingID.BLIND_SIGNING, - SettingID.DEBUG_DATA, - SettingID.NONCE - ] - if (device == "nanox") or (device == "nanosp") or (device == "stax"): - return [ - SettingID.BLIND_SIGNING, - SettingID.DEBUG_DATA, SettingID.NONCE, - SettingID.VERBOSE_EIP712, - SettingID.VERBOSE_ENS + SettingID.DEBUG_DATA, ] - return [] + return [ + SettingID.VERBOSE_ENS, + SettingID.VERBOSE_EIP712, + SettingID.NONCE, + SettingID.DEBUG_DATA, + ] -settings_per_page = 3 +def get_setting_per_page(firmware: Firmware) -> int: + if firmware == Firmware.STAX: + return 3 + return 2 -def get_setting_position(device: str, setting: Union[NavInsID, SettingID]) -> tuple[int, int]: - screen_height = 672 # px - header_height = 85 # px - footer_height = 124 # px +def get_setting_position(firmware: Firmware, setting: Union[NavInsID, SettingID]) -> tuple[int, int]: + settings_per_page = get_setting_per_page(firmware) + if firmware == Firmware.STAX: + screen_height = 672 # px + header_height = 88 # px + footer_height = 92 # px + option_offset = 350 # px + else: + screen_height = 600 # px + header_height = 92 # px + footer_height = 97 # px + option_offset = 420 # px usable_height = screen_height - (header_height + footer_height) setting_height = usable_height // settings_per_page - index_in_page = get_device_settings(device).index(SettingID(setting)) % settings_per_page - return 350, header_height + (setting_height * index_in_page) + (setting_height // 2) + index_in_page = get_device_settings(firmware).index(SettingID(setting)) % settings_per_page + return option_offset, header_height + (setting_height * index_in_page) + (setting_height // 2) -def settings_toggle(fw: Firmware, nav: Navigator, to_toggle: list[SettingID]): +def settings_toggle(firmware: Firmware, nav: Navigator, to_toggle: list[SettingID]): moves: list[Union[NavIns, NavInsID]] = list() - settings = get_device_settings(fw.device) + settings = get_device_settings(firmware) # Assume the app is on the home page - if fw.device.startswith("nano"): + if firmware.is_nano: moves += [NavInsID.RIGHT_CLICK] * 2 moves += [NavInsID.BOTH_CLICK] for setting in settings: @@ -57,12 +63,12 @@ def settings_toggle(fw: Firmware, nav: Navigator, to_toggle: list[SettingID]): moves += [NavInsID.BOTH_CLICK] # Back else: moves += [NavInsID.USE_CASE_HOME_SETTINGS] - moves += [NavInsID.USE_CASE_SETTINGS_NEXT] + settings_per_page = get_setting_per_page(firmware) for setting in settings: setting_idx = settings.index(setting) if (setting_idx > 0) and (setting_idx % settings_per_page) == 0: moves += [NavInsID.USE_CASE_SETTINGS_NEXT] if setting in to_toggle: - moves += [NavIns(NavInsID.TOUCH, get_setting_position(fw.device, setting))] + moves += [NavIns(NavInsID.TOUCH, get_setting_position(firmware, setting))] moves += [NavInsID.USE_CASE_SETTINGS_MULTI_PAGE_EXIT] nav.navigate(moves, screen_change_before_first_instruction=False) diff --git a/client/src/ledger_app_clients/ethereum/utils.py b/client/src/ledger_app_clients/ethereum/utils.py index 2b50fe5..0fa3508 100644 --- a/client/src/ledger_app_clients/ethereum/utils.py +++ b/client/src/ledger_app_clients/ethereum/utils.py @@ -3,6 +3,14 @@ from eth_account.messages import encode_defunct, encode_typed_data import rlp +# eth_account requires it for some reason +def normalize_vrs(vrs: tuple) -> tuple: + vrs_l = list() + for elem in vrs: + vrs_l.append(elem.lstrip(b'\x00')) + return tuple(vrs_l) + + def get_selector_from_data(data: str) -> bytes: raw_data = bytes.fromhex(data[2:]) return raw_data[:4] @@ -13,7 +21,7 @@ def recover_message(msg, vrs: tuple) -> bytes: smsg = encode_typed_data(full_message=msg) else: # EIP-191 smsg = encode_defunct(primitive=msg) - addr = Account.recover_message(smsg, vrs) + addr = Account.recover_message(smsg, normalize_vrs(vrs)) return bytes.fromhex(addr[2:]) @@ -23,17 +31,33 @@ def recover_transaction(tx_params, vrs: tuple) -> bytes: if raw_tx[0] in [0x01, 0x02]: prefix = raw_tx[:1] raw_tx = raw_tx[len(prefix):] - # v is returned on one byte only so it might have overflowed - # in that case, we will reconstruct it to its full value - if "chainId" in tx_params: - trunc_chain_id = tx_params["chainId"] - while trunc_chain_id.bit_length() > 32: - trunc_chain_id >>= 8 - target = tx_params["chainId"] * 2 + 35 - trunc_target = trunc_chain_id * 2 + 35 - diff = vrs[0][0] - (trunc_target & 0xff) - vrs = (target + diff, vrs[1], vrs[2]) + else: + if "chainId" in tx_params: + # v is returned on one byte only so it might have overflowed + # in that case, we will reconstruct it to its full value + trunc_chain_id = tx_params["chainId"] + while trunc_chain_id.bit_length() > 32: + trunc_chain_id >>= 8 + + trunc_target = trunc_chain_id * 2 + 35 + trunc_v = int.from_bytes(vrs[0], "big") + + if (trunc_target & 0xff) == trunc_v: + parity = 0 + elif ((trunc_target + 1) & 0xff) == trunc_v: + parity = 1 + else: + # should have matched with a previous if + assert False + + # https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md + full_v = parity + tx_params["chainId"] * 2 + 35 + # 9 bytes would be big enough even for the biggest chain ID + vrs = (int(full_v).to_bytes(9, "big"), vrs[1], vrs[2]) + else: + # Pre EIP-155 TX + assert False decoded = rlp.decode(raw_tx) - reencoded = rlp.encode(decoded[:-3] + list(vrs)) + reencoded = rlp.encode(decoded[:-3] + list(normalize_vrs(vrs))) addr = Account.recover_transaction(prefix + reencoded) return bytes.fromhex(addr[2:]) diff --git a/doc/eth_contract_support_embedded.adoc b/doc/eth_contract_support_embedded.adoc index 36a582c..629f994 100644 --- a/doc/eth_contract_support_embedded.adoc +++ b/doc/eth_contract_support_embedded.adoc @@ -12,7 +12,7 @@ This document described how a specific device UI for a smart contract can be add ## Standard support -The applications already includes dedicated UI support for those specific contract calls : +The application already includes dedicated UI support for those specific contract calls : * ERC 20 approve(address, uint256) - implementation in *src_features/erc20_approval* * ERC 20 transfer(address, uint256) - implementation in *src_features/signTx* @@ -45,4 +45,3 @@ A UI implementation might want to convert an ERC 20 token contract address to a 2 tickers can be temporarily provisioned to the application by using the PROVIDE ERC 20 TOKEN INFORMATION APDU, described in *src_features/provideErc20TokenInformation* - the UI can then iterate on the provisioned tickers to display relevant information to the user The same mechanism will be extended to support well known contract addresses in the future - diff --git a/doc/ethapp.adoc b/doc/ethapp.adoc index 4e5c646..35a0d98 100644 --- a/doc/ethapp.adoc +++ b/doc/ethapp.adoc @@ -41,6 +41,10 @@ Application version 1.9.19 - 2022-05-17 ### 1.10.2 - Add domain names support +### 1.11.0 + - Add EIP-712 amount & date/time filtering + - PROVIDE ERC 20 TOKEN INFORMATION & PROVIDE NFT INFORMATION now send back the index where the asset has been stored + ## About This application describes the APDU messages interface to communicate with the Ethereum application. @@ -267,34 +271,38 @@ The signature is computed on ticker || address || number of decimals (uint4be) || chainId (uint4be) -signed by the following secp256k1 public key 0482bbf2f34f367b2e5bc21847b6566f21f0976b22d3388a9a5e446ac62d25cf725b62a2555b2dd464a4da0ab2f4d506820543af1d242470b1b1a969a27578f353 +signed by the following secp256k1 public key 045e6c1020c14dc46442fe89f97c0b68cdb15976dc24f24c316e7b30fe4e8cc76b1489150c21514ebf440ff5dea5393d83de5358cd098fce8fd0f81daa94979183 #### Coding 'Command' [width="80%"] -|============================================================================================================================== +|====================================================================== | *CLA* | *INS* | *P1* | *P2* | *Lc* | *Le* -| E0 | 0A | 00 | 00 | variable | 00 -|============================================================================================================================== +| E0 | 0A | 00 | 00 | variable | 00 +|====================================================================== 'Input data' [width="80%"] -|============================================================================================================================== -| *Description* | *Length* -| Length of ERC 20 ticker | 1 -| ERC 20 ticker | variable -| ERC 20 contract address | 20 -| Number of decimals (big endian encoded) | 4 -| Chain ID (big endian encoded) | 4 -| Token information signature | variable -|============================================================================================================================== +|======================================================================= +| *Description* | *Length* +| Length of ERC 20 ticker | 1 +| ERC 20 ticker | variable +| ERC 20 contract address | 20 +| Number of decimals (big endian encoded) | 4 +| Chain ID (big endian encoded) | 4 +| Token information signature | variable +|======================================================================= 'Output data' -None +[width="80%"] +|==================================================================== +| *Description* | *Length* +| Asset index where the information has been stored | 1 +|==================================================================== ### SIGN ETH EIP 712 @@ -509,7 +517,11 @@ type || version || len(collectionName) || collectionName || address || chainId | 'Output data' -None +[width="80%"] +|==================================================================== +| *Description* | *Length* +| Asset index where the information has been stored | 1 +|==================================================================== ### SET PLUGIN @@ -801,7 +813,7 @@ None This command provides a trusted way of deciding what information from the JSON data to show and replace some values by more meaningful ones. -This mode can be overriden by the in-app setting to fully clear-sign EIP-712 messages. +This mode can be overridden by the in-app setting to fully clear-sign EIP-712 messages. For the signatures : @@ -825,10 +837,36 @@ The signature is computed on : 183 || chain ID (BE) || contract address || schema hash || filters count || display name +##### Amount-join token -##### Show field +This command should come before the corresponding *SEND STRUCT IMPLEMENTATION* and are only usable for message fields (and not domain ones). +The first byte is used so that a signature of one type cannot be valid as another type. -These commands should come before the corresponding *SEND STRUCT IMPLEMENTATION* and are only usable for message fields (and not domain ones). +The signature is computed on : + +11 || chain ID (BE) || contract address || schema hash || field path || token index + +##### Amount-join value + +This command should come before the corresponding *SEND STRUCT IMPLEMENTATION* and are only usable for message fields (and not domain ones). + +A token index of 0xFF indicates the token address is in the _verifyingContract_ field of the EIP712Domain so the app won't receive an amount-join token filtering APDU. This enables support for Permit (ERC-2612) messages. + +The signature is computed on : + +22 || chain ID (BE) || contract address || schema hash || field path || display name || token index + +##### Date / Time + +This command should come before the corresponding *SEND STRUCT IMPLEMENTATION* and are only usable for message fields (and not domain ones). + +The signature is computed on : + +33 || chain ID (BE) || contract address || schema hash || field path || display name + +##### Show raw field + +This command should come before the corresponding *SEND STRUCT IMPLEMENTATION* and are only usable for message fields (and not domain ones). The first byte is used so that a signature of one type cannot be valid as another type. The signature is computed on : @@ -843,17 +881,23 @@ _Command_ |========================================================================= | *CLA* | *INS* | *P1* | *P2* | *LC* | *Le* | E0 | 1E | 00 - | 00 : activate + | 00 : activation 0F : message info - FF : show field + FC : date/time + + FD : amount-join token + + FE : amount-join value + + FF : raw field | variable | variable |========================================================================= _Input data_ -##### If P2 == activate +##### If P2 == activation None @@ -869,7 +913,40 @@ None | Signature | variable |========================================== -##### If P2 == show field +##### If P2 == date / time + +[width="80%"] +|========================================== +| *Description* | *Length (byte)* +| Display name length | 1 +| Display name | variable +| Signature length | 1 +| Signature | variable +|========================================== + +##### If P2 == amount-join token + +[width="80%"] +|========================================== +| *Description* | *Length (byte)* +| Token index | 1 +| Signature length | 1 +| Signature | variable +|========================================== + +##### If P2 == amount-join value + +[width="80%"] +|========================================== +| *Description* | *Length (byte)* +| Display name length | 1 +| Display name | variable +| Token index | 1 +| Signature length | 1 +| Signature | variable +|========================================== + +##### If P2 == show raw field [width="80%"] |========================================== diff --git a/doc/ethapp_plugins.adoc b/doc/ethapp_plugins.adoc index 886928a..3e2bcbd 100644 --- a/doc/ethapp_plugins.adoc +++ b/doc/ethapp_plugins.adoc @@ -85,8 +85,6 @@ typedef struct ethPluginInitContract_t { uint8_t *selector; // 4 bytes selector uint32_t dataSize; - char *alias; // 29 bytes alias if ETH_PLUGIN_RESULT_OK_ALIAS set - uint8_t result; } ethPluginInitContract_t; @@ -102,7 +100,6 @@ This message is sent when the selector of the data has been parsed. The followin The following return codes are expected, any other will abort the signing process : * ETH_PLUGIN_RESULT_OK : if the plugin can be successfully initialized - * ETH_PLUGIN_RESULT_OK_ALIAS : if a base64 encoded alias of another plugin to call is copied to the _alias_ field. In this case, the dispatcher will follow the alias chain, and the original plugin will only be called to retrieve its name when using a generic user interface * ETH_PLUGIN_RESULT_FALLBACK : if the signing logic should fallback to the generic one ### ETH_PLUGIN_PROVIDE_PARAMETER diff --git a/ethereum-plugin-sdk b/ethereum-plugin-sdk index 0a98664..0afd2a9 160000 --- a/ethereum-plugin-sdk +++ b/ethereum-plugin-sdk @@ -1 +1 @@ -Subproject commit 0a98664deba849f05a51407d8a3edb05cd83d464 +Subproject commit 0afd2a969eb23e8a508560e0e308dc51fb9219e0 diff --git a/examples/signMessageEIP711v0.py b/examples/signMessageEIP711v0.py index 97b8ef1..cbe6595 100755 --- a/examples/signMessageEIP711v0.py +++ b/examples/signMessageEIP711v0.py @@ -59,7 +59,7 @@ if args.path == None: domainHash = binascii.unhexlify(args.domainHash) messageHash = binascii.unhexlify(args.messageHash) -encodedTx = domainHash + messageHash +encodedTx = domainHash + messageHash donglePath = parse_bip32_path(args.path) apdu = bytearray.fromhex("e00c0000") diff --git a/glyphs/stax_chain_100_64px.gif b/glyphs/chain_100_64px.gif similarity index 100% rename from glyphs/stax_chain_100_64px.gif rename to glyphs/chain_100_64px.gif diff --git a/glyphs/chain_10200_64px.gif b/glyphs/chain_10200_64px.gif new file mode 120000 index 0000000..ef9ba12 --- /dev/null +++ b/glyphs/chain_10200_64px.gif @@ -0,0 +1 @@ +chain_100_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_1030_64px.gif b/glyphs/chain_1030_64px.gif similarity index 100% rename from glyphs/stax_chain_1030_64px.gif rename to glyphs/chain_1030_64px.gif diff --git a/glyphs/chain_10507_64px.gif b/glyphs/chain_10507_64px.gif new file mode 100644 index 0000000..4cabc80 Binary files /dev/null and b/glyphs/chain_10507_64px.gif differ diff --git a/glyphs/stax_chain_106_64px.gif b/glyphs/chain_106_64px.gif similarity index 100% rename from glyphs/stax_chain_106_64px.gif rename to glyphs/chain_106_64px.gif diff --git a/glyphs/stax_chain_1088_64px.gif b/glyphs/chain_1088_64px.gif similarity index 100% rename from glyphs/stax_chain_1088_64px.gif rename to glyphs/chain_1088_64px.gif diff --git a/glyphs/stax_chain_108_64px.gif b/glyphs/chain_108_64px.gif similarity index 100% rename from glyphs/stax_chain_108_64px.gif rename to glyphs/chain_108_64px.gif diff --git a/glyphs/stax_chain_10_64px.gif b/glyphs/chain_10_64px.gif similarity index 100% rename from glyphs/stax_chain_10_64px.gif rename to glyphs/chain_10_64px.gif diff --git a/glyphs/chain_1101_64px.gif b/glyphs/chain_1101_64px.gif new file mode 120000 index 0000000..df4078d --- /dev/null +++ b/glyphs/chain_1101_64px.gif @@ -0,0 +1 @@ +chain_137_64px.gif \ No newline at end of file diff --git a/glyphs/chain_11155111_64px.gif b/glyphs/chain_11155111_64px.gif new file mode 120000 index 0000000..b955e47 --- /dev/null +++ b/glyphs/chain_11155111_64px.gif @@ -0,0 +1 @@ +chain_1_64px.gif \ No newline at end of file diff --git a/glyphs/chain_11155420_64px.gif b/glyphs/chain_11155420_64px.gif new file mode 120000 index 0000000..dd99baf --- /dev/null +++ b/glyphs/chain_11155420_64px.gif @@ -0,0 +1 @@ +chain_10_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_1116_64px.gif b/glyphs/chain_1116_64px.gif similarity index 100% rename from glyphs/stax_chain_1116_64px.gif rename to glyphs/chain_1116_64px.gif diff --git a/glyphs/stax_chain_11297108109_64px.gif b/glyphs/chain_11297108109_64px.gif similarity index 100% rename from glyphs/stax_chain_11297108109_64px.gif rename to glyphs/chain_11297108109_64px.gif diff --git a/glyphs/chain_1135_64px.gif b/glyphs/chain_1135_64px.gif new file mode 100644 index 0000000..a2cbf5e Binary files /dev/null and b/glyphs/chain_1135_64px.gif differ diff --git a/glyphs/stax_chain_1284_64px.gif b/glyphs/chain_1284_64px.gif similarity index 100% rename from glyphs/stax_chain_1284_64px.gif rename to glyphs/chain_1284_64px.gif diff --git a/glyphs/stax_chain_1285_64px.gif b/glyphs/chain_1285_64px.gif similarity index 100% rename from glyphs/stax_chain_1285_64px.gif rename to glyphs/chain_1285_64px.gif diff --git a/glyphs/stax_chain_1313114_64px.gif b/glyphs/chain_1313114_64px.gif similarity index 100% rename from glyphs/stax_chain_1313114_64px.gif rename to glyphs/chain_1313114_64px.gif diff --git a/glyphs/stax_chain_137_64px.gif b/glyphs/chain_137_64px.gif similarity index 100% rename from glyphs/stax_chain_137_64px.gif rename to glyphs/chain_137_64px.gif diff --git a/glyphs/stax_chain_14_64px.gif b/glyphs/chain_14_64px.gif similarity index 100% rename from glyphs/stax_chain_14_64px.gif rename to glyphs/chain_14_64px.gif diff --git a/glyphs/stax_chain_1620_64px.gif b/glyphs/chain_1620_64px.gif similarity index 100% rename from glyphs/stax_chain_1620_64px.gif rename to glyphs/chain_1620_64px.gif diff --git a/glyphs/chain_168587773_64px.gif b/glyphs/chain_168587773_64px.gif new file mode 120000 index 0000000..f95b095 --- /dev/null +++ b/glyphs/chain_168587773_64px.gif @@ -0,0 +1 @@ +chain_81457_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_16_64px.gif b/glyphs/chain_16_64px.gif similarity index 100% rename from glyphs/stax_chain_16_64px.gif rename to glyphs/chain_16_64px.gif diff --git a/glyphs/chain_17000_64px.gif b/glyphs/chain_17000_64px.gif new file mode 120000 index 0000000..b955e47 --- /dev/null +++ b/glyphs/chain_17000_64px.gif @@ -0,0 +1 @@ +chain_1_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_1818_64px.gif b/glyphs/chain_1818_64px.gif similarity index 100% rename from glyphs/stax_chain_1818_64px.gif rename to glyphs/chain_1818_64px.gif diff --git a/glyphs/chain_1907_64px.gif b/glyphs/chain_1907_64px.gif new file mode 100644 index 0000000..f2ddefc Binary files /dev/null and b/glyphs/chain_1907_64px.gif differ diff --git a/glyphs/stax_chain_196_64px.gif b/glyphs/chain_196_64px.gif similarity index 100% rename from glyphs/stax_chain_196_64px.gif rename to glyphs/chain_196_64px.gif diff --git a/glyphs/stax_chain_1987_64px.gif b/glyphs/chain_1987_64px.gif similarity index 100% rename from glyphs/stax_chain_1987_64px.gif rename to glyphs/chain_1987_64px.gif diff --git a/glyphs/stax_chain_199_64px.gif b/glyphs/chain_199_64px.gif similarity index 100% rename from glyphs/stax_chain_199_64px.gif rename to glyphs/chain_199_64px.gif diff --git a/glyphs/stax_chain_19_64px.gif b/glyphs/chain_19_64px.gif similarity index 100% rename from glyphs/stax_chain_19_64px.gif rename to glyphs/chain_19_64px.gif diff --git a/glyphs/stax_chain_1_64px.gif b/glyphs/chain_1_64px.gif similarity index 100% rename from glyphs/stax_chain_1_64px.gif rename to glyphs/chain_1_64px.gif diff --git a/glyphs/stax_chain_200625_64px.gif b/glyphs/chain_200625_64px.gif similarity index 100% rename from glyphs/stax_chain_200625_64px.gif rename to glyphs/chain_200625_64px.gif diff --git a/glyphs/chain_20531811_64px.gif b/glyphs/chain_20531811_64px.gif new file mode 120000 index 0000000..b032993 --- /dev/null +++ b/glyphs/chain_20531811_64px.gif @@ -0,0 +1 @@ +chain_20531812_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_20531811_64px.gif b/glyphs/chain_20531812_64px.gif similarity index 100% rename from glyphs/stax_chain_20531811_64px.gif rename to glyphs/chain_20531812_64px.gif diff --git a/glyphs/stax_chain_2222_64px.gif b/glyphs/chain_2222_64px.gif similarity index 100% rename from glyphs/stax_chain_2222_64px.gif rename to glyphs/chain_2222_64px.gif diff --git a/glyphs/stax_chain_237_64px.gif b/glyphs/chain_237_64px.gif similarity index 100% rename from glyphs/stax_chain_237_64px.gif rename to glyphs/chain_237_64px.gif diff --git a/glyphs/stax_chain_24484_64px.gif b/glyphs/chain_24484_64px.gif similarity index 100% rename from glyphs/stax_chain_24484_64px.gif rename to glyphs/chain_24484_64px.gif diff --git a/glyphs/chain_245022926_64px.gif b/glyphs/chain_245022926_64px.gif new file mode 120000 index 0000000..ee1050d --- /dev/null +++ b/glyphs/chain_245022926_64px.gif @@ -0,0 +1 @@ +chain_245022934_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_245022926_64px.gif b/glyphs/chain_245022934_64px.gif similarity index 100% rename from glyphs/stax_chain_245022926_64px.gif rename to glyphs/chain_245022934_64px.gif diff --git a/glyphs/stax_chain_246529_64px.gif b/glyphs/chain_246529_64px.gif similarity index 100% rename from glyphs/stax_chain_246529_64px.gif rename to glyphs/chain_246529_64px.gif diff --git a/glyphs/stax_chain_246785_64px.gif b/glyphs/chain_246785_64px.gif similarity index 100% rename from glyphs/stax_chain_246785_64px.gif rename to glyphs/chain_246785_64px.gif diff --git a/glyphs/stax_chain_246_64px.gif b/glyphs/chain_246_64px.gif similarity index 100% rename from glyphs/stax_chain_246_64px.gif rename to glyphs/chain_246_64px.gif diff --git a/glyphs/stax_chain_248_64px.gif b/glyphs/chain_248_64px.gif similarity index 100% rename from glyphs/stax_chain_248_64px.gif rename to glyphs/chain_248_64px.gif diff --git a/glyphs/stax_chain_24_64px.gif b/glyphs/chain_24_64px.gif similarity index 100% rename from glyphs/stax_chain_24_64px.gif rename to glyphs/chain_24_64px.gif diff --git a/glyphs/stax_chain_250_64px.gif b/glyphs/chain_250_64px.gif similarity index 100% rename from glyphs/stax_chain_250_64px.gif rename to glyphs/chain_250_64px.gif diff --git a/glyphs/stax_chain_25_64px.gif b/glyphs/chain_25_64px.gif similarity index 100% rename from glyphs/stax_chain_25_64px.gif rename to glyphs/chain_25_64px.gif diff --git a/glyphs/stax_chain_269_64px.gif b/glyphs/chain_269_64px.gif similarity index 100% rename from glyphs/stax_chain_269_64px.gif rename to glyphs/chain_269_64px.gif diff --git a/glyphs/stax_chain_288_64px.gif b/glyphs/chain_288_64px.gif similarity index 100% rename from glyphs/stax_chain_288_64px.gif rename to glyphs/chain_288_64px.gif diff --git a/glyphs/stax_chain_2894_64px.gif b/glyphs/chain_2894_64px.gif similarity index 100% rename from glyphs/stax_chain_2894_64px.gif rename to glyphs/chain_2894_64px.gif diff --git a/glyphs/stax_chain_2_64px.gif b/glyphs/chain_2_64px.gif similarity index 100% rename from glyphs/stax_chain_2_64px.gif rename to glyphs/chain_2_64px.gif diff --git a/glyphs/chain_300_64px.gif b/glyphs/chain_300_64px.gif new file mode 120000 index 0000000..a1e5f2b --- /dev/null +++ b/glyphs/chain_300_64px.gif @@ -0,0 +1 @@ +chain_324_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_30_64px.gif b/glyphs/chain_30_64px.gif similarity index 100% rename from glyphs/stax_chain_30_64px.gif rename to glyphs/chain_30_64px.gif diff --git a/glyphs/stax_chain_31102_64px.gif b/glyphs/chain_31102_64px.gif similarity index 100% rename from glyphs/stax_chain_31102_64px.gif rename to glyphs/chain_31102_64px.gif diff --git a/glyphs/stax_chain_3125659152_64px.gif b/glyphs/chain_3125659152_64px.gif similarity index 100% rename from glyphs/stax_chain_3125659152_64px.gif rename to glyphs/chain_3125659152_64px.gif diff --git a/glyphs/stax_chain_31_64px.gif b/glyphs/chain_31_64px.gif similarity index 100% rename from glyphs/stax_chain_31_64px.gif rename to glyphs/chain_31_64px.gif diff --git a/glyphs/stax_chain_321_64px.gif b/glyphs/chain_321_64px.gif similarity index 100% rename from glyphs/stax_chain_321_64px.gif rename to glyphs/chain_321_64px.gif diff --git a/glyphs/chain_324_64px.gif b/glyphs/chain_324_64px.gif new file mode 100644 index 0000000..656bc77 Binary files /dev/null and b/glyphs/chain_324_64px.gif differ diff --git a/glyphs/stax_chain_336_64px.gif b/glyphs/chain_336_64px.gif similarity index 100% rename from glyphs/stax_chain_336_64px.gif rename to glyphs/chain_336_64px.gif diff --git a/glyphs/stax_chain_369_64px.gif b/glyphs/chain_369_64px.gif similarity index 100% rename from glyphs/stax_chain_369_64px.gif rename to glyphs/chain_369_64px.gif diff --git a/glyphs/chain_3776_64px.gif b/glyphs/chain_3776_64px.gif new file mode 100644 index 0000000..b155234 Binary files /dev/null and b/glyphs/chain_3776_64px.gif differ diff --git a/glyphs/stax_chain_39797_64px.gif b/glyphs/chain_39797_64px.gif similarity index 100% rename from glyphs/stax_chain_39797_64px.gif rename to glyphs/chain_39797_64px.gif diff --git a/glyphs/chain_3_64px.gif b/glyphs/chain_3_64px.gif new file mode 120000 index 0000000..b955e47 --- /dev/null +++ b/glyphs/chain_3_64px.gif @@ -0,0 +1 @@ +chain_1_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_401697_64px.gif b/glyphs/chain_401697_64px.gif similarity index 100% rename from glyphs/stax_chain_401697_64px.gif rename to glyphs/chain_401697_64px.gif diff --git a/glyphs/chain_40_64px.gif b/glyphs/chain_40_64px.gif new file mode 100644 index 0000000..f245b1b Binary files /dev/null and b/glyphs/chain_40_64px.gif differ diff --git a/glyphs/chain_4201_64px.gif b/glyphs/chain_4201_64px.gif new file mode 120000 index 0000000..02328c5 --- /dev/null +++ b/glyphs/chain_4201_64px.gif @@ -0,0 +1 @@ +chain_42_64px.gif \ No newline at end of file diff --git a/glyphs/chain_4202_64px.gif b/glyphs/chain_4202_64px.gif new file mode 120000 index 0000000..058413f --- /dev/null +++ b/glyphs/chain_4202_64px.gif @@ -0,0 +1 @@ +chain_1135_64px.gif \ No newline at end of file diff --git a/glyphs/chain_421614_64px.gif b/glyphs/chain_421614_64px.gif new file mode 120000 index 0000000..7423366 --- /dev/null +++ b/glyphs/chain_421614_64px.gif @@ -0,0 +1 @@ +chain_42161_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_42161_64px.gif b/glyphs/chain_42161_64px.gif similarity index 100% rename from glyphs/stax_chain_42161_64px.gif rename to glyphs/chain_42161_64px.gif diff --git a/glyphs/chain_42220_64px.gif b/glyphs/chain_42220_64px.gif new file mode 100644 index 0000000..12216a6 Binary files /dev/null and b/glyphs/chain_42220_64px.gif differ diff --git a/glyphs/chain_42793_64px.gif b/glyphs/chain_42793_64px.gif new file mode 100644 index 0000000..22e3b42 Binary files /dev/null and b/glyphs/chain_42793_64px.gif differ diff --git a/glyphs/stax_chain_4201_64px.gif b/glyphs/chain_42_64px.gif similarity index 100% rename from glyphs/stax_chain_4201_64px.gif rename to glyphs/chain_42_64px.gif diff --git a/glyphs/stax_chain_43114_64px.gif b/glyphs/chain_43114_64px.gif similarity index 100% rename from glyphs/stax_chain_43114_64px.gif rename to glyphs/chain_43114_64px.gif diff --git a/glyphs/chain_44787_64px.gif b/glyphs/chain_44787_64px.gif new file mode 120000 index 0000000..3d39862 --- /dev/null +++ b/glyphs/chain_44787_64px.gif @@ -0,0 +1 @@ +chain_42220_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_4919_64px.gif b/glyphs/chain_4919_64px.gif similarity index 100% rename from glyphs/stax_chain_4919_64px.gif rename to glyphs/chain_4919_64px.gif diff --git a/glyphs/chain_4_64px.gif b/glyphs/chain_4_64px.gif new file mode 120000 index 0000000..b955e47 --- /dev/null +++ b/glyphs/chain_4_64px.gif @@ -0,0 +1 @@ +chain_1_64px.gif \ No newline at end of file diff --git a/glyphs/chain_5000_64px.gif b/glyphs/chain_5000_64px.gif new file mode 100644 index 0000000..90ce7bf Binary files /dev/null and b/glyphs/chain_5000_64px.gif differ diff --git a/glyphs/chain_5003_64px.gif b/glyphs/chain_5003_64px.gif new file mode 120000 index 0000000..4533c5c --- /dev/null +++ b/glyphs/chain_5003_64px.gif @@ -0,0 +1 @@ +chain_5000_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_50_64px.gif b/glyphs/chain_50_64px.gif similarity index 100% rename from glyphs/stax_chain_50_64px.gif rename to glyphs/chain_50_64px.gif diff --git a/glyphs/stax_chain_51_64px.gif b/glyphs/chain_51_64px.gif similarity index 100% rename from glyphs/stax_chain_51_64px.gif rename to glyphs/chain_51_64px.gif diff --git a/glyphs/chain_5201420_64px.gif b/glyphs/chain_5201420_64px.gif new file mode 120000 index 0000000..f8d77c7 --- /dev/null +++ b/glyphs/chain_5201420_64px.gif @@ -0,0 +1 @@ +chain_52014_64px.gif \ No newline at end of file diff --git a/glyphs/chain_52014_64px.gif b/glyphs/chain_52014_64px.gif new file mode 100644 index 0000000..51eaec4 Binary files /dev/null and b/glyphs/chain_52014_64px.gif differ diff --git a/glyphs/chain_534351_64px.gif b/glyphs/chain_534351_64px.gif new file mode 120000 index 0000000..87a6345 --- /dev/null +++ b/glyphs/chain_534351_64px.gif @@ -0,0 +1 @@ +chain_534352_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_534351_64px.gif b/glyphs/chain_534352_64px.gif similarity index 100% rename from glyphs/stax_chain_534351_64px.gif rename to glyphs/chain_534352_64px.gif diff --git a/glyphs/chain_534353_64px.gif b/glyphs/chain_534353_64px.gif new file mode 120000 index 0000000..87a6345 --- /dev/null +++ b/glyphs/chain_534353_64px.gif @@ -0,0 +1 @@ +chain_534352_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_534354_64px.gif b/glyphs/chain_534354_64px.gif similarity index 100% rename from glyphs/stax_chain_534354_64px.gif rename to glyphs/chain_534354_64px.gif diff --git a/glyphs/stax_chain_56_64px.gif b/glyphs/chain_56_64px.gif similarity index 100% rename from glyphs/stax_chain_56_64px.gif rename to glyphs/chain_56_64px.gif diff --git a/glyphs/stax_chain_57_64px.gif b/glyphs/chain_57_64px.gif similarity index 100% rename from glyphs/stax_chain_57_64px.gif rename to glyphs/chain_57_64px.gif diff --git a/glyphs/chain_59141_64px.gif b/glyphs/chain_59141_64px.gif new file mode 120000 index 0000000..aa34b0c --- /dev/null +++ b/glyphs/chain_59141_64px.gif @@ -0,0 +1 @@ +chain_59144_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_59144_64px.gif b/glyphs/chain_59144_64px.gif similarity index 100% rename from glyphs/stax_chain_59144_64px.gif rename to glyphs/chain_59144_64px.gif diff --git a/glyphs/stax_chain_592_64px.gif b/glyphs/chain_592_64px.gif similarity index 100% rename from glyphs/stax_chain_592_64px.gif rename to glyphs/chain_592_64px.gif diff --git a/glyphs/stax_chain_5_64px.gif b/glyphs/chain_5_64px.gif similarity index 100% rename from glyphs/stax_chain_5_64px.gif rename to glyphs/chain_5_64px.gif diff --git a/glyphs/chain_60808_64px.gif b/glyphs/chain_60808_64px.gif new file mode 100644 index 0000000..83306f4 Binary files /dev/null and b/glyphs/chain_60808_64px.gif differ diff --git a/glyphs/stax_chain_60_64px.gif b/glyphs/chain_60_64px.gif similarity index 100% rename from glyphs/stax_chain_60_64px.gif rename to glyphs/chain_60_64px.gif diff --git a/glyphs/stax_chain_61_64px.gif b/glyphs/chain_61_64px.gif similarity index 100% rename from glyphs/stax_chain_61_64px.gif rename to glyphs/chain_61_64px.gif diff --git a/glyphs/chain_62320_64px.gif b/glyphs/chain_62320_64px.gif new file mode 120000 index 0000000..3d39862 --- /dev/null +++ b/glyphs/chain_62320_64px.gif @@ -0,0 +1 @@ +chain_42220_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_62621_64px.gif b/glyphs/chain_62621_64px.gif similarity index 100% rename from glyphs/stax_chain_62621_64px.gif rename to glyphs/chain_62621_64px.gif diff --git a/glyphs/stax_chain_64_64px.gif b/glyphs/chain_64_64px.gif similarity index 100% rename from glyphs/stax_chain_64_64px.gif rename to glyphs/chain_64_64px.gif diff --git a/glyphs/stax_chain_66_64px.gif b/glyphs/chain_66_64px.gif similarity index 100% rename from glyphs/stax_chain_66_64px.gif rename to glyphs/chain_66_64px.gif diff --git a/glyphs/chain_7000_64px.gif b/glyphs/chain_7000_64px.gif new file mode 100644 index 0000000..41163c7 Binary files /dev/null and b/glyphs/chain_7000_64px.gif differ diff --git a/glyphs/stax_chain_7171_64px.gif b/glyphs/chain_7171_64px.gif similarity index 100% rename from glyphs/stax_chain_7171_64px.gif rename to glyphs/chain_7171_64px.gif diff --git a/glyphs/stax_chain_7341_64px.gif b/glyphs/chain_7341_64px.gif similarity index 100% rename from glyphs/stax_chain_7341_64px.gif rename to glyphs/chain_7341_64px.gif diff --git a/glyphs/stax_chain_73799_64px.gif b/glyphs/chain_73799_64px.gif similarity index 100% rename from glyphs/stax_chain_73799_64px.gif rename to glyphs/chain_73799_64px.gif diff --git a/glyphs/stax_chain_76_64px.gif b/glyphs/chain_76_64px.gif similarity index 100% rename from glyphs/stax_chain_76_64px.gif rename to glyphs/chain_76_64px.gif diff --git a/glyphs/stax_chain_7762959_64px.gif b/glyphs/chain_7762959_64px.gif similarity index 100% rename from glyphs/stax_chain_7762959_64px.gif rename to glyphs/chain_7762959_64px.gif diff --git a/glyphs/stax_chain_78_64px.gif b/glyphs/chain_78_64px.gif similarity index 100% rename from glyphs/stax_chain_78_64px.gif rename to glyphs/chain_78_64px.gif diff --git a/glyphs/chain_81457_64px.gif b/glyphs/chain_81457_64px.gif new file mode 100644 index 0000000..e24684e Binary files /dev/null and b/glyphs/chain_81457_64px.gif differ diff --git a/glyphs/stax_chain_820_64px.gif b/glyphs/chain_820_64px.gif similarity index 100% rename from glyphs/stax_chain_820_64px.gif rename to glyphs/chain_820_64px.gif diff --git a/glyphs/stax_chain_8217_64px.gif b/glyphs/chain_8217_64px.gif similarity index 100% rename from glyphs/stax_chain_8217_64px.gif rename to glyphs/chain_8217_64px.gif diff --git a/glyphs/stax_chain_82_64px.gif b/glyphs/chain_82_64px.gif similarity index 100% rename from glyphs/stax_chain_82_64px.gif rename to glyphs/chain_82_64px.gif diff --git a/glyphs/chain_84532_64px.gif b/glyphs/chain_84532_64px.gif new file mode 120000 index 0000000..b4a5272 --- /dev/null +++ b/glyphs/chain_84532_64px.gif @@ -0,0 +1 @@ +chain_8453_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_8453_64px.gif b/glyphs/chain_8453_64px.gif similarity index 100% rename from glyphs/stax_chain_8453_64px.gif rename to glyphs/chain_8453_64px.gif diff --git a/glyphs/stax_chain_846000_64px.gif b/glyphs/chain_846000_64px.gif similarity index 100% rename from glyphs/stax_chain_846000_64px.gif rename to glyphs/chain_846000_64px.gif diff --git a/glyphs/stax_chain_888_64px.gif b/glyphs/chain_888_64px.gif similarity index 100% rename from glyphs/stax_chain_888_64px.gif rename to glyphs/chain_888_64px.gif diff --git a/glyphs/stax_chain_88_64px.gif b/glyphs/chain_88_64px.gif similarity index 100% rename from glyphs/stax_chain_88_64px.gif rename to glyphs/chain_88_64px.gif diff --git a/glyphs/stax_chain_8_64px.gif b/glyphs/chain_8_64px.gif similarity index 100% rename from glyphs/stax_chain_8_64px.gif rename to glyphs/chain_8_64px.gif diff --git a/glyphs/stax_chain_9001_64px.gif b/glyphs/chain_9001_64px.gif similarity index 100% rename from glyphs/stax_chain_9001_64px.gif rename to glyphs/chain_9001_64px.gif diff --git a/glyphs/stax_chain_99_64px.gif b/glyphs/chain_99_64px.gif similarity index 100% rename from glyphs/stax_chain_99_64px.gif rename to glyphs/chain_99_64px.gif diff --git a/glyphs/stax_chain_10200_64px.gif b/glyphs/stax_chain_10200_64px.gif deleted file mode 100644 index 87d0da7..0000000 Binary files a/glyphs/stax_chain_10200_64px.gif and /dev/null differ diff --git a/glyphs/stax_chain_10507_64px.gif b/glyphs/stax_chain_10507_64px.gif deleted file mode 100644 index 287008f..0000000 Binary files a/glyphs/stax_chain_10507_64px.gif and /dev/null differ diff --git a/glyphs/stax_chain_1101_64px.gif b/glyphs/stax_chain_1101_64px.gif deleted file mode 100644 index 662cab0..0000000 Binary files a/glyphs/stax_chain_1101_64px.gif and /dev/null differ diff --git a/glyphs/stax_chain_11155111_64px.gif b/glyphs/stax_chain_11155111_64px.gif deleted file mode 120000 index 8ced0b7..0000000 --- a/glyphs/stax_chain_11155111_64px.gif +++ /dev/null @@ -1 +0,0 @@ -stax_chain_1_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_17000_64px.gif b/glyphs/stax_chain_17000_64px.gif deleted file mode 120000 index 8ced0b7..0000000 --- a/glyphs/stax_chain_17000_64px.gif +++ /dev/null @@ -1 +0,0 @@ -stax_chain_1_64px.gif \ No newline at end of file diff --git a/glyphs/stax_chain_1907_64px.gif b/glyphs/stax_chain_1907_64px.gif deleted file mode 100644 index 543f164..0000000 Binary files a/glyphs/stax_chain_1907_64px.gif and /dev/null differ diff --git a/glyphs/stax_chain_20531812_64px.gif b/glyphs/stax_chain_20531812_64px.gif deleted file mode 100644 index 4fa9b49..0000000 Binary files a/glyphs/stax_chain_20531812_64px.gif and /dev/null differ diff --git a/glyphs/stax_chain_245022934_64px.gif b/glyphs/stax_chain_245022934_64px.gif deleted file mode 100644 index e79f76f..0000000 Binary files a/glyphs/stax_chain_245022934_64px.gif and /dev/null differ diff --git a/glyphs/stax_chain_3_64px.gif b/glyphs/stax_chain_3_64px.gif deleted file mode 100644 index 6025aff..0000000 Binary files a/glyphs/stax_chain_3_64px.gif and /dev/null differ diff --git a/glyphs/stax_chain_40_64px.gif b/glyphs/stax_chain_40_64px.gif deleted file mode 100644 index 151d58d..0000000 Binary files a/glyphs/stax_chain_40_64px.gif and /dev/null differ diff --git a/glyphs/stax_chain_42220_64px.gif b/glyphs/stax_chain_42220_64px.gif deleted file mode 100644 index 2b1370c..0000000 Binary files a/glyphs/stax_chain_42220_64px.gif and /dev/null differ diff --git a/glyphs/stax_chain_42_64px.gif b/glyphs/stax_chain_42_64px.gif deleted file mode 100644 index f91bcb1..0000000 Binary files a/glyphs/stax_chain_42_64px.gif and /dev/null differ diff --git a/glyphs/stax_chain_44787_64px.gif b/glyphs/stax_chain_44787_64px.gif deleted file mode 100644 index 2b1370c..0000000 Binary files a/glyphs/stax_chain_44787_64px.gif and /dev/null differ diff --git a/glyphs/stax_chain_4_64px.gif b/glyphs/stax_chain_4_64px.gif deleted file mode 100644 index 503a95f..0000000 Binary files a/glyphs/stax_chain_4_64px.gif and /dev/null differ diff --git a/glyphs/stax_chain_534352_64px.gif b/glyphs/stax_chain_534352_64px.gif deleted file mode 100644 index 27e9445..0000000 Binary files a/glyphs/stax_chain_534352_64px.gif and /dev/null differ diff --git a/glyphs/stax_chain_534353_64px.gif b/glyphs/stax_chain_534353_64px.gif deleted file mode 100644 index 27e9445..0000000 Binary files a/glyphs/stax_chain_534353_64px.gif and /dev/null differ diff --git a/glyphs/stax_chain_62320_64px.gif b/glyphs/stax_chain_62320_64px.gif deleted file mode 100644 index 2b1370c..0000000 Binary files a/glyphs/stax_chain_62320_64px.gif and /dev/null differ diff --git a/icons/flex_app_chain_1.gif b/icons/flex_app_chain_1.gif new file mode 100644 index 0000000..6aeb7a7 Binary files /dev/null and b/icons/flex_app_chain_1.gif differ diff --git a/icons/flex_app_chain_1030.gif b/icons/flex_app_chain_1030.gif new file mode 100644 index 0000000..6a4039d Binary files /dev/null and b/icons/flex_app_chain_1030.gif differ diff --git a/icons/flex_app_chain_108.gif b/icons/flex_app_chain_108.gif new file mode 100644 index 0000000..1a053ab Binary files /dev/null and b/icons/flex_app_chain_108.gif differ diff --git a/icons/flex_app_chain_1284.gif b/icons/flex_app_chain_1284.gif new file mode 100644 index 0000000..dd919fc Binary files /dev/null and b/icons/flex_app_chain_1284.gif differ diff --git a/icons/flex_app_chain_1285.gif b/icons/flex_app_chain_1285.gif new file mode 100644 index 0000000..f3ef9f4 Binary files /dev/null and b/icons/flex_app_chain_1285.gif differ diff --git a/icons/flex_app_chain_1313114.gif b/icons/flex_app_chain_1313114.gif new file mode 100644 index 0000000..59da10a Binary files /dev/null and b/icons/flex_app_chain_1313114.gif differ diff --git a/icons/flex_app_chain_137.gif b/icons/flex_app_chain_137.gif new file mode 100644 index 0000000..b49f73b Binary files /dev/null and b/icons/flex_app_chain_137.gif differ diff --git a/icons/flex_app_chain_1620.gif b/icons/flex_app_chain_1620.gif new file mode 100644 index 0000000..6815caf Binary files /dev/null and b/icons/flex_app_chain_1620.gif differ diff --git a/icons/flex_app_chain_1818.gif b/icons/flex_app_chain_1818.gif new file mode 100644 index 0000000..6af034e Binary files /dev/null and b/icons/flex_app_chain_1818.gif differ diff --git a/icons/flex_app_chain_19.gif b/icons/flex_app_chain_19.gif new file mode 100644 index 0000000..2e0061d Binary files /dev/null and b/icons/flex_app_chain_19.gif differ diff --git a/icons/flex_app_chain_1987.gif b/icons/flex_app_chain_1987.gif new file mode 100644 index 0000000..0c6c85a Binary files /dev/null and b/icons/flex_app_chain_1987.gif differ diff --git a/icons/flex_app_chain_199.gif b/icons/flex_app_chain_199.gif new file mode 100644 index 0000000..d7d9276 Binary files /dev/null and b/icons/flex_app_chain_199.gif differ diff --git a/icons/flex_app_chain_2.gif b/icons/flex_app_chain_2.gif new file mode 100644 index 0000000..b59d301 Binary files /dev/null and b/icons/flex_app_chain_2.gif differ diff --git a/icons/flex_app_chain_200625.gif b/icons/flex_app_chain_200625.gif new file mode 100644 index 0000000..3fdb32f Binary files /dev/null and b/icons/flex_app_chain_200625.gif differ diff --git a/icons/flex_app_chain_20531811.gif b/icons/flex_app_chain_20531811.gif new file mode 100644 index 0000000..8c09a8d Binary files /dev/null and b/icons/flex_app_chain_20531811.gif differ diff --git a/icons/flex_app_chain_20531812.gif b/icons/flex_app_chain_20531812.gif new file mode 100644 index 0000000..8c09a8d Binary files /dev/null and b/icons/flex_app_chain_20531812.gif differ diff --git a/icons/flex_app_chain_237.gif b/icons/flex_app_chain_237.gif new file mode 100644 index 0000000..224f867 Binary files /dev/null and b/icons/flex_app_chain_237.gif differ diff --git a/icons/flex_app_chain_24.gif b/icons/flex_app_chain_24.gif new file mode 100644 index 0000000..a4f59ce Binary files /dev/null and b/icons/flex_app_chain_24.gif differ diff --git a/icons/flex_app_chain_24484.gif b/icons/flex_app_chain_24484.gif new file mode 100644 index 0000000..d788dd2 Binary files /dev/null and b/icons/flex_app_chain_24484.gif differ diff --git a/icons/flex_app_chain_246.gif b/icons/flex_app_chain_246.gif new file mode 100644 index 0000000..8f29253 Binary files /dev/null and b/icons/flex_app_chain_246.gif differ diff --git a/icons/flex_app_chain_246529.gif b/icons/flex_app_chain_246529.gif new file mode 100644 index 0000000..18860a4 Binary files /dev/null and b/icons/flex_app_chain_246529.gif differ diff --git a/icons/flex_app_chain_246785.gif b/icons/flex_app_chain_246785.gif new file mode 100644 index 0000000..18860a4 Binary files /dev/null and b/icons/flex_app_chain_246785.gif differ diff --git a/icons/flex_app_chain_248.gif b/icons/flex_app_chain_248.gif new file mode 100644 index 0000000..9e5d67f Binary files /dev/null and b/icons/flex_app_chain_248.gif differ diff --git a/icons/flex_app_chain_269.gif b/icons/flex_app_chain_269.gif new file mode 100644 index 0000000..0368902 Binary files /dev/null and b/icons/flex_app_chain_269.gif differ diff --git a/icons/flex_app_chain_2894.gif b/icons/flex_app_chain_2894.gif new file mode 100644 index 0000000..03be8ea Binary files /dev/null and b/icons/flex_app_chain_2894.gif differ diff --git a/icons/flex_app_chain_30.gif b/icons/flex_app_chain_30.gif new file mode 100644 index 0000000..4400f05 Binary files /dev/null and b/icons/flex_app_chain_30.gif differ diff --git a/icons/flex_app_chain_31.gif b/icons/flex_app_chain_31.gif new file mode 100644 index 0000000..4400f05 Binary files /dev/null and b/icons/flex_app_chain_31.gif differ diff --git a/icons/flex_app_chain_31102.gif b/icons/flex_app_chain_31102.gif new file mode 100644 index 0000000..feceebf Binary files /dev/null and b/icons/flex_app_chain_31102.gif differ diff --git a/icons/flex_app_chain_3125659152.gif b/icons/flex_app_chain_3125659152.gif new file mode 100644 index 0000000..dd6b8fb Binary files /dev/null and b/icons/flex_app_chain_3125659152.gif differ diff --git a/icons/flex_app_chain_336.gif b/icons/flex_app_chain_336.gif new file mode 100644 index 0000000..1933788 Binary files /dev/null and b/icons/flex_app_chain_336.gif differ diff --git a/icons/flex_app_chain_50.gif b/icons/flex_app_chain_50.gif new file mode 100644 index 0000000..e2a694f Binary files /dev/null and b/icons/flex_app_chain_50.gif differ diff --git a/icons/flex_app_chain_51.gif b/icons/flex_app_chain_51.gif new file mode 100644 index 0000000..e2a694f Binary files /dev/null and b/icons/flex_app_chain_51.gif differ diff --git a/icons/flex_app_chain_56.gif b/icons/flex_app_chain_56.gif new file mode 100644 index 0000000..1dd9c54 Binary files /dev/null and b/icons/flex_app_chain_56.gif differ diff --git a/icons/flex_app_chain_592.gif b/icons/flex_app_chain_592.gif new file mode 100644 index 0000000..8115113 Binary files /dev/null and b/icons/flex_app_chain_592.gif differ diff --git a/icons/flex_app_chain_60.gif b/icons/flex_app_chain_60.gif new file mode 100644 index 0000000..e081140 Binary files /dev/null and b/icons/flex_app_chain_60.gif differ diff --git a/icons/flex_app_chain_61.gif b/icons/flex_app_chain_61.gif new file mode 100644 index 0000000..b4e93ab Binary files /dev/null and b/icons/flex_app_chain_61.gif differ diff --git a/icons/flex_app_chain_62621.gif b/icons/flex_app_chain_62621.gif new file mode 100644 index 0000000..c8dc407 Binary files /dev/null and b/icons/flex_app_chain_62621.gif differ diff --git a/icons/flex_app_chain_64.gif b/icons/flex_app_chain_64.gif new file mode 100644 index 0000000..99d70f0 Binary files /dev/null and b/icons/flex_app_chain_64.gif differ diff --git a/icons/flex_app_chain_66.gif b/icons/flex_app_chain_66.gif new file mode 100644 index 0000000..f1db75a Binary files /dev/null and b/icons/flex_app_chain_66.gif differ diff --git a/icons/flex_app_chain_7341.gif b/icons/flex_app_chain_7341.gif new file mode 100644 index 0000000..bf6bd61 Binary files /dev/null and b/icons/flex_app_chain_7341.gif differ diff --git a/icons/flex_app_chain_73799.gif b/icons/flex_app_chain_73799.gif new file mode 100644 index 0000000..78e1fb5 Binary files /dev/null and b/icons/flex_app_chain_73799.gif differ diff --git a/icons/flex_app_chain_76.gif b/icons/flex_app_chain_76.gif new file mode 100644 index 0000000..b3f48f7 Binary files /dev/null and b/icons/flex_app_chain_76.gif differ diff --git a/icons/flex_app_chain_7762959.gif b/icons/flex_app_chain_7762959.gif new file mode 100644 index 0000000..35e930a Binary files /dev/null and b/icons/flex_app_chain_7762959.gif differ diff --git a/icons/flex_app_chain_78.gif b/icons/flex_app_chain_78.gif new file mode 100644 index 0000000..7507998 Binary files /dev/null and b/icons/flex_app_chain_78.gif differ diff --git a/icons/flex_app_chain_8.gif b/icons/flex_app_chain_8.gif new file mode 100644 index 0000000..88bab22 Binary files /dev/null and b/icons/flex_app_chain_8.gif differ diff --git a/icons/flex_app_chain_82.gif b/icons/flex_app_chain_82.gif new file mode 100644 index 0000000..d7cd90b Binary files /dev/null and b/icons/flex_app_chain_82.gif differ diff --git a/icons/flex_app_chain_820.gif b/icons/flex_app_chain_820.gif new file mode 100644 index 0000000..86a2c5a Binary files /dev/null and b/icons/flex_app_chain_820.gif differ diff --git a/icons/flex_app_chain_846000.gif b/icons/flex_app_chain_846000.gif new file mode 100644 index 0000000..c7babb5 Binary files /dev/null and b/icons/flex_app_chain_846000.gif differ diff --git a/icons/flex_app_chain_88.gif b/icons/flex_app_chain_88.gif new file mode 100644 index 0000000..e379af4 Binary files /dev/null and b/icons/flex_app_chain_88.gif differ diff --git a/icons/flex_app_chain_888.gif b/icons/flex_app_chain_888.gif new file mode 100644 index 0000000..585536a Binary files /dev/null and b/icons/flex_app_chain_888.gif differ diff --git a/icons/flex_app_chain_99.gif b/icons/flex_app_chain_99.gif new file mode 100644 index 0000000..cd615c5 Binary files /dev/null and b/icons/flex_app_chain_99.gif differ diff --git a/icons/nanos_app_chain_14.gif b/icons/nanos_app_chain_14.gif deleted file mode 100644 index e90dc8a..0000000 Binary files a/icons/nanos_app_chain_14.gif and /dev/null differ diff --git a/icons/nanos_app_chain_16.gif b/icons/nanos_app_chain_16.gif deleted file mode 100644 index 584b1dc..0000000 Binary files a/icons/nanos_app_chain_16.gif and /dev/null differ diff --git a/icons/nanos_app_chain_19.gif b/icons/nanos_app_chain_19.gif index 302030b..6af1721 100644 Binary files a/icons/nanos_app_chain_19.gif and b/icons/nanos_app_chain_19.gif differ diff --git a/icons/nanos_app_chain_20531811.gif b/icons/nanos_app_chain_20531811.gif index 367ccf4..8f94d1d 100644 Binary files a/icons/nanos_app_chain_20531811.gif and b/icons/nanos_app_chain_20531811.gif differ diff --git a/icons/nanos_app_chain_20531812.gif b/icons/nanos_app_chain_20531812.gif index 367ccf4..8f94d1d 100644 Binary files a/icons/nanos_app_chain_20531812.gif and b/icons/nanos_app_chain_20531812.gif differ diff --git a/icons/nanos_app_chain_246.gif b/icons/nanos_app_chain_246.gif new file mode 100644 index 0000000..e2b44ca Binary files /dev/null and b/icons/nanos_app_chain_246.gif differ diff --git a/icons/nanos_app_chain_269.gif b/icons/nanos_app_chain_269.gif index 1785934..958c660 100644 Binary files a/icons/nanos_app_chain_269.gif and b/icons/nanos_app_chain_269.gif differ diff --git a/icons/nanos_app_chain_3.gif b/icons/nanos_app_chain_3.gif deleted file mode 100644 index 8f8fa31..0000000 Binary files a/icons/nanos_app_chain_3.gif and /dev/null differ diff --git a/icons/nanos_app_chain_401697.gif b/icons/nanos_app_chain_401697.gif deleted file mode 100644 index d15c937..0000000 Binary files a/icons/nanos_app_chain_401697.gif and /dev/null differ diff --git a/icons/nanos_app_chain_5.gif b/icons/nanos_app_chain_5.gif deleted file mode 100644 index 8f8fa31..0000000 Binary files a/icons/nanos_app_chain_5.gif and /dev/null differ diff --git a/icons/nanos_app_chain_50.gif b/icons/nanos_app_chain_50.gif index cccda60..f9d105a 100644 Binary files a/icons/nanos_app_chain_50.gif and b/icons/nanos_app_chain_50.gif differ diff --git a/icons/nanos_app_chain_51.gif b/icons/nanos_app_chain_51.gif index cccda60..f9d105a 100644 Binary files a/icons/nanos_app_chain_51.gif and b/icons/nanos_app_chain_51.gif differ diff --git a/icons/nanos_app_chain_7341.gif b/icons/nanos_app_chain_7341.gif index 3a07de0..b96efa1 100644 Binary files a/icons/nanos_app_chain_7341.gif and b/icons/nanos_app_chain_7341.gif differ diff --git a/icons/nanos_app_chain_846000.gif b/icons/nanos_app_chain_846000.gif index ad64f0f..1fbb57a 100644 Binary files a/icons/nanos_app_chain_846000.gif and b/icons/nanos_app_chain_846000.gif differ diff --git a/icons/nanox_app_chain_14.gif b/icons/nanox_app_chain_14.gif deleted file mode 100644 index 3a617f8..0000000 Binary files a/icons/nanox_app_chain_14.gif and /dev/null differ diff --git a/icons/nanox_app_chain_16.gif b/icons/nanox_app_chain_16.gif deleted file mode 100644 index 34cc7f5..0000000 Binary files a/icons/nanox_app_chain_16.gif and /dev/null differ diff --git a/icons/nanox_app_chain_19.gif b/icons/nanox_app_chain_19.gif index 1361a68..cd3f798 100644 Binary files a/icons/nanox_app_chain_19.gif and b/icons/nanox_app_chain_19.gif differ diff --git a/icons/nanox_app_chain_20531811.gif b/icons/nanox_app_chain_20531811.gif index 596fa38..36a8eb7 100644 Binary files a/icons/nanox_app_chain_20531811.gif and b/icons/nanox_app_chain_20531811.gif differ diff --git a/icons/nanox_app_chain_20531812.gif b/icons/nanox_app_chain_20531812.gif index 596fa38..36a8eb7 100644 Binary files a/icons/nanox_app_chain_20531812.gif and b/icons/nanox_app_chain_20531812.gif differ diff --git a/icons/nanox_app_chain_246.gif b/icons/nanox_app_chain_246.gif new file mode 100644 index 0000000..cf87519 Binary files /dev/null and b/icons/nanox_app_chain_246.gif differ diff --git a/icons/nanox_app_chain_3.gif b/icons/nanox_app_chain_3.gif deleted file mode 100644 index d70e8a7..0000000 Binary files a/icons/nanox_app_chain_3.gif and /dev/null differ diff --git a/icons/nanox_app_chain_5.gif b/icons/nanox_app_chain_5.gif deleted file mode 100644 index d70e8a7..0000000 Binary files a/icons/nanox_app_chain_5.gif and /dev/null differ diff --git a/icons/nanox_app_chain_7341.gif b/icons/nanox_app_chain_7341.gif index fd1cb06..bab9850 100644 Binary files a/icons/nanox_app_chain_7341.gif and b/icons/nanox_app_chain_7341.gif differ diff --git a/icons/nanox_app_chain_846000.gif b/icons/nanox_app_chain_846000.gif index d36d209..dfc1f23 100644 Binary files a/icons/nanox_app_chain_846000.gif and b/icons/nanox_app_chain_846000.gif differ diff --git a/icons/stax_app_chain_14.gif b/icons/stax_app_chain_14.gif deleted file mode 100644 index 4d1a0f8..0000000 Binary files a/icons/stax_app_chain_14.gif and /dev/null differ diff --git a/icons/stax_app_chain_16.gif b/icons/stax_app_chain_16.gif deleted file mode 100644 index 2f77dee..0000000 Binary files a/icons/stax_app_chain_16.gif and /dev/null differ diff --git a/icons/stax_app_chain_3.gif b/icons/stax_app_chain_3.gif deleted file mode 100644 index 4c7a5a0..0000000 Binary files a/icons/stax_app_chain_3.gif and /dev/null differ diff --git a/icons/stax_app_chain_401697.gif b/icons/stax_app_chain_401697.gif deleted file mode 100644 index cd3e946..0000000 Binary files a/icons/stax_app_chain_401697.gif and /dev/null differ diff --git a/icons/stax_app_chain_5.gif b/icons/stax_app_chain_5.gif deleted file mode 100644 index 95c819d..0000000 Binary files a/icons/stax_app_chain_5.gif and /dev/null differ diff --git a/ledger_app.toml b/ledger_app.toml index 5c2fe30..a640f65 100644 --- a/ledger_app.toml +++ b/ledger_app.toml @@ -1,12 +1,13 @@ [app] build_directory = "./" sdk = "C" -devices = ["nanos", "nanox", "nanos+", "stax"] +devices = ["nanos", "nanox", "nanos+", "stax", "flex"] [use_cases] # Coherent build options that make sense for your application -debug = "DEBUG=1" -use_test_keys = "DEBUG=1 CAL_TEST_KEY=1 DOMAIN_NAME_TEST_KEY=1 SET_PLUGIN_TEST_KEY=1 NFT_TEST_KEY=1" -cal_bypass = "DEBUG=1 BYPASS_SIGNATURES=1" +test_keys = "CAL_TEST_KEY=1 DOMAIN_NAME_TEST_KEY=1 SET_PLUGIN_TEST_KEY=1 NFT_TEST_KEY=1" +dbg_test_keys = "DEBUG=1 CAL_TEST_KEY=1 DOMAIN_NAME_TEST_KEY=1 SET_PLUGIN_TEST_KEY=1 NFT_TEST_KEY=1" +cal_bypass = "BYPASS_SIGNATURES=1" +dbg_cal_bypass = "DEBUG=1 BYPASS_SIGNATURES=1" [tests] unit_directory = "./tests/unit" diff --git a/makefile_conf/chain/akroma.mk b/makefile_conf/chain/akroma.mk index 68c935f..6da1b17 100644 --- a/makefile_conf/chain/akroma.mk +++ b/makefile_conf/chain/akroma.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/200625'" +PATH_APP_LOAD_PARAMS += "44'/200625'" TICKER = "AKA" CHAIN_ID = 200625 -APPNAME = "Akroma" \ No newline at end of file +APPNAME = "Akroma" diff --git a/makefile_conf/chain/apothemnetwork.mk b/makefile_conf/chain/apothemnetwork.mk index 57dc45b..3446482 100644 --- a/makefile_conf/chain/apothemnetwork.mk +++ b/makefile_conf/chain/apothemnetwork.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/550'" +PATH_APP_LOAD_PARAMS += "44'/550'" TICKER = "TXDC" CHAIN_ID = 51 APPNAME = "ApothemNetwork" diff --git a/makefile_conf/chain/artis_sigma1.mk b/makefile_conf/chain/artis_sigma1.mk index 766bd32..bcf77a6 100644 --- a/makefile_conf/chain/artis_sigma1.mk +++ b/makefile_conf/chain/artis_sigma1.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/246529'" +PATH_APP_LOAD_PARAMS += "44'/246529'" TICKER = "ATS" CHAIN_ID = 246529 -APPNAME = "ARTIS sigma1" \ No newline at end of file +APPNAME = "ARTIS sigma1" diff --git a/makefile_conf/chain/artis_tau1.mk b/makefile_conf/chain/artis_tau1.mk index dd0d981..6aacfcc 100644 --- a/makefile_conf/chain/artis_tau1.mk +++ b/makefile_conf/chain/artis_tau1.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/246785'" +PATH_APP_LOAD_PARAMS += "44'/246785'" TICKER = "ATS" CHAIN_ID = 246785 -APPNAME = "ARTIS tau1" \ No newline at end of file +APPNAME = "ARTIS tau1" diff --git a/makefile_conf/chain/astar.mk b/makefile_conf/chain/astar.mk index 8914d38..e152326 100644 --- a/makefile_conf/chain/astar.mk +++ b/makefile_conf/chain/astar.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/810'" --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/810'" "44'/60'" TICKER = "ASTR" CHAIN_ID = 592 APPNAME = "Astar Polkadot EVM" diff --git a/makefile_conf/chain/atheios.mk b/makefile_conf/chain/atheios.mk index e7e9ef5..3ecb115 100644 --- a/makefile_conf/chain/atheios.mk +++ b/makefile_conf/chain/atheios.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/1620'" +PATH_APP_LOAD_PARAMS += "44'/1620'" TICKER = "ATH" CHAIN_ID = 1620 -APPNAME = "Atheios" \ No newline at end of file +APPNAME = "Atheios" diff --git a/makefile_conf/chain/bsc.mk b/makefile_conf/chain/bsc.mk index dc70e0b..3a47841 100644 --- a/makefile_conf/chain/bsc.mk +++ b/makefile_conf/chain/bsc.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/60'" TICKER = "BNB" CHAIN_ID = 56 -APPNAME = "Binance Smart Chain" \ No newline at end of file +APPNAME = "Binance Smart Chain" diff --git a/makefile_conf/chain/bttc.mk b/makefile_conf/chain/bttc.mk index 9e82b67..fdb1781 100644 --- a/makefile_conf/chain/bttc.mk +++ b/makefile_conf/chain/bttc.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/60'" TICKER = "BTT" CHAIN_ID = 199 -APPNAME = "BTTC" \ No newline at end of file +APPNAME = "BTTC" diff --git a/makefile_conf/chain/callisto.mk b/makefile_conf/chain/callisto.mk index 1147dc9..f8fe788 100644 --- a/makefile_conf/chain/callisto.mk +++ b/makefile_conf/chain/callisto.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/820'" +PATH_APP_LOAD_PARAMS += "44'/820'" TICKER = "CLO" CHAIN_ID = 820 -APPNAME = "Callisto" \ No newline at end of file +APPNAME = "Callisto" diff --git a/makefile_conf/chain/conflux_espace.mk b/makefile_conf/chain/conflux_espace.mk index 6efc293..2dd6a4b 100644 --- a/makefile_conf/chain/conflux_espace.mk +++ b/makefile_conf/chain/conflux_espace.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/60'" TICKER = "CFX" CHAIN_ID = 1030 -APPNAME = "Conflux eSpace" \ No newline at end of file +APPNAME = "Conflux eSpace" diff --git a/makefile_conf/chain/cube.mk b/makefile_conf/chain/cube.mk index 7ac424c..72b90bd 100644 --- a/makefile_conf/chain/cube.mk +++ b/makefile_conf/chain/cube.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/60'" TICKER = "CUBE" CHAIN_ID = 1818 -APPNAME = "Cube" \ No newline at end of file +APPNAME = "Cube" diff --git a/makefile_conf/chain/dexon.mk b/makefile_conf/chain/dexon.mk index c892e35..7985c53 100644 --- a/makefile_conf/chain/dexon.mk +++ b/makefile_conf/chain/dexon.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/237'" +PATH_APP_LOAD_PARAMS += "44'/237'" TICKER = "DXN" CHAIN_ID = 237 -APPNAME = "DEXON" \ No newline at end of file +APPNAME = "DEXON" diff --git a/makefile_conf/chain/ellaism.mk b/makefile_conf/chain/ellaism.mk index 1bd5589..e3396a8 100644 --- a/makefile_conf/chain/ellaism.mk +++ b/makefile_conf/chain/ellaism.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/163'" +PATH_APP_LOAD_PARAMS += "44'/163'" TICKER = "ELLA" CHAIN_ID = 64 -APPNAME = "Ellaism" \ No newline at end of file +APPNAME = "Ellaism" diff --git a/makefile_conf/chain/energywebchain.mk b/makefile_conf/chain/energywebchain.mk index 6de07e2..6dbf94f 100644 --- a/makefile_conf/chain/energywebchain.mk +++ b/makefile_conf/chain/energywebchain.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/246'" --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/246'" "44'/60'" TICKER = "EWT" CHAIN_ID = 246 APPNAME = "EnergyWebChain" diff --git a/makefile_conf/chain/ether1.mk b/makefile_conf/chain/ether1.mk index 9efc015..7641aa1 100644 --- a/makefile_conf/chain/ether1.mk +++ b/makefile_conf/chain/ether1.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/1313114'" +PATH_APP_LOAD_PARAMS += "44'/1313114'" TICKER = "ETHO" CHAIN_ID = 1313114 -APPNAME = "Ether-1" \ No newline at end of file +APPNAME = "Ether-1" diff --git a/makefile_conf/chain/ethereum.mk b/makefile_conf/chain/ethereum.mk index 993c930..a30fd11 100644 --- a/makefile_conf/chain/ethereum.mk +++ b/makefile_conf/chain/ethereum.mk @@ -1,11 +1,10 @@ # Lock the application on its standard path for 1.5. Please complain if non compliant -APP_LOAD_PARAMS += --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/60'" TICKER = "ETH" CHAIN_ID = 1 # Allow to derive ETH 2 public keys -APP_LOAD_PARAMS += --path "12381/3600" --curve bls12381g1 +PATH_APP_LOAD_PARAMS += "12381/3600" +CURVE_APP_LOAD_PARAMS += bls12381g1 DEFINES += HAVE_ETH2 APPNAME = "Ethereum" -DEFINES_LIB= DEFINES += HAVE_BOLOS_APP_STACK_CANARY -APP_LOAD_FLAGS=--appFlags 0xa40 diff --git a/makefile_conf/chain/ethereum_classic.mk b/makefile_conf/chain/ethereum_classic.mk index ac44b6a..1aea2af 100644 --- a/makefile_conf/chain/ethereum_classic.mk +++ b/makefile_conf/chain/ethereum_classic.mk @@ -1,5 +1,5 @@ # Also allows ETC to access the ETH derivation path to recover forked assets -APP_LOAD_PARAMS += --path "44'/61'" --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/61'" "44'/60'" TICKER = "ETC" CHAIN_ID = 61 -APPNAME = "Ethereum Classic" \ No newline at end of file +APPNAME = "Ethereum Classic" diff --git a/makefile_conf/chain/ethergem.mk b/makefile_conf/chain/ethergem.mk index 6c81976..a1f56ea 100644 --- a/makefile_conf/chain/ethergem.mk +++ b/makefile_conf/chain/ethergem.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/1987'" +PATH_APP_LOAD_PARAMS += "44'/1987'" TICKER = "EGEM" CHAIN_ID = 1987 -APPNAME = "EtherGem" \ No newline at end of file +APPNAME = "EtherGem" diff --git a/makefile_conf/chain/ethersocial.mk b/makefile_conf/chain/ethersocial.mk index bbf512c..c1586b2 100644 --- a/makefile_conf/chain/ethersocial.mk +++ b/makefile_conf/chain/ethersocial.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/31102'" +PATH_APP_LOAD_PARAMS += "44'/31102'" TICKER = "ESN" CHAIN_ID = 31102 -APPNAME = "Ethersocial" \ No newline at end of file +APPNAME = "Ethersocial" diff --git a/makefile_conf/chain/expanse.mk b/makefile_conf/chain/expanse.mk index f2ee995..24972b0 100644 --- a/makefile_conf/chain/expanse.mk +++ b/makefile_conf/chain/expanse.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/40'" +PATH_APP_LOAD_PARAMS += "44'/40'" TICKER = "EXP" CHAIN_ID = 2 -APPNAME = "Expanse" \ No newline at end of file +APPNAME = "Expanse" diff --git a/makefile_conf/chain/flare.mk b/makefile_conf/chain/flare.mk deleted file mode 100644 index 36339ee..0000000 --- a/makefile_conf/chain/flare.mk +++ /dev/null @@ -1,9 +0,0 @@ -APP_LOAD_PARAMS += --path "44'/554'" --path "44'/60'" -TICKER = "FLR" -CHAIN_ID = 14 - -# Pending review parameters -APP_LOAD_PARAMS += --tlvraw 9F:01 -DEFINES += HAVE_PENDING_REVIEW_SCREEN - -APPNAME = "Flare" \ No newline at end of file diff --git a/makefile_conf/chain/flare_coston.mk b/makefile_conf/chain/flare_coston.mk deleted file mode 100644 index 0d6bddf..0000000 --- a/makefile_conf/chain/flare_coston.mk +++ /dev/null @@ -1,4 +0,0 @@ -APP_LOAD_PARAMS += --path "44'/554'" --path "44'/60'" -TICKER = "FLR" -CHAIN_ID = 16 -APPNAME = "Flare Coston" \ No newline at end of file diff --git a/makefile_conf/chain/gochain.mk b/makefile_conf/chain/gochain.mk index 180b2fd..ed51bdc 100644 --- a/makefile_conf/chain/gochain.mk +++ b/makefile_conf/chain/gochain.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/6060'" +PATH_APP_LOAD_PARAMS += "44'/6060'" TICKER = "GO" CHAIN_ID = 60 -APPNAME = "GoChain" \ No newline at end of file +APPNAME = "GoChain" diff --git a/makefile_conf/chain/goerli.mk b/makefile_conf/chain/goerli.mk deleted file mode 100644 index c01e6c9..0000000 --- a/makefile_conf/chain/goerli.mk +++ /dev/null @@ -1,10 +0,0 @@ -APP_LOAD_PARAMS += --path "44'/60'" -TICKER = "ETH" -CHAIN_ID = 5 -# Allow to derive ETH 2 public keys -APP_LOAD_PARAMS += --path "12381/3600" --curve bls12381g1 -DEFINES += HAVE_ETH2 -APPNAME = "Eth Goerli" -DEFINES_LIB= -DEFINES += HAVE_BOLOS_APP_STACK_CANARY -APP_LOAD_FLAGS=--appFlags 0xa40 diff --git a/makefile_conf/chain/hpb.mk b/makefile_conf/chain/hpb.mk index 60fb3c1..baf819b 100644 --- a/makefile_conf/chain/hpb.mk +++ b/makefile_conf/chain/hpb.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/269'" +PATH_APP_LOAD_PARAMS += "44'/269'" TICKER = "HPB" CHAIN_ID = 269 -APPNAME = "HPB" \ No newline at end of file +APPNAME = "HPB" diff --git a/makefile_conf/chain/id4good.mk b/makefile_conf/chain/id4good.mk index 4abac30..79439e4 100644 --- a/makefile_conf/chain/id4good.mk +++ b/makefile_conf/chain/id4good.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/161803'" +PATH_APP_LOAD_PARAMS += "44'/161803'" TICKER = "A4G" CHAIN_ID = 846000 APPNAME = "ID4Good" diff --git a/makefile_conf/chain/kardiachain.mk b/makefile_conf/chain/kardiachain.mk index cc76d38..5d73e45 100644 --- a/makefile_conf/chain/kardiachain.mk +++ b/makefile_conf/chain/kardiachain.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/60'" TICKER = "KAI" CHAIN_ID = 24 -APPNAME = "KardiaChain" \ No newline at end of file +APPNAME = "KardiaChain" diff --git a/makefile_conf/chain/meter.mk b/makefile_conf/chain/meter.mk index 2a74120..2089edc 100644 --- a/makefile_conf/chain/meter.mk +++ b/makefile_conf/chain/meter.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/60'" TICKER = "MTR" CHAIN_ID = 82 -APPNAME = "Meter" \ No newline at end of file +APPNAME = "Meter" diff --git a/makefile_conf/chain/mix.mk b/makefile_conf/chain/mix.mk index c180cc9..52bbe2e 100644 --- a/makefile_conf/chain/mix.mk +++ b/makefile_conf/chain/mix.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/76'" +PATH_APP_LOAD_PARAMS += "44'/76'" TICKER = "MIX" CHAIN_ID = 76 -APPNAME = "Mix" \ No newline at end of file +APPNAME = "Mix" diff --git a/makefile_conf/chain/moonbeam.mk b/makefile_conf/chain/moonbeam.mk index 5822f8f..edf4c3f 100644 --- a/makefile_conf/chain/moonbeam.mk +++ b/makefile_conf/chain/moonbeam.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/60'" --path "44'/1284'" +PATH_APP_LOAD_PARAMS += "44'/60'" "44'/1284'" TICKER = "GLMR" CHAIN_ID = 1284 -APPNAME = "Moonbeam" \ No newline at end of file +APPNAME = "Moonbeam" diff --git a/makefile_conf/chain/moonriver.mk b/makefile_conf/chain/moonriver.mk index 4413715..a777fe0 100644 --- a/makefile_conf/chain/moonriver.mk +++ b/makefile_conf/chain/moonriver.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/60'" --path "44'/1285'" +PATH_APP_LOAD_PARAMS += "44'/60'" "44'/1285'" TICKER = "MOVR" CHAIN_ID = 1285 -APPNAME = "Moonriver" \ No newline at end of file +APPNAME = "Moonriver" diff --git a/makefile_conf/chain/multivac.mk b/makefile_conf/chain/multivac.mk index c5b5270..1fe26f9 100644 --- a/makefile_conf/chain/multivac.mk +++ b/makefile_conf/chain/multivac.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/60'" TICKER = "MTV" CHAIN_ID = 62621 APPNAME = "MultiVAC" diff --git a/makefile_conf/chain/musicoin.mk b/makefile_conf/chain/musicoin.mk index 188bebb..4523845 100644 --- a/makefile_conf/chain/musicoin.mk +++ b/makefile_conf/chain/musicoin.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/184'" +PATH_APP_LOAD_PARAMS += "44'/184'" TICKER = "MUSIC" CHAIN_ID = 7762959 -APPNAME = "Musicoin" \ No newline at end of file +APPNAME = "Musicoin" diff --git a/makefile_conf/chain/oasys.mk b/makefile_conf/chain/oasys.mk index 7fc384f..b75afc9 100644 --- a/makefile_conf/chain/oasys.mk +++ b/makefile_conf/chain/oasys.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/685'" --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/685'" "44'/60'" TICKER = "OAS" CHAIN_ID = 248 APPNAME = "Oasys" diff --git a/makefile_conf/chain/okc.mk b/makefile_conf/chain/okc.mk index 6ed8042..13e0f50 100644 --- a/makefile_conf/chain/okc.mk +++ b/makefile_conf/chain/okc.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/60'" TICKER = "OKT" CHAIN_ID = 66 -APPNAME = "OKXChain" \ No newline at end of file +APPNAME = "OKXChain" diff --git a/makefile_conf/chain/pirl.mk b/makefile_conf/chain/pirl.mk index 3f30261..27eb8af 100644 --- a/makefile_conf/chain/pirl.mk +++ b/makefile_conf/chain/pirl.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/164'" +PATH_APP_LOAD_PARAMS += "44'/164'" TICKER = "PIRL" CHAIN_ID = 3125659152 -APPNAME = "Pirl" \ No newline at end of file +APPNAME = "Pirl" diff --git a/makefile_conf/chain/poa.mk b/makefile_conf/chain/poa.mk index c415c26..5590fc9 100644 --- a/makefile_conf/chain/poa.mk +++ b/makefile_conf/chain/poa.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/60'" TICKER = "POA" CHAIN_ID = 99 -APPNAME = "POA" \ No newline at end of file +APPNAME = "POA" diff --git a/makefile_conf/chain/polygon.mk b/makefile_conf/chain/polygon.mk index 9bdf2dc..71b8a03 100644 --- a/makefile_conf/chain/polygon.mk +++ b/makefile_conf/chain/polygon.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/60'" TICKER = "MATIC" CHAIN_ID = 137 -APPNAME = "Polygon" \ No newline at end of file +APPNAME = "Polygon" diff --git a/makefile_conf/chain/reosc.mk b/makefile_conf/chain/reosc.mk index 9f9cedf..c90a3e0 100644 --- a/makefile_conf/chain/reosc.mk +++ b/makefile_conf/chain/reosc.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/2894'" +PATH_APP_LOAD_PARAMS += "44'/2894'" TICKER = "REOSC" CHAIN_ID = 2894 -APPNAME = "REOSC" \ No newline at end of file +APPNAME = "REOSC" diff --git a/makefile_conf/chain/ropsten.mk b/makefile_conf/chain/ropsten.mk deleted file mode 100644 index d709186..0000000 --- a/makefile_conf/chain/ropsten.mk +++ /dev/null @@ -1,10 +0,0 @@ -APP_LOAD_PARAMS += --path "44'/60'" -TICKER = "ETH" -CHAIN_ID = 3 -# Allow to derive ETH 2 public keys -APP_LOAD_PARAMS += --path "12381/3600" --curve bls12381g1 -DEFINES += HAVE_ETH2 -APPNAME = "Eth Ropsten" -DEFINES_LIB= -DEFINES += HAVE_BOLOS_APP_STACK_CANARY -APP_LOAD_FLAGS=--appFlags 0xa40 diff --git a/makefile_conf/chain/rsk.mk b/makefile_conf/chain/rsk.mk index dad8f56..0f05691 100644 --- a/makefile_conf/chain/rsk.mk +++ b/makefile_conf/chain/rsk.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/137'" --path "44'/00'" +PATH_APP_LOAD_PARAMS += "44'/137'" "44'/00'" TICKER = "RBTC" CHAIN_ID = 30 -APPNAME = "RSK" \ No newline at end of file +APPNAME = "RSK" diff --git a/makefile_conf/chain/rsk_testnet.mk b/makefile_conf/chain/rsk_testnet.mk index 2142f7c..0e043e4 100644 --- a/makefile_conf/chain/rsk_testnet.mk +++ b/makefile_conf/chain/rsk_testnet.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/37310'" +PATH_APP_LOAD_PARAMS += "44'/37310'" TICKER = "RBTC" CHAIN_ID = 31 -APPNAME = "RSK Test" \ No newline at end of file +APPNAME = "RSK Test" diff --git a/makefile_conf/chain/shiden.mk b/makefile_conf/chain/shiden.mk index bda1c9d..74bf66a 100644 --- a/makefile_conf/chain/shiden.mk +++ b/makefile_conf/chain/shiden.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/809'" --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/809'" "44'/60'" TICKER = "SDN" CHAIN_ID = 336 APPNAME = "Shiden EVM" diff --git a/makefile_conf/chain/shyft.mk b/makefile_conf/chain/shyft.mk index b578933..ae98994 100644 --- a/makefile_conf/chain/shyft.mk +++ b/makefile_conf/chain/shyft.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/60'" TICKER = "SHFT" CHAIN_ID = 7341 -APPNAME = "Shyft" \ No newline at end of file +APPNAME = "Shyft" diff --git a/makefile_conf/chain/songbird.mk b/makefile_conf/chain/songbird.mk index bc11a41..7dc4b6f 100644 --- a/makefile_conf/chain/songbird.mk +++ b/makefile_conf/chain/songbird.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/554'" --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/554'" "44'/60'" TICKER = "SGB" CHAIN_ID = 19 -APPNAME = "Songbird" \ No newline at end of file +APPNAME = "Songbird" diff --git a/makefile_conf/chain/tecracoin.mk b/makefile_conf/chain/tecracoin.mk index eabc826..fc34beb 100644 --- a/makefile_conf/chain/tecracoin.mk +++ b/makefile_conf/chain/tecracoin.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/554'" --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/554'" "44'/60'" TICKER = "TCR" CHAIN_ID = 20531812 -APPNAME = "TecraCoin" \ No newline at end of file +APPNAME = "TecraCoin" diff --git a/makefile_conf/chain/tecratestnet.mk b/makefile_conf/chain/tecratestnet.mk index d97ab81..b778ca1 100644 --- a/makefile_conf/chain/tecratestnet.mk +++ b/makefile_conf/chain/tecratestnet.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/554'" --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/554'" "44'/60'" TICKER = "TCR" CHAIN_ID = 20531811 -APPNAME = "TecraTestnet" \ No newline at end of file +APPNAME = "TecraTestnet" diff --git a/makefile_conf/chain/thundercore.mk b/makefile_conf/chain/thundercore.mk index a7a4ddd..f602f3e 100644 --- a/makefile_conf/chain/thundercore.mk +++ b/makefile_conf/chain/thundercore.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/1001'" +PATH_APP_LOAD_PARAMS += "44'/1001'" TICKER = "TT" CHAIN_ID = 108 -APPNAME = "ThunderCore" \ No newline at end of file +APPNAME = "ThunderCore" diff --git a/makefile_conf/chain/tomochain.mk b/makefile_conf/chain/tomochain.mk index 9538308..24c7f55 100644 --- a/makefile_conf/chain/tomochain.mk +++ b/makefile_conf/chain/tomochain.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/889'" +PATH_APP_LOAD_PARAMS += "44'/889'" TICKER = "TOMO" CHAIN_ID = 88 -APPNAME = "TomoChain" \ No newline at end of file +APPNAME = "TomoChain" diff --git a/makefile_conf/chain/ubiq.mk b/makefile_conf/chain/ubiq.mk index 62a4ba1..0796ea7 100644 --- a/makefile_conf/chain/ubiq.mk +++ b/makefile_conf/chain/ubiq.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/108'" +PATH_APP_LOAD_PARAMS += "44'/108'" TICKER = "UBQ" CHAIN_ID = 8 -APPNAME = "Ubiq" \ No newline at end of file +APPNAME = "Ubiq" diff --git a/makefile_conf/chain/volta.mk b/makefile_conf/chain/volta.mk index 28f7c56..1d3f51a 100644 --- a/makefile_conf/chain/volta.mk +++ b/makefile_conf/chain/volta.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/73799'" --path "44'/60'" +PATH_APP_LOAD_PARAMS += "44'/73799'" "44'/60'" TICKER = "VOLTA" CHAIN_ID = 73799 -APPNAME = "Volta" \ No newline at end of file +APPNAME = "Volta" diff --git a/makefile_conf/chain/wanchain.mk b/makefile_conf/chain/wanchain.mk index 66b6d82..3453baa 100644 --- a/makefile_conf/chain/wanchain.mk +++ b/makefile_conf/chain/wanchain.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/5718350'" +PATH_APP_LOAD_PARAMS += "44'/5718350'" TICKER = "WAN" CHAIN_ID = 888 APPNAME = "Wanchain" diff --git a/makefile_conf/chain/webchain.mk b/makefile_conf/chain/webchain.mk index 3a7da24..c73fc64 100644 --- a/makefile_conf/chain/webchain.mk +++ b/makefile_conf/chain/webchain.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/227'" +PATH_APP_LOAD_PARAMS += "44'/227'" TICKER = "WEB" CHAIN_ID = 24484 -APPNAME = "Webchain" \ No newline at end of file +APPNAME = "Webchain" diff --git a/makefile_conf/chain/wethio.mk b/makefile_conf/chain/wethio.mk index fc491df..1b6f210 100644 --- a/makefile_conf/chain/wethio.mk +++ b/makefile_conf/chain/wethio.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/77777'" +PATH_APP_LOAD_PARAMS += "44'/77777'" TICKER = "ZYN" CHAIN_ID = 78 -APPNAME = "Wethio" \ No newline at end of file +APPNAME = "Wethio" diff --git a/makefile_conf/chain/xdcnetwork.mk b/makefile_conf/chain/xdcnetwork.mk index 9118483..9a55396 100644 --- a/makefile_conf/chain/xdcnetwork.mk +++ b/makefile_conf/chain/xdcnetwork.mk @@ -1,4 +1,4 @@ -APP_LOAD_PARAMS += --path "44'/60'" --path "44'/550'" +PATH_APP_LOAD_PARAMS += "44'/60'" "44'/550'" TICKER = "XDC" CHAIN_ID = 50 APPNAME = "XDC Network" diff --git a/makefile_conf/features.mk b/makefile_conf/features.mk new file mode 100644 index 0000000..59b707f --- /dev/null +++ b/makefile_conf/features.mk @@ -0,0 +1,81 @@ +# Activate requested features +# --------------------------- +# Enables direct data signing without having to specify it in the settings. Useful when testing with speculos. +ALLOW_DATA ?= 0 +ifneq ($(ALLOW_DATA),0) + DEFINES += HAVE_ALLOW_DATA +endif + +# Bypass the signature verification for setExternalPlugin, setPlugin, provideERC20TokenInfo and provideNFTInfo calls +BYPASS_SIGNATURES ?= 0 +ifneq ($(BYPASS_SIGNATURES),0) + DEFINES += HAVE_BYPASS_SIGNATURES +endif + +# Enable the SET_PLUGIN test key +SET_PLUGIN_TEST_KEY ?= 0 +ifneq ($(SET_PLUGIN_TEST_KEY),0) + DEFINES += HAVE_SET_PLUGIN_TEST_KEY +endif + +# NFTs +ifneq ($(TARGET_NAME),TARGET_NANOS) + DEFINES += HAVE_NFT_SUPPORT + NFT_TEST_KEY ?= 0 + ifneq ($(NFT_TEST_KEY),0) + DEFINES += HAVE_NFT_TEST_KEY + endif + NFT_STAGING_KEY ?= 0 + ifneq ($(NFT_STAGING_KEY),0) + # Key used by the staging backend + DEFINES += HAVE_NFT_STAGING_KEY + endif +endif + +# Dynamic memory allocator +ifneq ($(TARGET_NAME),TARGET_NANOS) + DEFINES += HAVE_DYN_MEM_ALLOC +endif + +# EIP-712 +ifneq ($(TARGET_NAME),TARGET_NANOS) + DEFINES += HAVE_EIP712_FULL_SUPPORT +endif + +# CryptoAssetsList key +CAL_TEST_KEY ?= 0 +ifneq ($(CAL_TEST_KEY),0) + # Key used in our test framework + DEFINES += HAVE_CAL_TEST_KEY +endif +CAL_STAGING_KEY ?= 0 +ifneq ($(CAL_STAGING_KEY),0) + # Key used by the staging CAL + DEFINES += HAVE_CAL_STAGING_KEY +endif + +# ENS +ifneq ($(TARGET_NAME),TARGET_NANOS) + DEFINES += HAVE_DOMAIN_NAME + DOMAIN_NAME_TEST_KEY ?= 0 + ifneq ($(DOMAIN_NAME_TEST_KEY),0) + DEFINES += HAVE_DOMAIN_NAME_TEST_KEY + endif +endif + +# Check features incompatibilities +# -------------------------------- +# NFTs +ifneq (,$(filter $(DEFINES),HAVE_NFT_TEST_KEY)) + ifneq (, $(filter $(DEFINES),HAVE_NFT_STAGING_KEY)) + $(error Multiple alternative NFT keys set at once) + endif +endif + +# CryptoAssetsList key +ifneq (,$(filter $(DEFINES),HAVE_CAL_TEST_KEY)) + ifneq (, $(filter $(DEFINES),HAVE_CAL_STAGING_KEY)) + # Can't use both the staging and testing keys + $(error Multiple alternative CAL keys set at once) + endif +endif diff --git a/src/apdu_constants.h b/src/apdu_constants.h index 07e41a3..471a262 100644 --- a/src/apdu_constants.h +++ b/src/apdu_constants.h @@ -33,8 +33,7 @@ #define P2_EIP712_LEGACY_IMPLEM 0x00 #define P2_EIP712_FULL_IMPLEM 0x01 -#define COMMON_CLA 0xB0 -#define COMMON_INS_GET_WALLET_ID 0x04 +#define COMMON_CLA 0xB0 #define APDU_RESPONSE_OK 0x9000 #define APDU_RESPONSE_ERROR_NO_INFO 0x6a00 @@ -44,6 +43,7 @@ #define APDU_RESPONSE_INVALID_P1_P2 0x6b00 #define APDU_RESPONSE_CONDITION_NOT_SATISFIED 0x6985 #define APDU_RESPONSE_REF_DATA_NOT_FOUND 0x6a88 +#define APDU_RESPONSE_UNKNOWN 0x6f00 enum { OFFSET_CLA = 0, OFFSET_INS, OFFSET_P1, OFFSET_P2, OFFSET_LC, OFFSET_CDATA }; diff --git a/src/ethUstream.c b/src/ethUstream.c index 3273c65..3737dc2 100644 --- a/src/ethUstream.c +++ b/src/ethUstream.c @@ -36,7 +36,7 @@ void initTx(txContext_t *context, context->customProcessor = customProcessor; context->extra = extra; context->currentField = RLP_NONE + 1; - cx_keccak_init(context->sha3, 256); + CX_ASSERT(cx_keccak_init_no_throw(context->sha3, 256)); } uint8_t readTxByte(txContext_t *context) { @@ -52,7 +52,7 @@ uint8_t readTxByte(txContext_t *context) { context->currentFieldPos++; } if (!(context->processingField && context->fieldSingleByte)) { - cx_hash((cx_hash_t *) context->sha3, 0, &data, 1, NULL, 0); + CX_ASSERT(cx_hash_no_throw((cx_hash_t *) context->sha3, 0, &data, 1, NULL, 0)); } return data; } @@ -66,7 +66,8 @@ void copyTxData(txContext_t *context, uint8_t *out, uint32_t length) { memmove(out, context->workBuffer, length); } if (!(context->processingField && context->fieldSingleByte)) { - cx_hash((cx_hash_t *) context->sha3, 0, context->workBuffer, length, NULL, 0); + CX_ASSERT( + cx_hash_no_throw((cx_hash_t *) context->sha3, 0, context->workBuffer, length, NULL, 0)); } context->workBuffer += length; context->commandLength -= length; @@ -517,7 +518,7 @@ static parserStatus_e processTxInternal(txContext_t *context) { PRINTF("parsing is done\n"); return USTREAM_FINISHED; } - // Old style transaction (pre EIP-155). Transations could just skip `v,r,s` so we needed to + // Old style transaction (pre EIP-155). Transactions could just skip `v,r,s` so we needed to // cut parsing here. commandLength == 0 could happen in two cases : // 1. We are in an old style transaction : just return `USTREAM_FINISHED`. // 2. We are at the end of an APDU in a multi-apdu process. This would make us return diff --git a/src/eth_plugin_handler.c b/src/eth_plugin_handler.c index c768c7e..475a2a4 100644 --- a/src/eth_plugin_handler.c +++ b/src/eth_plugin_handler.c @@ -52,17 +52,17 @@ void eth_plugin_prepare_query_contract_UI(ethQueryContractUI_t *queryContractUI, memset((uint8_t *) queryContractUI, 0, sizeof(ethQueryContractUI_t)); // If no extra information was found, set the pointer to NULL - if (NO_EXTRA_INFO(tmpCtx, 1)) { + if (NO_EXTRA_INFO(tmpCtx, 0)) { queryContractUI->item1 = NULL; } else { - queryContractUI->item1 = &tmpCtx.transactionContext.extraInfo[1]; + queryContractUI->item1 = &tmpCtx.transactionContext.extraInfo[0]; } // If no extra information was found, set the pointer to NULL - if (NO_EXTRA_INFO(tmpCtx, 0)) { + if (NO_EXTRA_INFO(tmpCtx, 1)) { queryContractUI->item2 = NULL; } else { - queryContractUI->item2 = &tmpCtx.transactionContext.extraInfo[0]; + queryContractUI->item2 = &tmpCtx.transactionContext.extraInfo[1]; } queryContractUI->screenIndex = screenIndex; @@ -102,11 +102,11 @@ static void eth_plugin_perform_init_default(uint8_t *contractAddress, static bool eth_plugin_perform_init_old_internal(uint8_t *contractAddress, ethPluginInitContract_t *init) { uint8_t i, j; - const uint8_t **selectors; + const uint8_t *const *selectors; // Search internal plugin list for (i = 0;; i++) { - selectors = (const uint8_t **) PIC(INTERNAL_ETH_PLUGINS[i].selectors); + selectors = (const uint8_t *const *) PIC(INTERNAL_ETH_PLUGINS[i].selectors); if (selectors == NULL) { break; } @@ -207,7 +207,6 @@ eth_plugin_result_t eth_plugin_call(int method, void *parameter) { (uint8_t *) &dataContext.tokenContext.pluginContext; ((ethPluginInitContract_t *) parameter)->pluginContextLength = sizeof(dataContext.tokenContext.pluginContext); - ((ethPluginInitContract_t *) parameter)->alias = dataContext.tokenContext.pluginName; break; case ETH_PLUGIN_PROVIDE_PARAMETER: PRINTF("-- PLUGIN PROVIDE PARAMETER --\n"); diff --git a/src/eth_plugin_handler.h b/src/eth_plugin_handler.h index dab8ea4..1acaea0 100644 --- a/src/eth_plugin_handler.h +++ b/src/eth_plugin_handler.h @@ -6,7 +6,7 @@ #define NO_EXTRA_INFO(ctx, idx) \ (allzeroes(&(ctx.transactionContext.extraInfo[idx]), sizeof(extraInfo_t))) -#define NO_NFT_METADATA (NO_EXTRA_INFO(tmpCtx, 1)) +#define NO_NFT_METADATA (NO_EXTRA_INFO(tmpCtx, 0)) void eth_plugin_prepare_init(ethPluginInitContract_t *init, const uint8_t *selector, diff --git a/src/eth_plugin_internal.c b/src/eth_plugin_internal.c index 2cfe351..12ed6cf 100644 --- a/src/eth_plugin_internal.c +++ b/src/eth_plugin_internal.c @@ -25,11 +25,11 @@ const uint8_t* const ETH2_SELECTORS[NUM_ETH2_SELECTORS] = {ETH2_DEPOSIT_SELECTOR // All internal alias names start with 'minus' const internalEthPlugin_t INTERNAL_ETH_PLUGINS[] = { - {NULL, (const uint8_t**) ERC20_SELECTORS, NUM_ERC20_SELECTORS, "-erc20", erc20_plugin_call}, + {NULL, ERC20_SELECTORS, NUM_ERC20_SELECTORS, "-erc20", erc20_plugin_call}, #ifdef HAVE_ETH2 - {NULL, (const uint8_t**) ETH2_SELECTORS, NUM_ETH2_SELECTORS, "-eth2", eth2_plugin_call}, + {NULL, ETH2_SELECTORS, NUM_ETH2_SELECTORS, "-eth2", eth2_plugin_call}, #endif diff --git a/src/eth_plugin_internal.h b/src/eth_plugin_internal.h index ea84e40..14eecea 100644 --- a/src/eth_plugin_internal.h +++ b/src/eth_plugin_internal.h @@ -8,12 +8,12 @@ void erc721_plugin_call(int message, void* parameters); void erc1155_plugin_call(int message, void* parameters); -typedef bool (*PluginAvailableCheck)(void); +typedef bool (*const PluginAvailableCheck)(void); typedef void (*PluginCall)(int, void*); typedef struct internalEthPlugin_t { PluginAvailableCheck availableCheck; - const uint8_t** selectors; + const uint8_t* const* selectors; uint8_t num_selectors; char alias[10]; PluginCall impl; diff --git a/src/handle_check_address.c b/src/handle_check_address.c index 45c8586..e41bb73 100644 --- a/src/handle_check_address.c +++ b/src/handle_check_address.c @@ -1,11 +1,13 @@ #include "handle_check_address.h" +#include "apdu_constants.h" #include "os.h" #include "shared_context.h" #include "string.h" +#include "crypto_helpers.h" #define ZERO(x) explicit_bzero(&x, sizeof(x)) -void handle_check_address(check_address_parameters_t* params, chain_config_t* chain_config) { +void handle_check_address(check_address_parameters_t* params, const chain_config_t* chain_config) { params->result = 0; PRINTF("Params on the address %d\n", (unsigned int) params); PRINTF("Address to check %s\n", params->address_to_check); @@ -17,18 +19,9 @@ void handle_check_address(check_address_parameters_t* params, chain_config_t* ch const uint8_t* bip32_path_ptr = params->address_parameters; uint8_t bip32PathLength = *(bip32_path_ptr++); - cx_sha3_t local_sha3; - - // Common memory is used for locals that are not used concurrently - union group1 { - uint32_t bip32Path[MAX_BIP32_PATH]; - cx_ecfp_private_key_t privateKey; - char address[51]; - } locals_union1; - union group2 { - uint8_t privateKeyData[64]; - cx_ecfp_public_key_t publicKey; - } locals_union2; + uint32_t bip32Path[MAX_BIP32_PATH]; + char address[51]; + uint8_t raw_pubkey[65]; if ((bip32PathLength < 0x01) || (bip32PathLength > MAX_BIP32_PATH) || (bip32PathLength * 4 != params->address_parameters_length - 1)) { @@ -36,58 +29,30 @@ void handle_check_address(check_address_parameters_t* params, chain_config_t* ch return; } for (uint8_t i = 0; i < bip32PathLength; i++) { - locals_union1.bip32Path[i] = U4BE(bip32_path_ptr, 0); + bip32Path[i] = U4BE(bip32_path_ptr, 0); bip32_path_ptr += 4; } - if (os_derive_bip32_no_throw(CX_CURVE_256K1, - locals_union1.bip32Path, - bip32PathLength, - locals_union2.privateKeyData, - NULL) != CX_OK) { - ZERO(locals_union1); - ZERO(locals_union2); - return; + + if (bip32_derive_get_pubkey_256(CX_CURVE_256K1, + bip32Path, + bip32PathLength, + raw_pubkey, + NULL, + CX_SHA512) != CX_OK) { + THROW(APDU_RESPONSE_UNKNOWN); } - ZERO(locals_union1); - if (cx_ecfp_init_private_key_no_throw(CX_CURVE_256K1, - locals_union2.privateKeyData, - 32, - &locals_union1.privateKey) != CX_OK) { - ZERO(locals_union1); - ZERO(locals_union2); - return; - } - ZERO(locals_union2); - if (cx_ecfp_generate_pair_no_throw(CX_CURVE_256K1, - &locals_union2.publicKey, - &locals_union1.privateKey, - 1) != CX_OK) { - ZERO(locals_union1); - ZERO(locals_union2); - return; - } - ZERO(locals_union1); - if (!getEthAddressStringFromKey(&locals_union2.publicKey, - locals_union1.address, - &local_sha3, - chain_config->chainId)) { - ZERO(locals_union1); - ZERO(locals_union2); - return; - } - ZERO(locals_union2); + getEthAddressStringFromRawKey((const uint8_t*) raw_pubkey, address, chain_config->chainId); uint8_t offset_0x = 0; if (memcmp(params->address_to_check, "0x", 2) == 0) { offset_0x = 2; } - if (strcmp(locals_union1.address, params->address_to_check + offset_0x) != 0) { + if (strcmp(address, params->address_to_check + offset_0x) != 0) { PRINTF("Addresses don't match\n"); } else { PRINTF("Addresses match\n"); params->result = 1; } - ZERO(locals_union1); } diff --git a/src/handle_check_address.h b/src/handle_check_address.h index 92db829..89a5541 100644 --- a/src/handle_check_address.h +++ b/src/handle_check_address.h @@ -5,6 +5,6 @@ #include "chainConfig.h" void handle_check_address(check_address_parameters_t* check_address_params, - chain_config_t* chain_config); + const chain_config_t* chain_config); #endif // _HANDLE_CHECK_ADDRESS_H_ diff --git a/src/handle_swap_sign_transaction.c b/src/handle_swap_sign_transaction.c index fc7167a..107365d 100644 --- a/src/handle_swap_sign_transaction.c +++ b/src/handle_swap_sign_transaction.c @@ -14,15 +14,15 @@ static uint8_t* G_swap_sign_return_value_address; bool copy_transaction_parameters(create_transaction_parameters_t* sign_transaction_params, - chain_config_t* config) { + const chain_config_t* config) { // first copy parameters to stack, and then to global data. // We need this "trick" as the input data position can overlap with app-ethereum globals txStringProperties_t stack_data; memset(&stack_data, 0, sizeof(stack_data)); - strlcpy(stack_data.fullAddress, + strlcpy(stack_data.toAddress, sign_transaction_params->destination_address, - sizeof(stack_data.fullAddress)); - if ((stack_data.fullAddress[sizeof(stack_data.fullAddress) - 1] != '\0') || + sizeof(stack_data.toAddress)); + if ((stack_data.toAddress[sizeof(stack_data.toAddress) - 1] != '\0') || (sign_transaction_params->amount_length > 32) || (sign_transaction_params->fee_amount_length > 8)) { return false; @@ -80,7 +80,7 @@ void __attribute__((noreturn)) finalize_exchange_sign_transaction(bool is_succes os_lib_end(); } -void __attribute__((noreturn)) handle_swap_sign_transaction(chain_config_t* config) { +void __attribute__((noreturn)) handle_swap_sign_transaction(const chain_config_t* config) { #ifdef HAVE_NBGL // On Stax, display a spinner at startup UX_INIT(); @@ -95,7 +95,6 @@ void __attribute__((noreturn)) handle_swap_sign_transaction(chain_config_t* conf if (N_storage.initialized != 0x01) { internalStorage_t storage; - storage.dataAllowed = 0x00; storage.contractDetails = 0x00; storage.initialized = 0x01; storage.displayNonce = 0x00; @@ -113,4 +112,6 @@ void __attribute__((noreturn)) handle_swap_sign_transaction(chain_config_t* conf BLE_power(1, NULL); #endif // HAVE_BLE app_main(); + // Failsafe + os_sched_exit(-1); } diff --git a/src/handle_swap_sign_transaction.h b/src/handle_swap_sign_transaction.h index 2c20f1e..1b5d877 100644 --- a/src/handle_swap_sign_transaction.h +++ b/src/handle_swap_sign_transaction.h @@ -4,8 +4,8 @@ #include "chainConfig.h" bool copy_transaction_parameters(create_transaction_parameters_t* sign_transaction_params, - chain_config_t* config); + const chain_config_t* config); -void __attribute__((noreturn)) handle_swap_sign_transaction(chain_config_t* config); +void __attribute__((noreturn)) handle_swap_sign_transaction(const chain_config_t* config); void __attribute__((noreturn)) finalize_exchange_sign_transaction(bool is_success); diff --git a/src/hash_bytes.c b/src/hash_bytes.c index e6b6437..4d3eab4 100644 --- a/src/hash_bytes.c +++ b/src/hash_bytes.c @@ -8,7 +8,7 @@ * @param[in] hash_ctx pointer to the hashing context */ void hash_nbytes(const uint8_t *bytes_ptr, size_t n, cx_hash_t *hash_ctx) { - cx_hash(hash_ctx, 0, bytes_ptr, n, NULL, 0); + CX_ASSERT(cx_hash_no_throw(hash_ctx, 0, bytes_ptr, n, NULL, 0)); } /** diff --git a/src/main.c b/src/main.c index 4f5ce6d..38876d7 100644 --- a/src/main.c +++ b/src/main.c @@ -31,13 +31,14 @@ #include "commands_712.h" #include "challenge.h" #include "domain_name.h" +#include "crypto_helpers.h" +#include "manage_asset_info.h" unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; void ui_idle(void); uint32_t set_result_get_publicKey(void); -void finalizeParsing(bool); tmpCtx_t tmpCtx; txContext_t txContext; @@ -66,7 +67,7 @@ const internalStorage_t N_storage_real; #ifdef HAVE_NBGL caller_app_t *caller_app = NULL; #endif -chain_config_t *chainConfig = NULL; +const chain_config_t *chainConfig; void reset_app_context() { // PRINTF("!!RESET_APP_CONTEXT\n"); @@ -78,6 +79,7 @@ void reset_app_context() { eth2WithdrawalIndex = 0; #endif memset((uint8_t *) &tmpCtx, 0, sizeof(tmpCtx)); + forget_known_assets(); memset((uint8_t *) &txContext, 0, sizeof(txContext)); memset((uint8_t *) &tmpContent, 0, sizeof(tmpContent)); } @@ -88,28 +90,6 @@ void io_seproxyhal_send_status(uint32_t sw) { io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); } -void format_signature_out(const uint8_t *signature) { - memset(G_io_apdu_buffer + 1, 0x00, 64); - uint8_t offset = 1; - uint8_t xoffset = 4; // point to r value - // copy r - uint8_t xlength = signature[xoffset - 1]; - if (xlength == 33) { - xlength = 32; - xoffset++; - } - memmove(G_io_apdu_buffer + offset + 32 - xlength, signature + xoffset, xlength); - offset += 32; - xoffset += xlength + 2; // move over rvalue and TagLEn - // copy s value - xlength = signature[xoffset - 1]; - if (xlength == 33) { - xlength = 32; - xoffset++; - } - memmove(G_io_apdu_buffer + offset + 32 - xlength, signature + xoffset, xlength); -} - unsigned short io_exchange_al(unsigned char channel, unsigned short tx_len) { switch (channel & ~(IO_FLAGS)) { case CHANNEL_KEYBOARD: @@ -135,48 +115,6 @@ unsigned short io_exchange_al(unsigned char channel, unsigned short tx_len) { return 0; } -extraInfo_t *getKnownToken(uint8_t *contractAddress) { - union extraInfo_t *currentItem = NULL; - // Works for ERC-20 & NFT tokens since both structs in the union have the - // contract address aligned - for (uint8_t i = 0; i < MAX_ITEMS; i++) { - currentItem = (union extraInfo_t *) &tmpCtx.transactionContext.extraInfo[i].token; - if (tmpCtx.transactionContext.tokenSet[i] && - (memcmp(currentItem->token.address, contractAddress, ADDRESS_LENGTH) == 0)) { - PRINTF("Token found at index %d\n", i); - return currentItem; - } - } - - return NULL; -} - -#ifndef HAVE_WALLET_ID_SDK - -unsigned int const U_os_perso_seed_cookie[] = { - 0xda7aba5e, - 0xc1a551c5, -}; - -void handleGetWalletId(volatile unsigned int *tx) { - unsigned char t[64]; - cx_ecfp_256_private_key_t priv; - cx_ecfp_256_public_key_t pub; - // seed => priv key - os_perso_derive_node_bip32(CX_CURVE_256K1, U_os_perso_seed_cookie, 2, t, NULL); - // priv key => pubkey - cx_ecdsa_init_private_key(CX_CURVE_256K1, t, 32, &priv); - cx_ecfp_generate_pair(CX_CURVE_256K1, &pub, &priv, 1); - // pubkey -> sha512 - cx_hash_sha512(pub.W, sizeof(pub.W), t, sizeof(t)); - // ! cookie ! - memmove(G_io_apdu_buffer, t, 64); - *tx = 64; - THROW(0x9000); -} - -#endif // HAVE_WALLET_ID_SDK - const uint8_t *parseBip32(const uint8_t *dataBuffer, uint8_t *dataLength, bip32_path_t *bip32) { if (*dataLength < 1) { PRINTF("Invalid data\n"); @@ -212,23 +150,13 @@ void handleApdu(unsigned int *flags, unsigned int *tx) { BEGIN_TRY { TRY { -#ifndef HAVE_WALLET_ID_SDK - - if ((G_io_apdu_buffer[OFFSET_CLA] == COMMON_CLA) && - (G_io_apdu_buffer[OFFSET_INS] == COMMON_INS_GET_WALLET_ID)) { - handleGetWalletId(tx); - return; - } - -#endif // HAVE_WALLET_ID_SDK - if (G_io_apdu_buffer[OFFSET_CLA] != CLA) { THROW(0x6E00); } switch (G_io_apdu_buffer[OFFSET_INS]) { case INS_GET_PUBLIC_KEY: - memset(tmpCtx.transactionContext.tokenSet, 0, MAX_ITEMS); + forget_known_assets(); handleGetPublicKey(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, @@ -303,7 +231,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) { break; case INS_SIGN_PERSONAL_MESSAGE: - memset(tmpCtx.transactionContext.tokenSet, 0, MAX_ITEMS); + forget_known_assets(); *flags |= IO_ASYNCH_REPLY; if (!handleSignPersonalMessage(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], @@ -316,7 +244,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) { case INS_SIGN_EIP_712_MESSAGE: switch (G_io_apdu_buffer[OFFSET_P2]) { case P2_EIP712_LEGACY_IMPLEM: - memset(tmpCtx.transactionContext.tokenSet, 0, MAX_ITEMS); + forget_known_assets(); handleSignEIP712Message_v0(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, @@ -338,7 +266,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) { #ifdef HAVE_ETH2 case INS_GET_ETH2_PUBLIC_KEY: - memset(tmpCtx.transactionContext.tokenSet, 0, MAX_ITEMS); + forget_known_assets(); handleGetEth2PublicKey(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, @@ -427,7 +355,7 @@ void handleApdu(unsigned int *flags, unsigned int *tx) { // If we are in swap mode and have validated a TX, we send it and immediately quit if (quit_now) { if (io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, *tx) == 0) { - // In case of success, the apdu is sent immediatly and eth exits + // In case of success, the apdu is sent immediately and eth exits // Reaching this code means we encountered an error finalize_exchange_sign_transaction(false); } else { @@ -508,15 +436,12 @@ void app_main(void) { } END_TRY; } - - // return_to_dashboard: - return; } // override point, but nothing more to do #ifdef HAVE_BAGL void io_seproxyhal_display(const bagl_element_t *element) { - io_seproxyhal_display_default((bagl_element_t *) element); + io_seproxyhal_display_default(element); } #endif @@ -586,7 +511,7 @@ void init_coin_config(chain_config_t *coin_config) { coin_config->chainId = CHAIN_ID; } -void coin_main(libargs_t *args) { +__attribute__((noreturn)) void coin_main(libargs_t *args) { chain_config_t config; if (args) { if (args->chain_config != NULL) { @@ -608,7 +533,6 @@ void coin_main(libargs_t *args) { } reset_app_context(); - tmpCtx.transactionContext.currentItemIndex = 0; for (;;) { UX_INIT(); @@ -624,11 +548,6 @@ void coin_main(libargs_t *args) { if (!N_storage.initialized) { internalStorage_t storage; -#ifdef HAVE_ALLOW_DATA - storage.dataAllowed = true; -#else - storage.dataAllowed = false; -#endif storage.contractDetails = false; storage.displayNonce = false; #ifdef HAVE_EIP712_FULL_SUPPORT @@ -672,10 +591,10 @@ void coin_main(libargs_t *args) { } END_TRY; } - app_exit(); + os_sched_exit(-1); } -void library_main(libargs_t *args) { +__attribute__((noreturn)) void library_main(libargs_t *args) { chain_config_t coin_config; if (args->chain_config == NULL) { // We have been started directly by Exchange, not by a Clone. Init default chain diff --git a/src/manage_asset_info.c b/src/manage_asset_info.c new file mode 100644 index 0000000..5965b5f --- /dev/null +++ b/src/manage_asset_info.c @@ -0,0 +1,50 @@ +#include "manage_asset_info.h" +#include "shared_context.h" + +void forget_known_assets(void) { + memset(tmpCtx.transactionContext.assetSet, false, MAX_ASSETS); + tmpCtx.transactionContext.currentAssetIndex = 0; +} + +static extraInfo_t *get_asset_info(int index) { + if ((index < 0) || (index >= MAX_ASSETS)) { + return NULL; + } + return &tmpCtx.transactionContext.extraInfo[index]; +} + +static bool asset_info_is_set(int index) { + if ((index < 0) || (index >= MAX_ASSETS)) { + return false; + } + return tmpCtx.transactionContext.assetSet[index]; +} + +int get_asset_index_by_addr(const uint8_t *addr) { + // Works for ERC-20 & NFT tokens since both structs in the union have the + // contract address aligned + for (int i = 0; i < MAX_ASSETS; i++) { + extraInfo_t *asset = get_asset_info(i); + if (asset_info_is_set(i) && (memcmp(asset->token.address, addr, ADDRESS_LENGTH) == 0)) { + PRINTF("Token found at index %d\n", i); + return i; + } + } + return -1; +} + +extraInfo_t *get_asset_info_by_addr(const uint8_t *addr) { + return get_asset_info(get_asset_index_by_addr(addr)); +} + +extraInfo_t *get_current_asset_info(void) { + return get_asset_info(tmpCtx.transactionContext.currentAssetIndex); +} + +void validate_current_asset_info(void) { + // mark it as set + tmpCtx.transactionContext.assetSet[tmpCtx.transactionContext.currentAssetIndex] = true; + // increment index + tmpCtx.transactionContext.currentAssetIndex = + (tmpCtx.transactionContext.currentAssetIndex + 1) % MAX_ASSETS; +} diff --git a/src/manage_asset_info.h b/src/manage_asset_info.h new file mode 100644 index 0000000..3b8a306 --- /dev/null +++ b/src/manage_asset_info.h @@ -0,0 +1,14 @@ +#ifndef MANAGE_ASSET_INFO_H_ +#define MANAGE_ASSET_INFO_H_ + +#include "shared_context.h" +#include "common_utils.h" +#include "asset_info.h" + +void forget_known_assets(void); +int get_asset_index_by_addr(const uint8_t *addr); +extraInfo_t *get_asset_info_by_addr(const uint8_t *contractAddress); +extraInfo_t *get_current_asset_info(void); +void validate_current_asset_info(void); + +#endif // MANAGE_ASSET_INFO_H_ diff --git a/src/mem.c b/src/mem.c index 2234cf4..b0b993a 100644 --- a/src/mem.c +++ b/src/mem.c @@ -11,7 +11,7 @@ #include #include "mem.h" -#define SIZE_MEM_BUFFER 8192 +#define SIZE_MEM_BUFFER 10240 static uint8_t mem_buffer[SIZE_MEM_BUFFER]; static size_t mem_idx; diff --git a/src/network.c b/src/network.c index 1563c32..608ceb4 100644 --- a/src/network.c +++ b/src/network.c @@ -13,79 +13,97 @@ typedef struct network_info_s { static const char *unknown_ticker = "???"; -// Mappping of chain ids to networks. +// Mapping of chain ids to networks. static const network_info_t NETWORK_MAPPING[] = { {.chain_id = 1, .name = "Ethereum", .ticker = "ETH"}, {.chain_id = 3, .name = "Ropsten", .ticker = "ETH"}, {.chain_id = 4, .name = "Rinkeby", .ticker = "ETH"}, {.chain_id = 5, .name = "Goerli", .ticker = "ETH"}, - {.chain_id = 10, .name = "Optimism", .ticker = "ETH"}, - {.chain_id = 42, .name = "LUKSO", .ticker = "LYX"}, - {.chain_id = 4201, .name = "LUKSO Testnet", .ticker = "LYXt"}, - {.chain_id = 56, .name = "BSC", .ticker = "BNB"}, - {.chain_id = 100, .name = "Gnosis", .ticker = "xDAI"}, - {.chain_id = 10200, .name = "Chiado", .ticker = "xDAI"}, - {.chain_id = 137, .name = "Polygon", .ticker = "MATIC"}, - {.chain_id = 250, .name = "Fantom", .ticker = "FTM"}, - {.chain_id = 42161, .name = "Arbitrum", .ticker = "ETH"}, - {.chain_id = 42220, .name = "Celo", .ticker = "CELO"}, - {.chain_id = 43114, .name = "Avalanche", .ticker = "AVAX"}, - {.chain_id = 44787, .name = "Celo Alfajores", .ticker = "aCELO"}, - {.chain_id = 62320, .name = "Celo Baklava", .ticker = "bCELO"}, - {.chain_id = 11297108109, .name = "Palm Network", .ticker = "PALM"}, - {.chain_id = 1818, .name = "Cube", .ticker = "CUBE"}, - {.chain_id = 336, .name = "Shiden", .ticker = "SDN"}, - {.chain_id = 592, .name = "Astar", .ticker = "ASTR"}, - {.chain_id = 50, .name = "XDC", .ticker = "XDC"}, - {.chain_id = 82, .name = "Meter", .ticker = "MTR"}, - {.chain_id = 62621, .name = "Multivac", .ticker = "MTV"}, - {.chain_id = 20531812, .name = "Tecra", .ticker = "TCR"}, - {.chain_id = 20531811, .name = "TecraTestnet", .ticker = "TCR"}, - {.chain_id = 51, .name = "Apothemnetwork", .ticker = "XDC"}, - {.chain_id = 199, .name = "BTTC", .ticker = "BTT"}, - {.chain_id = 1030, .name = "Conflux", .ticker = "CFX"}, - {.chain_id = 61, .name = "Ethereum Classic", .ticker = "ETC"}, - {.chain_id = 246, .name = "EnergyWebChain", .ticker = "EWT"}, + {.chain_id = 10, .name = "OP Mainnet", .ticker = "ETH"}, {.chain_id = 14, .name = "Flare", .ticker = "FLR"}, {.chain_id = 16, .name = "Flare Coston", .ticker = "FLR"}, + {.chain_id = 19, .name = "Songbird", .ticker = "SGB"}, {.chain_id = 24, .name = "KardiaChain", .ticker = "KAI"}, + {.chain_id = 25, .name = "Cronos", .ticker = "CRO"}, + {.chain_id = 30, .name = "Rootstock", .ticker = "RBTC"}, + {.chain_id = 40, .name = "Telos EVM Mainnet", .ticker = "TLOS"}, + {.chain_id = 42, .name = "LUKSO", .ticker = "LYX"}, + {.chain_id = 50, .name = "XDC", .ticker = "XDC"}, + {.chain_id = 51, .name = "Apothemnetwork", .ticker = "XDC"}, + {.chain_id = 56, .name = "BSC", .ticker = "BNB"}, + {.chain_id = 57, .name = "Syscoin", .ticker = "SYS"}, + {.chain_id = 61, .name = "Ethereum Classic", .ticker = "ETC"}, + {.chain_id = 66, .name = "OKXChain", .ticker = "OKT"}, + {.chain_id = 82, .name = "Meter", .ticker = "MTR"}, + {.chain_id = 99, .name = "POA", .ticker = "POA"}, + {.chain_id = 100, .name = "Gnosis", .ticker = "xDAI"}, + {.chain_id = 106, .name = "Velas EVM", .ticker = "VLX"}, + {.chain_id = 137, .name = "Polygon", .ticker = "MATIC"}, + {.chain_id = 196, .name = "OKBChain Mainnet", .ticker = "OKB"}, + {.chain_id = 199, .name = "BTTC", .ticker = "BTT"}, + {.chain_id = 246, .name = "EnergyWebChain", .ticker = "EWT"}, + {.chain_id = 248, .name = "Oasys", .ticker = "OAS"}, + {.chain_id = 250, .name = "Fantom", .ticker = "FTM"}, + {.chain_id = 288, .name = "Boba Network", .ticker = "ETH"}, + {.chain_id = 300, .name = "ZKsync Sepolia Testnet", .ticker = "ETH"}, + {.chain_id = 321, .name = "KCC", .ticker = "KCS"}, + {.chain_id = 324, .name = "ZKsync Era", .ticker = "ETH"}, + {.chain_id = 336, .name = "Shiden", .ticker = "SDN"}, + {.chain_id = 369, .name = "PulseChain", .ticker = "PLS"}, + {.chain_id = 592, .name = "Astar", .ticker = "ASTR"}, + {.chain_id = 1030, .name = "Conflux", .ticker = "CFX"}, + {.chain_id = 1088, .name = "Metis Andromeda", .ticker = "METIS"}, + {.chain_id = 1101, .name = "Polygon zkEVM", .ticker = "ETH"}, + {.chain_id = 1116, .name = "Core", .ticker = "CORE"}, + {.chain_id = 1135, .name = "Lisk", .ticker = "ETH"}, {.chain_id = 1284, .name = "Moonbeam", .ticker = "GLMR"}, {.chain_id = 1285, .name = "Moonriver", .ticker = "MOVR"}, - {.chain_id = 66, .name = "OKXChain", .ticker = "OKT"}, - {.chain_id = 99, .name = "POA", .ticker = "POA"}, + {.chain_id = 1818, .name = "Cube", .ticker = "CUBE"}, + {.chain_id = 1907, .name = "Bitcichain", .ticker = "BITCI"}, + {.chain_id = 2222, .name = "Kava EVM", .ticker = "KAVA"}, + {.chain_id = 3776, .name = "Astar zkEVM", .ticker = "ETH"}, + {.chain_id = 4201, .name = "LUKSO Testnet", .ticker = "LYXt"}, + {.chain_id = 4202, .name = "Lisk Sepolia Testnet", .ticker = "ETH"}, + {.chain_id = 4919, .name = "Venidium", .ticker = "XVM"}, + {.chain_id = 5000, .name = "Mantle", .ticker = "MNT"}, + {.chain_id = 5003, .name = "Mantle Sepolia", .ticker = "MNT"}, + {.chain_id = 7000, .name = "ZetaChain", .ticker = "ZETA"}, + {.chain_id = 7171, .name = "Bitrock Mainnet", .ticker = "BROCK"}, {.chain_id = 7341, .name = "Shyft", .ticker = "SHFT"}, - {.chain_id = 19, .name = "Songbird", .ticker = "SGB"}, + {.chain_id = 8217, .name = "Klaytn Cypress", .ticker = "KLAY"}, + {.chain_id = 8453, .name = "Base", .ticker = "ETH"}, + {.chain_id = 9001, .name = "Evmos", .ticker = "EVMOS"}, + {.chain_id = 10200, .name = "Chiado", .ticker = "xDAI"}, + {.chain_id = 10507, .name = "Numbers Protocol", .ticker = "NUM"}, + {.chain_id = 17000, .name = "Holesky", .ticker = "ETH"}, + {.chain_id = 39797, .name = "Energi", .ticker = "NRG"}, + {.chain_id = 42161, .name = "Arbitrum", .ticker = "ETH"}, + {.chain_id = 42220, .name = "Celo", .ticker = "CELO"}, + {.chain_id = 42793, .name = "Etherlink Mainnet", .ticker = "XTZ"}, + {.chain_id = 43114, .name = "Avalanche", .ticker = "AVAX"}, + {.chain_id = 44787, .name = "Celo Alfajores", .ticker = "aCELO"}, + {.chain_id = 52014, .name = "Electroneum", .ticker = "ETN"}, + {.chain_id = 59141, .name = "Linea Sepolia", .ticker = "ETH"}, + {.chain_id = 59144, .name = "Linea", .ticker = "ETH"}, + {.chain_id = 60808, .name = "BOB", .ticker = "ETH"}, + {.chain_id = 62320, .name = "Celo Baklava", .ticker = "bCELO"}, + {.chain_id = 62621, .name = "Multivac", .ticker = "MTV"}, {.chain_id = 73799, .name = "Volta", .ticker = "VOLTA"}, - {.chain_id = 25, .name = "Cronos", .ticker = "CRO"}, - {.chain_id = 534353, .name = "Scroll Alpha", .ticker = "ETH"}, + {.chain_id = 81457, .name = "Blast", .ticker = "ETH"}, + {.chain_id = 84532, .name = "Base Sepolia", .ticker = "ETH"}, + {.chain_id = 421614, .name = "Arbitrum Sepolia", .ticker = "ETH"}, {.chain_id = 534351, .name = "Scroll Sepolia", .ticker = "ETH"}, {.chain_id = 534352, .name = "Scroll", .ticker = "ETH"}, - {.chain_id = 321, .name = "KCC", .ticker = "KCS"}, - {.chain_id = 30, .name = "Rootstock", .ticker = "RBTC"}, - {.chain_id = 9001, .name = "Evmos", .ticker = "EVMOS"}, - {.chain_id = 1088, .name = "Metis Andromeda", .ticker = "METIS"}, - {.chain_id = 2222, .name = "Kava EVM", .ticker = "KAVA"}, - {.chain_id = 8217, .name = "Klaytn Cypress", .ticker = "KLAY"}, - {.chain_id = 57, .name = "Syscoin", .ticker = "SYS"}, - {.chain_id = 106, .name = "Velas EVM", .ticker = "VLX"}, - {.chain_id = 288, .name = "Boba Network", .ticker = "ETH"}, - {.chain_id = 39797, .name = "Energi", .ticker = "NRG"}, - {.chain_id = 369, .name = "PulseChain", .ticker = "PLS"}, + {.chain_id = 534353, .name = "Scroll Alpha", .ticker = "ETH"}, + {.chain_id = 5201420, .name = "Electroneum Testnet", .ticker = "ETN"}, + {.chain_id = 11155111, .name = "Sepolia", .ticker = "ETH"}, + {.chain_id = 11155420, .name = "OP Sepolia", .ticker = "ETH"}, + {.chain_id = 20531811, .name = "TecraTestnet", .ticker = "TCR"}, + {.chain_id = 20531812, .name = "Tecra", .ticker = "TCR"}, + {.chain_id = 168587773, .name = "Blast Sepolia", .ticker = "ETH"}, {.chain_id = 245022926, .name = "Neon EVM Devnet", .ticker = "NEON"}, {.chain_id = 245022934, .name = "Neon EVM Mainnet", .ticker = "NEON"}, - {.chain_id = 4919, .name = "Venidium", .ticker = "XVM"}, - {.chain_id = 40, .name = "Telos EVM Mainnet", .ticker = "TLOS"}, - {.chain_id = 196, .name = "OKBChain Mainnet", .ticker = "OKB"}, - {.chain_id = 248, .name = "Oasys", .ticker = "OAS"}, - {.chain_id = 1101, .name = "Polygon zkEVM", .ticker = "ETH"}, - {.chain_id = 8453, .name = "Base", .ticker = "ETH"}, - {.chain_id = 1907, .name = "Bitcichain", .ticker = "BITCI"}, - {.chain_id = 1116, .name = "Core", .ticker = "CORE"}, - {.chain_id = 7171, .name = "Bitrock Mainnet", .ticker = "BROCK"}, - {.chain_id = 10507, .name = "Numbers Protocol", .ticker = "NUM"}, - {.chain_id = 59144, .name = "Linea", .ticker = "ETH"}, - {.chain_id = 11155111, .name = "Sepolia", .ticker = "ETH"}, - {.chain_id = 17000, .name = "Holesky", .ticker = "ETH"}, + {.chain_id = 11297108109, .name = "Palm Network", .ticker = "PALM"}, }; static const network_info_t *get_network_from_chain_id(const uint64_t *chain_id) { @@ -153,7 +171,7 @@ const char *get_displayable_ticker(const uint64_t *chain_id, const chain_config_ } /** - * Checks wether the app can support the given chain ID + * Checks whether the app can support the given chain ID * * - If the given chain ID is the same as the app's one * - If both chain IDs are present in the array of Ethereum-compatible networks diff --git a/src/plugins.c b/src/plugins.c index 42c17a9..ee5a2f7 100644 --- a/src/plugins.c +++ b/src/plugins.c @@ -4,8 +4,8 @@ void plugin_ui_get_id(void) { ethQueryContractID_t pluginQueryContractID; eth_plugin_prepare_query_contract_ID(&pluginQueryContractID, - strings.common.fullAddress, - sizeof(strings.common.fullAddress), + strings.common.toAddress, + sizeof(strings.common.toAddress), strings.common.fullAmount, sizeof(strings.common.fullAmount)); // Query the original contract for ID if it's not an internal alias @@ -33,8 +33,8 @@ void plugin_ui_get_item_internal(char *title_buffer, } void plugin_ui_get_item(void) { - plugin_ui_get_item_internal(strings.common.fullAddress, - sizeof(strings.common.fullAddress), + plugin_ui_get_item_internal(strings.common.toAddress, + sizeof(strings.common.toAddress), strings.common.fullAmount, sizeof(strings.common.fullAmount)); -} \ No newline at end of file +} diff --git a/src/plugins.h b/src/plugins.h index 1ccc123..df406c0 100644 --- a/src/plugins.h +++ b/src/plugins.h @@ -8,4 +8,4 @@ void plugin_ui_get_item_internal(uint8_t *title_buffer, uint8_t *msg_buffer, size_t msg_buffer_size); -#endif // _PLUGIN_H_ \ No newline at end of file +#endif // _PLUGIN_H_ diff --git a/src/shared_context.h b/src/shared_context.h index 4c15914..9208b0d 100644 --- a/src/shared_context.h +++ b/src/shared_context.h @@ -22,13 +22,14 @@ #define N_storage (*(volatile internalStorage_t *) PIC(&N_storage_real)) +#define MAX_ASSETS 5 + typedef struct bip32_path_t { uint8_t length; uint32_t path[MAX_BIP32_PATH]; } bip32_path_t; typedef struct internalStorage_t { - bool dataAllowed; bool contractDetails; bool displayNonce; #ifdef HAVE_EIP712_FULL_SUPPORT @@ -58,7 +59,9 @@ typedef struct tokenContext_t { }; // This needs to be strictly 4 bytes aligned since pointers to it will be casted as // plugin context struct pointers (structs that contain up to 4 bytes wide elements) - uint8_t pluginContext[5 * INT256_LENGTH] __attribute__((aligned(4))); + // uint8_t pluginContext[5 * INT256_LENGTH] __attribute__((aligned(4))); + // TODO: use PLUGIN_CONTEXT_SIZE after eth is released with the updated plugin sdk + uint8_t pluginContext[10 * INT256_LENGTH] __attribute__((aligned(4))); }; uint8_t pluginStatus; @@ -77,9 +80,9 @@ typedef struct publicKeyContext_t { typedef struct transactionContext_t { bip32_path_t bip32; uint8_t hash[INT256_LENGTH]; - union extraInfo_t extraInfo[MAX_ITEMS]; - uint8_t tokenSet[MAX_ITEMS]; - uint8_t currentItemIndex; + union extraInfo_t extraInfo[MAX_ASSETS]; + bool assetSet[MAX_ASSETS]; + uint8_t currentAssetIndex; } transactionContext_t; typedef struct messageSigningContext_t { @@ -123,7 +126,8 @@ typedef enum { #define NETWORK_STRING_MAX_SIZE 19 typedef struct txStringProperties_s { - char fullAddress[43]; + char fromAddress[43]; + char toAddress[43]; char fullAmount[79]; // 2^256 is 78 digits long char maxFee[50]; char nonce[8]; // 10M tx per account ought to be enough for everybody @@ -133,8 +137,12 @@ typedef struct txStringProperties_s { #ifdef TARGET_NANOS #define SHARED_CTX_FIELD_1_SIZE 100 #else +#ifdef SCREEN_SIZE_WALLET +#define SHARED_CTX_FIELD_1_SIZE 380 +#else #define SHARED_CTX_FIELD_1_SIZE 256 #endif +#endif #define SHARED_CTX_FIELD_2_SIZE 40 typedef struct strDataTmp_s { @@ -147,7 +155,7 @@ typedef union { strDataTmp_t tmp; } strings_t; -extern chain_config_t *chainConfig; +extern const chain_config_t *chainConfig; extern tmpCtx_t tmpCtx; extern txContext_t txContext; diff --git a/src/swap_utils.c b/src/swap_utils.c index 8a5db86..7774b75 100644 --- a/src/swap_utils.c +++ b/src/swap_utils.c @@ -53,7 +53,6 @@ bool parse_swap_config(const uint8_t *config, if ((config_len - offset) >= sizeof(*chain_id)) { PRINTF("Chain ID from the swap subconfig = 0x%.*h\n", sizeof(*chain_id), &config[offset]); *chain_id = u64_from_BE(config + offset, sizeof(*chain_id)); - offset += sizeof(*chain_id); } return true; } diff --git a/src/ui_callbacks.h b/src/ui_callbacks.h index 3063400..ed6a41e 100644 --- a/src/ui_callbacks.h +++ b/src/ui_callbacks.h @@ -1,5 +1,4 @@ -#ifndef _UI_CALLBACKS_H_ -#define _UI_CALLBACKS_H_ +#pragma once #include "shared_context.h" #include "ux.h" @@ -25,8 +24,3 @@ unsigned int io_seproxyhal_touch_privacy_cancel(const bagl_element_t *e); void ui_warning_contract_data(void); void io_seproxyhal_send_status(uint32_t sw); -void format_signature_out(const uint8_t *signature); -void finalizeParsing(bool direct); -extraInfo_t *getKnownToken(uint8_t *contractAddress); - -#endif // _UI_CALLBACKS_H_ diff --git a/src/uint128.c b/src/uint128.c index b720e35..1dda650 100644 --- a/src/uint128.c +++ b/src/uint128.c @@ -53,11 +53,9 @@ void shiftl128(const uint128_t *const number, uint32_t value, uint128_t *const t } else if (value < 64) { UPPER_P(target) = (UPPER_P(number) << value) + (LOWER_P(number) >> (64 - value)); LOWER_P(target) = (LOWER_P(number) << value); - } else if ((128 > value) && (value > 64)) { + } else { UPPER_P(target) = LOWER_P(number) << (value - 64); LOWER_P(target) = 0; - } else { - clear128(target); } } @@ -74,11 +72,9 @@ void shiftr128(const uint128_t *const number, uint32_t value, uint128_t *const t UPPER(result) = UPPER_P(number) >> value; LOWER(result) = (UPPER_P(number) << (64 - value)) + (LOWER_P(number) >> value); copy128(target, &result); - } else if ((128 > value) && (value > 64)) { + } else { LOWER_P(target) = UPPER_P(number) >> (value - 64); UPPER_P(target) = 0; - } else { - clear128(target); } } diff --git a/src/uint256.c b/src/uint256.c index 8829c90..7445b42 100644 --- a/src/uint256.c +++ b/src/uint256.c @@ -59,11 +59,9 @@ void shiftl256(const uint256_t *const number, uint32_t value, uint256_t *const t add128(&tmp1, &tmp2, &UPPER(result)); shiftl128(&LOWER_P(number), value, &LOWER(result)); copy256(target, &result); - } else if ((256 > value) && (value > 128)) { + } else { shiftl128(&LOWER_P(number), (value - 128), &UPPER_P(target)); clear128(&LOWER_P(target)); - } else { - clear256(target); } } @@ -84,11 +82,9 @@ void shiftr256(const uint256_t *const number, uint32_t value, uint256_t *const t shiftl128(&UPPER_P(number), (128 - value), &tmp2); add128(&tmp1, &tmp2, &LOWER(result)); copy256(target, &result); - } else if ((256 > value) && (value > 128)) { + } else { shiftr128(&UPPER_P(number), (value - 128), &LOWER_P(target)); clear128(&UPPER_P(target)); - } else { - clear256(target); } } @@ -175,7 +171,7 @@ void mul256(const uint256_t *const number1, write_u64_be(num1 + i * sizeof(uint64_t), number1->elements[i / 2].elements[i % 2]); write_u64_be(num2 + i * sizeof(uint64_t), number2->elements[i / 2].elements[i % 2]); } - cx_math_mult(result, num1, num2, sizeof(num1)); + CX_ASSERT(cx_math_mult_no_throw(result, num1, num2, sizeof(num1))); for (uint8_t i = 0; i < 4; i++) { read_u64_be(result + 32 + i * sizeof(uint64_t), &target->elements[i / 2].elements[i % 2]); } diff --git a/src/uint_common.h b/src/uint_common.h index c12d9e8..c0e9ac2 100644 --- a/src/uint_common.h +++ b/src/uint_common.h @@ -21,6 +21,9 @@ #define _UINT_COMMON_H_ #include +#include +#include +#include "format.h" #define UPPER_P(x) x->elements[0] #define LOWER_P(x) x->elements[1] diff --git a/src_bagl/common_ui.c b/src_bagl/common_ui.c index dc64504..044df68 100644 --- a/src_bagl/common_ui.c +++ b/src_bagl/common_ui.c @@ -13,7 +13,7 @@ void ui_idle(void) { } void ui_warning_contract_data(void) { - ux_flow_init(0, ux_warning_contract_data_flow, NULL); + ux_flow_init(0, ux_blind_signing_flow, NULL); } void ui_display_public_eth2(void) { diff --git a/src_bagl/ui_domain_name.c b/src_bagl/ui_domain_name.c index 3121546..3807a61 100644 --- a/src_bagl/ui_domain_name.c +++ b/src_bagl/ui_domain_name.c @@ -9,7 +9,7 @@ UX_STEP_NOCB( ux_domain_name_step, bnnn_paging, { - .title = "Domain", + .title = "To (domain)", .text = g_domain_name }); // clang-format on diff --git a/src_bagl/ui_flow.c b/src_bagl/ui_flow.c index 17f7eed..823a236 100644 --- a/src_bagl/ui_flow.c +++ b/src_bagl/ui_flow.c @@ -2,6 +2,7 @@ #include "ui_callbacks.h" #include "common_ui.h" #include "common_utils.h" +#include "feature_signTx.h" #define ENABLED_STR "Enabled" #define DISABLED_STR "Disabled" @@ -9,16 +10,14 @@ // Reuse the strings.common.fullAmount buffer for settings displaying. // No risk of collision as this buffer is unused in the settings menu -#define SETTING_BLIND_SIGNING_STATE (strings.common.fullAmount) -#define SETTING_DISPLAY_DATA_STATE (strings.common.fullAmount + (BUF_INCREMENT * 1)) +#define SETTING_VERBOSE_DOMAIN_NAME_STATE (strings.common.fullAmount + (BUF_INCREMENT * 0)) +#define SETTING_VERBOSE_EIP712_STATE (strings.common.fullAmount + (BUF_INCREMENT * 1)) #define SETTING_DISPLAY_NONCE_STATE (strings.common.fullAmount + (BUF_INCREMENT * 2)) -#define SETTING_VERBOSE_EIP712_STATE (strings.common.fullAmount + (BUF_INCREMENT * 3)) -#define SETTING_VERBOSE_DOMAIN_NAME_STATE (strings.common.fullAmount + (BUF_INCREMENT * 4)) +#define SETTING_DISPLAY_DATA_STATE (strings.common.fullAmount + (BUF_INCREMENT * 3)) #define BOOL_TO_STATE_STR(b) (b ? ENABLED_STR : DISABLED_STR) static void display_settings(const ux_flow_step_t* const start_step); -static void switch_settings_blind_signing(void); static void switch_settings_display_data(void); static void switch_settings_display_nonce(void); #ifdef HAVE_EIP712_FULL_SUPPORT @@ -71,45 +70,31 @@ UX_FLOW(ux_idle_flow, FLOW_LOOP); // clang-format off +#ifdef HAVE_DOMAIN_NAME UX_STEP_CB( - ux_settings_flow_blind_signing_step, -#ifdef TARGET_NANOS - bnnn_paging, -#else + ux_settings_flow_verbose_domain_name_step, bnnn, -#endif - switch_settings_blind_signing(), + switch_settings_verbose_domain_name(), { -#ifdef TARGET_NANOS - .title = "Blind signing", - .text = -#else - "Blind signing", - "Transaction", - "blind signing", -#endif - SETTING_BLIND_SIGNING_STATE + "ENS addresses", + "Displays resolved", + "addresses from ENS", + SETTING_VERBOSE_DOMAIN_NAME_STATE }); +#endif // HAVE_DOMAIN_NAME +#ifdef HAVE_EIP712_FULL_SUPPORT UX_STEP_CB( - ux_settings_flow_display_data_step, -#ifdef TARGET_NANOS - bnnn_paging, -#else + ux_settings_flow_verbose_eip712_step, bnnn, -#endif - switch_settings_display_data(), + switch_settings_verbose_eip712(), { -#ifdef TARGET_NANOS - .title = "Debug data", - .text = -#else - "Debug data", - "Show contract data", - "details", -#endif - SETTING_DISPLAY_DATA_STATE + "Raw messages", + "Displays raw content", + "from EIP712 messages", + SETTING_VERBOSE_EIP712_STATE }); +#endif // HAVE_EIP712_FULL_SUPPORT UX_STEP_CB( ux_settings_flow_display_nonce_step, @@ -125,38 +110,31 @@ UX_STEP_CB( .text = #else "Nonce", - "Show account nonce", + "Displays nonce", "in transactions", #endif SETTING_DISPLAY_NONCE_STATE }); -#ifdef HAVE_EIP712_FULL_SUPPORT UX_STEP_CB( - ux_settings_flow_verbose_eip712_step, + ux_settings_flow_display_data_step, +#ifdef TARGET_NANOS + bnnn_paging, +#else bnnn, - switch_settings_verbose_eip712(), +#endif + switch_settings_display_data(), { - "Verbose EIP-712", - "Ignore filtering &", - "display raw content", - SETTING_VERBOSE_EIP712_STATE +#ifdef TARGET_NANOS + .title = "Debug data", + .text = +#else + "Debug contracts", + "Displays contract", + "data details", +#endif + SETTING_DISPLAY_DATA_STATE }); -#endif // HAVE_EIP712_FULL_SUPPORT - -#ifdef HAVE_DOMAIN_NAME -UX_STEP_CB( - ux_settings_flow_verbose_domain_name_step, - bnnn, - switch_settings_verbose_domain_name(), - { - "Verbose domains", - "Show", - "resolved address", - SETTING_VERBOSE_DOMAIN_NAME_STATE - }); -#endif // HAVE_DOMAIN_NAME - UX_STEP_CB( ux_settings_flow_back_step, @@ -169,19 +147,17 @@ UX_STEP_CB( // clang-format on UX_FLOW(ux_settings_flow, - &ux_settings_flow_blind_signing_step, - &ux_settings_flow_display_data_step, - &ux_settings_flow_display_nonce_step, -#ifdef HAVE_EIP712_FULL_SUPPORT - &ux_settings_flow_verbose_eip712_step, -#endif // HAVE_EIP712_FULL_SUPPORT #ifdef HAVE_DOMAIN_NAME &ux_settings_flow_verbose_domain_name_step, #endif // HAVE_DOMAIN_NAME +#ifdef HAVE_EIP712_FULL_SUPPORT + &ux_settings_flow_verbose_eip712_step, +#endif // HAVE_EIP712_FULL_SUPPORT + &ux_settings_flow_display_nonce_step, + &ux_settings_flow_display_data_step, &ux_settings_flow_back_step); static void display_settings(const ux_flow_step_t* const start_step) { - strlcpy(SETTING_BLIND_SIGNING_STATE, BOOL_TO_STATE_STR(N_storage.dataAllowed), BUF_INCREMENT); strlcpy(SETTING_DISPLAY_DATA_STATE, BOOL_TO_STATE_STR(N_storage.contractDetails), BUF_INCREMENT); @@ -206,10 +182,6 @@ static void toggle_setting(volatile bool* setting, const ux_flow_step_t* ui_step display_settings(ui_step); } -static void switch_settings_blind_signing(void) { - toggle_setting(&N_storage.dataAllowed, &ux_settings_flow_blind_signing_step); -} - static void switch_settings_display_data(void) { toggle_setting(&N_storage.contractDetails, &ux_settings_flow_display_data_step); } @@ -232,26 +204,76 @@ static void switch_settings_verbose_domain_name(void) { ////////////////////////////////////////////////////////////////////// // clang-format off +UX_STEP_NOCB( + ux_blind_signing_warning_step, + pbb, + { + &C_icon_warning, #ifdef TARGET_NANOS -UX_STEP_CB( - ux_warning_contract_data_step, - bnnn_paging, - ui_idle(), - { - "Error", - "Blind signing must be enabled in Settings", - }); + "Transaction", + "not trusted", #else -UX_STEP_CB( - ux_warning_contract_data_step, - pnn, - ui_idle(), + "This transaction", + "cannot be trusted", +#endif + }); +#ifndef TARGET_NANOS +UX_STEP_NOCB( + ux_blind_signing_text1_step, + nnnn, { - &C_icon_crossmark, - "Blind signing must be", - "enabled in Settings", + "Your Ledger cannot", + "decode this", + "transaction. If you", + "sign it, you could", + }); +UX_STEP_NOCB( + ux_blind_signing_text2_step, + nnnn, + { + "be authorizing", + "malicious actions", + "that can drain your", + "wallet.", }); #endif +UX_STEP_NOCB( + ux_blind_signing_link_step, + nn, + { + "Learn more:", + "ledger.com/e8", + }); +UX_STEP_CB( + ux_blind_signing_accept_step, + pbb, + start_signature_flow(), + { + &C_icon_validate_14, +#ifdef TARGET_NANOS + "Accept risk", + "and review", +#else + "Accept risk and", + "review transaction", +#endif + }); +UX_STEP_CB( + ux_blind_signing_reject_step, + pb, + report_finalize_error(), + { + &C_icon_crossmark, + "Reject", + }); // clang-format on -UX_FLOW(ux_warning_contract_data_flow, &ux_warning_contract_data_step); +UX_FLOW(ux_blind_signing_flow, + &ux_blind_signing_warning_step, +#ifndef TARGET_NANOS + &ux_blind_signing_text1_step, + &ux_blind_signing_text2_step, +#endif + &ux_blind_signing_link_step, + &ux_blind_signing_accept_step, + &ux_blind_signing_reject_step); diff --git a/src_bagl/ui_flow.h b/src_bagl/ui_flow.h index ae2590d..e3d4270 100644 --- a/src_bagl/ui_flow.h +++ b/src_bagl/ui_flow.h @@ -8,7 +8,7 @@ extern const ux_flow_step_t* const ux_idle_flow[]; -extern const ux_flow_step_t* const ux_warning_contract_data_flow[]; +extern const ux_flow_step_t* const ux_blind_signing_flow[]; extern const ux_flow_step_t* const ux_settings_flow[]; diff --git a/src_bagl/ui_flow_erc20_approval.c b/src_bagl/ui_flow_erc20_approval.c index 91e78f1..9c512b4 100644 --- a/src_bagl/ui_flow_erc20_approval.c +++ b/src_bagl/ui_flow_erc20_approval.c @@ -23,7 +23,7 @@ UX_STEP_NOCB( bnnn_paging, { .title = "Contract Name", - .text = strings.common.fullAddress, + .text = strings.common.toAddress, }); UX_STEP_NOCB( diff --git a/src_bagl/ui_flow_getEth2PublicKey.c b/src_bagl/ui_flow_getEth2PublicKey.c index af2142f..cccf070 100644 --- a/src_bagl/ui_flow_getEth2PublicKey.c +++ b/src_bagl/ui_flow_getEth2PublicKey.c @@ -2,9 +2,13 @@ #include "shared_context.h" #include "ui_callbacks.h" +#include "uint_common.h" void prepare_eth2_public_key() { - snprintf(strings.tmp.tmp, 100, "0x%.*H", 48, tmpCtx.publicKeyContext.publicKey.W); + array_bytes_string(strings.tmp.tmp, + sizeof(strings.tmp.tmp), + tmpCtx.publicKeyContext.publicKey.W, + 48); } // clang-format off diff --git a/src_bagl/ui_flow_getPublicKey.c b/src_bagl/ui_flow_getPublicKey.c index 9bd6620..3ca3f77 100644 --- a/src_bagl/ui_flow_getPublicKey.c +++ b/src_bagl/ui_flow_getPublicKey.c @@ -15,7 +15,7 @@ UX_STEP_NOCB( bnnn_paging, { .title = "Address", - .text = strings.common.fullAddress, + .text = strings.common.toAddress, }); UX_STEP_CB( ux_display_public_flow_3_step, diff --git a/src_bagl/ui_flow_performPrivacyOperation.c b/src_bagl/ui_flow_performPrivacyOperation.c index 5c181ef..d1cb8d3 100644 --- a/src_bagl/ui_flow_performPrivacyOperation.c +++ b/src_bagl/ui_flow_performPrivacyOperation.c @@ -3,7 +3,7 @@ // clang-format off UX_STEP_NOCB( - ux_display_privacy_public_key_flow_1_step, + ux_display_privacy_public_key_flow_1_step, pnn, { &C_icon_eye, @@ -11,21 +11,21 @@ UX_STEP_NOCB( "privacy key", }); UX_STEP_NOCB( - ux_display_privacy_public_key_flow_2_step, + ux_display_privacy_public_key_flow_2_step, bnnn_paging, { .title = "Address", - .text = strings.common.fullAddress, + .text = strings.common.toAddress, }); UX_STEP_NOCB( - ux_display_privacy_public_key_flow_3_step, + ux_display_privacy_public_key_flow_3_step, bnnn_paging, { .title = "Key", .text = strings.common.fullAmount, }); UX_STEP_CB( - ux_display_privacy_public_key_flow_4_step, + ux_display_privacy_public_key_flow_4_step, pb, io_seproxyhal_touch_privacy_ok(NULL), { @@ -33,7 +33,7 @@ UX_STEP_CB( "Approve", }); UX_STEP_CB( - ux_display_privacy_public_key_flow_5_step, + ux_display_privacy_public_key_flow_5_step, pb, io_seproxyhal_touch_privacy_cancel(NULL), { diff --git a/src_bagl/ui_flow_signMessage.c b/src_bagl/ui_flow_signMessage.c index 3c2a75a..60b3fca 100644 --- a/src_bagl/ui_flow_signMessage.c +++ b/src_bagl/ui_flow_signMessage.c @@ -34,7 +34,7 @@ UX_STEP_NOCB( pnn, { &C_icon_certificate, - "Sign", + "Review", "message", }); UX_STEP_NOCB( diff --git a/src_bagl/ui_flow_signMessage712.c b/src_bagl/ui_flow_signMessage712.c index d21d047..3ffb5b0 100644 --- a/src_bagl/ui_flow_signMessage712.c +++ b/src_bagl/ui_flow_signMessage712.c @@ -12,10 +12,9 @@ static void dummy_cb(void) { if (ui_pos == UI_712_POS_REVIEW) { ux_flow_next(); ui_pos = UI_712_POS_END; - } else // UI_712_POS_END - { - ux_flow_prev(); - ui_pos = UI_712_POS_REVIEW; + } else { + // Keep user at the end of the flow + ux_flow_next(); } break; case EIP712_FIELD_INCOMING: @@ -57,7 +56,7 @@ UX_STEP_INIT( UX_STEP_CB( ux_712_step_approve, pb, - ui_712_approve(NULL), + ui_712_approve(), { &C_icon_validate_14, "Approve", @@ -65,7 +64,7 @@ UX_STEP_CB( UX_STEP_CB( ux_712_step_reject, pb, - ui_712_reject(NULL), + ui_712_reject(), { &C_icon_crossmark, "Reject", diff --git a/src_bagl/ui_flow_signMessage712_v0.c b/src_bagl/ui_flow_signMessage712_v0.c index 9cdda70..72c6435 100644 --- a/src_bagl/ui_flow_signMessage712_v0.c +++ b/src_bagl/ui_flow_signMessage712_v0.c @@ -1,21 +1,20 @@ #include "shared_context.h" #include "ui_callbacks.h" #include "common_712.h" +#include "uint_common.h" void prepare_domain_hash_v0() { - snprintf(strings.tmp.tmp, - sizeof(strings.tmp.tmp), - "0x%.*H", - KECCAK256_HASH_BYTESIZE, - tmpCtx.messageSigningContext712.domainHash); + array_bytes_string(strings.tmp.tmp, + sizeof(strings.tmp.tmp), + tmpCtx.messageSigningContext712.domainHash, + KECCAK256_HASH_BYTESIZE); } void prepare_message_hash_v0() { - snprintf(strings.tmp.tmp, - sizeof(strings.tmp.tmp), - "0x%.*H", - KECCAK256_HASH_BYTESIZE, - tmpCtx.messageSigningContext712.messageHash); + array_bytes_string(strings.tmp.tmp, + sizeof(strings.tmp.tmp), + tmpCtx.messageSigningContext712.messageHash, + KECCAK256_HASH_BYTESIZE); } // clang-format off @@ -24,7 +23,7 @@ UX_STEP_NOCB( pnn, { &C_icon_certificate, - "Sign", + "Review", "typed message", }); UX_STEP_NOCB_INIT( @@ -46,7 +45,7 @@ UX_STEP_NOCB_INIT( UX_STEP_CB( ux_sign_712_v0_flow_4_step, pbb, - ui_712_approve_cb(NULL), + ui_712_approve_cb(), { &C_icon_validate_14, "Sign", @@ -55,7 +54,7 @@ UX_STEP_CB( UX_STEP_CB( ux_sign_712_v0_flow_5_step, pbb, - ui_712_reject_cb(NULL), + ui_712_reject_cb(), { &C_icon_crossmark, "Cancel", diff --git a/src_bagl/ui_flow_signTx.c b/src_bagl/ui_flow_signTx.c index eabdf90..d32afe7 100644 --- a/src_bagl/ui_flow_signTx.c +++ b/src_bagl/ui_flow_signTx.c @@ -110,11 +110,18 @@ UX_STEP_NOCB( .text = strings.common.fullAmount }); UX_STEP_NOCB( - ux_approval_address_step, + ux_approval_from_step, bnnn_paging, { - .title = "Address", - .text = strings.common.fullAddress, + .title = "From", + .text = strings.common.fromAddress, + }); +UX_STEP_NOCB( + ux_approval_to_step, + bnnn_paging, + { + .title = "To", + .text = strings.common.toAddress, }); UX_STEP_NOCB_INIT( @@ -122,7 +129,7 @@ UX_STEP_NOCB_INIT( bnnn_paging, plugin_ui_get_id(), { - .title = strings.common.fullAddress, + .title = strings.common.toAddress, .text = strings.common.fullAmount }); @@ -138,7 +145,7 @@ UX_FLOW_DEF_NOCB( ux_plugin_approval_display_step, bnnn_paging, { - .title = strings.common.fullAddress, + .title = strings.common.toAddress, .text = strings.common.fullAmount }); @@ -192,12 +199,12 @@ UX_STEP_NOCB( .text = strings.common.nonce, }); -UX_STEP_NOCB(ux_approval_blind_signing_warning_step, +UX_STEP_NOCB(ux_approval_blind_signing_reminder_step, pbb, { &C_icon_warning, - "Blind", - "Signing", + "You accepted", + "the risks", }); // clang-format on @@ -207,29 +214,33 @@ void ux_approve_tx(bool fromPlugin) { int step = 0; ux_approval_tx_flow[step++] = &ux_approval_review_step; - if (!fromPlugin && tmpContent.txContent.dataPresent && !N_storage.contractDetails) { - ux_approval_tx_flow[step++] = &ux_approval_blind_signing_warning_step; - } - if (fromPlugin) { // Add the special dynamic display logic ux_approval_tx_flow[step++] = &ux_plugin_approval_id_step; + if (pluginType != EXTERNAL) { + if (strings.common.fromAddress[0] != 0) { + ux_approval_tx_flow[step++] = &ux_approval_from_step; + } + } ux_approval_tx_flow[step++] = &ux_plugin_approval_before_step; ux_approval_tx_flow[step++] = &ux_plugin_approval_display_step; ux_approval_tx_flow[step++] = &ux_plugin_approval_after_step; } else { // We're in a regular transaction, just show the amount and the address + if (strings.common.fromAddress[0] != 0) { + ux_approval_tx_flow[step++] = &ux_approval_from_step; + } ux_approval_tx_flow[step++] = &ux_approval_amount_step; #ifdef HAVE_DOMAIN_NAME uint64_t chain_id = get_tx_chain_id(); if (has_domain_name(&chain_id, tmpContent.txContent.destination)) { ux_approval_tx_flow[step++] = &ux_domain_name_step; if (N_storage.verbose_domain_name) { - ux_approval_tx_flow[step++] = &ux_approval_address_step; + ux_approval_tx_flow[step++] = &ux_approval_to_step; } } else { #endif // HAVE_DOMAIN_NAME - ux_approval_tx_flow[step++] = &ux_approval_address_step; + ux_approval_tx_flow[step++] = &ux_approval_to_step; #ifdef HAVE_DOMAIN_NAME } #endif // HAVE_DOMAIN_NAME @@ -245,6 +256,9 @@ void ux_approve_tx(bool fromPlugin) { } ux_approval_tx_flow[step++] = &ux_approval_fees_step; + if (!fromPlugin && tmpContent.txContent.dataPresent && !N_storage.contractDetails) { + ux_approval_tx_flow[step++] = &ux_approval_blind_signing_reminder_step; + } ux_approval_tx_flow[step++] = &ux_approval_accept_step; ux_approval_tx_flow[step++] = &ux_approval_reject_step; ux_approval_tx_flow[step++] = FLOW_END_STEP; diff --git a/src_bagl/ui_plugin.c b/src_bagl/ui_plugin.c index c3743fa..e493bd9 100644 --- a/src_bagl/ui_plugin.c +++ b/src_bagl/ui_plugin.c @@ -46,4 +46,4 @@ void display_next_plugin_item(bool entering) { } } } -} \ No newline at end of file +} diff --git a/src_common/asset_info.h b/src_common/asset_info.h deleted file mode 100644 index a2ce393..0000000 --- a/src_common/asset_info.h +++ /dev/null @@ -1,51 +0,0 @@ -/******************************************************************************* - * Ledger Ethereum App - * (c) 2016-2019 Ledger - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ********************************************************************************/ - -#pragma once - -#include -#include "common_utils.h" - -// NFT - -#define COLLECTION_NAME_MAX_LEN 70 - -typedef struct nftInfo_t { - uint8_t contractAddress[ADDRESS_LENGTH]; // must be first item - char collectionName[COLLECTION_NAME_MAX_LEN + 1]; -} nftInfo_t; - -// TOKENS - -#define MAX_TICKER_LEN 11 // 10 characters + '\0' -#define MAX_ITEMS 2 - -typedef struct tokenDefinition_t { - uint8_t address[ADDRESS_LENGTH]; // must be first item -#ifdef HAVE_CONTRACT_NAME_IN_DESCRIPTOR - uint8_t contractName[ADDRESS_LENGTH]; -#endif - char ticker[MAX_TICKER_LEN]; - uint8_t decimals; -} tokenDefinition_t; - -// UNION - -typedef union extraInfo_t { - tokenDefinition_t token; - nftInfo_t nft; -} extraInfo_t; diff --git a/src_common/caller_api.h b/src_common/caller_api.h deleted file mode 100644 index 7f769be..0000000 --- a/src_common/caller_api.h +++ /dev/null @@ -1,34 +0,0 @@ -/******************************************************************************* - * Ledger Ethereum App - * (c) 2016-2019 Ledger - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ********************************************************************************/ - -#pragma once - -#ifdef HAVE_NBGL -#include "ux.h" -#endif - -typedef enum { CALLER_TYPE_CLONE, CALLER_TYPE_PLUGIN } e_caller_type; - -typedef struct caller_app_t { - const char *name; -#ifdef HAVE_NBGL - const nbgl_icon_details_t *icon; -#endif - char type; // does not have to be set by the caller app -} caller_app_t; - -extern caller_app_t *caller_app; diff --git a/src_common/common_utils.c b/src_common/common_utils.c deleted file mode 100644 index 84a424e..0000000 --- a/src_common/common_utils.c +++ /dev/null @@ -1,351 +0,0 @@ -/******************************************************************************* - * Ledger Ethereum App - * (c) 2016-2019 Ledger - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ********************************************************************************/ - -#include -#include - -#include "asset_info.h" -#include "common_utils.h" - -void array_hexstr(char *strbuf, const void *bin, unsigned int len) { - while (len--) { - *strbuf++ = HEXDIGITS[((*((char *) bin)) >> 4) & 0xF]; - *strbuf++ = HEXDIGITS[(*((char *) bin)) & 0xF]; - bin = (const void *) ((unsigned int) bin + 1); - } - *strbuf = 0; // EOS -} - -uint64_t u64_from_BE(const uint8_t *in, uint8_t size) { - uint8_t i = 0; - uint64_t res = 0; - - while (i < size && i < sizeof(res)) { - res <<= 8; - res |= in[i]; - i++; - } - - return res; -} - -bool u64_to_string(uint64_t src, char *dst, uint8_t dst_size) { - // Copy the numbers in ASCII format. - uint8_t i = 0; - do { - // Checking `i + 1` to make sure we have enough space for '\0'. - if (i + 1 >= dst_size) { - return false; - } - dst[i] = src % 10 + '0'; - src /= 10; - i++; - } while (src); - - // Null terminate string - dst[i] = '\0'; - - // Revert the string - i--; - uint8_t j = 0; - while (j < i) { - char tmp = dst[i]; - dst[i] = dst[j]; - dst[j] = tmp; - i--; - j++; - } - return true; -} - -bool uint256_to_decimal(const uint8_t *value, size_t value_len, char *out, size_t out_len) { - if (value_len > INT256_LENGTH) { - // value len is bigger than INT256_LENGTH ?! - return false; - } - - uint16_t n[16] = {0}; - // Copy and right-align the number - memcpy((uint8_t *) n + INT256_LENGTH - value_len, value, value_len); - - // Special case when value is 0 - if (allzeroes(n, INT256_LENGTH)) { - if (out_len < 2) { - // Not enough space to hold "0" and \0. - return false; - } - strlcpy(out, "0", out_len); - return true; - } - - uint16_t *p = n; - for (int i = 0; i < 16; i++) { - n[i] = __builtin_bswap16(*p++); - } - int pos = out_len; - while (!allzeroes(n, sizeof(n))) { - if (pos == 0) { - return false; - } - pos -= 1; - unsigned int carry = 0; - for (int i = 0; i < 16; i++) { - int rem = ((carry << 16) | n[i]) % 10; - n[i] = ((carry << 16) | n[i]) / 10; - carry = rem; - } - out[pos] = '0' + carry; - } - memmove(out, out + pos, out_len - pos); - out[out_len - pos] = 0; - return true; -} - -bool adjustDecimals(const char *src, - size_t srcLength, - char *target, - size_t targetLength, - uint8_t decimals) { - uint32_t startOffset; - uint32_t lastZeroOffset = 0; - uint32_t offset = 0; - if ((srcLength == 1) && (*src == '0')) { - if (targetLength < 2) { - return false; - } - target[0] = '0'; - target[1] = '\0'; - return true; - } - if (srcLength <= decimals) { - uint32_t delta = decimals - srcLength; - if (targetLength < srcLength + 1 + 2 + delta) { - return false; - } - target[offset++] = '0'; - target[offset++] = '.'; - for (uint32_t i = 0; i < delta; i++) { - target[offset++] = '0'; - } - startOffset = offset; - for (uint32_t i = 0; i < srcLength; i++) { - target[offset++] = src[i]; - } - target[offset] = '\0'; - } else { - uint32_t sourceOffset = 0; - uint32_t delta = srcLength - decimals; - if (targetLength < srcLength + 1 + 1) { - return false; - } - while (offset < delta) { - target[offset++] = src[sourceOffset++]; - } - if (decimals != 0) { - target[offset++] = '.'; - } - startOffset = offset; - while (sourceOffset < srcLength) { - target[offset++] = src[sourceOffset++]; - } - target[offset] = '\0'; - } - for (uint32_t i = startOffset; i < offset; i++) { - if (target[i] == '0') { - if (lastZeroOffset == 0) { - lastZeroOffset = i; - } - } else { - lastZeroOffset = 0; - } - } - if (lastZeroOffset != 0) { - target[lastZeroOffset] = '\0'; - if (target[lastZeroOffset - 1] == '.') { - target[lastZeroOffset - 1] = '\0'; - } - } - return true; -} - -bool amountToString(const uint8_t *amount, - uint8_t amount_size, - uint8_t decimals, - const char *ticker, - char *out_buffer, - size_t out_buffer_size) { - char tmp_buffer[100] = {0}; - - if (uint256_to_decimal(amount, amount_size, tmp_buffer, sizeof(tmp_buffer)) == false) { - return false; - } - - uint8_t amount_len = strnlen(tmp_buffer, sizeof(tmp_buffer)); - uint8_t ticker_len = strnlen(ticker, MAX_TICKER_LEN); - - memcpy(out_buffer, ticker, MIN(out_buffer_size, ticker_len)); - if (ticker_len > 0) { - out_buffer[ticker_len++] = ' '; - } - - if (adjustDecimals(tmp_buffer, - amount_len, - out_buffer + ticker_len, - out_buffer_size - ticker_len - 1, - decimals) == false) { - return false; - } - - out_buffer[out_buffer_size - 1] = '\0'; - return true; -} - -bool getEthAddressFromKey(cx_ecfp_public_key_t *publicKey, uint8_t *out, cx_sha3_t *sha3Context) { - uint8_t hashAddress[INT256_LENGTH]; - - if (cx_keccak_init_no_throw(sha3Context, 256) != CX_OK) { - return false; - } - - if (cx_hash_no_throw((cx_hash_t *) sha3Context, - CX_LAST, - publicKey->W + 1, - 64, - hashAddress, - 32) != CX_OK) { - return false; - } - - memmove(out, hashAddress + 12, 20); - return true; -} - -bool getEthAddressStringFromKey(cx_ecfp_public_key_t *publicKey, - char *out, - cx_sha3_t *sha3Context, - uint64_t chainId) { - uint8_t hashAddress[INT256_LENGTH]; - - if (cx_keccak_init_no_throw(sha3Context, 256) != CX_OK) { - return false; - } - - if (cx_hash_no_throw((cx_hash_t *) sha3Context, - CX_LAST, - publicKey->W + 1, - 64, - hashAddress, - 32) != CX_OK) { - return false; - } - - if (!getEthAddressStringFromBinary(hashAddress + 12, out, sha3Context, chainId)) { - return false; - } - - return true; -} - -bool getEthAddressStringFromBinary(uint8_t *address, - char *out, - cx_sha3_t *sha3Context, - uint64_t chainId) { - // save some precious stack space - union locals_union { - uint8_t hashChecksum[INT256_LENGTH]; - uint8_t tmp[51]; - } locals_union; - - uint8_t i; - bool eip1191 = false; - uint32_t offset = 0; - switch (chainId) { - case 30: - case 31: - eip1191 = true; - break; - } - if (eip1191) { - if (!u64_to_string(chainId, (char *) locals_union.tmp, sizeof(locals_union.tmp))) { - return false; - } - offset = strnlen((char *) locals_union.tmp, sizeof(locals_union.tmp)); - strlcat((char *) locals_union.tmp + offset, "0x", sizeof(locals_union.tmp) - offset); - offset = strnlen((char *) locals_union.tmp, sizeof(locals_union.tmp)); - } - for (i = 0; i < 20; i++) { - uint8_t digit = address[i]; - locals_union.tmp[offset + 2 * i] = HEXDIGITS[(digit >> 4) & 0x0f]; - locals_union.tmp[offset + 2 * i + 1] = HEXDIGITS[digit & 0x0f]; - } - if (cx_keccak_init_no_throw(sha3Context, 256) != CX_OK) { - return false; - } - - if (cx_hash_no_throw((cx_hash_t *) sha3Context, - CX_LAST, - locals_union.tmp, - offset + 40, - locals_union.hashChecksum, - 32) != CX_OK) { - return false; - } - for (i = 0; i < 40; i++) { - uint8_t digit = address[i / 2]; - if ((i % 2) == 0) { - digit = (digit >> 4) & 0x0f; - } else { - digit = digit & 0x0f; - } - if (digit < 10) { - out[i] = HEXDIGITS[digit]; - } else { - int v = (locals_union.hashChecksum[i / 2] >> (4 * (1 - i % 2))) & 0x0f; - if (v >= 8) { - out[i] = HEXDIGITS[digit] - 'a' + 'A'; - } else { - out[i] = HEXDIGITS[digit]; - } - } - } - out[40] = '\0'; - - return true; -} - -/* Fills the `out` buffer with the lowercase string representation of the pubkey passed in as binary -format by `in`. (eg: uint8_t*:0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB -> -char*:"0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB\0" ) -`sha3` context doesn't have have to be initialized prior to call.*/ -bool getEthDisplayableAddress(uint8_t *in, - char *out, - size_t out_len, - cx_sha3_t *sha3, - uint64_t chainId) { - if (out_len < 43) { - strlcpy(out, "ERROR", out_len); - return false; - } - out[0] = '0'; - out[1] = 'x'; - if (!getEthAddressStringFromBinary(in, out + 2, sha3, chainId)) { - strlcpy(out, "ERROR", out_len); - return false; - } - - return true; -} diff --git a/src_common/common_utils.h b/src_common/common_utils.h deleted file mode 100644 index fd198d9..0000000 --- a/src_common/common_utils.h +++ /dev/null @@ -1,93 +0,0 @@ -/******************************************************************************* - * Ledger Ethereum App - * (c) 2016-2019 Ledger - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ********************************************************************************/ - -#pragma once - -#include -#include - -#include "os.h" -#include "cx.h" - -#define WEI_TO_ETHER 18 - -#define ADDRESS_LENGTH 20 -#define INT128_LENGTH 16 -#define INT256_LENGTH 32 - -#define KECCAK256_HASH_BYTESIZE 32 - -static const char HEXDIGITS[] = "0123456789abcdef"; - -#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) - -void array_hexstr(char *strbuf, const void *bin, unsigned int len); - -uint64_t u64_from_BE(const uint8_t *in, uint8_t size); - -bool u64_to_string(uint64_t src, char *dst, uint8_t dst_size); - -bool uint256_to_decimal(const uint8_t *value, size_t value_len, char *out, size_t out_len); - -bool amountToString(const uint8_t *amount, - uint8_t amount_len, - uint8_t decimals, - const char *ticker, - char *out_buffer, - size_t out_buffer_size); - -bool adjustDecimals(const char *src, - size_t srcLength, - char *target, - size_t targetLength, - uint8_t decimals); - -bool getEthAddressFromKey(cx_ecfp_public_key_t *publicKey, uint8_t *out, cx_sha3_t *sha3Context); - -bool getEthAddressStringFromKey(cx_ecfp_public_key_t *publicKey, - char *out, - cx_sha3_t *sha3Context, - uint64_t chainId); - -bool getEthAddressStringFromBinary(uint8_t *address, - char *out, - cx_sha3_t *sha3Context, - uint64_t chainId); - -bool getEthDisplayableAddress(uint8_t *in, - char *out, - size_t out_len, - cx_sha3_t *sha3, - uint64_t chainId); - -static __attribute__((no_instrument_function)) inline int allzeroes(const void *buf, size_t n) { - uint8_t *p = (uint8_t *) buf; - for (size_t i = 0; i < n; ++i) { - if (p[i]) { - return 0; - } - } - return 1; -} -static __attribute__((no_instrument_function)) inline int ismaxint(uint8_t *buf, int n) { - for (int i = 0; i < n; ++i) { - if (buf[i] != 0xff) { - return 0; - } - } - return 1; -} diff --git a/src_common/eth_plugin_interface.h b/src_common/eth_plugin_interface.h deleted file mode 100644 index 9821836..0000000 --- a/src_common/eth_plugin_interface.h +++ /dev/null @@ -1,224 +0,0 @@ -// clang-format off - -#pragma once - -#include "os.h" -#include "cx.h" - -// Include other header compatible with plugins -#include "asset_info.h" -#include "caller_api.h" -#include "common_utils.h" -#include "plugin_utils.h" -#include "tx_content.h" - -/************************************************************************************************* - * Comments provided in this file are quick reminders on the usage of the plugin interface * - * Reading the real plugin documentation is GREATLY recommended. * - * You can find the latest version here: * - * https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp_plugins.adoc * - *************************************************************************************************/ - -// Interface version. Will be updated every time a breaking change in the interface is introduced. -typedef enum eth_plugin_interface_version_e { - ETH_PLUGIN_INTERFACE_VERSION_1 = 1, - ETH_PLUGIN_INTERFACE_VERSION_2 = 2, - ETH_PLUGIN_INTERFACE_VERSION_3 = 3, - ETH_PLUGIN_INTERFACE_VERSION_4 = 4, - ETH_PLUGIN_INTERFACE_VERSION_5 = 5, - ETH_PLUGIN_INTERFACE_VERSION_LATEST = 6, -} eth_plugin_interface_version_t; - - -// Codes for the different requests Ethereum can send to the plugin -// The dispatch is handled by the SDK itself, the plugin code does not have to handle it -typedef enum eth_plugin_msg_e { - // Codes for actions the Ethereum app can ask the plugin to perform - ETH_PLUGIN_INIT_CONTRACT = 0x0101, - ETH_PLUGIN_PROVIDE_PARAMETER = 0x0102, - ETH_PLUGIN_FINALIZE = 0x0103, - ETH_PLUGIN_PROVIDE_INFO = 0x0104, - ETH_PLUGIN_QUERY_CONTRACT_ID = 0x0105, - ETH_PLUGIN_QUERY_CONTRACT_UI = 0x0106, - - // Special request: the Ethereum app is checking if we are installed on the device - ETH_PLUGIN_CHECK_PRESENCE = 0x01FF, -} eth_plugin_msg_t; - - -// Reply codes when responding to the Ethereum application -typedef enum eth_plugin_result_e { - // Unsuccessful return values - ETH_PLUGIN_RESULT_ERROR = 0x00, - ETH_PLUGIN_RESULT_UNAVAILABLE = 0x01, - ETH_PLUGIN_RESULT_UNSUCCESSFUL = 0x02, // Used for comparison - - // Successful return values - ETH_PLUGIN_RESULT_SUCCESSFUL = 0x03, // Used for comparison - ETH_PLUGIN_RESULT_OK = 0x04, - ETH_PLUGIN_RESULT_OK_ALIAS = 0x05, - ETH_PLUGIN_RESULT_FALLBACK = 0x06, -} eth_plugin_result_t; - - -// Format of UI the Ethereum application has to use for this plugin -typedef enum eth_ui_type_e { - // If uiType is UI_AMOUNT_ADDRESS, Ethereum will use the amount/address UI - // the amount and address provided by the plugin will be used - // If tokenLookup1 is set, the amount is provided for this token - ETH_UI_TYPE_AMOUNT_ADDRESS = 0x01, - - // If uiType is UI_TYPE_GENERIC, Ethereum will use the dedicated ETH plugin UI - // the ETH application provides tokens if requested then prompts for each UI field - // The first field is forced by the ETH app to be the name + version of the plugin handling the - // request. The last field is the fee amount - ETH_UI_TYPE_GENERIC = 0x02, -} eth_ui_type_t; - - -// Scratch objects and utilities available to the plugin READ-WRITE -typedef struct ethPluginSharedRW_s { - cx_sha3_t *sha3; -} ethPluginSharedRW_t; - - -// Transaction data available to the plugin READ-ONLY -typedef struct ethPluginSharedRO_s { - txContent_t *txContent; -} ethPluginSharedRO_t; - - -// Plugin-only memory allocated by the Ethereum application and used by the plugin. -#define PLUGIN_CONTEXT_SIZE (5 * INT256_LENGTH) -// It is recommended to cast the raw uin8_t array to a structure meaningfull for your plugin -// Helper to check that the actual plugin context structure is not bigger than the allocated memory -#define ASSERT_SIZEOF_PLUGIN_CONTEXT(s) \ - _Static_assert(sizeof(s) <= PLUGIN_CONTEXT_SIZE, "Plugin context structure is too big.") - - -/* - * HANDLERS AND PARAMETERS - * Parameters associated with the requests the Ethereum application can ask the plugin to perform - * The plugin SDK will automatically call the relevant handler for the received code, so the plugin - * has to define each of the handler functions declared below. - */ - - -// Init Contract - -typedef struct ethPluginInitContract_s { - eth_plugin_interface_version_t interfaceVersion; - eth_plugin_result_t result; - - // in - ethPluginSharedRW_t *pluginSharedRW; - ethPluginSharedRO_t *pluginSharedRO; - uint8_t *pluginContext; - size_t pluginContextLength; - const uint8_t *selector; // 4 bytes selector - size_t dataSize; - - char *alias; // 29 bytes alias if ETH_PLUGIN_RESULT_OK_ALIAS set - -} ethPluginInitContract_t; -// void handle_init_contract(ethPluginInitContract_t *parameters); - - -// Provide parameter - -typedef struct ethPluginProvideParameter_s { - ethPluginSharedRW_t *pluginSharedRW; - ethPluginSharedRO_t *pluginSharedRO; - uint8_t *pluginContext; // PLUGIN_CONTEXT_SIZE - const uint8_t *parameter; // 32 bytes parameter - uint32_t parameterOffset; - - eth_plugin_result_t result; - -} ethPluginProvideParameter_t; -// void handle_provide_parameter(ethPluginProvideParameter_t *parameters); - - -// Finalize - -typedef struct ethPluginFinalize_s { - ethPluginSharedRW_t *pluginSharedRW; - ethPluginSharedRO_t *pluginSharedRO; - uint8_t *pluginContext; // PLUGIN_CONTEXT_SIZE - - uint8_t *tokenLookup1; // set by the plugin if a token should be looked up - uint8_t *tokenLookup2; - - const uint8_t *amount; // set an uint256 pointer if uiType is UI_AMOUNT_ADDRESS - const uint8_t *address; // set to the destination address if uiType is UI_AMOUNT_ADDRESS. Set - // to the user's address if uiType is UI_TYPE_GENERIC - - eth_ui_type_t uiType; - uint8_t numScreens; // ignored if uiType is UI_AMOUNT_ADDRESS - eth_plugin_result_t result; - -} ethPluginFinalize_t; -// void handle_finalize(ethPluginFinalize_t *parameters); - - -// Provide token - -typedef struct ethPluginProvideInfo_s { - ethPluginSharedRW_t *pluginSharedRW; - ethPluginSharedRO_t *pluginSharedRO; - uint8_t *pluginContext; // PLUGIN_CONTEXT_SIZE - - union extraInfo_t *item1; // set by the ETH application, to be saved by the plugin - union extraInfo_t *item2; - - uint8_t additionalScreens; // Used by the plugin if it needs to display additional screens - // based on the information received from the token definitions. - - eth_plugin_result_t result; - -} ethPluginProvideInfo_t; -// void handle_provide_token(ethPluginProvideInfo_t *parameters); - - -// Query Contract name and version - -// This is always called on the non aliased contract - -typedef struct ethQueryContractID_s { - ethPluginSharedRW_t *pluginSharedRW; - ethPluginSharedRO_t *pluginSharedRO; - uint8_t *pluginContext; // PLUGIN_CONTEXT_SIZE - - char *name; - size_t nameLength; - char *version; - size_t versionLength; - - eth_plugin_result_t result; - -} ethQueryContractID_t; -// void handle_query_contract_id(ethQueryContractID_t *parameters); - - -// Query Contract UI - -typedef struct ethQueryContractUI_s { - ethPluginSharedRW_t *pluginSharedRW; - ethPluginSharedRO_t *pluginSharedRO; - union extraInfo_t *item1; - union extraInfo_t *item2; - char network_ticker[MAX_TICKER_LEN]; - uint8_t *pluginContext; // PLUGIN_CONTEXT_SIZE - uint8_t screenIndex; - - char *title; - size_t titleLength; - char *msg; - size_t msgLength; - - eth_plugin_result_t result; - -} ethQueryContractUI_t; -// void handle_query_contract_ui(ethQueryContractUI_t *parameters); - -// clang-format on diff --git a/src_common/plugin_utils.c b/src_common/plugin_utils.c deleted file mode 100644 index 5216fdb..0000000 --- a/src_common/plugin_utils.c +++ /dev/null @@ -1,42 +0,0 @@ -#include - -#include "common_utils.h" -#include "plugin_utils.h" - -void copy_address(uint8_t* dst, const uint8_t* parameter, uint8_t dst_size) { - uint8_t copy_size = MIN(dst_size, ADDRESS_LENGTH); - memmove(dst, parameter + PARAMETER_LENGTH - copy_size, copy_size); -} - -void copy_parameter(uint8_t* dst, const uint8_t* parameter, uint8_t dst_size) { - uint8_t copy_size = MIN(dst_size, PARAMETER_LENGTH); - memmove(dst, parameter, copy_size); -} - -bool U2BE_from_parameter(const uint8_t* parameter, uint16_t* value) { - if (allzeroes(parameter, PARAMETER_LENGTH - sizeof(uint16_t))) { - *value = U2BE(parameter, PARAMETER_LENGTH - sizeof(uint16_t)); - return true; - } - - return false; -} - -bool U4BE_from_parameter(const uint8_t* parameter, uint32_t* value) { - if (allzeroes(parameter, PARAMETER_LENGTH - sizeof(uint32_t))) { - *value = U4BE(parameter, PARAMETER_LENGTH - sizeof(uint32_t)); - return true; - } - - return false; -} - -bool find_selector(uint32_t selector, const uint32_t* array, size_t size, size_t* idx) { - for (size_t i = 0; i < size; ++i) { - if (selector == array[i]) { - if (idx != NULL) *idx = i; - return true; - } - } - return false; -} diff --git a/src_common/plugin_utils.h b/src_common/plugin_utils.h deleted file mode 100644 index b37da7a..0000000 --- a/src_common/plugin_utils.h +++ /dev/null @@ -1,37 +0,0 @@ -/***************************************************************************** - * Ledger - * (c) 2023 Ledger SAS - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *****************************************************************************/ - -#pragma once - -#include -#include - -#include "eth_plugin_interface.h" - -#define SELECTOR_SIZE 4 -#define PARAMETER_LENGTH 32 - -void copy_address(uint8_t* dst, const uint8_t* parameter, uint8_t dst_size); - -void copy_parameter(uint8_t* dst, const uint8_t* parameter, uint8_t dst_size); - -// Get the value from the beginning of the parameter (right to left) and check if the rest of it is -// zero -bool U2BE_from_parameter(const uint8_t* parameter, uint16_t* value); -bool U4BE_from_parameter(const uint8_t* parameter, uint32_t* value); - -bool find_selector(uint32_t selector, const uint32_t* array, size_t size, size_t* idx); diff --git a/src_common/tx_content.h b/src_common/tx_content.h deleted file mode 100644 index ffb0afc..0000000 --- a/src_common/tx_content.h +++ /dev/null @@ -1,43 +0,0 @@ -/******************************************************************************* - * Ledger Ethereum App - * (c) 2016-2019 Ledger - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ********************************************************************************/ - -#pragma once - -#include -#include - -#include "os.h" -#include "cx.h" -#include "common_utils.h" - -typedef struct txInt256_t { - uint8_t value[INT256_LENGTH]; - uint8_t length; -} txInt256_t; - -typedef struct txContent_t { - txInt256_t gasprice; // Used as MaxFeePerGas when dealing with EIP1559 transactions. - txInt256_t startgas; // Also known as `gasLimit`. - txInt256_t value; - txInt256_t nonce; - txInt256_t chainID; - uint8_t destination[ADDRESS_LENGTH]; - uint8_t destinationLength; - uint8_t v[8]; - uint8_t vLength; - bool dataPresent; -} txContent_t; diff --git a/src_features/getAppConfiguration/cmd_getAppConfiguration.c b/src_features/getAppConfiguration/cmd_getAppConfiguration.c index c882b11..53f04eb 100644 --- a/src_features/getAppConfiguration/cmd_getAppConfiguration.c +++ b/src_features/getAppConfiguration/cmd_getAppConfiguration.c @@ -12,11 +12,10 @@ void handleGetAppConfiguration(uint8_t p1, UNUSED(workBuffer); UNUSED(dataLength); UNUSED(flags); - G_io_apdu_buffer[0] = (N_storage.dataAllowed ? APP_FLAG_DATA_ALLOWED : 0x00); - G_io_apdu_buffer[0] |= APP_FLAG_EXTERNAL_TOKEN_NEEDED; - G_io_apdu_buffer[1] = LEDGER_MAJOR_VERSION; - G_io_apdu_buffer[2] = LEDGER_MINOR_VERSION; - G_io_apdu_buffer[3] = LEDGER_PATCH_VERSION; + G_io_apdu_buffer[0] = APP_FLAG_EXTERNAL_TOKEN_NEEDED; + G_io_apdu_buffer[1] = MAJOR_VERSION; + G_io_apdu_buffer[2] = MINOR_VERSION; + G_io_apdu_buffer[3] = PATCH_VERSION; *tx = 4; THROW(0x9000); } diff --git a/src_features/getEth2PublicKey/cmd_getEth2PublicKey.c b/src_features/getEth2PublicKey/cmd_getEth2PublicKey.c index b1b38d5..9955980 100644 --- a/src_features/getEth2PublicKey/cmd_getEth2PublicKey.c +++ b/src_features/getEth2PublicKey/cmd_getEth2PublicKey.c @@ -13,27 +13,35 @@ static const uint8_t BLS12_381_FIELD_MODULUS[] = { 0x1e, 0xab, 0xff, 0xfe, 0xb1, 0x53, 0xff, 0xff, 0xb9, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xab}; void getEth2PublicKey(uint32_t *bip32Path, uint8_t bip32PathLength, uint8_t *out) { - uint8_t privateKeyData[INT256_LENGTH]; + uint8_t privateKeyData[64]; cx_ecfp_256_extended_private_key_t privateKey; cx_ecfp_384_public_key_t publicKey; uint8_t yFlag = 0; uint8_t tmp[96]; + int diff; io_seproxyhal_io_heartbeat(); - os_perso_derive_eip2333(CX_CURVE_BLS12_381_G1, bip32Path, bip32PathLength, privateKeyData); + CX_ASSERT(os_derive_eip2333_no_throw(CX_CURVE_BLS12_381_G1, + bip32Path, + bip32PathLength, + privateKeyData)); io_seproxyhal_io_heartbeat(); memset(tmp, 0, 48); memmove(tmp + 16, privateKeyData, 32); - cx_ecfp_init_private_key(CX_CURVE_BLS12_381_G1, tmp, 48, (cx_ecfp_private_key_t *) &privateKey); - cx_ecfp_generate_pair(CX_CURVE_BLS12_381_G1, - (cx_ecfp_public_key_t *) &publicKey, - (cx_ecfp_private_key_t *) &privateKey, - 1); + CX_ASSERT(cx_ecfp_init_private_key_no_throw(CX_CURVE_BLS12_381_G1, + tmp, + 48, + (cx_ecfp_private_key_t *) &privateKey)); + CX_ASSERT(cx_ecfp_generate_pair_no_throw(CX_CURVE_BLS12_381_G1, + (cx_ecfp_public_key_t *) &publicKey, + (cx_ecfp_private_key_t *) &privateKey, + 1)); explicit_bzero(tmp, 96); explicit_bzero((void *) &privateKey, sizeof(cx_ecfp_256_extended_private_key_t)); tmp[47] = 2; - cx_math_mult(tmp, publicKey.W + 1 + 48, tmp, 48); - if (cx_math_cmp(tmp + 48, BLS12_381_FIELD_MODULUS, 48) > 0) { + CX_ASSERT(cx_math_mult_no_throw(tmp, publicKey.W + 1 + 48, tmp, 48)); + CX_ASSERT(cx_math_cmp_no_throw(tmp + 48, BLS12_381_FIELD_MODULUS, 48, &diff)); + if (diff > 0) { yFlag = 0x20; } publicKey.W[1] &= 0x1f; @@ -67,20 +75,14 @@ void handleGetEth2PublicKey(uint8_t p1, getEth2PublicKey(bip32.path, bip32.length, tmpCtx.publicKeyContext.publicKey.W); -#ifndef NO_CONSENT - if (p1 == P1_NON_CONFIRM) -#endif // NO_CONSENT - { + if (p1 == P1_NON_CONFIRM) { *tx = set_result_get_eth2_publicKey(); THROW(0x9000); - } -#ifndef NO_CONSENT - else { + } else { ui_display_public_eth2(); *flags |= IO_ASYNCH_REPLY; } -#endif // NO_CONSENT } #endif diff --git a/src_features/getPublicKey/cmd_getPublicKey.c b/src_features/getPublicKey/cmd_getPublicKey.c index c30addc..66a4b4c 100644 --- a/src_features/getPublicKey/cmd_getPublicKey.c +++ b/src_features/getPublicKey/cmd_getPublicKey.c @@ -4,6 +4,7 @@ #include "feature_getPublicKey.h" #include "common_ui.h" #include "os_io_seproxyhal.h" +#include "crypto_helpers.h" void handleGetPublicKey(uint8_t p1, uint8_t p2, @@ -11,9 +12,7 @@ void handleGetPublicKey(uint8_t p1, uint8_t dataLength, unsigned int *flags, unsigned int *tx) { - uint8_t privateKeyData[INT256_LENGTH]; bip32_path_t bip32; - cx_ecfp_private_key_t privateKey; if (!G_called_from_swap) { reset_app_context(); @@ -35,25 +34,18 @@ void handleGetPublicKey(uint8_t p1, } tmpCtx.publicKeyContext.getChaincode = (p2 == P2_CHAINCODE); - io_seproxyhal_io_heartbeat(); - os_perso_derive_node_bip32( - CX_CURVE_256K1, - bip32.path, - bip32.length, - privateKeyData, - (tmpCtx.publicKeyContext.getChaincode ? tmpCtx.publicKeyContext.chainCode : NULL)); - cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey); - io_seproxyhal_io_heartbeat(); - cx_ecfp_generate_pair(CX_CURVE_256K1, &tmpCtx.publicKeyContext.publicKey, &privateKey, 1); - explicit_bzero(&privateKey, sizeof(privateKey)); - explicit_bzero(privateKeyData, sizeof(privateKeyData)); - io_seproxyhal_io_heartbeat(); - if (!getEthAddressStringFromKey(&tmpCtx.publicKeyContext.publicKey, - tmpCtx.publicKeyContext.address, - &global_sha3, - chainConfig->chainId)) { - THROW(CX_INVALID_PARAMETER); + if (bip32_derive_get_pubkey_256( + CX_CURVE_256K1, + bip32.path, + bip32.length, + tmpCtx.publicKeyContext.publicKey.W, + (tmpCtx.publicKeyContext.getChaincode ? tmpCtx.publicKeyContext.chainCode : NULL), + CX_SHA512) != CX_OK) { + THROW(APDU_RESPONSE_UNKNOWN); } + getEthAddressStringFromRawKey(tmpCtx.publicKeyContext.publicKey.W, + tmpCtx.publicKeyContext.address, + chainConfig->chainId); uint64_t chain_id = chainConfig->chainId; if (dataLength >= sizeof(chain_id)) { @@ -68,17 +60,12 @@ void handleGetPublicKey(uint8_t p1, THROW(APDU_RESPONSE_INVALID_DATA); } -#ifndef NO_CONSENT - if (p1 == P1_NON_CONFIRM) -#endif // NO_CONSENT - { + if (p1 == P1_NON_CONFIRM) { *tx = set_result_get_publicKey(); THROW(APDU_RESPONSE_OK); - } -#ifndef NO_CONSENT - else { - snprintf(strings.common.fullAddress, - sizeof(strings.common.fullAddress), + } else { + snprintf(strings.common.toAddress, + sizeof(strings.common.toAddress), "0x%.*s", 40, tmpCtx.publicKeyContext.address); @@ -87,5 +74,4 @@ void handleGetPublicKey(uint8_t p1, *flags |= IO_ASYNCH_REPLY; } -#endif // NO_CONSENT } diff --git a/src_features/performPrivacyOperation/cmd_performPrivacyOperation.c b/src_features/performPrivacyOperation/cmd_performPrivacyOperation.c index c1f0369..e1a733f 100644 --- a/src_features/performPrivacyOperation/cmd_performPrivacyOperation.c +++ b/src_features/performPrivacyOperation/cmd_performPrivacyOperation.c @@ -3,6 +3,7 @@ #include "feature_performPrivacyOperation.h" #include "common_ui.h" +#include "uint_common.h" #define P2_PUBLIC_ENCRYPTION_KEY 0x00 #define P2_SHARED_SECRET 0x01 @@ -28,7 +29,7 @@ void handlePerformPrivacyOperation(uint8_t p1, uint8_t dataLength, unsigned int *flags, unsigned int *tx) { - uint8_t privateKeyData[INT256_LENGTH]; + uint8_t privateKeyData[64]; uint8_t privateKeyDataSwapped[INT256_LENGTH]; bip32_path_t bip32; cx_err_t status = CX_OK; @@ -53,27 +54,30 @@ void handlePerformPrivacyOperation(uint8_t p1, cx_ecfp_private_key_t privateKey; - os_perso_derive_node_bip32( + CX_ASSERT(os_derive_bip32_no_throw( CX_CURVE_256K1, bip32.path, bip32.length, privateKeyData, - (tmpCtx.publicKeyContext.getChaincode ? tmpCtx.publicKeyContext.chainCode : NULL)); - cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey); - cx_ecfp_generate_pair(CX_CURVE_256K1, &tmpCtx.publicKeyContext.publicKey, &privateKey, 1); - if (!getEthAddressStringFromKey(&tmpCtx.publicKeyContext.publicKey, - tmpCtx.publicKeyContext.address, - &global_sha3, - chainConfig->chainId)) { - THROW(CX_INVALID_PARAMETER); - } + (tmpCtx.publicKeyContext.getChaincode ? tmpCtx.publicKeyContext.chainCode : NULL))); + CX_ASSERT(cx_ecfp_init_private_key_no_throw(CX_CURVE_256K1, privateKeyData, 32, &privateKey)); + CX_ASSERT(cx_ecfp_generate_pair_no_throw(CX_CURVE_256K1, + &tmpCtx.publicKeyContext.publicKey, + &privateKey, + 1)); + getEthAddressStringFromRawKey((const uint8_t *) &tmpCtx.publicKeyContext.publicKey.W, + tmpCtx.publicKeyContext.address, + chainConfig->chainId); if (p2 == P2_PUBLIC_ENCRYPTION_KEY) { decodeScalar(privateKeyData, privateKeyDataSwapped); - cx_ecfp_init_private_key(CX_CURVE_Curve25519, privateKeyDataSwapped, 32, &privateKey); - cx_ecfp_generate_pair(CX_CURVE_Curve25519, - &tmpCtx.publicKeyContext.publicKey, - &privateKey, - 1); + CX_ASSERT(cx_ecfp_init_private_key_no_throw(CX_CURVE_Curve25519, + privateKeyDataSwapped, + 32, + &privateKey)); + CX_ASSERT(cx_ecfp_generate_pair_no_throw(CX_CURVE_Curve25519, + &tmpCtx.publicKeyContext.publicKey, + &privateKey, + 1)); explicit_bzero(privateKeyDataSwapped, sizeof(privateKeyDataSwapped)); } else { memmove(tmpCtx.publicKeyContext.publicKey.W + 1, dataBuffer, 32); @@ -86,28 +90,23 @@ void handlePerformPrivacyOperation(uint8_t p1, THROW(0x6A80); } -#ifndef NO_CONSENT - if (p1 == P1_NON_CONFIRM) -#endif // NO_CONSENT - { + if (p1 == P1_NON_CONFIRM) { *tx = set_result_perform_privacy_operation(); THROW(0x9000); - } -#ifndef NO_CONSENT - else { - snprintf(strings.common.fullAddress, - sizeof(strings.common.fullAddress), + } else { + snprintf(strings.common.toAddress, + sizeof(strings.common.toAddress), "0x%.*s", 40, tmpCtx.publicKeyContext.address); for (uint8_t i = 0; i < 32; i++) { privateKeyData[i] = tmpCtx.publicKeyContext.publicKey.W[32 - i]; } - snprintf(strings.common.fullAmount, - sizeof(strings.common.fullAmount) - 1, - "%.*H", - 32, - privateKeyData); + format_hex(privateKeyData, + 32, + strings.common.fullAmount, + sizeof(strings.common.fullAmount) - 1); + if (p2 == P2_PUBLIC_ENCRYPTION_KEY) { ui_display_privacy_public_key(); } else { @@ -116,5 +115,4 @@ void handlePerformPrivacyOperation(uint8_t p1, *flags |= IO_ASYNCH_REPLY; } -#endif // NO_CONSENT } diff --git a/src_features/performPrivacyOperation/feature_performPrivacyOperation.h b/src_features/performPrivacyOperation/feature_performPrivacyOperation.h index df80ffd..1e519d3 100644 --- a/src_features/performPrivacyOperation/feature_performPrivacyOperation.h +++ b/src_features/performPrivacyOperation/feature_performPrivacyOperation.h @@ -1,3 +1,8 @@ +#ifndef _PERFORM_PRIVACY_OPERATION_H_ +#define _PERFORM_PRIVACY_OPERATION_H_ + #include "shared_context.h" uint32_t set_result_perform_privacy_operation(void); + +#endif // _PERFORM_PRIVACY_OPERATION_H_ diff --git a/src_features/provideDomainName/cmd_provide_domain_name.c b/src_features/provideDomainName/cmd_provide_domain_name.c index 3ec5b39..cfcdc0d 100644 --- a/src_features/provideDomainName/cmd_provide_domain_name.c +++ b/src_features/provideDomainName/cmd_provide_domain_name.c @@ -365,36 +365,38 @@ static bool handle_address(const s_tlv_data *data, static bool verify_signature(const s_sig_ctx *sig_ctx) { uint8_t hash[INT256_LENGTH]; cx_ecfp_public_key_t verif_key; + cx_err_t error = CX_INTERNAL_ERROR; - cx_hash((cx_hash_t *) &sig_ctx->hash_ctx, CX_LAST, NULL, 0, hash, INT256_LENGTH); + CX_CHECK( + cx_hash_no_throw((cx_hash_t *) &sig_ctx->hash_ctx, CX_LAST, NULL, 0, hash, INT256_LENGTH)); switch (sig_ctx->key_id) { #ifdef HAVE_DOMAIN_NAME_TEST_KEY case KEY_ID_TEST: #else case KEY_ID_PROD: #endif - cx_ecfp_init_public_key(CX_CURVE_256K1, - DOMAIN_NAME_PUB_KEY, - sizeof(DOMAIN_NAME_PUB_KEY), - &verif_key); + CX_CHECK(cx_ecfp_init_public_key_no_throw(CX_CURVE_256K1, + DOMAIN_NAME_PUB_KEY, + sizeof(DOMAIN_NAME_PUB_KEY), + &verif_key)); break; default: PRINTF("Error: Unknown metadata key ID %u\n", sig_ctx->key_id); return false; } - if (!cx_ecdsa_verify(&verif_key, - CX_LAST, - CX_SHA256, - hash, - sizeof(hash), - sig_ctx->input_sig, - sig_ctx->input_sig_size)) { + if (!cx_ecdsa_verify_no_throw(&verif_key, + hash, + sizeof(hash), + sig_ctx->input_sig, + sig_ctx->input_sig_size)) { PRINTF("Domain name signature verification failed!\n"); #ifndef HAVE_BYPASS_SIGNATURES return false; #endif } return true; +end: + return false; } /** @@ -442,7 +444,7 @@ static bool check_found_tlv_tags(s_tlv_handler *handlers, int handler_count) { // prevent missing or duplicated tags for (int idx = 0; idx < handler_count; ++idx) { if (handlers[idx].found != 1) { - PRINTF("Found %u occurence(s) of tag 0x%x in TLV!\n", + PRINTF("Found %u occurrence(s) of tag 0x%x in TLV!\n", handlers[idx].found, handlers[idx].tag); return false; diff --git a/src_features/provideErc20TokenInformation/cmd_provideTokenInfo.c b/src_features/provideErc20TokenInformation/cmd_provideTokenInfo.c index 00665ad..d5ed912 100644 --- a/src_features/provideErc20TokenInformation/cmd_provideTokenInfo.c +++ b/src_features/provideErc20TokenInformation/cmd_provideTokenInfo.c @@ -5,6 +5,7 @@ #include "os_io_seproxyhal.h" #include "extra_tokens.h" #include "network.h" +#include "manage_asset_info.h" #ifdef HAVE_CONTRACT_NAME_IN_DESCRIPTOR @@ -26,10 +27,7 @@ void handleProvideErc20TokenInformation(uint8_t p1, cx_sha256_init(&sha256); - tmpCtx.transactionContext.currentItemIndex = - (tmpCtx.transactionContext.currentItemIndex + 1) % MAX_ITEMS; - tokenDefinition_t *token = - &tmpCtx.transactionContext.tokens[tmpCtx.transactionContext.currentItemIndex]; + tokenDefinition_t *token = &get_current_asset_info()->token; if (dataLength < 1) { THROW(0x6A80); @@ -95,7 +93,7 @@ void handleProvideErc20TokenInformation(uint8_t p1, THROW(0x6A80); #endif } - tmpCtx.transactionContext.tokenSet[tmpCtx.transactionContext.currentItemIndex] = 1; + validate_current_asset_info(); THROW(0x9000); } @@ -117,12 +115,9 @@ void handleProvideErc20TokenInformation(uint8_t p1, uint8_t hash[INT256_LENGTH]; cx_ecfp_public_key_t tokenKey; - tmpCtx.transactionContext.currentItemIndex = - (tmpCtx.transactionContext.currentItemIndex + 1) % MAX_ITEMS; - tokenDefinition_t *token = - &tmpCtx.transactionContext.extraInfo[tmpCtx.transactionContext.currentItemIndex].token; + tokenDefinition_t *token = &get_current_asset_info()->token; - PRINTF("Provisioning currentItemIndex %d\n", tmpCtx.transactionContext.currentItemIndex); + PRINTF("Provisioning currentAssetIndex %d\n", tmpCtx.transactionContext.currentAssetIndex); if (dataLength < 1) { THROW(0x6A80); @@ -143,10 +138,11 @@ void handleProvideErc20TokenInformation(uint8_t p1, memmove(token->address, workBuffer + offset, 20); offset += 20; dataLength -= 20; - // TODO: Handle 64-bit long chain IDs + // TODO: 4 bytes for this is overkill token->decimals = U4BE(workBuffer, offset); offset += 4; dataLength -= 4; + // TODO: Handle 64-bit long chain IDs chain_id = U4BE(workBuffer, offset); if (!app_compatible_with_chain_id(&chain_id)) { UNSUPPORTED_CHAIN_ID_MSG(chain_id); @@ -168,18 +164,14 @@ void handleProvideErc20TokenInformation(uint8_t p1, } if (index < NUM_TOKENS_EXTRA) { PRINTF("Descriptor whitelisted\n"); - } else { - cx_ecfp_init_public_key(CX_CURVE_256K1, - LEDGER_SIGNATURE_PUBLIC_KEY, - sizeof(LEDGER_SIGNATURE_PUBLIC_KEY), - &tokenKey); - if (!cx_ecdsa_verify(&tokenKey, - CX_LAST, - CX_SHA256, - hash, - 32, - workBuffer + offset, - dataLength)) { + } else +#endif + { + CX_ASSERT(cx_ecfp_init_public_key_no_throw(CX_CURVE_256K1, + LEDGER_SIGNATURE_PUBLIC_KEY, + sizeof(LEDGER_SIGNATURE_PUBLIC_KEY), + &tokenKey)); + if (!cx_ecdsa_verify_no_throw(&tokenKey, hash, 32, workBuffer + offset, dataLength)) { #ifndef HAVE_BYPASS_SIGNATURES PRINTF("Invalid token signature\n"); THROW(0x6A80); @@ -187,28 +179,10 @@ void handleProvideErc20TokenInformation(uint8_t p1, } } -#else - - cx_ecfp_init_public_key(CX_CURVE_256K1, - LEDGER_SIGNATURE_PUBLIC_KEY, - sizeof(LEDGER_SIGNATURE_PUBLIC_KEY), - &tokenKey); - if (!cx_ecdsa_verify(&tokenKey, - CX_LAST, - CX_SHA256, - hash, - 32, - workBuffer + offset, - dataLength)) { -#ifndef HAVE_BYPASS_SIGNATURES - PRINTF("Invalid token signature\n"); - THROW(0x6A80); -#endif - } -#endif - - tmpCtx.transactionContext.tokenSet[tmpCtx.transactionContext.currentItemIndex] = 1; - THROW(0x9000); + G_io_apdu_buffer[0] = tmpCtx.transactionContext.currentAssetIndex; + validate_current_asset_info(); + U2BE_ENCODE(G_io_apdu_buffer, 1, APDU_RESPONSE_OK); + io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 3); } #endif diff --git a/src_features/provideNFTInformation/cmd_provideNFTInfo.c b/src_features/provideNFTInformation/cmd_provideNFTInfo.c index e59c77b..2b46d9d 100644 --- a/src_features/provideNFTInformation/cmd_provideNFTInfo.c +++ b/src_features/provideNFTInformation/cmd_provideNFTInfo.c @@ -8,6 +8,7 @@ #include "os_io_seproxyhal.h" #include "network.h" #include "public_keys.h" +#include "manage_asset_info.h" #define TYPE_SIZE 1 #define VERSION_SIZE 1 @@ -56,12 +57,9 @@ void handleProvideNFTInformation(uint8_t p1, PRINTF("NFT metadata provided without proper plugin loaded!\n"); THROW(0x6985); } - tmpCtx.transactionContext.currentItemIndex = - (tmpCtx.transactionContext.currentItemIndex + 1) % MAX_ITEMS; - nftInfo_t *nft = - &tmpCtx.transactionContext.extraInfo[tmpCtx.transactionContext.currentItemIndex].nft; + nftInfo_t *nft = &get_current_asset_info()->nft; - PRINTF("Provisioning currentItemIndex %d\n", tmpCtx.transactionContext.currentItemIndex); + PRINTF("Provisioning currentAssetIndex %d\n", tmpCtx.transactionContext.currentAssetIndex); size_t offset = 0; @@ -69,7 +67,7 @@ void handleProvideNFTInformation(uint8_t p1, PRINTF("Data too small for headers: expected at least %d, got %d\n", HEADER_SIZE, dataLength); - THROW(0x6A80); + THROW(APDU_RESPONSE_INVALID_DATA); } uint8_t type = workBuffer[offset]; @@ -78,7 +76,7 @@ void handleProvideNFTInformation(uint8_t p1, break; default: PRINTF("Unsupported type %d\n", type); - THROW(0x6a80); + THROW(APDU_RESPONSE_INVALID_DATA); break; } offset += TYPE_SIZE; @@ -89,7 +87,7 @@ void handleProvideNFTInformation(uint8_t p1, break; default: PRINTF("Unsupported version %d\n", version); - THROW(0x6a80); + THROW(APDU_RESPONSE_INVALID_DATA); break; } offset += VERSION_SIZE; @@ -104,14 +102,14 @@ void handleProvideNFTInformation(uint8_t p1, PRINTF("Data too small for payload: expected at least %d, got %d\n", payloadSize, dataLength); - THROW(0x6A80); + THROW(APDU_RESPONSE_INVALID_DATA); } if (collectionNameLength > COLLECTION_NAME_MAX_LEN) { PRINTF("CollectionName too big: expected max %d, got %d\n", COLLECTION_NAME_MAX_LEN, collectionNameLength); - THROW(0x6A80); + THROW(APDU_RESPONSE_INVALID_DATA); } // Safe because we've checked the size before. @@ -137,7 +135,7 @@ void handleProvideNFTInformation(uint8_t p1, offset += CHAIN_ID_SIZE; uint8_t keyId = workBuffer[offset]; - uint8_t *rawKey; + const uint8_t *rawKey; uint8_t rawKeyLen; PRINTF("KeyID: %d\n", keyId); @@ -146,12 +144,12 @@ void handleProvideNFTInformation(uint8_t p1, case STAGING_NFT_METADATA_KEY: #endif case PROD_NFT_METADATA_KEY: - rawKey = (uint8_t *) LEDGER_NFT_METADATA_PUBLIC_KEY; + rawKey = LEDGER_NFT_METADATA_PUBLIC_KEY; rawKeyLen = sizeof(LEDGER_NFT_METADATA_PUBLIC_KEY); break; default: PRINTF("KeyID %d not supported\n", keyId); - THROW(0x6A80); + THROW(APDU_RESPONSE_INVALID_DATA); break; } PRINTF("RawKey: %.*H\n", rawKeyLen, rawKey); @@ -159,20 +157,10 @@ void handleProvideNFTInformation(uint8_t p1, uint8_t algorithmId = workBuffer[offset]; PRINTF("Algorithm: %d\n", algorithmId); - cx_curve_t curve; - verificationAlgo *verificationFn; - cx_md_t hashId; - switch (algorithmId) { - case ALGORITHM_ID_1: - curve = CX_CURVE_256K1; - verificationFn = (verificationAlgo *) cx_ecdsa_verify; - hashId = CX_SHA256; - break; - default: - PRINTF("Incorrect algorithmId %d\n", algorithmId); - THROW(0x6a80); - break; + if (algorithmId != ALGORITHM_ID_1) { + PRINTF("Incorrect algorithmId %d\n", algorithmId); + THROW(APDU_RESPONSE_INVALID_DATA); } offset += ALGORITHM_ID_SIZE; PRINTF("hashing: %.*H\n", payloadSize, workBuffer); @@ -180,41 +168,41 @@ void handleProvideNFTInformation(uint8_t p1, if (dataLength < payloadSize + SIGNATURE_LENGTH_SIZE) { PRINTF("Data too short to hold signature length\n"); - THROW(0x6a80); + THROW(APDU_RESPONSE_INVALID_DATA); } uint8_t signatureLen = workBuffer[offset]; - PRINTF("Sigature len: %d\n", signatureLen); + PRINTF("Signature len: %d\n", signatureLen); if (signatureLen < MIN_DER_SIG_SIZE || signatureLen > MAX_DER_SIG_SIZE) { PRINTF("SignatureLen too big or too small. Must be between %d and %d, got %d\n", MIN_DER_SIG_SIZE, MAX_DER_SIG_SIZE, signatureLen); - THROW(0x6a80); + THROW(APDU_RESPONSE_INVALID_DATA); } offset += SIGNATURE_LENGTH_SIZE; if (dataLength < payloadSize + SIGNATURE_LENGTH_SIZE + signatureLen) { PRINTF("Signature could not fit in data\n"); - THROW(0x6a80); + THROW(APDU_RESPONSE_INVALID_DATA); } - cx_ecfp_init_public_key(curve, rawKey, rawKeyLen, &nftKey); - if (!verificationFn(&nftKey, - CX_LAST, - hashId, - hash, - sizeof(hash), - (uint8_t *) workBuffer + offset, - signatureLen)) { + CX_ASSERT(cx_ecfp_init_public_key_no_throw(CX_CURVE_256K1, rawKey, rawKeyLen, &nftKey)); + if (!cx_ecdsa_verify_no_throw(&nftKey, + hash, + sizeof(hash), + (uint8_t *) workBuffer + offset, + signatureLen)) { #ifndef HAVE_BYPASS_SIGNATURES PRINTF("Invalid NFT signature\n"); - THROW(0x6A80); + THROW(APDU_RESPONSE_INVALID_DATA); #endif } - tmpCtx.transactionContext.tokenSet[tmpCtx.transactionContext.currentItemIndex] = 1; - THROW(0x9000); + G_io_apdu_buffer[0] = tmpCtx.transactionContext.currentAssetIndex; + validate_current_asset_info(); + U2BE_ENCODE(G_io_apdu_buffer, 1, APDU_RESPONSE_OK); + io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 3); } #endif // HAVE_NFT_SUPPORT diff --git a/src_features/setExternalPlugin/cmd_setExternalPlugin.c b/src_features/setExternalPlugin/cmd_setExternalPlugin.c index 13d1faf..a2ddd71 100644 --- a/src_features/setExternalPlugin/cmd_setExternalPlugin.c +++ b/src_features/setExternalPlugin/cmd_setExternalPlugin.c @@ -37,17 +37,15 @@ void handleSetExternalPlugin(uint8_t p1, // check Ledger's signature over the payload cx_hash_sha256(workBuffer, payload_size, hash, sizeof(hash)); - cx_ecfp_init_public_key(CX_CURVE_256K1, - LEDGER_SIGNATURE_PUBLIC_KEY, - sizeof(LEDGER_SIGNATURE_PUBLIC_KEY), - &tokenKey); - if (!cx_ecdsa_verify(&tokenKey, - CX_LAST, - CX_SHA256, - hash, - sizeof(hash), - workBuffer + payload_size, - dataLength - payload_size)) { + CX_ASSERT(cx_ecfp_init_public_key_no_throw(CX_CURVE_256K1, + LEDGER_SIGNATURE_PUBLIC_KEY, + sizeof(LEDGER_SIGNATURE_PUBLIC_KEY), + &tokenKey)); + if (!cx_ecdsa_verify_no_throw(&tokenKey, + hash, + sizeof(hash), + workBuffer + payload_size, + dataLength - payload_size)) { #ifndef HAVE_BYPASS_SIGNATURES PRINTF("Invalid plugin signature %.*H\n", dataLength - payload_size, diff --git a/src_features/setPlugin/cmd_setPlugin.c b/src_features/setPlugin/cmd_setPlugin.c index d4eb522..d083d9b 100644 --- a/src_features/setPlugin/cmd_setPlugin.c +++ b/src_features/setPlugin/cmd_setPlugin.c @@ -58,7 +58,7 @@ typedef bool verificationAlgo(const cx_ecfp_public_key_t *, // Returns the plugin type of a given plugin name. // If the plugin name is not a specific known internal plugin, this function default return value is -// `EXERNAL`. +// `EXTERNAL`. static pluginType_t getPluginType(char *pluginName, uint8_t pluginNameLength) { if (pluginNameLength == sizeof(ERC721_STR) - 1 && strncmp(pluginName, ERC721_STR, pluginNameLength) == 0) { @@ -189,20 +189,10 @@ void handleSetPlugin(uint8_t p1, uint8_t algorithmId = workBuffer[offset]; PRINTF("Algorithm: %d\n", algorithmId); - cx_curve_t curve; - verificationAlgo *verificationFn; - cx_md_t hashId; - switch (algorithmId) { - case ECC_SECG_P256K1__ECDSA_SHA_256: - curve = CX_CURVE_256K1; - verificationFn = (verificationAlgo *) cx_ecdsa_verify; - hashId = CX_SHA256; - break; - default: - PRINTF("Incorrect algorithmId %d\n", algorithmId); - THROW(0x6a80); - break; + if (algorithmId != ECC_SECG_P256K1__ECDSA_SHA_256) { + PRINTF("Incorrect algorithmId %d\n", algorithmId); + THROW(0x6a80); } offset += ALGORITHM_ID_SIZE; PRINTF("hashing: %.*H\n", payloadSize, workBuffer); @@ -229,14 +219,12 @@ void handleSetPlugin(uint8_t p1, THROW(0x6a80); } - cx_ecfp_init_public_key(curve, rawKey, rawKeyLen, &pluginKey); - if (!verificationFn(&pluginKey, - CX_LAST, - hashId, - hash, - sizeof(hash), - (unsigned char *) (workBuffer + offset), - signatureLen)) { + CX_ASSERT(cx_ecfp_init_public_key_no_throw(CX_CURVE_256K1, rawKey, rawKeyLen, &pluginKey)); + if (!cx_ecdsa_verify_no_throw(&pluginKey, + hash, + sizeof(hash), + (unsigned char *) (workBuffer + offset), + signatureLen)) { #ifndef HAVE_BYPASS_SIGNATURES PRINTF("Invalid NFT signature\n"); THROW(0x6A80); diff --git a/src_features/signMessage/cmd_signMessage.c b/src_features/signMessage/cmd_signMessage.c index 6280ca0..7110730 100644 --- a/src_features/signMessage/cmd_signMessage.c +++ b/src_features/signMessage/cmd_signMessage.c @@ -92,6 +92,8 @@ static void reset_ui_buffer(void) { * @return pointer to the start of the start of the message; \ref NULL if it failed */ static const uint8_t *first_apdu_data(const uint8_t *data, uint8_t *length) { + cx_err_t error = CX_INTERNAL_ERROR; + if (appState != APP_STATE_IDLE) { apdu_reply(APDU_RESPONSE_CONDITION_NOT_SATISFIED); } @@ -113,22 +115,29 @@ static const uint8_t *first_apdu_data(const uint8_t *data, uint8_t *length) { *length -= sizeof(uint32_t); // Initialize message header + length - cx_keccak_init(&global_sha3, 256); - cx_hash((cx_hash_t *) &global_sha3, 0, (uint8_t *) SIGN_MAGIC, sizeof(SIGN_MAGIC) - 1, NULL, 0); + CX_CHECK(cx_keccak_init_no_throw(&global_sha3, 256)); + CX_CHECK(cx_hash_no_throw((cx_hash_t *) &global_sha3, + 0, + (uint8_t *) SIGN_MAGIC, + sizeof(SIGN_MAGIC) - 1, + NULL, + 0)); snprintf(strings.tmp.tmp2, sizeof(strings.tmp.tmp2), "%u", tmpCtx.messageSigningContext.remainingLength); - cx_hash((cx_hash_t *) &global_sha3, - 0, - (uint8_t *) strings.tmp.tmp2, - strlen(strings.tmp.tmp2), - NULL, - 0); + CX_CHECK(cx_hash_no_throw((cx_hash_t *) &global_sha3, + 0, + (uint8_t *) strings.tmp.tmp2, + strlen(strings.tmp.tmp2), + NULL, + 0)); reset_ui_buffer(); states.sign_state = STATE_191_HASH_DISPLAY; states.ui_started = false; return data; +end: + return NULL; } /** @@ -139,6 +148,8 @@ static const uint8_t *first_apdu_data(const uint8_t *data, uint8_t *length) { * @return whether it was successful or not */ static bool feed_hash(const uint8_t *const data, const uint8_t length) { + cx_err_t error = CX_INTERNAL_ERROR; + if (length > tmpCtx.messageSigningContext.remainingLength) { PRINTF("Error: Length mismatch ! (%u > %u)!\n", length, @@ -146,17 +157,19 @@ static bool feed_hash(const uint8_t *const data, const uint8_t length) { apdu_reply(APDU_RESPONSE_INVALID_DATA); return false; } - cx_hash((cx_hash_t *) &global_sha3, 0, data, length, NULL, 0); + CX_CHECK(cx_hash_no_throw((cx_hash_t *) &global_sha3, 0, data, length, NULL, 0)); if ((tmpCtx.messageSigningContext.remainingLength -= length) == 0) { // Finalize hash - cx_hash((cx_hash_t *) &global_sha3, - CX_LAST, - NULL, - 0, - tmpCtx.messageSigningContext.hash, - 32); + CX_CHECK(cx_hash_no_throw((cx_hash_t *) &global_sha3, + CX_LAST, + NULL, + 0, + tmpCtx.messageSigningContext.hash, + 32)); } return true; +end: + return false; } /** @@ -242,11 +255,7 @@ bool handleSignPersonalMessage(uint8_t p1, } else // hash only { if (tmpCtx.messageSigningContext.remainingLength == 0) { -#ifdef NO_CONSENT - io_seproxyhal_touch_signMessage_ok(); -#else ui_191_switch_to_sign(); -#endif } else { apdu_reply(APDU_RESPONSE_OK); } diff --git a/src_features/signMessage/ui_common_signMessage.c b/src_features/signMessage/ui_common_signMessage.c index eb6707d..d58fd6c 100644 --- a/src_features/signMessage/ui_common_signMessage.c +++ b/src_features/signMessage/ui_common_signMessage.c @@ -1,31 +1,23 @@ #include "os_io_seproxyhal.h" +#include "apdu_constants.h" +#include "crypto_helpers.h" #include "common_ui.h" unsigned int io_seproxyhal_touch_signMessage_ok(void) { - uint8_t privateKeyData[INT256_LENGTH]; - uint8_t signature[100]; - cx_ecfp_private_key_t privateKey; uint32_t tx = 0; - io_seproxyhal_io_heartbeat(); - os_perso_derive_node_bip32(CX_CURVE_256K1, - tmpCtx.messageSigningContext.bip32.path, - tmpCtx.messageSigningContext.bip32.length, - privateKeyData, - NULL); - io_seproxyhal_io_heartbeat(); - cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey); - explicit_bzero(privateKeyData, sizeof(privateKeyData)); unsigned int info = 0; - io_seproxyhal_io_heartbeat(); - cx_ecdsa_sign(&privateKey, - CX_RND_RFC6979 | CX_LAST, - CX_SHA256, - tmpCtx.messageSigningContext.hash, - sizeof(tmpCtx.messageSigningContext.hash), - signature, - sizeof(signature), - &info); - explicit_bzero(&privateKey, sizeof(privateKey)); + if (bip32_derive_ecdsa_sign_rs_hash_256(CX_CURVE_256K1, + tmpCtx.messageSigningContext.bip32.path, + tmpCtx.messageSigningContext.bip32.length, + CX_RND_RFC6979 | CX_LAST, + CX_SHA256, + tmpCtx.messageSigningContext.hash, + sizeof(tmpCtx.messageSigningContext.hash), + G_io_apdu_buffer + 1, + G_io_apdu_buffer + 1 + 32, + &info) != CX_OK) { + THROW(APDU_RESPONSE_UNKNOWN); + } G_io_apdu_buffer[0] = 27; if (info & CX_ECCINFO_PARITY_ODD) { G_io_apdu_buffer[0]++; @@ -33,7 +25,6 @@ unsigned int io_seproxyhal_touch_signMessage_ok(void) { if (info & CX_ECCINFO_xGTn) { G_io_apdu_buffer[0] += 2; } - format_signature_out(signature); tx = 65; G_io_apdu_buffer[tx++] = 0x90; G_io_apdu_buffer[tx++] = 0x00; diff --git a/src_features/signMessageEIP712/commands_712.c b/src_features/signMessageEIP712/commands_712.c index 8a21dc3..179cff7 100644 --- a/src_features/signMessageEIP712/commands_712.c +++ b/src_features/signMessageEIP712/commands_712.c @@ -14,6 +14,24 @@ #include "filtering.h" #include "common_712.h" #include "common_ui.h" // ui_idle +#include "manage_asset_info.h" + +// APDUs P1 +#define P1_COMPLETE 0x00 +#define P1_PARTIAL 0xFF + +// APDUs P2 +#define P2_DEF_NAME 0x00 +#define P2_DEF_FIELD 0xFF +#define P2_IMPL_NAME P2_DEF_NAME +#define P2_IMPL_ARRAY 0x0F +#define P2_IMPL_FIELD P2_DEF_FIELD +#define P2_FILT_ACTIVATE 0x00 +#define P2_FILT_MESSAGE_INFO 0x0F +#define P2_FILT_DATE_TIME 0xFC +#define P2_FILT_AMOUNT_JOIN_TOKEN 0xFD +#define P2_FILT_AMOUNT_JOIN_VALUE 0xFE +#define P2_FILT_RAW_FIELD 0xFF /** * Send the response to the previous APDU command @@ -136,38 +154,53 @@ bool handle_eip712_struct_impl(const uint8_t *const apdu_buf) { bool handle_eip712_filtering(const uint8_t *const apdu_buf) { bool ret = true; bool reply_apdu = true; - e_filtering_type type; if (eip712_context == NULL) { apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED; - ret = false; - } else { - switch (apdu_buf[OFFSET_P2]) { - case P2_FILT_ACTIVATE: - if (!N_storage.verbose_eip712) { - ui_712_set_filtering_mode(EIP712_FILTERING_FULL); - ret = compute_schema_hash(); - } - break; - case P2_FILT_MESSAGE_INFO: - case P2_FILT_SHOW_FIELD: - type = (apdu_buf[OFFSET_P2] == P2_FILT_MESSAGE_INFO) - ? FILTERING_PROVIDE_MESSAGE_INFO - : FILTERING_SHOW_FIELD; - if (ui_712_get_filtering_mode() == EIP712_FILTERING_FULL) { - ret = - provide_filtering_info(&apdu_buf[OFFSET_CDATA], apdu_buf[OFFSET_LC], type); - if ((apdu_buf[OFFSET_P2] == P2_FILT_MESSAGE_INFO) && ret) { - reply_apdu = false; - } - } - break; - default: - PRINTF("Unknown P2 0x%x for APDU 0x%x\n", - apdu_buf[OFFSET_P2], - apdu_buf[OFFSET_INS]); - apdu_response_code = APDU_RESPONSE_INVALID_P1_P2; + return false; + } + if ((apdu_buf[OFFSET_P2] != P2_FILT_ACTIVATE) && + (ui_712_get_filtering_mode() != EIP712_FILTERING_FULL)) { + handle_eip712_return_code(true); + return true; + } + switch (apdu_buf[OFFSET_P2]) { + case P2_FILT_ACTIVATE: + if (!N_storage.verbose_eip712) { + ui_712_set_filtering_mode(EIP712_FILTERING_FULL); + ret = compute_schema_hash(); + } + forget_known_assets(); + break; + case P2_FILT_MESSAGE_INFO: + ret = filtering_message_info(&apdu_buf[OFFSET_CDATA], apdu_buf[OFFSET_LC]); + if (ret) { + reply_apdu = false; + } + break; + case P2_FILT_DATE_TIME: + ret = filtering_date_time(&apdu_buf[OFFSET_CDATA], apdu_buf[OFFSET_LC]); + break; + case P2_FILT_AMOUNT_JOIN_TOKEN: + ret = filtering_amount_join_token(&apdu_buf[OFFSET_CDATA], apdu_buf[OFFSET_LC]); + break; + case P2_FILT_AMOUNT_JOIN_VALUE: + ret = filtering_amount_join_value(&apdu_buf[OFFSET_CDATA], apdu_buf[OFFSET_LC]); + break; + case P2_FILT_RAW_FIELD: + ret = filtering_raw_field(&apdu_buf[OFFSET_CDATA], apdu_buf[OFFSET_LC]); + break; + default: + PRINTF("Unknown P2 0x%x for APDU 0x%x\n", apdu_buf[OFFSET_P2], apdu_buf[OFFSET_INS]); + apdu_response_code = APDU_RESPONSE_INVALID_P1_P2; + ret = false; + } + if ((apdu_buf[OFFSET_P2] > P2_FILT_MESSAGE_INFO) && ret) { + if (ui_712_push_new_filter_path()) { + if (!ui_712_filters_counter_incr()) { ret = false; + apdu_response_code = APDU_RESPONSE_INVALID_DATA; + } } } if (reply_apdu) { diff --git a/src_features/signMessageEIP712/commands_712.h b/src_features/signMessageEIP712/commands_712.h index e97d77b..dcfcf45 100644 --- a/src_features/signMessageEIP712/commands_712.h +++ b/src_features/signMessageEIP712/commands_712.h @@ -6,20 +6,6 @@ #include #include -// APDUs P1 -#define P1_COMPLETE 0x00 -#define P1_PARTIAL 0xFF - -// APDUs P2 -#define P2_DEF_NAME 0x00 -#define P2_DEF_FIELD 0xFF -#define P2_IMPL_NAME P2_DEF_NAME -#define P2_IMPL_ARRAY 0x0F -#define P2_IMPL_FIELD P2_DEF_FIELD -#define P2_FILT_ACTIVATE 0x00 -#define P2_FILT_MESSAGE_INFO 0x0F -#define P2_FILT_SHOW_FIELD 0xFF - #define DOMAIN_STRUCT_NAME "EIP712Domain" bool handle_eip712_struct_def(const uint8_t *const apdu_buf); diff --git a/src_features/signMessageEIP712/field_hash.c b/src_features/signMessageEIP712/field_hash.c index af89be8..bec2ff4 100644 --- a/src_features/signMessageEIP712/field_hash.c +++ b/src_features/signMessageEIP712/field_hash.c @@ -52,6 +52,7 @@ static const uint8_t *field_hash_prepare(const void *const field_ptr, const uint8_t *data, uint8_t *data_length) { e_type field_type; + cx_err_t error = CX_INTERNAL_ERROR; field_type = struct_field_type(field_ptr); fh->remaining_size = __builtin_bswap16(*(uint16_t *) &data[0]); // network byte order @@ -59,10 +60,11 @@ static const uint8_t *field_hash_prepare(const void *const field_ptr, *data_length -= sizeof(uint16_t); fh->state = FHS_WAITING_FOR_MORE; if (IS_DYN(field_type)) { - cx_keccak_init(&global_sha3, 256); // init hash - ui_712_new_field(field_ptr, data, *data_length); + CX_CHECK(cx_keccak_init_no_throw(&global_sha3, 256)); } return data; +end: + return NULL; } /** @@ -103,11 +105,6 @@ static const uint8_t *field_hash_finalize_static(const void *const field_ptr, apdu_response_code = APDU_RESPONSE_INVALID_DATA; PRINTF("Unknown solidity type!\n"); } - - if (value == NULL) { - return NULL; - } - ui_712_new_field(field_ptr, data, data_length); return value; } @@ -120,14 +117,22 @@ static const uint8_t *field_hash_finalize_static(const void *const field_ptr, */ static uint8_t *field_hash_finalize_dynamic(void) { uint8_t *value; + cx_err_t error = CX_INTERNAL_ERROR; if ((value = mem_alloc(KECCAK256_HASH_BYTESIZE)) == NULL) { apdu_response_code = APDU_RESPONSE_INSUFFICIENT_MEMORY; return NULL; } // copy hash into memory - cx_hash((cx_hash_t *) &global_sha3, CX_LAST, NULL, 0, value, KECCAK256_HASH_BYTESIZE); + CX_CHECK(cx_hash_no_throw((cx_hash_t *) &global_sha3, + CX_LAST, + NULL, + 0, + value, + KECCAK256_HASH_BYTESIZE)); return value; +end: + return NULL; } /** @@ -162,7 +167,7 @@ static void field_hash_feed_parent(e_type field_type, const uint8_t *const hash) * @param[in] field_ptr pointer to the struct field definition * @param[in] data the field value * @param[in] data_length the value length - * @return whether an error occured or not + * @return whether an error occurred or not */ static bool field_hash_domain_special_fields(const void *const field_ptr, const uint8_t *const data, @@ -191,7 +196,7 @@ static bool field_hash_domain_special_fields(const void *const field_ptr, * @param[in] field_ptr pointer to the struct field definition * @param[in] data the field value * @param[in] data_length the value length - * @return whether an error occured or not + * @return whether an error occurred or not */ static bool field_hash_finalize(const void *const field_ptr, const uint8_t *const data, @@ -217,7 +222,7 @@ static bool field_hash_finalize(const void *const field_ptr, return false; } } - path_advance(); + path_advance(true); fh->state = FHS_IDLE; ui_712_finalize_field(); return true; @@ -234,6 +239,7 @@ static bool field_hash_finalize(const void *const field_ptr, bool field_hash(const uint8_t *data, uint8_t data_length, bool partial) { const void *field_ptr; e_type field_type; + bool first = fh->state == FHS_IDLE; if ((fh == NULL) || ((field_ptr = path_get_field()) == NULL)) { apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED; @@ -241,8 +247,11 @@ bool field_hash(const uint8_t *data, uint8_t data_length, bool partial) { } field_type = struct_field_type(field_ptr); - if (fh->state == FHS_IDLE) // first packet for this frame - { + // first packet for this frame + if (first) { + if (!ui_712_show_raw_key(field_ptr)) { + return false; + } if (data_length < 2) { apdu_response_code = APDU_RESPONSE_INVALID_DATA; return false; @@ -259,6 +268,9 @@ bool field_hash(const uint8_t *data, uint8_t data_length, bool partial) { if (IS_DYN(field_type)) { hash_nbytes(data, data_length, (cx_hash_t *) &global_sha3); } + if (!ui_712_feed_to_display(field_ptr, data, data_length, first, fh->remaining_size == 0)) { + return false; + } if (fh->remaining_size == 0) { if (partial) // only makes sense if marked as complete { @@ -276,7 +288,6 @@ bool field_hash(const uint8_t *data, uint8_t data_length, bool partial) { } handle_eip712_return_code(true); } - return true; } diff --git a/src_features/signMessageEIP712/filtering.c b/src_features/signMessageEIP712/filtering.c index ff45a6e..efefd64 100644 --- a/src_features/signMessageEIP712/filtering.c +++ b/src_features/signMessageEIP712/filtering.c @@ -5,18 +5,28 @@ #include "ethUstream.h" // INT256_LENGTH #include "apdu_constants.h" // APDU return codes #include "public_keys.h" +#include "manage_asset_info.h" #include "context_712.h" #include "commands_712.h" #include "typed_data.h" #include "path.h" #include "ui_logic.h" +#include "filtering.h" + +#define FILT_MAGIC_MESSAGE_INFO 183 +#define FILT_MAGIC_AMOUNT_JOIN_TOKEN 11 +#define FILT_MAGIC_AMOUNT_JOIN_VALUE 22 +#define FILT_MAGIC_DATETIME 33 +#define FILT_MAGIC_RAW_FIELD 72 + +#define TOKEN_IDX_ADDR_IN_DOMAIN 0xff /** * Reconstruct the field path and hash it * * @param[in] hash_ctx the hashing context */ -static void hash_filtering_path(cx_hash_t *const hash_ctx) { +static void hash_filtering_path(cx_hash_t *hash_ctx) { const void *field_ptr; const char *key; uint8_t key_len; @@ -45,73 +55,57 @@ static void hash_filtering_path(cx_hash_t *const hash_ctx) { } /** - * Verify the provided signature + * Begin the hashing for signature verification * - * @param[in] dname_length length of provided substitution name - * @param[in] dname provided substitution name - * @param[in] sig_length provided signature length - * @param[in] sig pointer to the provided signature - * @param[in] type the type of filtering - * @return whether the signature verification worked or not + * @param[in] hash_ctx hashing context + * @param[in] magic magic number used in the signature + * @return \ref true */ -static bool verify_filtering_signature(uint8_t dname_length, - const char *const dname, - uint8_t sig_length, - const uint8_t *const sig, - e_filtering_type type) { - uint8_t hash[INT256_LENGTH]; - cx_ecfp_public_key_t verifying_key; - cx_sha256_t hash_ctx; +static bool sig_verif_start(cx_sha256_t *hash_ctx, uint8_t magic) { uint64_t chain_id; - cx_sha256_init(&hash_ctx); + cx_sha256_init(hash_ctx); // Magic number, makes it so a signature of one type can't be used as another - switch (type) { - case FILTERING_SHOW_FIELD: - hash_byte(FILTERING_MAGIC_STRUCT_FIELD, (cx_hash_t *) &hash_ctx); - break; - case FILTERING_PROVIDE_MESSAGE_INFO: - hash_byte(FILTERING_MAGIC_CONTRACT_NAME, (cx_hash_t *) &hash_ctx); - break; - default: - apdu_response_code = APDU_RESPONSE_INVALID_DATA; - PRINTF("Invalid filtering type when verifying signature!\n"); - return false; - } + hash_byte(magic, (cx_hash_t *) hash_ctx); // Chain ID chain_id = __builtin_bswap64(eip712_context->chain_id); - hash_nbytes((uint8_t *) &chain_id, sizeof(chain_id), (cx_hash_t *) &hash_ctx); + hash_nbytes((uint8_t *) &chain_id, sizeof(chain_id), (cx_hash_t *) hash_ctx); // Contract address hash_nbytes(eip712_context->contract_addr, sizeof(eip712_context->contract_addr), - (cx_hash_t *) &hash_ctx); + (cx_hash_t *) hash_ctx); // Schema hash hash_nbytes(eip712_context->schema_hash, sizeof(eip712_context->schema_hash), - (cx_hash_t *) &hash_ctx); + (cx_hash_t *) hash_ctx); + return true; +} - if (type == FILTERING_SHOW_FIELD) { - hash_filtering_path((cx_hash_t *) &hash_ctx); - } else // FILTERING_PROVIDE_MESSAGE_INFO - { - hash_byte(ui_712_remaining_filters(), (cx_hash_t *) &hash_ctx); - } - - // Display name - hash_nbytes((uint8_t *) dname, sizeof(char) * dname_length, (cx_hash_t *) &hash_ctx); +/** + * End the hashing & do the signature verification + * + * @param[in] hash_ctx hashing context + * @param[in] sig signature + * @param[in] sig_length signature length + * @return whether the signature verification worked or not + */ +static bool sig_verif_end(cx_sha256_t *hash_ctx, const uint8_t *sig, uint8_t sig_length) { + uint8_t hash[INT256_LENGTH]; + cx_ecfp_public_key_t verifying_key; + cx_err_t error = CX_INTERNAL_ERROR; // Finalize hash - cx_hash((cx_hash_t *) &hash_ctx, CX_LAST, NULL, 0, hash, INT256_LENGTH); + CX_CHECK(cx_hash_no_throw((cx_hash_t *) hash_ctx, CX_LAST, NULL, 0, hash, INT256_LENGTH)); - cx_ecfp_init_public_key(CX_CURVE_256K1, - LEDGER_SIGNATURE_PUBLIC_KEY, - sizeof(LEDGER_SIGNATURE_PUBLIC_KEY), - &verifying_key); - if (!cx_ecdsa_verify(&verifying_key, CX_LAST, CX_SHA256, hash, sizeof(hash), sig, sig_length)) { + CX_CHECK(cx_ecfp_init_public_key_no_throw(CX_CURVE_256K1, + LEDGER_SIGNATURE_PUBLIC_KEY, + sizeof(LEDGER_SIGNATURE_PUBLIC_KEY), + &verifying_key)); + if (!cx_ecdsa_verify_no_throw(&verifying_key, hash, sizeof(hash), sig, sig_length)) { #ifndef HAVE_BYPASS_SIGNATURES PRINTF("Invalid EIP-712 filtering signature\n"); apdu_response_code = APDU_RESPONSE_INVALID_DATA; @@ -119,68 +113,363 @@ static bool verify_filtering_signature(uint8_t dname_length, #endif } return true; +end: + return false; } /** - * Provide filtering information about upcoming struct field + * Check if the given token index is valid * - * @param[in] payload the raw data received - * @param[in] length payload length - * @param[in] type the type of filtering - * @return if everything went well or not + * @param[in] idx token index + * @return whether the index is valid or not */ -bool provide_filtering_info(const uint8_t *const payload, uint8_t length, e_filtering_type type) { - bool ret = false; - uint8_t dname_len; - const char *dname; +static bool check_token_index(uint8_t idx) { + if (idx >= MAX_ASSETS) { + PRINTF("Error: token index out of range (%u)\n", idx); + return false; + } + if (!tmpCtx.transactionContext.assetSet[idx]) { + PRINTF("Error: token not set (%u)\n", idx); + return false; + } + return true; +} + +/** + * Check if the current element's typename matches the expected one + * + * @param[in] expected the typename we expect + * @return whether it is a match or not + */ +static bool check_typename(const char *expected) { + uint8_t typename_len = 0; + const char *typename; + + typename = get_struct_field_typename(path_get_field(), &typename_len); + if ((typename_len != strlen(expected)) || (strncmp(typename, expected, typename_len) != 0)) { + PRINTF("Error: expected field of type \"%s\" but got \"", expected); + for (int i = 0; i < typename_len; ++i) PRINTF("%c", typename[i]); + PRINTF("\" instead.\n"); + return false; + } + return true; +} + +/** + * Command to give the message information + * + * @param[in] payload the payload to parse + * @param[in] length the payload length + * @return whether it was successful or not + */ +bool filtering_message_info(const uint8_t *payload, uint8_t length) { + uint8_t name_len; + const char *name; + uint8_t filters_count; uint8_t sig_len; const uint8_t *sig; uint8_t offset = 0; - if (type == FILTERING_PROVIDE_MESSAGE_INFO) { - if (path_get_root_type() != ROOT_DOMAIN) { - apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED; - return false; - } - } else // FILTERING_SHOW_FIELD - { - if (path_get_root_type() != ROOT_MESSAGE) { - apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED; + if (path_get_root_type() != ROOT_DOMAIN) { + apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED; + return false; + } + + // Parsing + if ((offset + sizeof(name_len)) > length) { + return false; + } + name_len = payload[offset++]; + if ((offset + name_len) > length) { + return false; + } + name = (char *) &payload[offset]; + offset += name_len; + if ((offset + sizeof(filters_count)) > length) { + return false; + } + filters_count = payload[offset++]; + if (filters_count > MAX_FILTERS) { + PRINTF("%u filters planned but can only store up to %u.\n", filters_count, MAX_FILTERS); + return false; + } + if ((offset + sizeof(sig_len)) > length) { + return false; + } + sig_len = payload[offset++]; + if ((offset + sig_len) != length) { + return false; + } + sig = &payload[offset]; + + // Verification + cx_sha256_t hash_ctx; + if (!sig_verif_start(&hash_ctx, FILT_MAGIC_MESSAGE_INFO)) { + return false; + } + hash_byte(filters_count, (cx_hash_t *) &hash_ctx); + hash_nbytes((uint8_t *) name, sizeof(char) * name_len, (cx_hash_t *) &hash_ctx); + if (!sig_verif_end(&hash_ctx, sig, sig_len)) { + return false; + } + + // Handling + ui_712_set_filters_count(filters_count); + if (!N_storage.verbose_eip712) { + ui_712_set_title("Contract", 8); + ui_712_set_value(name, name_len); + ui_712_redraw_generic_step(); + } + return true; +} + +/** + * Command to display a field as a date-time + * + * @param[in] payload the payload to parse + * @param[in] length the payload length + * @return whether it was successful or not + */ +bool filtering_date_time(const uint8_t *payload, uint8_t length) { + uint8_t name_len; + const char *name; + uint8_t sig_len; + const uint8_t *sig; + uint8_t offset = 0; + + if (path_get_root_type() != ROOT_MESSAGE) { + apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED; + return false; + } + + // Parsing + if ((offset + sizeof(name_len)) > length) { + return false; + } + name_len = payload[offset++]; + if ((offset + name_len) > length) { + return false; + } + name = (char *) &payload[offset]; + offset += name_len; + if ((offset + sizeof(sig_len)) > length) { + return false; + } + sig_len = payload[offset++]; + if ((offset + sig_len) != length) { + return false; + } + sig = &payload[offset]; + + // Verification + cx_sha256_t hash_ctx; + if (!sig_verif_start(&hash_ctx, FILT_MAGIC_DATETIME)) { + return false; + } + hash_filtering_path((cx_hash_t *) &hash_ctx); + hash_nbytes((uint8_t *) name, sizeof(char) * name_len, (cx_hash_t *) &hash_ctx); + if (!sig_verif_end(&hash_ctx, sig, sig_len)) { + return false; + } + + // Handling + if (!check_typename("uint")) { + return false; + } + if (name_len > 0) { // don't substitute for an empty name + ui_712_set_title(name, name_len); + } + ui_712_flag_field(true, name_len > 0, false, true); + return true; +} + +/** + * Command to display a field as an amount-join (token part) + * + * @param[in] payload the payload to parse + * @param[in] length the payload length + * @return whether it was successful or not + */ +bool filtering_amount_join_token(const uint8_t *payload, uint8_t length) { + uint8_t token_idx; + uint8_t sig_len; + const uint8_t *sig; + uint8_t offset = 0; + + if (path_get_root_type() != ROOT_MESSAGE) { + apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED; + return false; + } + + // Parsing + if ((offset + sizeof(token_idx)) > length) { + return false; + } + token_idx = payload[offset++]; + if ((offset + sizeof(sig_len)) > length) { + return false; + } + sig_len = payload[offset++]; + if ((offset + sig_len) != length) { + return false; + } + sig = &payload[offset]; + + // Verification + cx_sha256_t hash_ctx; + if (!sig_verif_start(&hash_ctx, FILT_MAGIC_AMOUNT_JOIN_TOKEN)) { + return false; + } + hash_filtering_path((cx_hash_t *) &hash_ctx); + hash_byte(token_idx, (cx_hash_t *) &hash_ctx); + if (!sig_verif_end(&hash_ctx, sig, sig_len)) { + return false; + } + + // Handling + if (!check_typename("address") || !check_token_index(token_idx)) { + return false; + } + ui_712_flag_field(false, false, true, false); + ui_712_token_join_prepare_addr_check(token_idx); + return true; +} + +/** + * Command to display a field as an amount-join (value part) + * + * @param[in] payload the payload to parse + * @param[in] length the payload length + * @return whether it was successful or not + */ +bool filtering_amount_join_value(const uint8_t *payload, uint8_t length) { + uint8_t name_len; + const char *name; + uint8_t token_idx; + uint8_t sig_len; + const uint8_t *sig; + uint8_t offset = 0; + + if (path_get_root_type() != ROOT_MESSAGE) { + apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED; + return false; + } + + // Parsing + if ((offset + sizeof(name_len)) > length) { + return false; + } + name_len = payload[offset++]; + if ((offset + name_len) > length) { + return false; + } + if (name_len == 0) { + return false; + } + name = (char *) &payload[offset]; + offset += name_len; + if ((offset + sizeof(token_idx)) > length) { + return false; + } + token_idx = payload[offset++]; + if ((offset + sizeof(sig_len)) > length) { + return false; + } + sig_len = payload[offset++]; + if ((offset + sig_len) != length) { + return false; + } + sig = &payload[offset]; + + // Verification + cx_sha256_t hash_ctx; + if (!sig_verif_start(&hash_ctx, FILT_MAGIC_AMOUNT_JOIN_VALUE)) { + return false; + } + hash_filtering_path((cx_hash_t *) &hash_ctx); + hash_nbytes((uint8_t *) name, sizeof(char) * name_len, (cx_hash_t *) &hash_ctx); + hash_byte(token_idx, (cx_hash_t *) &hash_ctx); + if (!sig_verif_end(&hash_ctx, sig, sig_len)) { + return false; + } + + // Handling + if (token_idx == TOKEN_IDX_ADDR_IN_DOMAIN) { + // Permit (ERC-2612) + int resolved_idx = get_asset_index_by_addr(eip712_context->contract_addr); + + if (resolved_idx == -1) { + PRINTF("ERROR: Could not find asset info for verifyingContract address!\n"); return false; } + token_idx = (uint8_t) resolved_idx; + // simulate as if we had received a token-join addr + ui_712_token_join_prepare_addr_check(token_idx); + amount_join_set_token_received(); } - if (length > 0) { - dname_len = payload[offset++]; - if ((1 + dname_len) < length) { - dname = (char *) &payload[offset]; - offset += dname_len; - if (type == FILTERING_PROVIDE_MESSAGE_INFO) { - ui_712_set_filters_count(payload[offset++]); - } - sig_len = payload[offset++]; - sig = &payload[offset]; - offset += sig_len; - if ((sig_len > 0) && (offset == length)) { - if ((ret = verify_filtering_signature(dname_len, dname, sig_len, sig, type))) { - if (type == FILTERING_PROVIDE_MESSAGE_INFO) { - if (!N_storage.verbose_eip712) { - ui_712_set_title("Contract", 8); - ui_712_set_value(dname, dname_len); - ui_712_redraw_generic_step(); - } - } else // FILTERING_SHOW_FIELD - { - if (dname_len > 0) // don't substitute for an empty name - { - ui_712_set_title(dname, dname_len); - } - ui_712_flag_field(true, dname_len > 0); - } - } - } - } + if (!check_typename("uint") || !check_token_index(token_idx)) { + return false; } - return ret; + ui_712_flag_field(false, false, true, false); + ui_712_token_join_prepare_amount(token_idx, name, name_len); + return true; +} + +/** + * Command to display a field raw (without formatting) + * + * @param[in] payload the payload to parse + * @param[in] length the payload length + * @return whether it was successful or not + */ +bool filtering_raw_field(const uint8_t *payload, uint8_t length) { + uint8_t name_len; + const char *name; + uint8_t sig_len; + const uint8_t *sig; + uint8_t offset = 0; + + if (path_get_root_type() != ROOT_MESSAGE) { + apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED; + return false; + } + + // Parsing + if ((offset + sizeof(name_len)) > length) { + return false; + } + name_len = payload[offset++]; + if ((offset + name_len) > length) { + return false; + } + name = (char *) &payload[offset]; + offset += name_len; + if ((offset + sizeof(sig_len)) > length) { + return false; + } + sig_len = payload[offset++]; + if ((offset + sig_len) != length) { + return false; + } + sig = &payload[offset]; + + // Verification + cx_sha256_t hash_ctx; + if (!sig_verif_start(&hash_ctx, FILT_MAGIC_RAW_FIELD)) { + return false; + } + hash_filtering_path((cx_hash_t *) &hash_ctx); + hash_nbytes((uint8_t *) name, sizeof(char) * name_len, (cx_hash_t *) &hash_ctx); + if (!sig_verif_end(&hash_ctx, sig, sig_len)) { + return false; + } + + // Handling + if (name_len > 0) { // don't substitute for an empty name + ui_712_set_title(name, name_len); + } + ui_712_flag_field(true, name_len > 0, false, false); + return true; } #endif // HAVE_EIP712_FULL_SUPPORT diff --git a/src_features/signMessageEIP712/filtering.h b/src_features/signMessageEIP712/filtering.h index 3e33b9a..d35963c 100644 --- a/src_features/signMessageEIP712/filtering.h +++ b/src_features/signMessageEIP712/filtering.h @@ -6,12 +6,13 @@ #include #include -#define FILTERING_MAGIC_CONTRACT_NAME 0b10110111 // 183 -#define FILTERING_MAGIC_STRUCT_FIELD 0b01001000 // ~183 = 72 +#define MAX_FILTERS 50 -typedef enum { FILTERING_PROVIDE_MESSAGE_INFO, FILTERING_SHOW_FIELD } e_filtering_type; - -bool provide_filtering_info(const uint8_t *const payload, uint8_t length, e_filtering_type type); +bool filtering_message_info(const uint8_t *payload, uint8_t length); +bool filtering_date_time(const uint8_t *payload, uint8_t length); +bool filtering_amount_join_token(const uint8_t *payload, uint8_t length); +bool filtering_amount_join_value(const uint8_t *payload, uint8_t length); +bool filtering_raw_field(const uint8_t *payload, uint8_t length); #endif // HAVE_EIP712_FULL_SUPPORT diff --git a/src_features/signMessageEIP712/path.c b/src_features/signMessageEIP712/path.c index 3c823c9..732cbcb 100644 --- a/src_features/signMessageEIP712/path.c +++ b/src_features/signMessageEIP712/path.c @@ -9,7 +9,6 @@ #include "type_hash.h" #include "shared_context.h" #include "mem_utils.h" -#include "ui_logic.h" #include "apdu_constants.h" // APDU response codes #include "typed_data.h" @@ -115,7 +114,7 @@ const void *path_get_field(void) { /** * Go down (add) a depth level. * - * @return whether the push was succesful + * @return whether the push was successful */ static bool path_depth_list_push(void) { if (path_struct == NULL) { @@ -147,13 +146,17 @@ static cx_sha3_t *get_last_hash_ctx(void) { static bool finalize_hash_depth(uint8_t *hash) { const cx_sha3_t *hash_ctx; size_t hashed_bytes; + cx_err_t error = CX_INTERNAL_ERROR; hash_ctx = get_last_hash_ctx(); hashed_bytes = hash_ctx->blen; // finalize hash - cx_hash((cx_hash_t *) hash_ctx, CX_LAST, NULL, 0, hash, KECCAK256_HASH_BYTESIZE); + CX_CHECK( + cx_hash_no_throw((cx_hash_t *) hash_ctx, CX_LAST, NULL, 0, hash, KECCAK256_HASH_BYTESIZE)); mem_dealloc(sizeof(*hash_ctx)); // remove hash context return hashed_bytes > 0; +end: + return false; } /** @@ -166,7 +169,7 @@ static void feed_last_hash_depth(const uint8_t *const hash) { hash_ctx = get_last_hash_ctx(); // continue progressive hash with the array hash - cx_hash((cx_hash_t *) hash_ctx, 0, hash, KECCAK256_HASH_BYTESIZE, NULL, 0); + CX_ASSERT(cx_hash_no_throw((cx_hash_t *) hash_ctx, 0, hash, KECCAK256_HASH_BYTESIZE, NULL, 0)); } /** @@ -177,15 +180,18 @@ static void feed_last_hash_depth(const uint8_t *const hash) { */ static bool push_new_hash_depth(bool init) { cx_sha3_t *hash_ctx; + cx_err_t error = CX_INTERNAL_ERROR; // allocate new hash context if ((hash_ctx = MEM_ALLOC_AND_ALIGN_TYPE(*hash_ctx)) == NULL) { return false; } if (init) { - cx_keccak_init(hash_ctx, 256); // initialize it + CX_CHECK(cx_keccak_init_no_throw(hash_ctx, 256)); } return true; +end: + return false; } /** @@ -248,6 +254,7 @@ static bool array_depth_list_push(uint8_t path_idx, uint8_t size) { arr = &path_struct->array_depths[path_struct->array_depth_count]; arr->path_index = path_idx; arr->size = size; + arr->index = 0; path_struct->array_depth_count += 1; return true; } @@ -278,11 +285,14 @@ static bool array_depth_list_pop(void) { * Updates the path so that it doesn't point to a struct-type field, but rather * only to actual fields. * + * @param[in] skip_if_array skip if path is already pointing at an array + * @param[in] stop_at_array stop at the first downstream array * @return whether the path update worked or not */ -static bool path_update(void) { +static bool path_update(bool skip_if_array, bool stop_at_array) { uint8_t fields_count; const void *struct_ptr; + const void *starting_field_ptr; const void *field_ptr; const char *typename; uint8_t typename_len; @@ -291,11 +301,20 @@ static bool path_update(void) { if (path_struct == NULL) { return false; } - if ((field_ptr = get_field(NULL)) == NULL) { + if ((starting_field_ptr = get_field(NULL)) == NULL) { return false; } - struct_ptr = path_struct->root_struct; + field_ptr = starting_field_ptr; while (struct_field_type(field_ptr) == TYPE_CUSTOM) { + // check if we meet one of the given conditions + if (((field_ptr == starting_field_ptr) && skip_if_array) || + ((field_ptr != starting_field_ptr) && stop_at_array)) { + // only if it is the first iteration of that array depth + if ((path_struct->array_depths[path_struct->array_depth_count - 1].index == 0) && + struct_field_is_array(field_ptr)) { + break; + } + } typename = get_struct_field_typename(field_ptr, &typename_len); if ((struct_ptr = get_structn(typename, typename_len)) == NULL) { return false; @@ -307,11 +326,16 @@ static bool path_update(void) { if (push_new_hash_depth(true) == false) { return false; } - // get the struct typehash - if (type_hash(typename, typename_len, hash) == false) { - return false; + + // The only times they are both at false is if we are traversing an empty array, + // don't do a typehash in that case + if ((skip_if_array != false) || (stop_at_array != false)) { + // get the struct typehash + if (type_hash(typename, typename_len, hash) == false) { + return false; + } + feed_last_hash_depth(hash); } - feed_last_hash_depth(hash); // TODO: Find a better way to show inner structs in verbose mode when it might be // an empty array of structs in which case we don't want to show it but the @@ -375,7 +399,7 @@ bool path_set_root(const char *const struct_name, uint8_t name_length) { struct_state = DEFINED; // because the first field could be a struct type - path_update(); + path_update(true, true); return true; } @@ -432,6 +456,7 @@ bool path_new_array_depth(const uint8_t *const data, uint8_t length) { bool is_custom; uint8_t array_size; uint8_t array_depth_count_bak; + cx_err_t error = CX_INTERNAL_ERROR; if (path_struct == NULL) { apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED; @@ -442,6 +467,9 @@ bool path_new_array_depth(const uint8_t *const data, uint8_t length) { } array_size = *data; + if (!path_update(false, array_size > 0)) { + return false; + } array_depth_count_bak = path_struct->array_depth_count; for (pidx = 0; pidx < path_struct->depth_count; ++pidx) { if ((field_ptr = get_nth_field(NULL, pidx + 1)) == NULL) { @@ -479,17 +507,19 @@ bool path_new_array_depth(const uint8_t *const data, uint8_t length) { if (array_size > 0) { memcpy(hash_ctx, old_ctx, sizeof(*old_ctx)); } else { - cx_keccak_init(hash_ctx, 256); + CX_CHECK(cx_keccak_init_no_throw(hash_ctx, 256)); } - cx_keccak_init(old_ctx, 256); // init hash + CX_CHECK(cx_keccak_init_no_throw(old_ctx, 256)); } if (array_size == 0) { do { - path_advance(); - } while (path_struct->array_depth_count != array_depth_count_bak); + path_advance(false); + } while (path_struct->array_depth_count > array_depth_count_bak); } return true; +end: + return false; } /** @@ -510,7 +540,6 @@ static bool path_advance_in_struct(void) { } if (path_struct->depth_count > 0) { *depth += 1; - ui_712_notify_filter_change(); end_reached = (*depth == fields_count); } if (end_reached) { @@ -537,8 +566,8 @@ static bool path_advance_in_array(void) { if ((path_struct->array_depth_count > 0) && (arr_depth->path_index == (path_struct->depth_count - 1))) { - if (arr_depth->size > 0) arr_depth->size -= 1; - if (arr_depth->size == 0) { + arr_depth->index += 1; + if (arr_depth->index == arr_depth->size) { array_depth_list_pop(); end_reached = true; } else { @@ -554,7 +583,7 @@ static bool path_advance_in_array(void) { * * @return whether the advancement was successful or not */ -bool path_advance(void) { +bool path_advance(bool array_check) { bool end_reached; do { @@ -564,8 +593,7 @@ bool path_advance(void) { end_reached = false; } } while (end_reached); - path_update(); - return true; + return path_update(array_check, array_check); } /** @@ -604,6 +632,35 @@ uint8_t path_get_depth_count(void) { return path_struct->depth_count; } +/** + * Generate a unique checksum out of the current path + * + * Goes over the fields of the \ref path_struct with a few exceptions : we skip the root_type since + * we already go over root_struct, and in array_depths we only go over path_index since it would + * otherwise generate a different CRC for different fields which are targeted by the same filtering + * path. + * + * @return CRC-32 checksum + */ +uint32_t get_path_crc(void) { + uint32_t value = CX_CRC32_INIT; + + value = cx_crc32_update(value, &path_struct->root_struct, sizeof(path_struct->root_struct)); + value = cx_crc32_update(value, &path_struct->depth_count, sizeof(path_struct->depth_count)); + value = cx_crc32_update(value, + path_struct->depths, + sizeof(path_struct->depths[0]) * path_struct->depth_count); + value = cx_crc32_update(value, + &path_struct->array_depth_count, + sizeof(path_struct->array_depth_count)); + for (int i = 0; i < path_struct->array_depth_count; ++i) { + value = cx_crc32_update(value, + &path_struct->array_depths[i].path_index, + sizeof(path_struct->array_depths[i].path_index)); + } + return value; +} + /** * Initialize the path context with its indexes in memory and sets it with a depth of 0. * diff --git a/src_features/signMessageEIP712/path.h b/src_features/signMessageEIP712/path.h index d03b4c5..fbb655e 100644 --- a/src_features/signMessageEIP712/path.h +++ b/src_features/signMessageEIP712/path.h @@ -12,6 +12,7 @@ typedef struct { uint8_t path_index; uint8_t size; + uint8_t index; } s_array_depth; typedef enum { ROOT_DOMAIN, ROOT_MESSAGE } e_root_type; @@ -27,7 +28,7 @@ typedef struct { bool path_set_root(const char *const struct_name, uint8_t length); const void *path_get_field(void); -bool path_advance(void); +bool path_advance(bool array_check); bool path_init(void); void path_deinit(void); bool path_new_array_depth(const uint8_t *const data, uint8_t length); @@ -36,6 +37,7 @@ const void *path_get_root(void); const void *path_get_nth_field(uint8_t n); const void *path_get_nth_field_to_last(uint8_t n); uint8_t path_get_depth_count(void); +uint32_t get_path_crc(void); #endif // HAVE_EIP712_FULL_SUPPORT diff --git a/src_features/signMessageEIP712/schema_hash.c b/src_features/signMessageEIP712/schema_hash.c index e47c2ee..5b8e1bf 100644 --- a/src_features/signMessageEIP712/schema_hash.c +++ b/src_features/signMessageEIP712/schema_hash.c @@ -27,6 +27,7 @@ bool compute_schema_hash(void) { const char *name; uint8_t name_length; cx_sha224_t hash_ctx; + cx_err_t error = CX_INTERNAL_ERROR; cx_sha224_init(&hash_ctx); @@ -61,13 +62,15 @@ bool compute_schema_hash(void) { hash_byte('}', (cx_hash_t *) &hash_ctx); // copy hash into context struct - cx_hash((cx_hash_t *) &hash_ctx, - CX_LAST, - NULL, - 0, - eip712_context->schema_hash, - sizeof(eip712_context->schema_hash)); + CX_CHECK(cx_hash_no_throw((cx_hash_t *) &hash_ctx, + CX_LAST, + NULL, + 0, + eip712_context->schema_hash, + sizeof(eip712_context->schema_hash))); return true; +end: + return false; } #endif // HAVE_EIP712_FULL_SUPPORT diff --git a/src_features/signMessageEIP712/type_hash.c b/src_features/signMessageEIP712/type_hash.c index 7b9515f..f37e208 100644 --- a/src_features/signMessageEIP712/type_hash.c +++ b/src_features/signMessageEIP712/type_hash.c @@ -51,7 +51,7 @@ static bool encode_and_hash_type(const void *const struct_ptr) { struct_name = get_struct_name(struct_ptr, &struct_name_length); hash_nbytes((uint8_t *) struct_name, struct_name_length, (cx_hash_t *) &global_sha3); - // opening struct parenthese + // opening struct parentheses hash_byte('(', (cx_hash_t *) &global_sha3); field_ptr = get_struct_fields_array(struct_ptr, &fields_count); @@ -67,7 +67,7 @@ static bool encode_and_hash_type(const void *const struct_ptr) { field_ptr = get_next_struct_field(field_ptr); } - // closing struct parenthese + // closing struct parentheses hash_byte(')', (cx_hash_t *) &global_sha3); return true; @@ -107,7 +107,7 @@ static void sort_dependencies(uint8_t deps_count, const void **deps) { /** * Find all the dependencies from a given structure * - * @param[out] deps_count count of how many struct dependencie pointers + * @param[out] deps_count count of how many struct dependency pointers * @param[in] first_dep pointer to the first dependency pointer * @param[in] struct_ptr pointer to the struct we are getting the dependencies of * @return pointer to the first found dependency, \ref NULL otherwise @@ -171,8 +171,9 @@ bool type_hash(const char *const struct_name, const uint8_t struct_name_length, uint8_t deps_count = 0; const void **deps; void *mem_loc_bak = mem_alloc(0); + cx_err_t error = CX_INTERNAL_ERROR; - cx_keccak_init(&global_sha3, 256); // init hash + CX_CHECK(cx_keccak_init_no_throw(&global_sha3, 256)); deps = get_struct_dependencies(&deps_count, NULL, struct_ptr); if ((deps_count > 0) && (deps == NULL)) { return false; @@ -191,8 +192,15 @@ bool type_hash(const char *const struct_name, const uint8_t struct_name_length, mem_dealloc(mem_alloc(0) - mem_loc_bak); // copy hash into memory - cx_hash((cx_hash_t *) &global_sha3, CX_LAST, NULL, 0, hash_buf, KECCAK256_HASH_BYTESIZE); + CX_CHECK(cx_hash_no_throw((cx_hash_t *) &global_sha3, + CX_LAST, + NULL, + 0, + hash_buf, + KECCAK256_HASH_BYTESIZE)); return true; +end: + return false; } #endif // HAVE_EIP712_FULL_SUPPORT diff --git a/src_features/signMessageEIP712/typed_data.c b/src_features/signMessageEIP712/typed_data.c index a410ccf..e5f75b7 100644 --- a/src_features/signMessageEIP712/typed_data.c +++ b/src_features/signMessageEIP712/typed_data.c @@ -58,7 +58,7 @@ static const uint8_t *field_skip_typedesc(const uint8_t *field_ptr, const uint8_ * @return pointer to the data right after */ static const uint8_t *field_skip_typename(const uint8_t *field_ptr, const uint8_t *ptr) { - uint8_t size; + uint8_t size = 0; if (struct_field_type(field_ptr) == TYPE_CUSTOM) { get_string_in_mem(ptr, &size); @@ -89,7 +89,7 @@ static const uint8_t *field_skip_typesize(const uint8_t *field_ptr, const uint8_ * @return pointer to the data right after */ static const uint8_t *field_skip_array_levels(const uint8_t *field_ptr, const uint8_t *ptr) { - uint8_t size; + uint8_t size = 0; if (struct_field_is_array(field_ptr)) { ptr = get_array_in_mem(ptr, &size); @@ -108,11 +108,12 @@ static const uint8_t *field_skip_array_levels(const uint8_t *field_ptr, const ui * @return pointer to the data right after */ static const uint8_t *field_skip_keyname(const uint8_t *field_ptr, const uint8_t *ptr) { - uint8_t size; + uint8_t size = 0; + uint8_t *new_ptr; (void) field_ptr; - ptr = get_array_in_mem(ptr, &size); - return ptr + size; + new_ptr = (uint8_t *) get_array_in_mem(ptr, &size); + return (const uint8_t *) (new_ptr + size); } /** @@ -416,7 +417,7 @@ const uint8_t *get_structs_array(uint8_t *const length) { * @return pointer to struct */ const uint8_t *get_structn(const char *const name, const uint8_t length) { - uint8_t structs_count; + uint8_t structs_count = 0; const uint8_t *struct_ptr; const char *struct_name; uint8_t name_length; diff --git a/src_features/signMessageEIP712/ui_logic.c b/src_features/signMessageEIP712/ui_logic.c index 5a169e9..357cca5 100644 --- a/src_features/signMessageEIP712/ui_logic.c +++ b/src_features/signMessageEIP712/ui_logic.c @@ -2,6 +2,7 @@ #include #include +#include #include "ui_logic.h" #include "mem.h" #include "mem_utils.h" @@ -16,7 +17,52 @@ #include "typed_data.h" #include "commands_712.h" #include "common_ui.h" -#include "domain_name.h" +#include "uint_common.h" +#include "filtering.h" + +#define AMOUNT_JOIN_FLAG_TOKEN (1 << 0) +#define AMOUNT_JOIN_FLAG_VALUE (1 << 1) + +typedef struct { + // display name, not NULL-terminated + char name[25]; + uint8_t name_length; + uint8_t value[INT256_LENGTH]; + uint8_t value_length; + // indicates the steps the token join has gone through + uint8_t flags; +} s_amount_join; + +typedef enum { + AMOUNT_JOIN_STATE_TOKEN, + AMOUNT_JOIN_STATE_VALUE, +} e_amount_join_state; + +#define UI_712_FIELD_SHOWN (1 << 0) +#define UI_712_FIELD_NAME_PROVIDED (1 << 1) +#define UI_712_AMOUNT_JOIN (1 << 2) +#define UI_712_DATETIME (1 << 3) + +typedef struct { + s_amount_join joins[MAX_ASSETS]; + uint8_t idx; + e_amount_join_state state; +} s_amount_context; + +typedef struct { + bool shown; + bool end_reached; + uint8_t filtering_mode; + uint8_t filters_to_process; + uint8_t field_flags; + uint8_t structs_to_review; + s_amount_context amount; + uint8_t filters_received; + uint32_t filters_crc[MAX_FILTERS]; +#ifdef SCREEN_SIZE_WALLET + char ui_pairs_buffer[(SHARED_CTX_FIELD_1_SIZE + SHARED_CTX_FIELD_2_SIZE) * 2]; +#endif +} t_ui_context; static t_ui_context *ui_ctx = NULL; @@ -32,8 +78,7 @@ static bool ui_712_field_shown(void) { if (N_storage.verbose_eip712 || (path_get_root_type() == ROOT_DOMAIN)) { ret = true; } - } else // EIP712_FILTERING_FULL - { + } else { // EIP712_FILTERING_FULL if (ui_ctx->field_flags & UI_712_FIELD_SHOWN) { ret = true; } @@ -48,11 +93,11 @@ static bool ui_712_field_shown(void) { * @param[in] src_length source buffer size * @param[in] dst destination buffer * @param[in] dst_length destination buffer length - * @param[in] explicit_trunc if truncation should be explicitely shown + * @param[in] explicit_trunc if truncation should be explicitly shown */ -static void ui_712_set_buf(const char *const src, +static void ui_712_set_buf(const char *src, size_t src_length, - char *const dst, + char *dst, size_t dst_length, bool explicit_trunc) { uint8_t cpy_length; @@ -85,7 +130,7 @@ void ui_712_finalize_field(void) { * @param[in] str the new title * @param[in] length its length */ -void ui_712_set_title(const char *const str, uint8_t length) { +void ui_712_set_title(const char *str, size_t length) { ui_712_set_buf(str, length, strings.tmp.tmp2, sizeof(strings.tmp.tmp2), false); } @@ -95,7 +140,7 @@ void ui_712_set_title(const char *const str, uint8_t length) { * @param[in] str the new value * @param[in] length its length */ -void ui_712_set_value(const char *const str, uint8_t length) { +void ui_712_set_value(const char *str, size_t length) { ui_712_set_buf(str, length, strings.tmp.tmp, sizeof(strings.tmp.tmp), true); } @@ -103,8 +148,7 @@ void ui_712_set_value(const char *const str, uint8_t length) { * Redraw the dynamic UI step that shows EIP712 information */ void ui_712_redraw_generic_step(void) { - if (!ui_ctx->shown) // Initialize if it is not already - { + if (!ui_ctx->shown) { // Initialize if it is not already ui_712_start(); ui_ctx->shown = true; } else { @@ -132,6 +176,9 @@ e_eip712_nfs ui_712_next_field(void) { } else if (!ui_ctx->end_reached) { handle_eip712_return_code(true); state = EIP712_FIELD_INCOMING; + // So that later when we append to them, we start from an empty string + explicit_bzero(strings.tmp.tmp, sizeof(strings.tmp.tmp)); + explicit_bzero(strings.tmp.tmp2, sizeof(strings.tmp.tmp2)); } } return state; @@ -142,10 +189,10 @@ e_eip712_nfs ui_712_next_field(void) { * * @param[in] struct_ptr pointer to the structure to be shown */ -void ui_712_review_struct(const void *const struct_ptr) { +void ui_712_review_struct(const void *struct_ptr) { const char *struct_name; uint8_t struct_name_length; - const char *const title = "Review struct"; + const char *title = "Review struct"; if (ui_ctx == NULL) { return; @@ -162,14 +209,14 @@ void ui_712_review_struct(const void *const struct_ptr) { * Show the hash of the message on the generic UI step */ void ui_712_message_hash(void) { - const char *const title = "Message hash"; + const char *title = "Message hash"; ui_712_set_title(title, strlen(title)); - snprintf(strings.tmp.tmp, - sizeof(strings.tmp.tmp), - "0x%.*H", - KECCAK256_HASH_BYTESIZE, - tmpCtx.messageSigningContext712.messageHash); + array_bytes_string(strings.tmp.tmp, + sizeof(strings.tmp.tmp), + tmpCtx.messageSigningContext712.messageHash, + KECCAK256_HASH_BYTESIZE); + ui_ctx->end_reached = true; ui_712_redraw_generic_step(); } @@ -178,80 +225,41 @@ void ui_712_message_hash(void) { * * @param[in] data the data that needs formatting * @param[in] length its length + * @param[in] last if this is the last chunk */ -static void ui_712_format_str(const uint8_t *const data, uint8_t length) { - if (ui_712_field_shown()) { - ui_712_set_value((char *) data, length); +static void ui_712_format_str(const uint8_t *data, uint8_t length, bool last) { + size_t max_len = sizeof(strings.tmp.tmp) - 1; + size_t cur_len = strlen(strings.tmp.tmp); + + memcpy(strings.tmp.tmp + cur_len, data, MIN(max_len - cur_len, length)); + // truncated + if (last && ((max_len - cur_len) < length)) { + memcpy(strings.tmp.tmp + max_len - 3, "...", 3); } } -/** - * Find a substitute token ticker for a given address - * - * @param[in] addr the given address - * @return the ticker name if found, \ref NULL otherwise - */ -static const char *get_address_token_ticker(const uint8_t *addr) { - tokenDefinition_t *token; - - // Loop over the received token informations - for (uint8_t token_idx = 0; token_idx < MAX_ITEMS; ++token_idx) { - if (tmpCtx.transactionContext.tokenSet[token_idx] == 1) { - token = &tmpCtx.transactionContext.extraInfo[token_idx].token; - if (memcmp(token->address, addr, ADDRESS_LENGTH) == 0) { - return token->ticker; - } - } - } - return NULL; -} - -/** - * Find a substitute (token ticker or domain name) for a given address - * - * @param[in] addr the given address - * @return the substitute if found, \ref NULL otherwise - */ -static const char *get_address_substitute(const uint8_t *addr) { - const char *str = NULL; - - str = get_address_token_ticker(addr); - if (str == NULL) { - if (has_domain_name(&eip712_context->chain_id, addr)) { - // No handling of the verbose domains setting - str = g_domain_name; - } - } - return str; -} - /** * Format a given data as a string representation of an address * * @param[in] data the data that needs formatting * @param[in] length its length + * @param[in] first if this is the first chunk * @return if the formatting was successful */ -static bool ui_712_format_addr(const uint8_t *const data, uint8_t length) { +static bool ui_712_format_addr(const uint8_t *data, uint8_t length, bool first) { + // no reason for an address to be received over multiple chunks + if (!first) { + return false; + } if (length != ADDRESS_LENGTH) { apdu_response_code = APDU_RESPONSE_INVALID_DATA; return false; } - - if (ui_712_field_shown()) { - const char *sub; - - if (!N_storage.verbose_eip712 && ((sub = get_address_substitute(data)) != NULL)) { - ui_712_set_value(sub, strlen(sub)); - } else { - if (!getEthDisplayableAddress((uint8_t *) data, - strings.tmp.tmp, - sizeof(strings.tmp.tmp), - &global_sha3, - chainConfig->chainId)) { - THROW(APDU_RESPONSE_ERROR_NO_INFO); - } - } + if (!getEthDisplayableAddress((uint8_t *) data, + strings.tmp.tmp, + sizeof(strings.tmp.tmp), + chainConfig->chainId)) { + THROW(APDU_RESPONSE_ERROR_NO_INFO); } return true; } @@ -261,21 +269,25 @@ static bool ui_712_format_addr(const uint8_t *const data, uint8_t length) { * * @param[in] data the data that needs formatting * @param[in] length its length + * @param[in] first if this is the first chunk * @return if the formatting was successful */ -static bool ui_712_format_bool(const uint8_t *const data, uint8_t length) { - const char *const true_str = "true"; - const char *const false_str = "false"; +static bool ui_712_format_bool(const uint8_t *data, uint8_t length, bool first) { + size_t max_len = sizeof(strings.tmp.tmp) - 1; + const char *true_str = "true"; + const char *false_str = "false"; const char *str; + // no reason for a boolean to be received over multiple chunks + if (!first) { + return false; + } if (length != 1) { apdu_response_code = APDU_RESPONSE_INVALID_DATA; return false; } str = *data ? true_str : false_str; - if (ui_712_field_shown()) { - ui_712_set_value(str, strlen(str)); - } + memcpy(strings.tmp.tmp, str, MIN(max_len, strlen(str))); return true; } @@ -284,17 +296,29 @@ static bool ui_712_format_bool(const uint8_t *const data, uint8_t length) { * * @param[in] data the data that needs formatting * @param[in] length its length + * @param[in] first if this is the first chunk + * @param[in] last if this is the last chunk + * @return if the formatting was successful */ -static void ui_712_format_bytes(const uint8_t *const data, uint8_t length) { - if (ui_712_field_shown()) { - snprintf(strings.tmp.tmp, sizeof(strings.tmp.tmp), "0x%.*H", length, data); - // +2 for the "0x" - // x2 for each byte value is represented by 2 ASCII characters - if ((2 + (length * 2)) > (sizeof(strings.tmp.tmp) - 1)) { - strings.tmp.tmp[sizeof(strings.tmp.tmp) - 1 - 3] = '\0'; - strcat(strings.tmp.tmp, "..."); - } +static bool ui_712_format_bytes(const uint8_t *data, uint8_t length, bool first, bool last) { + size_t max_len = sizeof(strings.tmp.tmp) - 1; + size_t cur_len = strlen(strings.tmp.tmp); + + if (first) { + memcpy(strings.tmp.tmp, "0x", MIN(max_len, 2)); + cur_len += 2; } + if (format_hex(data, + MIN((max_len - cur_len) / 2, length), + strings.tmp.tmp + cur_len, + max_len + 1 - cur_len) < 0) { + return false; + } + // truncated + if (last && (((max_len - cur_len) / 2) < length)) { + memcpy(strings.tmp.tmp + max_len - 3, "...", 3); + } + return true; } /** @@ -302,63 +326,58 @@ static void ui_712_format_bytes(const uint8_t *const data, uint8_t length) { * * @param[in] data the data that needs formatting * @param[in] length its length + * @param[in] first if this is the first chunk + * @param[in] field_ptr pointer to the EIP-712 field * @return if the formatting was successful */ -static bool ui_712_format_int(const uint8_t *const data, +static bool ui_712_format_int(const uint8_t *data, uint8_t length, - const void *const field_ptr) { + bool first, + const void *field_ptr) { uint256_t value256; uint128_t value128; int32_t value32; int16_t value16; + // no reason for an integer to be received over multiple chunks + if (!first) { + return false; + } switch (get_struct_field_typesize(field_ptr) * 8) { case 256: convertUint256BE(data, length, &value256); - if (ui_712_field_shown()) { - tostring256_signed(&value256, 10, strings.tmp.tmp, sizeof(strings.tmp.tmp)); - } + tostring256_signed(&value256, 10, strings.tmp.tmp, sizeof(strings.tmp.tmp)); break; case 128: convertUint128BE(data, length, &value128); - if (ui_712_field_shown()) { - tostring128_signed(&value128, 10, strings.tmp.tmp, sizeof(strings.tmp.tmp)); - } + tostring128_signed(&value128, 10, strings.tmp.tmp, sizeof(strings.tmp.tmp)); break; case 64: convertUint64BEto128(data, length, &value128); - if (ui_712_field_shown()) { - tostring128_signed(&value128, 10, strings.tmp.tmp, sizeof(strings.tmp.tmp)); - } + tostring128_signed(&value128, 10, strings.tmp.tmp, sizeof(strings.tmp.tmp)); break; case 32: value32 = 0; for (int i = 0; i < length; ++i) { ((uint8_t *) &value32)[length - 1 - i] = data[i]; } - if (ui_712_field_shown()) { - snprintf(strings.tmp.tmp, sizeof(strings.tmp.tmp), "%d", value32); - } + snprintf(strings.tmp.tmp, sizeof(strings.tmp.tmp), "%d", value32); break; case 16: value16 = 0; for (int i = 0; i < length; ++i) { ((uint8_t *) &value16)[length - 1 - i] = data[i]; } - if (ui_712_field_shown()) { - snprintf(strings.tmp.tmp, - sizeof(strings.tmp.tmp), - "%d", - value16); // expanded to 32 bits - } + snprintf(strings.tmp.tmp, + sizeof(strings.tmp.tmp), + "%d", + value16); // expanded to 32 bits break; case 8: - if (ui_712_field_shown()) { - snprintf(strings.tmp.tmp, - sizeof(strings.tmp.tmp), - "%d", - ((int8_t *) data)[0]); // expanded to 32 bits - } + snprintf(strings.tmp.tmp, + sizeof(strings.tmp.tmp), + "%d", + ((int8_t *) data)[0]); // expanded to 32 bits break; default: PRINTF("Unhandled field typesize\n"); @@ -373,76 +392,208 @@ static bool ui_712_format_int(const uint8_t *const data, * * @param[in] data the data that needs formatting * @param[in] length its length + * @param[in] first if this is the first chunk + * @return if the formatting was successful */ -static void ui_712_format_uint(const uint8_t *const data, uint8_t length) { +static bool ui_712_format_uint(const uint8_t *data, uint8_t length, bool first) { uint256_t value256; - convertUint256BE(data, length, &value256); - if (ui_712_field_shown()) { - tostring256(&value256, 10, strings.tmp.tmp, sizeof(strings.tmp.tmp)); + // no reason for an integer to be received over multiple chunks + if (!first) { + return false; } + convertUint256BE(data, length, &value256); + tostring256(&value256, 10, strings.tmp.tmp, sizeof(strings.tmp.tmp)); + return true; } /** - * Used to notify of a new field to review in the current struct (key + value) + * Format given data as an amount with its ticker and value with correct decimals + * + * @return whether it was successful or not + */ +static bool ui_712_format_amount_join(void) { + const tokenDefinition_t *token; + token = &tmpCtx.transactionContext.extraInfo[ui_ctx->amount.idx].token; + + if ((ui_ctx->amount.joins[ui_ctx->amount.idx].value_length == INT256_LENGTH) && + ismaxint(ui_ctx->amount.joins[ui_ctx->amount.idx].value, + ui_ctx->amount.joins[ui_ctx->amount.idx].value_length)) { + strlcpy(strings.tmp.tmp, "Unlimited ", sizeof(strings.tmp.tmp)); + strlcat(strings.tmp.tmp, token->ticker, sizeof(strings.tmp.tmp)); + } else { + if (!amountToString(ui_ctx->amount.joins[ui_ctx->amount.idx].value, + ui_ctx->amount.joins[ui_ctx->amount.idx].value_length, + token->decimals, + token->ticker, + strings.tmp.tmp, + sizeof(strings.tmp.tmp))) { + return false; + } + } + ui_ctx->field_flags |= UI_712_FIELD_SHOWN; + ui_712_set_title(ui_ctx->amount.joins[ui_ctx->amount.idx].name, + ui_ctx->amount.joins[ui_ctx->amount.idx].name_length); + explicit_bzero(&ui_ctx->amount.joins[ui_ctx->amount.idx], + sizeof(ui_ctx->amount.joins[ui_ctx->amount.idx])); + return true; +} + +/** + * Simply mark the current amount-join's token address as received + */ +void amount_join_set_token_received(void) { + ui_ctx->amount.joins[ui_ctx->amount.idx].flags |= AMOUNT_JOIN_FLAG_TOKEN; +} + +/** + * Update the state of the amount-join + * + * @param[in] data the data that needs formatting + * @param[in] length its length + * @return whether it was successful or not + */ +static bool update_amount_join(const uint8_t *data, uint8_t length) { + tokenDefinition_t *token; + + token = &tmpCtx.transactionContext.extraInfo[ui_ctx->amount.idx].token; + switch (ui_ctx->amount.state) { + case AMOUNT_JOIN_STATE_TOKEN: + if (memcmp(data, token->address, ADDRESS_LENGTH) != 0) { + return false; + } + amount_join_set_token_received(); + break; + + case AMOUNT_JOIN_STATE_VALUE: + memcpy(ui_ctx->amount.joins[ui_ctx->amount.idx].value, data, length); + ui_ctx->amount.joins[ui_ctx->amount.idx].value_length = length; + ui_ctx->amount.joins[ui_ctx->amount.idx].flags |= AMOUNT_JOIN_FLAG_VALUE; + break; + + default: + return false; + } + return true; +} + +/** + * Format given data as a human-readable date/time representation + * + * @param[in] data the data that needs formatting + * @param[in] length its length + * @return whether it was successful or not + */ +static bool ui_712_format_datetime(const uint8_t *data, uint8_t length) { + struct tm tstruct; + int shown_hour; + time_t timestamp = u64_from_BE(data, length); + + if (gmtime_r(×tamp, &tstruct) == NULL) { + return false; + } + if (tstruct.tm_hour == 0) { + shown_hour = 12; + } else { + shown_hour = tstruct.tm_hour; + if (shown_hour > 12) { + shown_hour -= 12; + } + } + snprintf(strings.tmp.tmp, + sizeof(strings.tmp.tmp), + "%04d-%02d-%02d\n%02d:%02d:%02d %s UTC", + tstruct.tm_year + 1900, + tstruct.tm_mon + 1, + tstruct.tm_mday, + shown_hour, + tstruct.tm_min, + tstruct.tm_sec, + (tstruct.tm_hour < 12) ? "AM" : "PM"); + return true; +} + +/** + * Formats and feeds the given input data to the display buffers * * @param[in] field_ptr pointer to the new struct field * @param[in] data pointer to the field's raw value * @param[in] length field's raw value byte-length + * @param[in] first if this is the first chunk + * @param[in] last if this is the last chunk */ -bool ui_712_new_field(const void *const field_ptr, const uint8_t *const data, uint8_t length) { - const char *key; - uint8_t key_len; - +bool ui_712_feed_to_display(const void *field_ptr, + const uint8_t *data, + uint8_t length, + bool first, + bool last) { if (ui_ctx == NULL) { apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED; return false; } - // Key - if ((key = get_struct_field_keyname(field_ptr, &key_len)) == NULL) { - apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED; + if (first && (strlen(strings.tmp.tmp) > 0)) { return false; } - - if (ui_712_field_shown() && !(ui_ctx->field_flags & UI_712_FIELD_NAME_PROVIDED)) { - ui_712_set_title(key, key_len); + // Value + if (ui_712_field_shown()) { + switch (struct_field_type(field_ptr)) { + case TYPE_SOL_STRING: + ui_712_format_str(data, length, last); + break; + case TYPE_SOL_ADDRESS: + if (ui_712_format_addr(data, length, first) == false) { + return false; + } + break; + case TYPE_SOL_BOOL: + if (ui_712_format_bool(data, length, first) == false) { + return false; + } + break; + case TYPE_SOL_BYTES_FIX: + case TYPE_SOL_BYTES_DYN: + if (ui_712_format_bytes(data, length, first, last) == false) { + return false; + } + break; + case TYPE_SOL_INT: + if (ui_712_format_int(data, length, first, field_ptr) == false) { + return false; + } + break; + case TYPE_SOL_UINT: + if (ui_712_format_uint(data, length, first) == false) { + return false; + } + break; + default: + PRINTF("Unhandled type\n"); + return false; + } } - // Value - switch (struct_field_type(field_ptr)) { - case TYPE_SOL_STRING: - ui_712_format_str(data, length); - break; - case TYPE_SOL_ADDRESS: - if (ui_712_format_addr(data, length) == false) { - return false; - } - break; - case TYPE_SOL_BOOL: - if (ui_712_format_bool(data, length) == false) { - return false; - } - break; - case TYPE_SOL_BYTES_FIX: - case TYPE_SOL_BYTES_DYN: - ui_712_format_bytes(data, length); - break; - case TYPE_SOL_INT: - if (ui_712_format_int(data, length, field_ptr) == false) { - return false; - } - break; - case TYPE_SOL_UINT: - ui_712_format_uint(data, length); - break; - default: - PRINTF("Unhandled type\n"); + if (ui_ctx->field_flags & UI_712_AMOUNT_JOIN) { + if (!update_amount_join(data, length)) { return false; + } + + if (ui_ctx->amount.joins[ui_ctx->amount.idx].flags == + (AMOUNT_JOIN_FLAG_TOKEN | AMOUNT_JOIN_FLAG_VALUE)) { + if (!ui_712_format_amount_join()) { + return false; + } + } + } + + if (ui_ctx->field_flags & UI_712_DATETIME) { + if (!ui_712_format_datetime(data, length)) { + return false; + } } // Check if this field is supposed to be displayed - if (ui_712_field_shown()) { + if (last && ui_712_field_shown()) { ui_712_redraw_generic_step(); } return true; @@ -457,9 +608,9 @@ void ui_712_end_sign(void) { apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED; return; } - ui_ctx->end_reached = true; if (N_storage.verbose_eip712 || (ui_ctx->filtering_mode == EIP712_FILTERING_FULL)) { + ui_ctx->end_reached = true; ui_712_switch_to_sign(); } } @@ -469,8 +620,7 @@ void ui_712_end_sign(void) { */ bool ui_712_init(void) { if ((ui_ctx = MEM_ALLOC_AND_ALIGN_TYPE(*ui_ctx))) { - ui_ctx->shown = false; - ui_ctx->end_reached = false; + explicit_bzero(ui_ctx, sizeof(*ui_ctx)); ui_ctx->filtering_mode = EIP712_FILTERING_BASIC; } else { apdu_response_code = APDU_RESPONSE_INSUFFICIENT_MEMORY; @@ -515,14 +665,22 @@ unsigned int ui_712_reject() { * * @param[in] show if this field should be shown on the device * @param[in] name_provided if a substitution name has been provided + * @param[in] token_join if this field is part of a token join + * @param[in] datetime if this field should be shown and formatted as a date/time */ -void ui_712_flag_field(bool show, bool name_provided) { +void ui_712_flag_field(bool show, bool name_provided, bool token_join, bool datetime) { if (show) { ui_ctx->field_flags |= UI_712_FIELD_SHOWN; } if (name_provided) { ui_ctx->field_flags |= UI_712_FIELD_NAME_PROVIDED; } + if (token_join) { + ui_ctx->field_flags |= UI_712_AMOUNT_JOIN; + } + if (datetime) { + ui_ctx->field_flags |= UI_712_DATETIME; + } } /** @@ -558,7 +716,7 @@ void ui_712_set_filters_count(uint8_t count) { * @return number of filters */ uint8_t ui_712_remaining_filters(void) { - return ui_ctx->filters_to_process; + return ui_ctx->filters_to_process - ui_ctx->filters_received; } /** @@ -580,20 +738,83 @@ void ui_712_queue_struct_to_review(void) { } /** - * Notify of a filter change from a path advance + * Increment the filters counter * - * This function figures out by itself if there is anything to do + * @return if the counter could be incremented */ -void ui_712_notify_filter_change(void) { - if (path_get_root_type() == ROOT_MESSAGE) { - if (ui_ctx->filtering_mode == EIP712_FILTERING_FULL) { - if (ui_ctx->filters_to_process > 0) { - if (ui_ctx->field_flags & UI_712_FIELD_SHOWN) { - ui_ctx->filters_to_process -= 1; - } - } - } +bool ui_712_filters_counter_incr(void) { + if (ui_ctx->filters_received > ui_ctx->filters_to_process) { + return false; } + ui_ctx->filters_received += 1; + return true; } +void ui_712_token_join_prepare_addr_check(uint8_t index) { + ui_ctx->amount.idx = index; + ui_ctx->amount.state = AMOUNT_JOIN_STATE_TOKEN; +} + +void ui_712_token_join_prepare_amount(uint8_t index, const char *name, uint8_t name_length) { + uint8_t cpy_len = MIN(sizeof(ui_ctx->amount.joins[index].name), name_length); + + ui_ctx->amount.idx = index; + ui_ctx->amount.state = AMOUNT_JOIN_STATE_VALUE; + memcpy(ui_ctx->amount.joins[index].name, name, cpy_len); + ui_ctx->amount.joins[index].name_length = cpy_len; +} + +/** + * Set UI pair key to the raw JSON key + * + * @param[in] field_ptr pointer to the field + * @return whether it was successful or not + */ +bool ui_712_show_raw_key(const void *field_ptr) { + const char *key; + uint8_t key_len; + + if ((key = get_struct_field_keyname(field_ptr, &key_len)) == NULL) { + return false; + } + + if (ui_712_field_shown() && !(ui_ctx->field_flags & UI_712_FIELD_NAME_PROVIDED)) { + ui_712_set_title(key, key_len); + } + return true; +} + +/** + * Push a new filter path + * + * @return if the path was pushed or not (in case it was already present) + */ +bool ui_712_push_new_filter_path(void) { + uint32_t path_crc = get_path_crc(); + + // check if already present + for (int i = 0; i < ui_ctx->filters_received; ++i) { + if (ui_ctx->filters_crc[i] == path_crc) { + PRINTF("EIP-712 path CRC (%x) already found at index %u!\n", path_crc, i); + return false; + } + } + PRINTF("Pushing new EIP-712 path CRC (%x) at index %u\n", path_crc, ui_ctx->filters_received); + ui_ctx->filters_crc[ui_ctx->filters_received] = path_crc; + return true; +} + +#ifdef SCREEN_SIZE_WALLET +/* + * Get UI pairs buffer + * + * @param[out] size buffer size + * @return pointer to the buffer + */ +char *get_ui_pairs_buffer(size_t *size) { + *size = sizeof(ui_ctx->ui_pairs_buffer); + return ui_ctx->ui_pairs_buffer; +} +#endif + #endif // HAVE_EIP712_FULL_SUPPORT diff --git a/src_features/signMessageEIP712/ui_logic.h b/src_features/signMessageEIP712/ui_logic.h index 0b651e6..9ce4ee1 100644 --- a/src_features/signMessageEIP712/ui_logic.h +++ b/src_features/signMessageEIP712/ui_logic.h @@ -5,9 +5,7 @@ #include #include "ux.h" - -#define UI_712_FIELD_SHOWN (1 << 0) -#define UI_712_FIELD_NAME_PROVIDED (1 << 1) +#include "uint256.h" typedef enum { EIP712_FILTERING_BASIC, EIP712_FILTERING_FULL } e_eip712_filtering_mode; typedef enum { @@ -16,28 +14,23 @@ typedef enum { EIP712_NO_MORE_FIELD } e_eip712_nfs; // next field state -typedef struct { - bool shown; - bool end_reached; - uint8_t filtering_mode; - uint8_t filters_to_process; - uint8_t field_flags; - uint8_t structs_to_review; -} t_ui_context; - bool ui_712_init(void); void ui_712_deinit(void); e_eip712_nfs ui_712_next_field(void); void ui_712_review_struct(const void *const struct_ptr); -bool ui_712_new_field(const void *const field_ptr, const uint8_t *const data, uint8_t length); +bool ui_712_feed_to_display(const void *field_ptr, + const uint8_t *data, + uint8_t length, + bool first, + bool last); void ui_712_end_sign(void); unsigned int ui_712_approve(); unsigned int ui_712_reject(); -void ui_712_set_title(const char *const str, uint8_t length); -void ui_712_set_value(const char *const str, uint8_t length); +void ui_712_set_title(const char *str, size_t length); +void ui_712_set_value(const char *str, size_t length); void ui_712_message_hash(void); void ui_712_redraw_generic_step(void); -void ui_712_flag_field(bool show, bool name_provided); +void ui_712_flag_field(bool show, bool name_provided, bool token_join, bool datetime); void ui_712_field_flags_reset(void); void ui_712_finalize_field(void); void ui_712_set_filtering_mode(e_eip712_filtering_mode mode); @@ -45,7 +38,15 @@ e_eip712_filtering_mode ui_712_get_filtering_mode(void); void ui_712_set_filters_count(uint8_t count); uint8_t ui_712_remaining_filters(void); void ui_712_queue_struct_to_review(void); -void ui_712_notify_filter_change(void); +bool ui_712_filters_counter_incr(void); +void ui_712_token_join_prepare_addr_check(uint8_t index); +void ui_712_token_join_prepare_amount(uint8_t index, const char *name, uint8_t name_length); +void amount_join_set_token_received(void); +bool ui_712_show_raw_key(const void *field_ptr); +bool ui_712_push_new_filter_path(void); +#ifdef SCREEN_SIZE_WALLET +char *get_ui_pairs_buffer(size_t *size); +#endif #endif // HAVE_EIP712_FULL_SUPPORT diff --git a/src_features/signMessageEIP712_common/common_712.c b/src_features/signMessageEIP712_common/common_712.c index 084a528..95b8866 100644 --- a/src_features/signMessageEIP712_common/common_712.c +++ b/src_features/signMessageEIP712_common/common_712.c @@ -1,5 +1,7 @@ #include "shared_context.h" +#include "apdu_constants.h" #include "os_io_seproxyhal.h" +#include "crypto_helpers.h" #include "ui_callbacks.h" #include "common_712.h" #include "ui_callbacks.h" @@ -8,54 +10,45 @@ static const uint8_t EIP_712_MAGIC[] = {0x19, 0x01}; unsigned int ui_712_approve_cb(void) { - uint8_t privateKeyData[INT256_LENGTH]; uint8_t hash[INT256_LENGTH]; - uint8_t signature[100]; - cx_ecfp_private_key_t privateKey; uint32_t tx = 0; io_seproxyhal_io_heartbeat(); - cx_keccak_init(&global_sha3, 256); - cx_hash((cx_hash_t *) &global_sha3, - 0, - (uint8_t *) EIP_712_MAGIC, - sizeof(EIP_712_MAGIC), - NULL, - 0); - cx_hash((cx_hash_t *) &global_sha3, - 0, - tmpCtx.messageSigningContext712.domainHash, - sizeof(tmpCtx.messageSigningContext712.domainHash), - NULL, - 0); - cx_hash((cx_hash_t *) &global_sha3, - CX_LAST, - tmpCtx.messageSigningContext712.messageHash, - sizeof(tmpCtx.messageSigningContext712.messageHash), - hash, - sizeof(hash)); + CX_ASSERT(cx_keccak_init_no_throw(&global_sha3, 256)); + CX_ASSERT(cx_hash_no_throw((cx_hash_t *) &global_sha3, + 0, + (uint8_t *) EIP_712_MAGIC, + sizeof(EIP_712_MAGIC), + NULL, + 0)); + CX_ASSERT(cx_hash_no_throw((cx_hash_t *) &global_sha3, + 0, + tmpCtx.messageSigningContext712.domainHash, + sizeof(tmpCtx.messageSigningContext712.domainHash), + NULL, + 0)); + CX_ASSERT(cx_hash_no_throw((cx_hash_t *) &global_sha3, + CX_LAST, + tmpCtx.messageSigningContext712.messageHash, + sizeof(tmpCtx.messageSigningContext712.messageHash), + hash, + sizeof(hash))); PRINTF("EIP712 Domain hash 0x%.*h\n", 32, tmpCtx.messageSigningContext712.domainHash); PRINTF("EIP712 Message hash 0x%.*h\n", 32, tmpCtx.messageSigningContext712.messageHash); - io_seproxyhal_io_heartbeat(); - os_perso_derive_node_bip32(CX_CURVE_256K1, - tmpCtx.messageSigningContext712.bip32.path, - tmpCtx.messageSigningContext712.bip32.length, - privateKeyData, - NULL); - io_seproxyhal_io_heartbeat(); - cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey); - explicit_bzero(privateKeyData, sizeof(privateKeyData)); + unsigned int info = 0; - io_seproxyhal_io_heartbeat(); - cx_ecdsa_sign(&privateKey, - CX_RND_RFC6979 | CX_LAST, - CX_SHA256, - hash, - sizeof(hash), - signature, - sizeof(signature), - &info); - explicit_bzero(&privateKey, sizeof(privateKey)); + if (bip32_derive_ecdsa_sign_rs_hash_256(CX_CURVE_256K1, + tmpCtx.messageSigningContext712.bip32.path, + tmpCtx.messageSigningContext712.bip32.length, + CX_RND_RFC6979 | CX_LAST, + CX_SHA256, + hash, + sizeof(hash), + G_io_apdu_buffer + 1, + G_io_apdu_buffer + 1 + 32, + &info) != CX_OK) { + THROW(APDU_RESPONSE_UNKNOWN); + } G_io_apdu_buffer[0] = 27; if (info & CX_ECCINFO_PARITY_ODD) { G_io_apdu_buffer[0]++; @@ -63,7 +56,6 @@ unsigned int ui_712_approve_cb(void) { if (info & CX_ECCINFO_xGTn) { G_io_apdu_buffer[0] += 2; } - format_signature_out(signature); tx = 65; G_io_apdu_buffer[tx++] = 0x90; G_io_apdu_buffer[tx++] = 0x00; diff --git a/src_features/signMessageEIP712_v0/cmd_signMessage712.c b/src_features/signMessageEIP712_v0/cmd_signMessage712.c index 058495e..d9587e6 100644 --- a/src_features/signMessageEIP712_v0/cmd_signMessage712.c +++ b/src_features/signMessageEIP712_v0/cmd_signMessage712.c @@ -29,11 +29,7 @@ void handleSignEIP712Message_v0(uint8_t p1, workBuffer + KECCAK256_HASH_BYTESIZE, KECCAK256_HASH_BYTESIZE); -#ifdef NO_CONSENT - io_seproxyhal_touch_signMessage_ok(NULL); -#else // NO_CONSENT ui_sign_712_v0(); -#endif // NO_CONSENT *flags |= IO_ASYNCH_REPLY; } diff --git a/src_features/signTx/cmd_signTx.c b/src_features/signTx/cmd_signTx.c index 0eb1d1c..4da3a76 100644 --- a/src_features/signTx/cmd_signTx.c +++ b/src_features/signTx/cmd_signTx.c @@ -43,7 +43,7 @@ void handleSign(uint8_t p1, if (txType >= MIN_TX_TYPE && txType <= MAX_TX_TYPE) { // Enumerate through all supported txTypes here... if (txType == EIP2930 || txType == EIP1559) { - cx_hash((cx_hash_t *) &global_sha3, 0, workBuffer, 1, NULL, 0); + CX_ASSERT(cx_hash_no_throw((cx_hash_t *) &global_sha3, 0, workBuffer, 1, NULL, 0)); txContext.txType = txType; workBuffer++; dataLength--; @@ -88,7 +88,7 @@ void handleSign(uint8_t p1, } if (txResult == USTREAM_FINISHED) { - finalizeParsing(false); + finalizeParsing(); } *flags |= IO_ASYNCH_REPLY; diff --git a/src_features/signTx/feature_signTx.h b/src_features/signTx/feature_signTx.h index 84d2cd5..a62514a 100644 --- a/src_features/signTx/feature_signTx.h +++ b/src_features/signTx/feature_signTx.h @@ -11,9 +11,11 @@ typedef enum { } plugin_ui_state_t; customStatus_e customProcessor(txContext_t *context); -void finalizeParsing(bool direct); +void finalizeParsing(); void prepareFeeDisplay(); void prepareNetworkDisplay(); void ux_approve_tx(bool fromPlugin); +void report_finalize_error(void); +void start_signature_flow(void); #endif // _SIGN_TX_H_ diff --git a/src_features/signTx/logic_signTx.c b/src_features/signTx/logic_signTx.c index bdacd76..f9f8a8c 100644 --- a/src_features/signTx/logic_signTx.c +++ b/src_features/signTx/logic_signTx.c @@ -8,10 +8,15 @@ #include "common_ui.h" #include "ui_callbacks.h" #include "apdu_constants.h" +#include "crypto_helpers.h" +#include "format.h" +#include "manage_asset_info.h" #define ERR_SILENT_MODE_CHECK_FAILED 0x6001 -uint32_t splitBinaryParameterPart(char *result, uint8_t *parameter) { +static bool g_use_standard_ui; + +static uint32_t splitBinaryParameterPart(char *result, size_t result_size, uint8_t *parameter) { uint32_t i; for (i = 0; i < 8; i++) { if (parameter[i] != 0x00) { @@ -24,7 +29,7 @@ uint32_t splitBinaryParameterPart(char *result, uint8_t *parameter) { result[2] = '\0'; return 2; } else { - array_hexstr(result, parameter + i, 8 - i); + format_hex(parameter + i, 8 - i, result, result_size); return ((8 - i) * 2); } } @@ -79,11 +84,6 @@ customStatus_e customProcessor(txContext_t *context) { uint32_t copySize; uint32_t fieldPos = context->currentFieldPos; if (fieldPos == 0) { // not reached if a plugin is available - if (!N_storage.dataAllowed) { - PRINTF("Data field forbidden\n"); - ui_warning_contract_data(); - return CUSTOM_FAULT; - } if (!N_storage.contractDetails) { return CUSTOM_NOT_HANDLED; } @@ -143,7 +143,10 @@ customStatus_e customProcessor(txContext_t *context) { } dataContext.tokenContext.fieldOffset = 0; if (fieldPos == 0) { - array_hexstr(strings.tmp.tmp, dataContext.tokenContext.data, 4); + format_hex(dataContext.tokenContext.data, + 4, + strings.tmp.tmp, + sizeof(strings.tmp.tmp)); ui_confirm_selector(); } else { uint32_t offset = 0; @@ -154,6 +157,7 @@ customStatus_e customProcessor(txContext_t *context) { dataContext.tokenContext.fieldIndex); for (i = 0; i < 4; i++) { offset += splitBinaryParameterPart(strings.tmp.tmp + offset, + sizeof(strings.tmp.tmp) - offset, dataContext.tokenContext.data + 8 * i); if (i != 3) { strings.tmp.tmp[offset++] = ':'; @@ -170,24 +174,19 @@ customStatus_e customProcessor(txContext_t *context) { return CUSTOM_NOT_HANDLED; } -void reportFinalizeError(bool direct) { +void report_finalize_error(void) { reset_app_context(); - if (direct) { - THROW(0x6A80); - } else { - io_seproxyhal_send_status(0x6A80); - ui_idle(); - } + io_seproxyhal_send_status(APDU_RESPONSE_INVALID_DATA); + ui_idle(); } static void address_to_string(uint8_t *in, size_t in_len, char *out, size_t out_len, - cx_sha3_t *sha3, uint64_t chainId) { if (in_len != 0) { - if (!getEthDisplayableAddress(in, out, out_len, sha3, chainId)) { + if (!getEthDisplayableAddress(in, out, out_len, chainId)) { THROW(APDU_RESPONSE_ERROR_NO_INFO); } } else { @@ -279,29 +278,24 @@ static void get_network_as_string(char *out, size_t out_size) { } static void get_public_key(uint8_t *out, uint8_t outLength) { - uint8_t privateKeyData[INT256_LENGTH] = {0}; - cx_ecfp_private_key_t privateKey = {0}; - cx_ecfp_public_key_t publicKey = {0}; + uint8_t raw_pubkey[65]; if (outLength < ADDRESS_LENGTH) { return; } - - os_perso_derive_node_bip32(CX_CURVE_256K1, - tmpCtx.transactionContext.bip32.path, - tmpCtx.transactionContext.bip32.length, - privateKeyData, - NULL); - cx_ecfp_init_private_key(CX_CURVE_256K1, privateKeyData, 32, &privateKey); - cx_ecfp_generate_pair(CX_CURVE_256K1, &publicKey, &privateKey, 1); - explicit_bzero(&privateKey, sizeof(privateKey)); - explicit_bzero(privateKeyData, sizeof(privateKeyData)); - if (!getEthAddressFromKey(&publicKey, out, &global_sha3)) { - THROW(CX_INVALID_PARAMETER); + if (bip32_derive_get_pubkey_256(CX_CURVE_256K1, + tmpCtx.transactionContext.bip32.path, + tmpCtx.transactionContext.bip32.length, + raw_pubkey, + NULL, + CX_SHA512) != CX_OK) { + THROW(APDU_RESPONSE_UNKNOWN); } + + getEthAddressFromRawKey(raw_pubkey, out); } -/* Local implmentation of strncasecmp, workaround of the segfaulting base implem +/* Local implementation of strncasecmp, workaround of the segfaulting base implem * Remove once strncasecmp is fixed */ static int strcasecmp_workaround(const char *str1, const char *str2) { @@ -316,12 +310,13 @@ static int strcasecmp_workaround(const char *str1, const char *str2) { return 0; } -__attribute__((noinline)) static bool finalize_parsing_helper(bool direct, bool *use_standard_UI) { +__attribute__((noinline)) static bool finalize_parsing_helper(void) { char displayBuffer[50]; uint8_t decimals = WEI_TO_ETHER; uint64_t chain_id = get_tx_chain_id(); const char *ticker = get_displayable_ticker(&chain_id, chainConfig); ethPluginFinalize_t pluginFinalize; + cx_err_t error = CX_INTERNAL_ERROR; // Verify the chain if (chainConfig->chainId != ETHEREUM_MAINNET_CHAINID) { @@ -330,34 +325,37 @@ __attribute__((noinline)) static bool finalize_parsing_helper(bool direct, bool if (chainConfig->chainId != id) { PRINTF("Invalid chainID %u expected %u\n", id, chainConfig->chainId); reset_app_context(); - reportFinalizeError(direct); - if (!direct) { - return false; - } + report_finalize_error(); + return false; } } // Store the hash - cx_hash((cx_hash_t *) &global_sha3, - CX_LAST, - tmpCtx.transactionContext.hash, - 0, - tmpCtx.transactionContext.hash, - 32); + CX_CHECK(cx_hash_no_throw((cx_hash_t *) &global_sha3, + CX_LAST, + tmpCtx.transactionContext.hash, + 0, + tmpCtx.transactionContext.hash, + 32)); + uint8_t msg_sender[ADDRESS_LENGTH] = {0}; + get_public_key(msg_sender, sizeof(msg_sender)); + + address_to_string(msg_sender, + ADDRESS_LENGTH, + strings.common.fromAddress, + sizeof(strings.common.fromAddress), + chainConfig->chainId); + PRINTF("FROM address displayed: %s\n", strings.common.fromAddress); // Finalize the plugin handling if (dataContext.tokenContext.pluginStatus >= ETH_PLUGIN_RESULT_SUCCESSFUL) { eth_plugin_prepare_finalize(&pluginFinalize); - uint8_t msg_sender[ADDRESS_LENGTH] = {0}; - get_public_key(msg_sender, sizeof(msg_sender)); pluginFinalize.address = msg_sender; if (!eth_plugin_call(ETH_PLUGIN_FINALIZE, (void *) &pluginFinalize)) { PRINTF("Plugin finalize call failed\n"); - reportFinalizeError(direct); - if (!direct) { - return false; - } + report_finalize_error(); + return false; } // Lookup tokens if requested ethPluginProvideInfo_t pluginProvideInfo; @@ -365,14 +363,14 @@ __attribute__((noinline)) static bool finalize_parsing_helper(bool direct, bool if ((pluginFinalize.tokenLookup1 != NULL) || (pluginFinalize.tokenLookup2 != NULL)) { if (pluginFinalize.tokenLookup1 != NULL) { PRINTF("Lookup1: %.*H\n", ADDRESS_LENGTH, pluginFinalize.tokenLookup1); - pluginProvideInfo.item1 = getKnownToken(pluginFinalize.tokenLookup1); + pluginProvideInfo.item1 = get_asset_info_by_addr(pluginFinalize.tokenLookup1); if (pluginProvideInfo.item1 != NULL) { PRINTF("Token1 ticker: %s\n", pluginProvideInfo.item1->token.ticker); } } if (pluginFinalize.tokenLookup2 != NULL) { PRINTF("Lookup2: %.*H\n", ADDRESS_LENGTH, pluginFinalize.tokenLookup2); - pluginProvideInfo.item2 = getKnownToken(pluginFinalize.tokenLookup2); + pluginProvideInfo.item2 = get_asset_info_by_addr(pluginFinalize.tokenLookup2); if (pluginProvideInfo.item2 != NULL) { PRINTF("Token2 ticker: %s\n", pluginProvideInfo.item2->token.ticker); } @@ -380,10 +378,8 @@ __attribute__((noinline)) static bool finalize_parsing_helper(bool direct, bool if (eth_plugin_call(ETH_PLUGIN_PROVIDE_INFO, (void *) &pluginProvideInfo) <= ETH_PLUGIN_RESULT_UNSUCCESSFUL) { PRINTF("Plugin provide token call failed\n"); - reportFinalizeError(direct); - if (!direct) { - return false; - } + report_finalize_error(); + return false; } pluginFinalize.result = pluginProvideInfo.result; } @@ -392,7 +388,7 @@ __attribute__((noinline)) static bool finalize_parsing_helper(bool direct, bool switch (pluginFinalize.uiType) { case ETH_UI_TYPE_GENERIC: // Use the dedicated ETH plugin UI - *use_standard_UI = false; + g_use_standard_ui = false; tmpContent.txContent.dataPresent = false; // Add the number of screens + the number of additional screens to get the total // number of screens needed. @@ -401,14 +397,12 @@ __attribute__((noinline)) static bool finalize_parsing_helper(bool direct, bool break; case ETH_UI_TYPE_AMOUNT_ADDRESS: // Use the standard ETH UI as this plugin uses the amount/address UI - *use_standard_UI = true; + g_use_standard_ui = true; tmpContent.txContent.dataPresent = false; if ((pluginFinalize.amount == NULL) || (pluginFinalize.address == NULL)) { PRINTF("Incorrect amount/address set by plugin\n"); - reportFinalizeError(direct); - if (!direct) { - return false; - } + report_finalize_error(); + return false; } memmove(tmpContent.txContent.value.value, pluginFinalize.amount, 32); tmpContent.txContent.value.length = 32; @@ -421,10 +415,8 @@ __attribute__((noinline)) static bool finalize_parsing_helper(bool direct, bool break; default: PRINTF("ui type %d not supported\n", pluginFinalize.uiType); - reportFinalizeError(direct); - if (!direct) { - return false; - } + report_finalize_error(); + return false; } } } @@ -439,39 +431,30 @@ __attribute__((noinline)) static bool finalize_parsing_helper(bool direct, bool } // User has just validated a swap but ETH received apdus about a non standard plugin / contract - if (G_called_from_swap && !*use_standard_UI) { + if (G_called_from_swap && !g_use_standard_ui) { PRINTF("ERR_SILENT_MODE_CHECK_FAILED, G_called_from_swap\n"); THROW(ERR_SILENT_MODE_CHECK_FAILED); } - if (tmpContent.txContent.dataPresent && !N_storage.dataAllowed) { - reportFinalizeError(direct); - ui_warning_contract_data(); - if (!direct) { - return false; - } - } - // Prepare destination address and amount to display - if (*use_standard_UI) { + if (g_use_standard_ui) { // Format the address in a temporary buffer, if in swap case compare it with validated // address, else commit it address_to_string(tmpContent.txContent.destination, tmpContent.txContent.destinationLength, displayBuffer, sizeof(displayBuffer), - &global_sha3, chainConfig->chainId); if (G_called_from_swap) { // Ensure the values are the same that the ones that have been previously validated - if (strcasecmp_workaround(strings.common.fullAddress, displayBuffer) != 0) { + if (strcasecmp_workaround(strings.common.toAddress, displayBuffer) != 0) { PRINTF("ERR_SILENT_MODE_CHECK_FAILED, address check failed\n"); THROW(ERR_SILENT_MODE_CHECK_FAILED); } } else { - strlcpy(strings.common.fullAddress, displayBuffer, sizeof(strings.common.fullAddress)); + strlcpy(strings.common.toAddress, displayBuffer, sizeof(strings.common.toAddress)); } - PRINTF("Address displayed: %s\n", strings.common.fullAddress); + PRINTF("TO address displayed: %s\n", strings.common.toAddress); // Format the amount in a temporary buffer, if in swap case compare it with validated // amount, else commit it @@ -529,32 +512,36 @@ __attribute__((noinline)) static bool finalize_parsing_helper(bool direct, bool get_network_as_string(strings.common.network_name, sizeof(strings.common.network_name)); PRINTF("Network: %s\n", strings.common.network_name); return true; +end: + return false; } -void finalizeParsing(bool direct) { - bool use_standard_UI = true; - bool no_consent_check; +void start_signature_flow(void) { + if (g_use_standard_ui) { + ux_approve_tx(false); + } else { + dataContext.tokenContext.pluginUiState = PLUGIN_UI_OUTSIDE; + dataContext.tokenContext.pluginUiCurrentItem = 0; + ux_approve_tx(true); + } +} - if (!finalize_parsing_helper(direct, &use_standard_UI)) { +void finalizeParsing(void) { + g_use_standard_ui = true; + + if (!finalize_parsing_helper()) { return; } // If called from swap, the user has already validated a standard transaction // And we have already checked the fields of this transaction above - no_consent_check = G_called_from_swap && use_standard_UI; - -#ifdef NO_CONSENT - no_consent_check = true; -#endif // NO_CONSENT - - if (no_consent_check) { + if (G_called_from_swap && g_use_standard_ui) { io_seproxyhal_touch_tx_ok(NULL); } else { - if (use_standard_UI) { - ux_approve_tx(false); + // If blind-signing detected, start the warning flow beforehand + if (tmpContent.txContent.dataPresent) { + ui_warning_contract_data(); } else { - dataContext.tokenContext.pluginUiState = PLUGIN_UI_OUTSIDE; - dataContext.tokenContext.pluginUiCurrentItem = 0; - ux_approve_tx(true); + start_signature_flow(); } } } diff --git a/src_features/signTx/ui_common_signTx.c b/src_features/signTx/ui_common_signTx.c index 96eee2f..4b567db 100644 --- a/src_features/signTx/ui_common_signTx.c +++ b/src_features/signTx/ui_common_signTx.c @@ -1,9 +1,10 @@ -#include "lib_standard_app/crypto_helpers.h" +#include "crypto_helpers.h" #include "os_io_seproxyhal.h" #include "shared_context.h" #include "common_utils.h" #include "common_ui.h" #include "handle_swap_sign_transaction.h" +#include "feature_signTx.h" unsigned int io_seproxyhal_touch_tx_ok(__attribute__((unused)) const bagl_element_t *e) { uint32_t info = 0; @@ -109,7 +110,7 @@ unsigned int io_seproxyhal_touch_data_ok(__attribute__((unused)) const bagl_elem } if (txResult == USTREAM_FINISHED) { - finalizeParsing(false); + finalizeParsing(); } return 0; diff --git a/src_nbgl/ui_approve_tx.c b/src_nbgl/ui_approve_tx.c index 7e2f59d..6b8b8ea 100644 --- a/src_nbgl/ui_approve_tx.c +++ b/src_nbgl/ui_approve_tx.c @@ -1,5 +1,5 @@ #include -#include +#include "nbgl_page.h" #include "shared_context.h" #include "ui_callbacks.h" #include "ui_nbgl.h" @@ -9,27 +9,22 @@ #include "caller_api.h" #include "network_icons.h" #include "network.h" +#include "ledger_assert.h" -#define TEXT_TX "transaction" // 1 more than actually displayed on screen, because of calculations in StaticReview -#define MAX_PLUGIN_ITEMS_PER_SCREEN 4 -#define TAG_MAX_LEN 43 -#define VALUE_MAX_LEN 79 -enum { - REJECT_TOKEN, - START_REVIEW_TOKEN, -}; +#define MAX_PLUGIN_ITEMS 8 +#define TAG_MAX_LEN 43 +#define VALUE_MAX_LEN 79 +#define MAX_PAIRS 12 // Max 10 for plugins + 2 (Network and fees) -static nbgl_layoutTagValue_t pair; +static nbgl_contentTagValue_t pairs[MAX_PAIRS]; +static nbgl_contentTagValueList_t pairsList; // these buffers are used as circular -static char title_buffer[MAX_PLUGIN_ITEMS_PER_SCREEN][TAG_MAX_LEN]; -static char msg_buffer[MAX_PLUGIN_ITEMS_PER_SCREEN][VALUE_MAX_LEN]; -static nbgl_layoutTagValueList_t useCaseTagValueList; -static nbgl_pageInfoLongPress_t infoLongPress; +static char title_buffer[MAX_PLUGIN_ITEMS][TAG_MAX_LEN]; +static char msg_buffer[MAX_PLUGIN_ITEMS][VALUE_MAX_LEN]; struct tx_approval_context_t { bool fromPlugin; - bool blindSigning; bool displayNetwork; #ifdef HAVE_DOMAIN_NAME bool domain_name_match; @@ -38,8 +33,6 @@ struct tx_approval_context_t { static struct tx_approval_context_t tx_approval_context; -static void reviewContinueCommon(void); - static void reviewReject(void) { io_seproxyhal_touch_tx_cancel(NULL); memset(&tx_approval_context, 0, sizeof(tx_approval_context)); @@ -50,147 +43,28 @@ static void confirmTransation(void) { memset(&tx_approval_context, 0, sizeof(tx_approval_context)); } -static void onConfirmAbandon(void) { - nbgl_useCaseStatus("Transaction rejected", false, reviewReject); -} - -static void rejectTransactionQuestion(void) { - nbgl_useCaseConfirm(REJECT_QUESTION(TEXT_TX), - NULL, - REJECT_CONFIRM_BUTTON, - RESUME(TEXT_TX), - onConfirmAbandon); -} - static void reviewChoice(bool confirm) { if (confirm) { - nbgl_useCaseStatus("TRANSACTION\nSIGNED", true, confirmTransation); + nbgl_useCaseReviewStatus(STATUS_TYPE_TRANSACTION_SIGNED, confirmTransation); } else { - rejectTransactionQuestion(); + nbgl_useCaseReviewStatus(STATUS_TYPE_TRANSACTION_REJECTED, reviewReject); } } -// called by NBGL to get the tag/value pair corresponding to pairIndex -static nbgl_layoutTagValue_t *getTagValuePair(uint8_t pairIndex) { - static int counter = 0; - - if (tx_approval_context.fromPlugin) { - if (pairIndex < dataContext.tokenContext.pluginUiMaxItems) { - // for the next dataContext.tokenContext.pluginUiMaxItems items, get tag/value from - // plugin_ui_get_item_internal() - dataContext.tokenContext.pluginUiCurrentItem = pairIndex; - plugin_ui_get_item_internal((uint8_t *) title_buffer[counter], - TAG_MAX_LEN, - (uint8_t *) msg_buffer[counter], - VALUE_MAX_LEN); - pair.item = title_buffer[counter]; - pair.value = msg_buffer[counter]; - } else { - pairIndex -= dataContext.tokenContext.pluginUiMaxItems; - // for the last 1 (or 2), tags are fixed - if (tx_approval_context.displayNetwork && (pairIndex == 0)) { - pair.item = "Network"; - pair.value = strings.common.network_name; - } else { - pair.item = "Max fees"; - pair.value = strings.common.maxFee; - } - } - } else { - uint8_t target_index = 0; - - if (pairIndex == target_index++) { - pair.item = "Amount"; - pair.value = strings.common.fullAmount; - } -#ifdef HAVE_DOMAIN_NAME - if (tx_approval_context.domain_name_match) { - if (pairIndex == target_index++) { - pair.item = "Domain"; - pair.value = g_domain_name; - } - } - if (!tx_approval_context.domain_name_match || N_storage.verbose_domain_name) { -#endif // HAVE_DOMAIN_NAME - if (pairIndex == target_index++) { - pair.item = "Address"; - pair.value = strings.common.fullAddress; - } -#ifdef HAVE_DOMAIN_NAME - } -#endif // HAVE_DOMAIN_NAME - if (N_storage.displayNonce) { - if (pairIndex == target_index++) { - pair.item = "Nonce"; - pair.value = strings.common.nonce; - } - } - if (pairIndex == target_index++) { - pair.item = "Max fees"; - pair.value = strings.common.maxFee; - } - if (pairIndex == target_index++) { - pair.item = "Network"; - pair.value = strings.common.network_name; - } - } - // counter is used as index to circular buffer - counter++; - if (counter == MAX_PLUGIN_ITEMS_PER_SCREEN) { - counter = 0; - } - return &pair; -} - -static void pageCallback(int token, uint8_t index) { - (void) index; - nbgl_pageRelease(pageContext); - if (token == REJECT_TOKEN) { - reviewReject(); - } else if (token == START_REVIEW_TOKEN) { - reviewContinueCommon(); - } -} - -static void reviewContinue(void) { - if (tx_approval_context.blindSigning) { - nbgl_pageInfoDescription_t info = { - .centeredInfo.icon = &C_round_warning_64px, - .centeredInfo.text1 = "Blind Signing", - .centeredInfo.text2 = - "This transaction cannot be\nsecurely interpreted by Ledger\nStax. It might put " - "your assets\nat risk.", - .centeredInfo.text3 = NULL, - .centeredInfo.style = LARGE_CASE_INFO, - .centeredInfo.offsetY = -32, - .footerText = REJECT(TEXT_TX), - .footerToken = REJECT_TOKEN, - .tapActionText = "Tap to continue", - .tapActionToken = START_REVIEW_TOKEN, - .topRightStyle = NO_BUTTON_STYLE, - .actionButtonText = NULL, - .tuneId = TUNE_TAP_CASUAL}; - - if (pageContext != NULL) { - nbgl_pageRelease(pageContext); - pageContext = NULL; - } - pageContext = nbgl_pageDrawInfo(&pageCallback, NULL, &info); - } else { - reviewContinueCommon(); - } -} - -static const nbgl_icon_details_t *get_tx_icon(void) { +const nbgl_icon_details_t *get_tx_icon(void) { const nbgl_icon_details_t *icon = NULL; if (tx_approval_context.fromPlugin && (pluginType == EXTERNAL)) { - if (caller_app && caller_app->name) { - if ((strlen(strings.common.fullAddress) == strlen(caller_app->name)) && - (strcmp(strings.common.fullAddress, caller_app->name) == 0)) { + if ((caller_app != NULL) && (caller_app->name != NULL)) { + if (strcmp(strings.common.toAddress, caller_app->name) == 0) { icon = get_app_icon(true); } } + // icon is NULL in this case + // Check with Alex if this is expected or a bug + } else if ((caller_app != NULL) && !tx_approval_context.fromPlugin) { + // Clone case + icon = get_app_icon(true); } else { uint64_t chain_id = get_tx_chain_id(); if (chain_id == chainConfig->chainId) { @@ -202,55 +76,6 @@ static const nbgl_icon_details_t *get_tx_icon(void) { return icon; } -static void reviewContinueCommon(void) { - uint8_t nbPairs = 0; - - if (tx_approval_context.fromPlugin) { - // plugin id + max items + fees - nbPairs += dataContext.tokenContext.pluginUiMaxItems + 1; - } else { - nbPairs += 3; - if (N_storage.displayNonce) { - nbPairs++; - } -#ifdef HAVE_DOMAIN_NAME - uint64_t chain_id = get_tx_chain_id(); - tx_approval_context.domain_name_match = - has_domain_name(&chain_id, tmpContent.txContent.destination); - if (tx_approval_context.domain_name_match && N_storage.verbose_domain_name) { - nbPairs += 1; - } -#endif // HAVE_DOMAIN_NAME - } - - if (tx_approval_context.displayNetwork) { - nbPairs++; - } - - useCaseTagValueList.pairs = NULL; - useCaseTagValueList.callback = getTagValuePair; - useCaseTagValueList.startIndex = 0; - useCaseTagValueList.nbPairs = nbPairs; ///< number of pairs in pairs array - useCaseTagValueList.smallCaseForValue = false; - useCaseTagValueList.wrapping = false; - infoLongPress.icon = get_tx_icon(); - infoLongPress.text = tx_approval_context.fromPlugin ? g_stax_shared_buffer : SIGN(TEXT_TX); - infoLongPress.longPressText = SIGN_BUTTON; - nbgl_useCaseStaticReview(&useCaseTagValueList, &infoLongPress, REJECT(TEXT_TX), reviewChoice); -} - -// Replace "Review" by "Sign" and add questionmark -static void prepare_sign_text(void) { - uint8_t sign_length = strlen("Sign"); - uint8_t review_length = strlen("Review"); - - memmove(g_stax_shared_buffer, "Sign", sign_length); - memmove(g_stax_shared_buffer + sign_length, - g_stax_shared_buffer + review_length, - strlen(g_stax_shared_buffer) - review_length + 1); - strlcat(g_stax_shared_buffer, "?", sizeof(g_stax_shared_buffer)); -} - // Force operation to be lowercase static void get_lowercase_operation(char *dst, size_t dst_len) { const char *src = strings.common.fullAmount; @@ -262,45 +87,152 @@ static void get_lowercase_operation(char *dst, size_t dst_len) { dst[idx] = '\0'; } -static void buildFirstPage(void) { +static uint8_t setTagValuePairs(void) { + uint8_t nbPairs = 0; + uint8_t pairIndex = 0; + uint8_t counter = 0; + + explicit_bzero(pairs, sizeof(pairs)); + + // Setup data to display if (tx_approval_context.fromPlugin) { + if (pluginType != EXTERNAL) { + if (strings.common.fromAddress[0] != 0) { + pairs[nbPairs].item = "From"; + pairs[nbPairs].value = strings.common.fromAddress; + nbPairs++; + } + } + for (pairIndex = 0; pairIndex < dataContext.tokenContext.pluginUiMaxItems; pairIndex++) { + // for the next dataContext.tokenContext.pluginUiMaxItems items, get tag/value from + // plugin_ui_get_item_internal() + dataContext.tokenContext.pluginUiCurrentItem = pairIndex; + plugin_ui_get_item_internal((uint8_t *) title_buffer[counter], + TAG_MAX_LEN, + (uint8_t *) msg_buffer[counter], + VALUE_MAX_LEN); + pairs[nbPairs].item = title_buffer[counter]; + pairs[nbPairs].value = msg_buffer[counter]; + nbPairs++; + LEDGER_ASSERT((++counter < MAX_PLUGIN_ITEMS), "Too many items for plugin\n"); + } + // for the last 1 (or 2), tags are fixed + if (tx_approval_context.displayNetwork) { + pairs[nbPairs].item = "Network"; + pairs[nbPairs].value = strings.common.network_name; + nbPairs++; + } + pairs[nbPairs].item = "Max fees"; + pairs[nbPairs].value = strings.common.maxFee; + nbPairs++; + } else { + if (strings.common.fromAddress[0] != 0) { + pairs[nbPairs].item = "From"; + pairs[nbPairs].value = strings.common.fromAddress; + nbPairs++; + } + + pairs[nbPairs].item = "Amount"; + pairs[nbPairs].value = strings.common.fullAmount; + nbPairs++; + +#ifdef HAVE_DOMAIN_NAME + uint64_t chain_id = get_tx_chain_id(); + tx_approval_context.domain_name_match = + has_domain_name(&chain_id, tmpContent.txContent.destination); + if (tx_approval_context.domain_name_match) { + pairs[nbPairs].item = "To (domain)"; + pairs[nbPairs].value = g_domain_name; + nbPairs++; + } + if (!tx_approval_context.domain_name_match || N_storage.verbose_domain_name) { +#endif + pairs[nbPairs].item = "To"; + pairs[nbPairs].value = strings.common.toAddress; + nbPairs++; +#ifdef HAVE_DOMAIN_NAME + } +#endif + if (N_storage.displayNonce) { + pairs[nbPairs].item = "Nonce"; + pairs[nbPairs].value = strings.common.nonce; + nbPairs++; + } + + pairs[nbPairs].item = "Max fees"; + pairs[nbPairs].value = strings.common.maxFee; + nbPairs++; + + if (tx_approval_context.displayNetwork) { + pairs[nbPairs].item = "Network"; + pairs[nbPairs].value = strings.common.network_name; + nbPairs++; + } + } + return nbPairs; +} + +static void reviewCommon(void) { + explicit_bzero(&pairsList, sizeof(pairsList)); + + pairsList.nbPairs = setTagValuePairs(); + pairsList.pairs = pairs; + nbgl_operationType_t op = TYPE_TRANSACTION; + +#if API_LEVEL >= 19 + if (tmpContent.txContent.dataPresent) { + op |= BLIND_OPERATION; + } +#endif + if (tx_approval_context.fromPlugin) { + uint32_t buf_size = SHARED_BUFFER_SIZE / 2; char op_name[sizeof(strings.common.fullAmount)]; plugin_ui_get_id(); get_lowercase_operation(op_name, sizeof(op_name)); - if (pluginType == EXTERNAL) { - snprintf(g_stax_shared_buffer, - sizeof(g_stax_shared_buffer), - "Review transaction\nto %s\non %s", - op_name, - strings.common.fullAddress); - } else { - snprintf(g_stax_shared_buffer, - sizeof(g_stax_shared_buffer), - "Review transaction\nto %s\n%s", - op_name, - strings.common.fullAddress); - } - nbgl_useCaseReviewStart(get_tx_icon(), - g_stax_shared_buffer, - NULL, - REJECT(TEXT_TX), - reviewContinue, - rejectTransactionQuestion); - prepare_sign_text(); + snprintf(g_stax_shared_buffer, + buf_size, + "Review transaction\nto %s\n%s%s", + op_name, + (pluginType == EXTERNAL ? "on " : ""), + strings.common.toAddress); + // Finish text: replace "Review" by "Sign" and add questionmark + snprintf(g_stax_shared_buffer + buf_size, + buf_size, + "Sign transaction\nto %s\n%s%s", + op_name, + (pluginType == EXTERNAL ? "on " : ""), + strings.common.toAddress); + + nbgl_useCaseReview(op, + &pairsList, + get_tx_icon(), + g_stax_shared_buffer, + NULL, + g_stax_shared_buffer + buf_size, + reviewChoice); } else { - nbgl_useCaseReviewStart(get_tx_icon(), - REVIEW(TEXT_TX), - NULL, - REJECT(TEXT_TX), - reviewContinue, - rejectTransactionQuestion); + nbgl_useCaseReview(op, + &pairsList, + get_tx_icon(), + REVIEW("transaction"), + NULL, + SIGN("transaction"), + reviewChoice); + } +} + +void blind_confirm_cb(bool confirm) { + if (confirm) { + reviewCommon(); + } else { + reviewReject(); } } void ux_approve_tx(bool fromPlugin) { - tx_approval_context.blindSigning = - !fromPlugin && tmpContent.txContent.dataPresent && !N_storage.contractDetails; + memset(&tx_approval_context, 0, sizeof(tx_approval_context)); + tx_approval_context.fromPlugin = fromPlugin; tx_approval_context.displayNetwork = false; @@ -309,5 +241,5 @@ void ux_approve_tx(bool fromPlugin) { tx_approval_context.displayNetwork = true; } - buildFirstPage(); + reviewCommon(); } diff --git a/src_nbgl/ui_confirm_parameter_selector.c b/src_nbgl/ui_confirm_parameter_selector.c index 80418e1..e4dca60 100644 --- a/src_nbgl/ui_confirm_parameter_selector.c +++ b/src_nbgl/ui_confirm_parameter_selector.c @@ -4,80 +4,51 @@ #include "network.h" typedef enum { PARAMETER_CONFIRMATION, SELECTOR_CONFIRMATION } e_confirmation_type; - -static nbgl_layoutTagValue_t pair; -static e_confirmation_type confirm_type; - -static void reviewReject(void) { - io_seproxyhal_touch_data_cancel(NULL); -} - -static void confirmTransation(void) { - io_seproxyhal_touch_data_ok(NULL); -} +static nbgl_contentTagValue_t pair; +static nbgl_contentTagValueList_t pairsList; static void reviewChoice(bool confirm) { if (confirm) { - confirmTransation(); + io_seproxyhal_touch_data_ok(NULL); } else { - reviewReject(); + io_seproxyhal_touch_data_cancel(NULL); } } -static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { - if (page == 0) { - pair.item = (confirm_type == PARAMETER_CONFIRMATION) ? "Parameter" : "Selector"; - pair.value = strings.tmp.tmp; - content->type = TAG_VALUE_LIST; - content->tagValueList.nbPairs = 1; - content->tagValueList.pairs = (nbgl_layoutTagValue_t *) &pair; - } else if (page == 1) { - snprintf(g_stax_shared_buffer, - sizeof(g_stax_shared_buffer), - "Confirm %s", - (confirm_type == PARAMETER_CONFIRMATION) ? "parameter" : "selector"); - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); - content->infoLongPress.text = g_stax_shared_buffer; - content->infoLongPress.longPressText = "Hold to confirm"; - } else { - return false; - } - // valid page so return true - return true; -} +static void buildScreen(e_confirmation_type confirm_type) { + uint32_t buf_size = SHARED_BUFFER_SIZE / 2; + nbgl_operationType_t op = TYPE_TRANSACTION; -static void reviewContinue(void) { + pair.item = (confirm_type == PARAMETER_CONFIRMATION) ? "Parameter" : "Selector"; + pair.value = strings.tmp.tmp; + pairsList.nbPairs = 1; + pairsList.pairs = &pair; snprintf(g_stax_shared_buffer, - sizeof(g_stax_shared_buffer), - "Reject %s", - (confirm_type == PARAMETER_CONFIRMATION) ? "parameter" : "selector"); - nbgl_useCaseRegularReview(0, - 2, - g_stax_shared_buffer, - NULL, - displayTransactionPage, - reviewChoice); -} - -static void buildScreen(void) { - snprintf(g_stax_shared_buffer, - sizeof(g_stax_shared_buffer), + buf_size, "Verify %s", (confirm_type == PARAMETER_CONFIRMATION) ? "parameter" : "selector"); - nbgl_useCaseReviewStart(get_app_icon(true), - g_stax_shared_buffer, - NULL, - REJECT_BUTTON, - reviewContinue, - reviewReject); + // Finish text: replace "Verify" by "Confirm" and add questionmark + snprintf(g_stax_shared_buffer + buf_size, + buf_size, + "Confirm %s", + (confirm_type == PARAMETER_CONFIRMATION) ? "parameter" : "selector"); + + if (tmpContent.txContent.dataPresent) { + op |= BLIND_OPERATION; + } + nbgl_useCaseReview(op, + &pairsList, + get_tx_icon(), + g_stax_shared_buffer, + NULL, + g_stax_shared_buffer + buf_size, + reviewChoice); } void ui_confirm_parameter(void) { - confirm_type = PARAMETER_CONFIRMATION; - buildScreen(); + buildScreen(PARAMETER_CONFIRMATION); } void ui_confirm_selector(void) { - confirm_type = SELECTOR_CONFIRMATION; - buildScreen(); + buildScreen(SELECTOR_CONFIRMATION); } diff --git a/src_nbgl/ui_display_privacy.c b/src_nbgl/ui_display_privacy.c index 2b08175..65b5363 100644 --- a/src_nbgl/ui_display_privacy.c +++ b/src_nbgl/ui_display_privacy.c @@ -1,69 +1,41 @@ #include "common_ui.h" #include "ui_signing.h" #include "ui_nbgl.h" -#include "ui_callbacks.h" #include "nbgl_use_case.h" -#include "network.h" - -static nbgl_layoutTagValue_t pairs[2]; -static char *review_string; - -static void reviewReject(void) { - io_seproxyhal_touch_privacy_cancel(NULL); -} - -static void confirmTransation(void) { - io_seproxyhal_touch_privacy_ok(NULL); -} +#include "nbgl_content.h" static void reviewChoice(bool confirm) { if (confirm) { - confirmTransation(); + io_seproxyhal_touch_privacy_ok(NULL); } else { - reviewReject(); + io_seproxyhal_touch_privacy_cancel(NULL); } } -static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { - if (page == 0) { - pairs[0].item = "Address"; - pairs[0].value = strings.common.fullAddress; - pairs[1].item = "Key"; - pairs[1].value = strings.common.fullAmount; +static void buildFirstPage(const char *review_string) { + static nbgl_contentTagValue_t pairs[2] = {0}; + static nbgl_contentTagValueList_t pairsList = {0}; - content->type = TAG_VALUE_LIST; - content->tagValueList.nbPairs = 2; - content->tagValueList.pairs = (nbgl_layoutTagValue_t *) pairs; - } else if (page == 1) { - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); - content->infoLongPress.text = review_string; - content->infoLongPress.longPressText = "Hold to approve"; - } else { - return false; - } - // valid page so return true - return true; -} + pairs[0].item = "Address"; + pairs[0].value = strings.common.toAddress; + pairs[1].item = "Key"; + pairs[1].value = strings.common.fullAmount; + pairsList.nbPairs = 2; + pairsList.pairs = pairs; -static void reviewContinue(void) { - nbgl_useCaseRegularReview(0, 2, REJECT_BUTTON, NULL, displayTransactionPage, reviewChoice); -} - -static void buildFirstPage(void) { - nbgl_useCaseReviewStart(get_app_icon(true), - review_string, - NULL, - REJECT_BUTTON, - reviewContinue, - reviewReject); + nbgl_useCaseReview(TYPE_OPERATION, + &pairsList, + get_tx_icon(), + review_string, + NULL, + review_string, + reviewChoice); } void ui_display_privacy_public_key(void) { - review_string = (char *) "Provide public\nprivacy key"; - buildFirstPage(); + buildFirstPage("Provide public\nprivacy key"); } void ui_display_privacy_shared_secret(void) { - review_string = (char *) "Provide public\nsecret key"; - buildFirstPage(); + buildFirstPage("Provide public\nsecret key"); } diff --git a/src_nbgl/ui_get_eth2_public_key.c b/src_nbgl/ui_get_eth2_public_key.c index 9f388df..99d09a5 100644 --- a/src_nbgl/ui_get_eth2_public_key.c +++ b/src_nbgl/ui_get_eth2_public_key.c @@ -2,6 +2,7 @@ #include "shared_context.h" #include "ui_callbacks.h" #include "ui_nbgl.h" +#include "uint_common.h" static void reviewReject(void) { io_seproxyhal_touch_address_cancel(NULL); @@ -13,18 +14,22 @@ static void confirmTransation(void) { static void reviewChoice(bool confirm) { if (confirm) { - // display a status page and go back to main - nbgl_useCaseStatus("ADDRESS\nVERIFIED", true, confirmTransation); + nbgl_useCaseReviewStatus(STATUS_TYPE_ADDRESS_VERIFIED, confirmTransation); } else { - nbgl_useCaseStatus("Address verification\ncancelled", false, reviewReject); + nbgl_useCaseReviewStatus(STATUS_TYPE_ADDRESS_REJECTED, reviewReject); } } -static void buildScreen(void) { - snprintf(strings.tmp.tmp, 100, "0x%.*H", 48, tmpCtx.publicKeyContext.publicKey.W); - nbgl_useCaseAddressConfirmation(strings.tmp.tmp, reviewChoice); -} - void ui_display_public_eth2(void) { - buildScreen(); -} \ No newline at end of file + array_bytes_string(strings.tmp.tmp, + sizeof(strings.tmp.tmp), + tmpCtx.publicKeyContext.publicKey.W, + 48); + strlcpy(g_stax_shared_buffer, "Verify ETH2\naddress", sizeof(g_stax_shared_buffer)); + nbgl_useCaseAddressReview(strings.tmp.tmp, + NULL, + get_app_icon(false), + g_stax_shared_buffer, + NULL, + reviewChoice); +} diff --git a/src_nbgl/ui_get_public_key.c b/src_nbgl/ui_get_public_key.c index b3c4953..bc00ab6 100644 --- a/src_nbgl/ui_get_public_key.c +++ b/src_nbgl/ui_get_public_key.c @@ -13,27 +13,14 @@ static void confirm_send(void) { io_seproxyhal_touch_address_ok(NULL); } -static void confirm_addr(void) { - // display a status page and go back to main - nbgl_useCaseStatus("ADDRESS\nVERIFIED", true, confirm_send); -} - -static void reject_addr(void) { - nbgl_useCaseStatus("Address verification\ncancelled", false, cancel_send); -} - static void review_choice(bool confirm) { if (confirm) { - confirm_addr(); + nbgl_useCaseReviewStatus(STATUS_TYPE_ADDRESS_VERIFIED, confirm_send); } else { - reject_addr(); + nbgl_useCaseReviewStatus(STATUS_TYPE_ADDRESS_REJECTED, cancel_send); } } -static void display_addr(void) { - nbgl_useCaseAddressConfirmation(strings.common.fullAddress, review_choice); -} - void ui_display_public_key(const uint64_t *chain_id) { const nbgl_icon_details_t *icon; @@ -54,5 +41,10 @@ void ui_display_public_key(const uint64_t *chain_id) { icon = get_app_icon(false); } strlcat(g_stax_shared_buffer, "address", sizeof(g_stax_shared_buffer)); - nbgl_useCaseReviewStart(icon, g_stax_shared_buffer, NULL, "Cancel", display_addr, reject_addr); + nbgl_useCaseAddressReview(strings.common.toAddress, + NULL, + icon, + g_stax_shared_buffer, + NULL, + review_choice); } diff --git a/src_nbgl/ui_home.c b/src_nbgl/ui_home.c new file mode 100644 index 0000000..4771236 --- /dev/null +++ b/src_nbgl/ui_home.c @@ -0,0 +1,185 @@ +#include "common_ui.h" +#include "ui_nbgl.h" +#include "nbgl_use_case.h" +#include "caller_api.h" +#include "network.h" + +// settings info definition +#define SETTING_INFO_NB 2 + +// settings menu definition +#define SETTING_CONTENTS_NB 1 + +// Tagline format for plugins +#define FORMAT_PLUGIN "This app enables clear\nsigning transactions for\nthe %s dApp." + +enum { + DEBUG_TOKEN = FIRST_USER_TOKEN, + NONCE_TOKEN, +#ifdef HAVE_EIP712_FULL_SUPPORT + EIP712_VERBOSE_TOKEN, +#endif +#ifdef HAVE_DOMAIN_NAME + DOMAIN_NAME_VERBOSE_TOKEN +#endif +}; + +enum { +#ifdef HAVE_DOMAIN_NAME + DOMAIN_NAME_VERBOSE_ID, +#endif +#ifdef HAVE_EIP712_FULL_SUPPORT + EIP712_VERBOSE_ID, +#endif + NONCE_ID, + DEBUG_ID, + SETTINGS_SWITCHES_NB +}; + +// settings definition +static const char *const infoTypes[SETTING_INFO_NB] = {"Version", "Developer"}; +static const char *const infoContents[SETTING_INFO_NB] = {APPVERSION, "Ledger"}; + +static nbgl_contentInfoList_t infoList = {0}; +static nbgl_contentSwitch_t switches[SETTINGS_SWITCHES_NB] = {0}; +static nbgl_content_t contents[SETTING_CONTENTS_NB] = {0}; +static nbgl_genericContents_t settingContents = {0}; + +// Buffer used all throughout the NBGL code +char g_stax_shared_buffer[SHARED_BUFFER_SIZE] = {0}; + +static void setting_toggle_callback(int token, uint8_t index, int page) { + UNUSED(index); + UNUSED(page); + bool value; + + switch (token) { + case DEBUG_TOKEN: + value = !N_storage.contractDetails; + switches[DEBUG_ID].initState = (nbgl_state_t) value; + nvm_write((void *) &N_storage.contractDetails, (void *) &value, sizeof(uint8_t)); + break; + case NONCE_TOKEN: + value = !N_storage.displayNonce; + switches[NONCE_ID].initState = (nbgl_state_t) value; + nvm_write((void *) &N_storage.displayNonce, (void *) &value, sizeof(uint8_t)); + break; +#ifdef HAVE_EIP712_FULL_SUPPORT + case EIP712_VERBOSE_TOKEN: + value = !N_storage.verbose_eip712; + switches[EIP712_VERBOSE_ID].initState = (nbgl_state_t) value; + nvm_write((void *) &N_storage.verbose_eip712, (void *) &value, sizeof(uint8_t)); + break; +#endif // HAVE_EIP712_FULL_SUPPORT +#ifdef HAVE_DOMAIN_NAME + case DOMAIN_NAME_VERBOSE_TOKEN: + value = !N_storage.verbose_domain_name; + switches[DOMAIN_NAME_VERBOSE_ID].initState = (nbgl_state_t) value; + nvm_write((void *) &N_storage.verbose_domain_name, (void *) &value, sizeof(uint8_t)); + break; +#endif // HAVE_DOMAIN_NAME + } +} + +static void app_quit(void) { + // exit app here + os_sched_exit(-1); +} + +const nbgl_icon_details_t *get_app_icon(bool caller_icon) { + const nbgl_icon_details_t *icon = NULL; + + if (caller_icon && caller_app) { + if (caller_app->icon) { + icon = caller_app->icon; + } + } else { + icon = &ICONGLYPH; + } + if (icon == NULL) { + PRINTF("%s(%s) returned NULL!\n", __func__, (caller_icon ? "true" : "false")); + } + return icon; +} + +/** + * Prepare settings, app infos and call the HomeAndSettings use case + * + * @param[in] appname given app name + * @param[in] tagline given tagline (\ref NULL if default) + */ +static void prepare_and_display_home(const char *appname, const char *tagline) { +#ifdef HAVE_DOMAIN_NAME + switches[DOMAIN_NAME_VERBOSE_ID].initState = + N_storage.verbose_domain_name ? ON_STATE : OFF_STATE; + switches[DOMAIN_NAME_VERBOSE_ID].text = "ENS addresses"; + switches[DOMAIN_NAME_VERBOSE_ID].subText = "Display the resolved address of ENS domains."; + switches[DOMAIN_NAME_VERBOSE_ID].token = DOMAIN_NAME_VERBOSE_TOKEN; + switches[DOMAIN_NAME_VERBOSE_ID].tuneId = TUNE_TAP_CASUAL; +#endif // HAVE_DOMAIN_NAME + +#ifdef HAVE_EIP712_FULL_SUPPORT + switches[EIP712_VERBOSE_ID].initState = N_storage.verbose_eip712 ? ON_STATE : OFF_STATE; + switches[EIP712_VERBOSE_ID].text = "Raw messages"; + switches[EIP712_VERBOSE_ID].subText = "Display raw content from EIP712 messages."; + switches[EIP712_VERBOSE_ID].token = EIP712_VERBOSE_TOKEN; + switches[EIP712_VERBOSE_ID].tuneId = TUNE_TAP_CASUAL; +#endif // HAVE_EIP712_FULL_SUPPORT + + switches[NONCE_ID].initState = N_storage.displayNonce ? ON_STATE : OFF_STATE; + switches[NONCE_ID].text = "Nonce"; + switches[NONCE_ID].subText = "Display nonce in transactions."; + switches[NONCE_ID].token = NONCE_TOKEN; + switches[NONCE_ID].tuneId = TUNE_TAP_CASUAL; + + switches[DEBUG_ID].initState = N_storage.contractDetails ? ON_STATE : OFF_STATE; + switches[DEBUG_ID].text = "Debug smart contracts"; + switches[DEBUG_ID].subText = "Display contract data details."; + switches[DEBUG_ID].token = DEBUG_TOKEN; + switches[DEBUG_ID].tuneId = TUNE_TAP_CASUAL; + + contents[0].type = SWITCHES_LIST; + contents[0].content.switchesList.nbSwitches = SETTINGS_SWITCHES_NB; + contents[0].content.switchesList.switches = switches; + contents[0].contentActionCallback = setting_toggle_callback; + + settingContents.callbackCallNeeded = false; + settingContents.contentsList = contents; + settingContents.nbContents = SETTING_CONTENTS_NB; + + infoList.nbInfos = SETTING_INFO_NB; + infoList.infoTypes = infoTypes; + infoList.infoContents = infoContents; + + nbgl_useCaseHomeAndSettings(appname, + get_app_icon(true), + tagline, + INIT_HOME_PAGE, + &settingContents, + &infoList, + NULL, + app_quit); +} + +/** + * Go to home screen + * + * This function prepares the app name & tagline depending on how the application was called + */ +void ui_idle(void) { + const char *appname = NULL; + const char *tagline = NULL; + + if (caller_app) { + appname = caller_app->name; + + if (caller_app->type == CALLER_TYPE_PLUGIN) { + snprintf(g_stax_shared_buffer, sizeof(g_stax_shared_buffer), FORMAT_PLUGIN, appname); + tagline = g_stax_shared_buffer; + } + } else { // Ethereum app + uint64_t mainnet_chain_id = ETHEREUM_MAINNET_CHAINID; + appname = get_network_name_from_chain_id(&mainnet_chain_id); + } + prepare_and_display_home(appname, tagline); +} diff --git a/src_nbgl/ui_idle.c b/src_nbgl/ui_idle.c deleted file mode 100644 index 56f559e..0000000 --- a/src_nbgl/ui_idle.c +++ /dev/null @@ -1,64 +0,0 @@ -#include "common_ui.h" -#include "shared_context.h" -#include "ui_nbgl.h" -#include "nbgl_use_case.h" -#include "glyphs.h" -#include "caller_api.h" -#include "network.h" - -char g_stax_shared_buffer[SHARED_BUFFER_SIZE] = {0}; -nbgl_page_t *pageContext; - -#define FORMAT_PLUGIN "This app enables clear\nsigning transactions for\nthe %s dApp." - -void releaseContext(void) { - if (pageContext != NULL) { - nbgl_pageRelease(pageContext); - pageContext = NULL; - } -} - -void app_quit(void) { - // exit app here - os_sched_exit(-1); -} - -const nbgl_icon_details_t *get_app_icon(bool caller_icon) { - const nbgl_icon_details_t *icon = NULL; - - if (caller_icon && caller_app) { - if (caller_app->icon) { - icon = caller_app->icon; - } - } else { - icon = &ICONGLYPH; - } - if (icon == NULL) { - PRINTF("%s(%s) returned NULL!\n", __func__, (caller_icon ? "true" : "false")); - } - return icon; -} - -void ui_idle(void) { - const char *app_name = NULL; - const char *tagline = NULL; - - if (caller_app) { - app_name = caller_app->name; - - if (caller_app->type == CALLER_TYPE_PLUGIN) { - snprintf(g_stax_shared_buffer, sizeof(g_stax_shared_buffer), FORMAT_PLUGIN, app_name); - tagline = g_stax_shared_buffer; - } - } else { // Ethereum app - uint64_t mainnet_chain_id = ETHEREUM_MAINNET_CHAINID; - app_name = get_network_name_from_chain_id(&mainnet_chain_id); - } - - nbgl_useCaseHome((char *) app_name, - get_app_icon(true), - tagline, - true, - ui_menu_settings, - app_quit); -} diff --git a/src_nbgl/ui_message_signing.c b/src_nbgl/ui_message_signing.c index 51e1a7e..4fd171a 100644 --- a/src_nbgl/ui_message_signing.c +++ b/src_nbgl/ui_message_signing.c @@ -1,50 +1,18 @@ #include "ui_nbgl.h" -#include "ui_signing.h" #include "ui_logic.h" -#include "ui_message_signing.h" -#include "glyphs.h" -static void (*g_approved_func)(void) = NULL; -static void (*g_rejected_func)(void) = NULL; - -static void ui_message_rejection_handler() { - nbgl_useCaseStatus("Message signing\ncancelled", false, g_rejected_func); -} - -static void ui_message_confirm_rejection(void) { - nbgl_useCaseConfirm(REJECT_QUESTION(TEXT_MESSAGE), - NULL, - REJECT_CONFIRM_BUTTON, - RESUME(TEXT_MESSAGE), - ui_message_rejection_handler); -} - -void ui_message_review_choice(bool confirm) { - if (confirm) { - nbgl_useCaseStatus("MESSAGE\nSIGNED", true, g_approved_func); - } else { - ui_message_confirm_rejection(); - } -} - -void ui_message_start(const char *title, - void (*start_func)(void), - void (*approved_func)(void), - void (*rejected_func)(void)) { - g_approved_func = approved_func; - g_rejected_func = rejected_func; - nbgl_useCaseReviewStart(&C_Message_64px, - title, - NULL, - REJECT_BUTTON, - start_func, - ui_message_confirm_rejection); -} - -void ui_message_712_approved(void) { +static void ui_message_712_approved(void) { ui_712_approve(); } -void ui_message_712_rejected(void) { +static void ui_message_712_rejected(void) { ui_712_reject(); } + +void ui_typed_message_review_choice(bool confirm) { + if (confirm) { + nbgl_useCaseReviewStatus(STATUS_TYPE_MESSAGE_SIGNED, ui_message_712_approved); + } else { + nbgl_useCaseReviewStatus(STATUS_TYPE_MESSAGE_REJECTED, ui_message_712_rejected); + } +} diff --git a/src_nbgl/ui_message_signing.h b/src_nbgl/ui_message_signing.h index 008f574..48412fe 100644 --- a/src_nbgl/ui_message_signing.h +++ b/src_nbgl/ui_message_signing.h @@ -2,19 +2,13 @@ #define UI_MESSAGE_SIGNING_H_ #include +#include "ui_signing.h" #define TEXT_MESSAGE "message" #define TEXT_TYPED_MESSAGE "typed " TEXT_MESSAGE #define TEXT_REVIEW_EIP712 REVIEW(TEXT_TYPED_MESSAGE) #define TEXT_SIGN_EIP712 SIGN(TEXT_TYPED_MESSAGE) -void ui_message_review_choice(bool confirm); -void ui_message_start(const char *title, - void (*start_func)(void), - void (*approved_func)(void), - void (*rejected_func)(void)); - -void ui_message_712_approved(void); -void ui_message_712_rejected(void); +void ui_typed_message_review_choice(bool confirm); #endif // UI_MESSAGE_SIGNING_H_ diff --git a/src_nbgl/ui_nbgl.h b/src_nbgl/ui_nbgl.h index 921d604..d983311 100644 --- a/src_nbgl/ui_nbgl.h +++ b/src_nbgl/ui_nbgl.h @@ -10,12 +10,9 @@ extern char g_stax_shared_buffer[SHARED_BUFFER_SIZE]; extern nbgl_page_t* pageContext; -void releaseContext(void); - const nbgl_icon_details_t* get_app_icon(bool caller_icon); +const nbgl_icon_details_t* get_tx_icon(void); void ui_idle(void); -void ui_menu_settings(void); -void ui_menu_about(void); #endif // _UI_NBGL_H_ diff --git a/src_nbgl/ui_settings.c b/src_nbgl/ui_settings.c deleted file mode 100644 index 9d3656c..0000000 --- a/src_nbgl/ui_settings.c +++ /dev/null @@ -1,132 +0,0 @@ -#include "common_ui.h" -#include "ui_nbgl.h" -#include "nbgl_use_case.h" - -static const char* const infoTypes[] = {"Version", APPNAME " App"}; -static const char* const infoContents[] = {APPVERSION, "(c) " BUILD_YEAR " Ledger"}; - -enum { - BLIND_SIGNING_TOKEN = FIRST_USER_TOKEN, - DEBUG_TOKEN, - NONCE_TOKEN, -#ifdef HAVE_EIP712_FULL_SUPPORT - EIP712_VERBOSE_TOKEN, -#endif // HAVE_EIP712_FULL_SUPPORT -#ifdef HAVE_DOMAIN_NAME - DOMAIN_NAME_VERBOSE_TOKEN -#endif // HAVE_DOMAIN_NAME -}; - -static nbgl_layoutSwitch_t switches[3]; - -static bool navCallback(uint8_t page, nbgl_pageContent_t* content) { - uint8_t index = 0; - - switch (page) { - case 0: - content->type = INFOS_LIST; - content->infosList.nbInfos = 2; - content->infosList.infoTypes = (const char**) infoTypes; - content->infosList.infoContents = (const char**) infoContents; - break; - - case 1: - switches[index++] = - (nbgl_layoutSwitch_t){.initState = N_storage.dataAllowed ? ON_STATE : OFF_STATE, - .text = "Blind signing", - .subText = "Enable transaction blind\nsigning", - .token = BLIND_SIGNING_TOKEN, - .tuneId = TUNE_TAP_CASUAL}; - switches[index++] = - (nbgl_layoutSwitch_t){.initState = N_storage.contractDetails ? ON_STATE : OFF_STATE, - .text = "Debug", - .subText = "Display contract data\ndetails", - .token = DEBUG_TOKEN, - .tuneId = TUNE_TAP_CASUAL}; - switches[index++] = - (nbgl_layoutSwitch_t){.initState = N_storage.displayNonce ? ON_STATE : OFF_STATE, - .text = "Nonce", - .subText = "Display account nonce\nin transaction", - .token = NONCE_TOKEN, - .tuneId = TUNE_TAP_CASUAL}; - - content->type = SWITCHES_LIST; - content->switchesList.nbSwitches = index; - content->switchesList.switches = (nbgl_layoutSwitch_t*) switches; - break; - - case 2: -#ifdef HAVE_EIP712_FULL_SUPPORT - switches[index++] = - (nbgl_layoutSwitch_t){.initState = N_storage.verbose_eip712 ? ON_STATE : OFF_STATE, - .text = "Verbose EIP712", - .subText = "Ignore filtering and\ndisplay raw content", - .token = EIP712_VERBOSE_TOKEN, - .tuneId = TUNE_TAP_CASUAL}; -#endif // HAVE_EIP712_FULL_SUPPORT -#ifdef HAVE_DOMAIN_NAME - switches[index++] = (nbgl_layoutSwitch_t){ - .initState = N_storage.verbose_domain_name ? ON_STATE : OFF_STATE, - .text = "Verbose domains", - .subText = "Show resolved address", - .token = DOMAIN_NAME_VERBOSE_TOKEN, - .tuneId = TUNE_TAP_CASUAL}; -#endif // HAVE_DOMAIN_NAME - - content->type = SWITCHES_LIST; - content->switchesList.nbSwitches = index; - content->switchesList.switches = (nbgl_layoutSwitch_t*) switches; - break; - - default: - return false; - break; - } - - return true; -} - -static void controlsCallback(int token, uint8_t index) { - (void) index; - uint8_t value; - switch (token) { - case BLIND_SIGNING_TOKEN: - value = (N_storage.dataAllowed ? 0 : 1); - nvm_write((void*) &N_storage.dataAllowed, (void*) &value, sizeof(uint8_t)); - break; - case DEBUG_TOKEN: - value = (N_storage.contractDetails ? 0 : 1); - nvm_write((void*) &N_storage.contractDetails, (void*) &value, sizeof(uint8_t)); - break; - case NONCE_TOKEN: - value = (N_storage.displayNonce ? 0 : 1); - nvm_write((void*) &N_storage.displayNonce, (void*) &value, sizeof(uint8_t)); - break; -#ifdef HAVE_EIP712_FULL_SUPPORT - case EIP712_VERBOSE_TOKEN: - value = (N_storage.verbose_eip712 ? 0 : 1); - nvm_write((void*) &N_storage.verbose_eip712, (void*) &value, sizeof(uint8_t)); - break; -#endif // HAVE_EIP712_FULL_SUPPORT -#ifdef HAVE_DOMAIN_NAME - case DOMAIN_NAME_VERBOSE_TOKEN: - value = (N_storage.verbose_domain_name ? 0 : 1); - nvm_write((void*) &N_storage.verbose_domain_name, (void*) &value, sizeof(uint8_t)); - break; -#endif // HAVE_DOMAIN_NAME - } -} - -void ui_menu_settings(void) { - uint8_t nb_screens = 2; -#if defined(HAVE_EIP712_FULL_SUPPORT) || defined(HAVE_DOMAIN_NAME) - nb_screens += 1; -#endif - nbgl_useCaseSettings(APPNAME " settings", - 0, - nb_screens, - false, - ui_idle, - navCallback, - controlsCallback); -} diff --git a/src_nbgl/ui_sign_712.c b/src_nbgl/ui_sign_712.c index ad4f07f..10b27d3 100644 --- a/src_nbgl/ui_sign_712.c +++ b/src_nbgl/ui_sign_712.c @@ -1,92 +1,97 @@ #ifdef HAVE_EIP712_FULL_SUPPORT +#include // explicit_bzero #include "common_ui.h" #include "ui_nbgl.h" #include "ui_logic.h" #include "common_712.h" #include "nbgl_use_case.h" -#include "network.h" #include "ui_message_signing.h" -#include "ui_signing.h" +#include "ledger_assert.h" -static nbgl_layoutTagValue_t pair; +static nbgl_contentTagValue_t pairs[6]; +static nbgl_contentTagValueList_t pairs_list; +static uint8_t pair_idx; +static size_t buf_idx; -static bool display_sign_page(uint8_t page, nbgl_pageContent_t *content) { - (void) page; - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); - content->infoLongPress.text = TEXT_SIGN_EIP712; - content->infoLongPress.longPressText = SIGN_BUTTON; - return true; -} +static void message_progress(bool confirm) { + char *buf; + size_t buf_size; + size_t shift_off; -static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { - bool ret; - uint16_t len; - - switch (page) { - case 0: - // limit the value to one page - nbgl_getTextMaxLenInNbLines(BAGL_FONT_INTER_MEDIUM_32px, - strings.tmp.tmp, - SCREEN_WIDTH - (2 * BORDER_MARGIN), - NB_MAX_LINES_IN_REVIEW, -#if (API_LEVEL == 0 || API_LEVEL >= 14) - &len, - false); -#else - &len); -#endif - strings.tmp.tmp[len] = '\0'; - - pair.item = strings.tmp.tmp2; - pair.value = strings.tmp.tmp; - content->type = TAG_VALUE_LIST; - content->tagValueList.nbPairs = 1; - content->tagValueList.pairs = &pair; - content->tagValueList.wrapping = false; - ret = true; - break; - - case 1: - switch (ui_712_next_field()) { - case EIP712_NO_MORE_FIELD: - ui_712_switch_to_sign(); - ret = true; - break; - case EIP712_FIELD_INCOMING: - case EIP712_FIELD_LATER: - default: - break; - } - __attribute__((fallthrough)); - - default: - ret = false; - break; + if (pairs_list.nbPairs < pair_idx) { + buf = get_ui_pairs_buffer(&buf_size); + memmove(&pairs[0], &pairs[pairs_list.nbPairs], sizeof(pairs[0])); + memmove(buf, pairs[0].item, (buf + buf_idx) - pairs[0].item); + shift_off = pairs[0].item - buf; + buf_idx -= shift_off; + pairs[0].value -= shift_off; + pairs[0].item = buf; + pair_idx = 1; + } + if (confirm) { + if (ui_712_next_field() == EIP712_NO_MORE_FIELD) { + ui_712_switch_to_sign(); + } + } else { + ui_typed_message_review_choice(false); } - return ret; } -static void handle_display(nbgl_navCallback_t cb) { - nbgl_useCaseRegularReview(0, 0, REJECT_BUTTON, NULL, cb, ui_message_review_choice); +static void message_update(bool confirm) { + char *buf; + size_t buf_size; + size_t buf_off; + bool flag; + + buf = get_ui_pairs_buffer(&buf_size); + if (confirm) { + buf_off = strlen(strings.tmp.tmp2) + 1; + LEDGER_ASSERT((buf_idx + buf_off) < buf_size, "UI pairs buffer overflow"); + pairs[pair_idx].item = memmove(buf + buf_idx, strings.tmp.tmp2, buf_off); + buf_idx += buf_off; + buf_off = strlen(strings.tmp.tmp) + 1; + LEDGER_ASSERT((buf_idx + buf_off) < buf_size, "UI pairs buffer overflow"); + pairs[pair_idx].value = memmove(buf + buf_idx, strings.tmp.tmp, buf_off); + buf_idx += buf_off; + pair_idx += 1; + pairs_list.nbPairs = nbgl_useCaseGetNbTagValuesInPage(pair_idx, &pairs_list, 0, &flag); + if (pairs_list.nbPairs < pair_idx) { + nbgl_useCaseReviewStreamingContinue(&pairs_list, message_progress); + } else { + message_progress(true); + } + } else { + ui_typed_message_review_choice(false); + } } void ui_712_start(void) { - g_position = UI_SIGNING_POSITION_START; - ui_message_start(TEXT_REVIEW_EIP712, - &ui_712_switch_to_message, - &ui_message_712_approved, - &ui_message_712_rejected); + explicit_bzero(&pairs, sizeof(pairs)); + explicit_bzero(&pairs_list, sizeof(pairs_list)); + pairs_list.pairs = pairs; + pair_idx = 0; + buf_idx = 0; + + nbgl_useCaseReviewStreamingStart(TYPE_MESSAGE, + &C_Review_64px, + TEXT_REVIEW_EIP712, + NULL, + message_update); } void ui_712_switch_to_message(void) { - g_position = UI_SIGNING_POSITION_REVIEW; - handle_display(display_review_page); + message_update(true); } void ui_712_switch_to_sign(void) { - g_position = UI_SIGNING_POSITION_SIGN; - handle_display(display_sign_page); + if (pair_idx > 0) { + pairs_list.nbPairs = pair_idx; + pair_idx = 0; + nbgl_useCaseReviewStreamingContinue(&pairs_list, message_progress); + } else { + nbgl_useCaseReviewStreamingFinish(TEXT_SIGN_EIP712, ui_typed_message_review_choice); + } } #endif // HAVE_EIP712_FULL_SUPPORT diff --git a/src_nbgl/ui_sign_712_v0.c b/src_nbgl/ui_sign_712_v0.c index 0681009..a3a39b7 100644 --- a/src_nbgl/ui_sign_712_v0.c +++ b/src_nbgl/ui_sign_712_v0.c @@ -1,77 +1,42 @@ +#include // explicit_bzero +#include "os_utils.h" // ARRAYLEN #include "common_ui.h" #include "ui_nbgl.h" #include "common_712.h" -#include "network.h" #include "ui_message_signing.h" -#include "ui_signing.h" -static nbgl_layoutTagValue_t pairs[2]; - -static void start_review(void); // forward declaration +static nbgl_contentTagValue_t pairs[2]; +static nbgl_contentTagValueList_t pairs_list; static char *format_hash(const uint8_t *hash, char *buffer, size_t buffer_size, size_t offset) { - snprintf(buffer + offset, buffer_size - offset, "0x%.*H", KECCAK256_HASH_BYTESIZE, hash); + array_bytes_string(buffer + offset, buffer_size - offset, hash, KECCAK256_HASH_BYTESIZE); return buffer + offset; } -static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { - if (page == 0) { - pairs[0].item = "Domain hash"; - pairs[0].value = format_hash(tmpCtx.messageSigningContext712.domainHash, - strings.tmp.tmp, - sizeof(strings.tmp.tmp), - 0); - pairs[1].item = "Message hash"; - pairs[1].value = format_hash(tmpCtx.messageSigningContext712.messageHash, - strings.tmp.tmp, - sizeof(strings.tmp.tmp), - 70); - - content->type = TAG_VALUE_LIST; - content->tagValueList.nbPairs = 2; - content->tagValueList.pairs = (nbgl_layoutTagValue_t *) pairs; - } else if (page == 1) { - g_position = UI_SIGNING_POSITION_SIGN; - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); - content->infoLongPress.text = TEXT_SIGN_EIP712; - content->infoLongPress.longPressText = SIGN_BUTTON; - } else { - return false; - } - // valid page so return true - return true; -} - -static void display_review(void) { - uint8_t page; - - switch (g_position) { - case UI_SIGNING_POSITION_REVIEW: - page = 0; - break; - case UI_SIGNING_POSITION_SIGN: - page = 1; - break; - default: - return; // should not happen - } - nbgl_useCaseRegularReview(page, - 2, - REJECT_BUTTON, - NULL, - display_review_page, - ui_message_review_choice); -} - -static void start_review(void) { - g_position = UI_SIGNING_POSITION_REVIEW; - display_review(); -} - void ui_sign_712_v0(void) { - g_position = UI_SIGNING_POSITION_START; - ui_message_start(TEXT_REVIEW_EIP712, - &start_review, - &ui_message_712_approved, - &ui_message_712_rejected); + explicit_bzero(pairs, sizeof(pairs)); + explicit_bzero(&pairs_list, sizeof(pairs_list)); + + pairs[0].item = "Domain hash"; + pairs[0].value = format_hash(tmpCtx.messageSigningContext712.domainHash, + strings.tmp.tmp, + sizeof(strings.tmp.tmp), + 0); + pairs[1].item = "Message hash"; + pairs[1].value = format_hash(tmpCtx.messageSigningContext712.messageHash, + strings.tmp.tmp, + sizeof(strings.tmp.tmp), + 70); + + pairs_list.nbPairs = ARRAYLEN(pairs); + pairs_list.pairs = pairs; + pairs_list.nbMaxLinesForValue = 0; + + nbgl_useCaseReview(TYPE_MESSAGE, + &pairs_list, + &C_Review_64px, + TEXT_REVIEW_EIP712, + NULL, + TEXT_SIGN_EIP712, + ui_typed_message_review_choice); } diff --git a/src_nbgl/ui_sign_message.c b/src_nbgl/ui_sign_message.c index a85d98b..93312a0 100644 --- a/src_nbgl/ui_sign_message.c +++ b/src_nbgl/ui_sign_message.c @@ -1,4 +1,4 @@ -#include +#include "nbgl_page.h" #include "shared_context.h" #include "ui_callbacks.h" #include "ui_nbgl.h" @@ -20,12 +20,14 @@ typedef enum { static e_ui_191_action g_action; -static bool skip_message; +static nbgl_contentTagValue_t pair; +static nbgl_contentTagValueList_t pairs_list; -static nbgl_layoutTagValue_t pair; +static uint32_t g_display_buffer_idx; +static uint32_t g_rcv_buffer_idx; +static bool g_skipped; -static uint32_t eip191MessageIdx = 0; -static uint32_t stringsTmpTmpIdx = 0; +static void ui_191_process_state(void); static void reject_message(void) { io_seproxyhal_touch_signMessage_cancel(); @@ -35,125 +37,111 @@ static void sign_message(void) { io_seproxyhal_touch_signMessage_ok(); } -static bool display_message(nbgl_pageContent_t *content) { +static void ui_191_finish_cb(bool confirm) { + if (confirm) { + nbgl_useCaseReviewStatus(STATUS_TYPE_MESSAGE_SIGNED, sign_message); + } else { + nbgl_useCaseReviewStatus(STATUS_TYPE_MESSAGE_REJECTED, reject_message); + } +} + +static void ui_191_skip_cb(void) { + g_skipped = true; + skip_rest_of_message(); +} + +static bool ui_191_update_display_buffer(void) { uint16_t len = 0; bool reached; - if (g_action == UI_191_ACTION_ADVANCE_IN_MESSAGE) { - strncpy(g_stax_shared_buffer + eip191MessageIdx, - strings.tmp.tmp + stringsTmpTmpIdx, - SHARED_BUFFER_SIZE - eip191MessageIdx); - reached = nbgl_getTextMaxLenInNbLines(BAGL_FONT_INTER_MEDIUM_32px, - (char *) g_stax_shared_buffer, - SCREEN_WIDTH - (2 * BORDER_MARGIN), - NB_MAX_LINES_IN_REVIEW, -#if (API_LEVEL == 0 || API_LEVEL >= 14) - &len, - false); -#else - &len); -#endif + g_stax_shared_buffer[g_display_buffer_idx] = '\0'; + strlcat(g_stax_shared_buffer + g_display_buffer_idx, + strings.tmp.tmp + g_rcv_buffer_idx, + sizeof(g_stax_shared_buffer) - g_display_buffer_idx); + reached = nbgl_getTextMaxLenInNbLines(LARGE_MEDIUM_FONT, + (char *) g_stax_shared_buffer, + SCREEN_WIDTH - (2 * BORDER_MARGIN), + NB_MAX_LINES_IN_REVIEW, + &len, + false); - stringsTmpTmpIdx = len - eip191MessageIdx; - eip191MessageIdx = len; - g_stax_shared_buffer[eip191MessageIdx] = '\0'; + g_rcv_buffer_idx += (len - g_display_buffer_idx); + g_display_buffer_idx = len; + g_stax_shared_buffer[g_display_buffer_idx] = '\0'; - if (!reached && eip191MessageIdx < SHARED_BUFFER_SIZE) { - stringsTmpTmpIdx = 0; - question_switcher(); - - if (g_action != UI_191_ACTION_GO_TO_SIGN) { - return false; - } - } else if (reached || eip191MessageIdx == SHARED_BUFFER_SIZE) { - eip191MessageIdx = 0; - } - } - - pair.value = g_stax_shared_buffer; - pair.item = "Message"; - content->type = TAG_VALUE_LIST; - content->tagValueList.nbPairs = 1; - content->tagValueList.pairs = &pair; - content->tagValueList.smallCaseForValue = false; - content->tagValueList.nbMaxLinesForValue = NB_MAX_LINES_IN_REVIEW; - content->tagValueList.wrapping = false; - - if ((g_action != UI_191_ACTION_IDLE) && (stringsTmpTmpIdx >= strlen(strings.tmp.tmp))) { - // Fetch the next content to display into strings.tmp.tmp buffer. - stringsTmpTmpIdx = 0; + if (!reached) { + g_rcv_buffer_idx = 0; question_switcher(); + return false; } + g_display_buffer_idx = 0; return true; } -static bool display_sign(nbgl_pageContent_t *content) { - bool ret = false; - - if (g_position != UI_SIGNING_POSITION_SIGN) { - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = &C_Message_64px; - content->infoLongPress.text = TEXT_SIGN_EIP191; - content->infoLongPress.longPressText = SIGN_BUTTON; - g_position = UI_SIGNING_POSITION_SIGN; - ret = true; - } - return ret; -} - -static bool nav_callback(uint8_t page, nbgl_pageContent_t *content) { - bool ret = true; - - if (page == LAST_PAGE_FOR_REVIEW) { // was skipped - skip_message = true; - skip_rest_of_message(); - } - if ((g_action != UI_191_ACTION_GO_TO_SIGN) && (g_position != UI_SIGNING_POSITION_SIGN)) { - if (skip_message) { - // do not refresh when this callback triggers after user validation - ret = false; - } else { - ret = display_message(content); - } +static void ui_191_data_cb(bool more) { + if (more) { + ui_191_process_state(); } else { - // the last page must contain a long press button - ret = display_sign(content); + ui_191_finish_cb(false); } - return ret; } -static void continue_review(void) { - nbgl_useCaseForwardOnlyReview(REJECT_BUTTON, NULL, nav_callback, ui_message_review_choice); +static void ui_191_show_message(void) { + pair.value = g_stax_shared_buffer; + pair.item = "Message"; + pairs_list.nbPairs = 1; + pairs_list.pairs = &pair; + pairs_list.smallCaseForValue = false; + pairs_list.nbMaxLinesForValue = NB_MAX_LINES_IN_REVIEW; + pairs_list.wrapping = false; + nbgl_useCaseReviewStreamingContinueExt(&pairs_list, ui_191_data_cb, ui_191_skip_cb); +} + +static void ui_191_process_state(void) { + switch (g_action) { + case UI_191_ACTION_IDLE: + g_action = UI_191_ACTION_ADVANCE_IN_MESSAGE; + __attribute__((fallthrough)); + case UI_191_ACTION_ADVANCE_IN_MESSAGE: + if (ui_191_update_display_buffer()) { + ui_191_show_message(); + } + break; + case UI_191_ACTION_GO_TO_SIGN: + nbgl_useCaseReviewStreamingFinish(TEXT_SIGN_EIP191, ui_191_finish_cb); + break; + } } void ui_191_start(void) { - g_position = UI_SIGNING_POSITION_START; + g_action = UI_191_ACTION_IDLE; + g_display_buffer_idx = 0; + g_rcv_buffer_idx = 0; + g_skipped = false; - skip_message = false; - eip191MessageIdx = 0; - stringsTmpTmpIdx = 0; - - ui_message_start(TEXT_REVIEW_EIP191, &ui_191_switch_to_message, &sign_message, &reject_message); + nbgl_useCaseReviewStreamingStart(TYPE_MESSAGE | SKIPPABLE_OPERATION, + &C_Review_64px, + TEXT_REVIEW_EIP191, + NULL, + ui_191_data_cb); } void ui_191_switch_to_message(void) { - g_position = UI_SIGNING_POSITION_REVIEW; - g_action = UI_191_ACTION_ADVANCE_IN_MESSAGE; - // No question mechanism on Stax: - // Message is already displayed - continue_review(); + // Get following part of the message + ui_191_process_state(); } void ui_191_switch_to_sign(void) { g_action = UI_191_ACTION_GO_TO_SIGN; - // Next nav_callback callback must display - // the hold to approve screen - if (skip_message) { - continue_review(); // to force screen refresh + if (g_skipped) { + nbgl_useCaseReviewStreamingFinish(TEXT_SIGN_EIP191, ui_191_finish_cb); + } else if (g_display_buffer_idx > 0) { + // still on an incomplete display buffer, show it before the last page + ui_191_show_message(); } } void ui_191_switch_to_question(void) { - // No question mechanism on Stax: - // Always display the next message chunk. + // No question mechanism on Stax: Always display the next message chunk. continue_displaying_message(); } diff --git a/src_nbgl/ui_warning_contract_data.c b/src_nbgl/ui_warning_contract_data.c index 2619dce..b4d1fb4 100644 --- a/src_nbgl/ui_warning_contract_data.c +++ b/src_nbgl/ui_warning_contract_data.c @@ -2,20 +2,37 @@ #include "shared_context.h" #include "ui_callbacks.h" #include "ui_nbgl.h" +#include "feature_signTx.h" -static void ui_warning_contract_data_choice(bool confirm) { +static void ui_warning_contract_data_choice2(bool confirm) { if (confirm) { - ui_idle(); + start_signature_flow(); } else { - ui_menu_settings(); + report_finalize_error(); + } +} + +static void ui_warning_contract_data_choice1(bool confirm) { + if (confirm) { + report_finalize_error(); + } else { + nbgl_useCaseChoice( + NULL, + "The transaction cannot be trusted", + "Your Ledger cannot decode this transaction. If you sign it, you could be authorizing " + "malicious actions that can drain your wallet.\n\nLearn more: ledger.com/e8", + "I accept the risk", + "Reject transaction", + ui_warning_contract_data_choice2); } } void ui_warning_contract_data(void) { - nbgl_useCaseChoice(&C_warning64px, - "This message cannot\nbe clear-signed", - "Enable blind-signing in\nthe settings to sign\nthis transaction.", - "Exit", - "Go to settings", - ui_warning_contract_data_choice); + nbgl_useCaseChoice( + &C_Warning_64px, + "Security risk detected", + "It may not be safe to sign this transaction. To continue, you'll need to review the risk.", + "Back to safety", + "Review risk", + ui_warning_contract_data_choice1); } diff --git a/src_plugin_sdk/CHANGELOG.md b/src_plugin_sdk/CHANGELOG.md deleted file mode 100644 index 90ead8d..0000000 --- a/src_plugin_sdk/CHANGELOG.md +++ /dev/null @@ -1,68 +0,0 @@ -# Ethereum Plugin SDK changelog - -| Icon | Impact | -|----------------------|-------------------------------| -| :rotating_light: | Breaks build | -| :warning: | Breaks compatibility with app | - -## [latest](/) - 2024/02/07 - -### Removed - -* UI disabler - -## [2250549](/../../commit/2250549) - 2024/02/02 - -### Changed - -* The SDK source code has been split into multiple smaller files - -## [3b7e7ad](/../../commit/3b7e7ad) - 2023/12/07 - -### Fixed - -* standard\_plugin build ([this PR on the SDK](https://github.com/LedgerHQ/ledger-secure-sdk/pull/473) had broken it) -* Broken variant auto-setting in the standard\_plugin Makefile -* Missing null-check on parameters received by the plugins - -### Changed - -* utils renamed to plugin\_utils to prevent filename conflicts in plugins - -## [4d8e044](/../../commit/4d8e044) - 2023/11/09 - -### Added - -* standard\_plugin Makefile so plugins can use it & have a really small Makefile -with only the relevant information -* Comments in the plugin interface header file - -## [1fe4085](/../../commit/1fe4085) - 2023/10/19 - -### Changed - -* Now only uses *\_no\_throw* functions, SDK functions now return a boolean -(keeps the guidelines enforcer happy) - -### Added - -* *main* & *dispatch\_call* functions are now part of the SDK and don't need to -be implemented by each plugin :rotating_light: - -## [b9777e7](/../../commit/b9777e7) - 2023/05/16 - -### Added - -* Stax support with information passed from plugin to app-ethereum (with caller app struct) - -## [a4b971f](/../../commit/a4b971f) - 2023/01/24 - -### Changed - -* Removed end space in tickers :warning: - -## [81eb658](/../../commit/81eb658) - 2022/11/17 - -### Added - -* *U2BE\_from\_parameter* & *U4BE\_from\_parameter* safe functions diff --git a/src_plugin_sdk/LICENSE b/src_plugin_sdk/LICENSE deleted file mode 100644 index 8dada3e..0000000 --- a/src_plugin_sdk/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/src_plugin_sdk/README.md b/src_plugin_sdk/README.md deleted file mode 100644 index a5c308d..0000000 --- a/src_plugin_sdk/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# ethereum-plugin-sdk - -This repository is meant to be linked as submodule and used in external plugins working with [app-ethereum](https://github.com/LedgerHQ/app-ethereum). -It is composed of a few headers containing definitions about app-ethereum's internal transaction parsing state and some structures to communicate via shared memory. - -## Updating this SDK - -This SDK is updated at (app-ethereum) build time every time one of app-ethereum internals structures of interest are modified. -If this SDK gets updated, it is possible that all plugins must be recompiled (and eventually updated to work again with the update) with this new SDK. -Be careful, and weight your choices. - -## Manual build - -If for some reasons you want to rebuild this SDK manually from [app-ethereum](https://github.com/LedgerHQ/app-ethereum) (reminder: it is rebuild automatically when building app-ethereum itself): - -```shell -$> ./tools/build_sdk.sh -``` diff --git a/src_plugin_sdk/src/eth_internals.h b/src_plugin_sdk/src/eth_internals.h deleted file mode 100644 index 60087ea..0000000 --- a/src_plugin_sdk/src/eth_internals.h +++ /dev/null @@ -1,21 +0,0 @@ -/******************************************************************************* - * Ledger Ethereum App - * (c) 2016-2019 Ledger - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ********************************************************************************/ - -#pragma once - -// Empty file, introduced to not break compatibility following plugin-sdk structure rework -#warning "Deprecated file, the sdk sources have been rationalized in several dedicated files." diff --git a/src_plugin_sdk/src/main.c b/src_plugin_sdk/src/main.c deleted file mode 100644 index bd5b56c..0000000 --- a/src_plugin_sdk/src/main.c +++ /dev/null @@ -1,129 +0,0 @@ -/***************************************************************************** - * Ledger Plugin SDK - * (c) 2023 Ledger SAS - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *****************************************************************************/ - -#include "eth_plugin_interface.h" -#include "lib_standard_app/swap_lib_calls.h" // RUN_APPLICATION - -// Functions implemented by the plugin -void handle_init_contract(ethPluginInitContract_t *parameters); -void handle_provide_parameter(ethPluginProvideParameter_t *parameters); -void handle_finalize(ethPluginFinalize_t *parameters); -void handle_provide_token(ethPluginProvideInfo_t *parameters); -void handle_query_contract_id(ethQueryContractID_t *parameters); -void handle_query_contract_ui(ethQueryContractUI_t *parameters); - -// Calls the ethereum app. -static void call_app_ethereum() { - unsigned int libcall_params[5]; - libcall_params[0] = (unsigned int) "Ethereum"; - libcall_params[1] = 0x100; - libcall_params[2] = RUN_APPLICATION; - libcall_params[3] = (unsigned int) NULL; -#ifdef HAVE_NBGL - caller_app_t capp; - const char name[] = APPNAME; - nbgl_icon_details_t icon_details; - uint8_t bitmap[sizeof(ICONBITMAP)]; - - memcpy(&icon_details, &ICONGLYPH, sizeof(ICONGLYPH)); - memcpy(&bitmap, &ICONBITMAP, sizeof(bitmap)); - icon_details.bitmap = (const uint8_t *) bitmap; - capp.name = (const char *) name; - capp.icon = &icon_details; - libcall_params[4] = (unsigned int) &capp; -#else - libcall_params[4] = (unsigned int) NULL; -#endif - os_lib_call((unsigned int *) &libcall_params); -} - -// Function to dispatch calls from the ethereum app. -static void dispatch_call(int message, void *parameters) { - if (parameters != NULL) { - switch (message) { - case ETH_PLUGIN_INIT_CONTRACT: - handle_init_contract(parameters); - break; - case ETH_PLUGIN_PROVIDE_PARAMETER: - handle_provide_parameter(parameters); - break; - case ETH_PLUGIN_FINALIZE: - handle_finalize(parameters); - break; - case ETH_PLUGIN_PROVIDE_INFO: - handle_provide_token(parameters); - break; - case ETH_PLUGIN_QUERY_CONTRACT_ID: - handle_query_contract_id(parameters); - break; - case ETH_PLUGIN_QUERY_CONTRACT_UI: - handle_query_contract_ui(parameters); - break; - default: - PRINTF("Unhandled message %d\n", message); - break; - } - } else { - PRINTF("Received null parameters\n"); - } -} - -// Low-level main for plugins. -__attribute__((section(".boot"))) int main(int arg0) { - // Exit critical section - __asm volatile("cpsie i"); - - os_boot(); - - BEGIN_TRY { - TRY { - // Check if plugin is called from the dashboard. - if (!arg0) { - // Called from dashboard, launch Ethereum app - call_app_ethereum(); - - // Will not get reached. - __builtin_unreachable(); - - os_sched_exit(-1); - - } else { - // Not called from dashboard: called from the ethereum app! - const unsigned int *args = (unsigned int *) arg0; - - // If `ETH_PLUGIN_CHECK_PRESENCE` is set, this means the caller is just trying to - // know whether this app exists or not. We can skip `paraswap_plugin_call`. - if (args[0] != ETH_PLUGIN_CHECK_PRESENCE) { - dispatch_call(args[0], (void *) args[1]); - } - } - - // Call `os_lib_end`, go back to the ethereum app. - os_lib_end(); - - // Will not get reached. - __builtin_unreachable(); - } - CATCH_OTHER(e) { - PRINTF("Exiting following exception: %d\n", e); - } - FINALLY { - os_lib_end(); - } - } - END_TRY; -} diff --git a/src_plugin_sdk/standard_plugin.mk b/src_plugin_sdk/standard_plugin.mk deleted file mode 100644 index f52c132..0000000 --- a/src_plugin_sdk/standard_plugin.mk +++ /dev/null @@ -1,59 +0,0 @@ -# **************************************************************************** -# Ledger Ethereum Plugin SDK -# (c) 2023 Ledger SAS. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# **************************************************************************** - -ifeq ($(BOLOS_SDK),) -$(error Environment variable BOLOS_SDK is not set) -endif - -include $(BOLOS_SDK)/Makefile.defines - -APPVERSION ?= "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" - -# Application source files -APP_SOURCE_PATH += src ethereum-plugin-sdk - -# Application icons following guidelines: -# https://developers.ledger.com/docs/embedded-app/design-requirements/#device-icon -NORMAL_NAME ?= $(shell echo -n "$(APPNAME)" | tr " ." "_" | tr "[:upper:]" "[:lower:]") -ICON_NANOS = icons/nanos_app_$(NORMAL_NAME).gif -ICON_NANOX = icons/nanox_app_$(NORMAL_NAME).gif -ICON_NANOSP = $(ICON_NANOX) -ICON_STAX = icons/stax_app_$(NORMAL_NAME).gif - -ifeq ($(TARGET_NAME),TARGET_STAX) - DEFINES += ICONGLYPH=C_stax_$(NORMAL_NAME)_64px - DEFINES += ICONBITMAP=C_stax_$(NORMAL_NAME)_64px_bitmap -endif - -CURVE_APP_LOAD_PARAMS = secp256k1 - -PATH_APP_LOAD_PARAMS ?= "44'/60'" - -VARIANT_PARAM = COIN -VARIANT_VALUES ?= $(NORMAL_NAME) - -HAVE_APPLICATION_FLAG_LIBRARY = 1 - -DISABLE_STANDARD_APP_FILES = 1 -DISABLE_STANDARD_SNPRINTF = 1 -DISABLE_STANDARD_USB = 1 -DISABLE_STANDARD_WEBUSB = 1 -DISABLE_STANDARD_BAGL_UX_FLOW = 1 -DISABLE_DEBUG_LEDGER_ASSERT = 1 -DISABLE_DEBUG_THROW = 1 - -include $(BOLOS_SDK)/Makefile.standard_app diff --git a/src_plugins/erc1155/erc1155_plugin.c b/src_plugins/erc1155/erc1155_plugin.c index b81aa8d..b1704ca 100644 --- a/src_plugins/erc1155/erc1155_plugin.c +++ b/src_plugins/erc1155/erc1155_plugin.c @@ -27,7 +27,7 @@ static void handle_init_contract(void *parameters) { } uint8_t i; for (i = 0; i < SELECTORS_COUNT; i++) { - if (memcmp((uint8_t *) PIC(ERC1155_SELECTORS[i]), msg->selector, SELECTOR_SIZE) == 0) { + if (memcmp(PIC(ERC1155_SELECTORS[i]), msg->selector, SELECTOR_SIZE) == 0) { context->selectorIndex = i; break; } diff --git a/src_plugins/erc1155/erc1155_ui.c b/src_plugins/erc1155/erc1155_ui.c index a31dd96..1e9d451 100644 --- a/src_plugins/erc1155/erc1155_ui.c +++ b/src_plugins/erc1155/erc1155_ui.c @@ -17,7 +17,6 @@ static void set_approval_for_all_ui(ethQueryContractUI_t *msg, erc1155_context_t if (!getEthDisplayableAddress(context->address, msg->msg, msg->msgLength, - &global_sha3, chainConfig->chainId)) { msg->result = ETH_PLUGIN_RESULT_ERROR; } @@ -31,7 +30,6 @@ static void set_approval_for_all_ui(ethQueryContractUI_t *msg, erc1155_context_t if (!getEthDisplayableAddress(msg->item1->nft.contractAddress, msg->msg, msg->msgLength, - &global_sha3, chainConfig->chainId)) { msg->result = ETH_PLUGIN_RESULT_ERROR; } @@ -50,7 +48,6 @@ static void set_transfer_ui(ethQueryContractUI_t *msg, erc1155_context_t *contex if (!getEthDisplayableAddress(context->address, msg->msg, msg->msgLength, - &global_sha3, chainConfig->chainId)) { msg->result = ETH_PLUGIN_RESULT_ERROR; } @@ -64,7 +61,6 @@ static void set_transfer_ui(ethQueryContractUI_t *msg, erc1155_context_t *contex if (!getEthDisplayableAddress(msg->item1->nft.contractAddress, msg->msg, msg->msgLength, - &global_sha3, chainConfig->chainId)) { msg->result = ETH_PLUGIN_RESULT_ERROR; } @@ -100,7 +96,6 @@ static void set_batch_transfer_ui(ethQueryContractUI_t *msg, erc1155_context_t * if (!getEthDisplayableAddress(context->address, msg->msg, msg->msgLength, - &global_sha3, chainConfig->chainId)) { msg->result = ETH_PLUGIN_RESULT_ERROR; } @@ -114,7 +109,6 @@ static void set_batch_transfer_ui(ethQueryContractUI_t *msg, erc1155_context_t * if (!getEthDisplayableAddress(msg->item1->nft.contractAddress, msg->msg, msg->msgLength, - &global_sha3, chainConfig->chainId)) { msg->result = ETH_PLUGIN_RESULT_ERROR; } diff --git a/src_plugins/erc20/erc20_plugin.c b/src_plugins/erc20/erc20_plugin.c index e5b1ba0..009336f 100644 --- a/src_plugins/erc20/erc20_plugin.c +++ b/src_plugins/erc20/erc20_plugin.c @@ -64,7 +64,7 @@ const contract_t CONTRACTS[NUM_CONTRACTS] = { bool check_contract(erc20_parameters_t *context) { for (size_t i = 0; i < NUM_CONTRACTS; i++) { - contract_t *contract = (contract_t *) PIC(&CONTRACTS[i]); + const contract_t *contract = (const contract_t *) PIC(&CONTRACTS[i]); if (memcmp(contract->address, context->destinationAddress, ADDRESS_LENGTH) == 0) { strlcpy(context->contract_name, contract->name, sizeof(context->contract_name)); return true; @@ -204,7 +204,6 @@ void erc20_plugin_call(int message, void *parameters) { if (!getEthDisplayableAddress(context->destinationAddress, msg->msg, msg->msgLength, - msg->pluginSharedRW->sha3, chainConfig->chainId)) { msg->result = ETH_PLUGIN_RESULT_ERROR; } diff --git a/src_plugins/erc721/erc721_plugin.c b/src_plugins/erc721/erc721_plugin.c index bfe12cd..07ba0c7 100644 --- a/src_plugins/erc721/erc721_plugin.c +++ b/src_plugins/erc721/erc721_plugin.c @@ -32,7 +32,7 @@ static void handle_init_contract(void *parameters) { } uint8_t i; for (i = 0; i < SELECTORS_COUNT; i++) { - if (memcmp((uint8_t *) PIC(ERC721_SELECTORS[i]), msg->selector, SELECTOR_SIZE) == 0) { + if (memcmp(PIC(ERC721_SELECTORS[i]), msg->selector, SELECTOR_SIZE) == 0) { context->selectorIndex = i; break; } diff --git a/src_plugins/erc721/erc721_ui.c b/src_plugins/erc721/erc721_ui.c index e948087..1c0facd 100644 --- a/src_plugins/erc721/erc721_ui.c +++ b/src_plugins/erc721/erc721_ui.c @@ -13,7 +13,6 @@ static void set_approval_ui(ethQueryContractUI_t *msg, erc721_context_t *context if (!getEthDisplayableAddress(context->address, msg->msg, msg->msgLength, - &global_sha3, chainConfig->chainId)) { msg->result = ETH_PLUGIN_RESULT_ERROR; } @@ -27,7 +26,6 @@ static void set_approval_ui(ethQueryContractUI_t *msg, erc721_context_t *context if (!getEthDisplayableAddress(msg->item1->nft.contractAddress, msg->msg, msg->msgLength, - &global_sha3, chainConfig->chainId)) { msg->result = ETH_PLUGIN_RESULT_ERROR; } @@ -59,7 +57,6 @@ static void set_approval_for_all_ui(ethQueryContractUI_t *msg, erc721_context_t if (!getEthDisplayableAddress(context->address, msg->msg, msg->msgLength, - &global_sha3, chainConfig->chainId)) { msg->result = ETH_PLUGIN_RESULT_ERROR; } @@ -73,7 +70,6 @@ static void set_approval_for_all_ui(ethQueryContractUI_t *msg, erc721_context_t if (!getEthDisplayableAddress(msg->item1->nft.contractAddress, msg->msg, msg->msgLength, - &global_sha3, chainConfig->chainId)) { msg->result = ETH_PLUGIN_RESULT_ERROR; } @@ -92,7 +88,6 @@ static void set_transfer_ui(ethQueryContractUI_t *msg, erc721_context_t *context if (!getEthDisplayableAddress(context->address, msg->msg, msg->msgLength, - &global_sha3, chainConfig->chainId)) { msg->result = ETH_PLUGIN_RESULT_ERROR; } @@ -106,7 +101,6 @@ static void set_transfer_ui(ethQueryContractUI_t *msg, erc721_context_t *context if (!getEthDisplayableAddress(msg->item1->nft.contractAddress, msg->msg, msg->msgLength, - &global_sha3, chainConfig->chainId)) { msg->result = ETH_PLUGIN_RESULT_ERROR; } diff --git a/src_plugins/eth2/eth2_plugin.c b/src_plugins/eth2/eth2_plugin.c index 588199e..9c42e31 100644 --- a/src_plugins/eth2/eth2_plugin.c +++ b/src_plugins/eth2/eth2_plugin.c @@ -119,7 +119,6 @@ void eth2_plugin_call(int message, void *parameters) { if (!getEthDisplayableAddress((uint8_t *) context->deposit_address, tmp, sizeof(tmp), - msg->pluginSharedRW->sha3, chainConfig->chainId)) { msg->result = ETH_PLUGIN_RESULT_ERROR; return; @@ -200,7 +199,7 @@ void eth2_plugin_call(int message, void *parameters) { switch (msg->screenIndex) { case 0: { // Amount screen uint8_t decimals = WEI_TO_ETHER; - char *ticker = chainConfig->coinName; + const char *ticker = chainConfig->coinName; strlcpy(msg->title, "Amount", msg->titleLength); if (!amountToString(tmpContent.txContent.value.value, tmpContent.txContent.value.length, diff --git a/tests/speculos/ethereum_client/__init__.py b/tests/ragger/.test_dependencies/clone/.clone_application_goes_there similarity index 100% rename from tests/speculos/ethereum_client/__init__.py rename to tests/ragger/.test_dependencies/clone/.clone_application_goes_there diff --git a/tests/ragger/client b/tests/ragger/client index 96cd109..66dee0e 120000 --- a/tests/ragger/client +++ b/tests/ragger/client @@ -1 +1 @@ -../../client \ No newline at end of file +../../client/src/ledger_app_clients/ethereum \ No newline at end of file diff --git a/tests/ragger/conftest.py b/tests/ragger/conftest.py index 6dd6f4b..086d95e 100644 --- a/tests/ragger/conftest.py +++ b/tests/ragger/conftest.py @@ -1,4 +1,50 @@ +import sys +from pathlib import Path +from os import path +import warnings +import glob + from ragger.conftest import configuration +####################### +# CONFIGURATION START # +####################### + +# You can configure optional parameters by overriding the value of +# ragger.configuration.OPTIONAL_CONFIGURATION +# Please refer to ragger/conftest/configuration.py for their descriptions and accepted values + +def pytest_addoption(parser): + parser.addoption("--with_lib_mode", action="store_true", help="Run the test with Library Mode") + + +pattern = f"{Path(__file__).parent}/test_*.py" +testFiles = [path.basename(x) for x in glob.glob(pattern)] +collect_ignore = [] +if "--with_lib_mode" in sys.argv: + + # ============================================================================== + # /!\ Tests are started in Library mode: unselect (ignore) unrelated modules /!\ + # ============================================================================== + + warnings.warn("Main app is started in library mode") + + configuration.OPTIONAL.MAIN_APP_DIR = "tests/ragger/.test_dependencies/" + + collect_ignore += [f for f in testFiles if "test_clone" not in f] + +else: + + # =========================================================================== + # /!\ Standards tests without Library mode: unselect (ignore) clone tests /!\ + # =========================================================================== + + collect_ignore += [f for f in testFiles if "test_clone" in f] + + +##################### +# CONFIGURATION END # +##################### + # Pull all features from the base ragger conftest using the overridden configuration pytest_plugins = ("ragger.conftest.base_conftest", ) diff --git a/tests/ragger/constants.py b/tests/ragger/constants.py index 0f375a7..8a434df 100644 --- a/tests/ragger/constants.py +++ b/tests/ragger/constants.py @@ -1,5 +1,3 @@ -from pathlib import Path import os -ROOT_SNAPSHOT_PATH = Path(__file__).parent -ABIS_FOLDER = "%s/abis" % (os.path.dirname(__file__)) +ABIS_FOLDER = f"{os.path.dirname(__file__)}/abis" diff --git a/tests/ragger/eip712_input_files/00-simple_mail-filter.json b/tests/ragger/eip712_input_files/00-simple_mail-filter.json index 33399d1..bb49570 100644 --- a/tests/ragger/eip712_input_files/00-simple_mail-filter.json +++ b/tests/ragger/eip712_input_files/00-simple_mail-filter.json @@ -1,7 +1,13 @@ { "name": "Test JSON", "fields": { - "from.name": "From", - "to.name" : "To" + "from.name": { + "type": "raw", + "name": "From" + }, + "to.name": { + "type": "raw", + "name": "To" + } } -} +} \ No newline at end of file diff --git a/tests/ragger/eip712_input_files/00-simple_mail.ini b/tests/ragger/eip712_input_files/00-simple_mail.ini deleted file mode 100644 index 62d03bd..0000000 --- a/tests/ragger/eip712_input_files/00-simple_mail.ini +++ /dev/null @@ -1,4 +0,0 @@ -[signature] -v = 1b -r = 23599abd6c4b631e42770c112b5955907fe91339f1ea1e102f7682262ca178b9 -s = 29fc94518588165114b4c4acb4d73e6d028dfb051d90e517b3b4746e04eb0f5f diff --git a/tests/ragger/eip712_input_files/01-addresses_array_mail.ini b/tests/ragger/eip712_input_files/01-addresses_array_mail.ini deleted file mode 100644 index d972658..0000000 --- a/tests/ragger/eip712_input_files/01-addresses_array_mail.ini +++ /dev/null @@ -1,4 +0,0 @@ -[signature] -v = 1c -r = 3f084a471e6158bce792287500d62d40061acc1864180ed2da7a704bf3aced0f -s = 3b799ced9e48cda152b4b9a4b7f45e3119dc7acdf16710a73800b4e336fa1b40 diff --git a/tests/ragger/eip712_input_files/02-recipients_array_mail-data.json b/tests/ragger/eip712_input_files/02-recipients_array_mail-data.json index 1d27ff0..97a4cb9 100644 --- a/tests/ragger/eip712_input_files/02-recipients_array_mail-data.json +++ b/tests/ragger/eip712_input_files/02-recipients_array_mail-data.json @@ -38,10 +38,6 @@ { "name": "chainId", "type": "uint256" }, { "name": "verifyingContract", "type": "address" } ], - "Group": [ - { "name": "name", "type": "string" }, - { "name": "members", "type": "Person[]" } - ], "Mail": [ { "name": "from", "type": "Person" }, { "name": "to", "type": "Person[]" }, diff --git a/tests/ragger/eip712_input_files/02-recipients_array_mail.ini b/tests/ragger/eip712_input_files/02-recipients_array_mail.ini deleted file mode 100644 index 8e8dcff..0000000 --- a/tests/ragger/eip712_input_files/02-recipients_array_mail.ini +++ /dev/null @@ -1,4 +0,0 @@ -[signature] -v = 1b -r = 49dd2aa96d7494e0cd9111f19f87ac50194e4bbc61ea9f4bb86d674da0ae7721 -s = 7a12ddd9083b4caaabd2fb80df6de1d5d926c0e8a73bf371a45e231d409d79d6 diff --git a/tests/ragger/eip712_input_files/03-long_string-data.json b/tests/ragger/eip712_input_files/03-long_string-data.json index d286934..e2917c4 100644 --- a/tests/ragger/eip712_input_files/03-long_string-data.json +++ b/tests/ragger/eip712_input_files/03-long_string-data.json @@ -33,10 +33,6 @@ { "name": "chainId", "type": "uint256" }, { "name": "verifyingContract", "type": "address" } ], - "Group": [ - { "name": "name", "type": "string" }, - { "name": "members", "type": "Person[]" } - ], "Mail": [ { "name": "from", "type": "Person" }, { "name": "to", "type": "Person[]" }, diff --git a/tests/ragger/eip712_input_files/03-long_string.ini b/tests/ragger/eip712_input_files/03-long_string.ini deleted file mode 100644 index 9b2740a..0000000 --- a/tests/ragger/eip712_input_files/03-long_string.ini +++ /dev/null @@ -1,4 +0,0 @@ -[signature] -v = 1c -r = b23ffac2cb350fd6e7d06ec4b981fe016d33426d753c870e7e753797cc43bb1f -s = 37948a656fa3403e21956ef10c8d3152f7ce22cc252d958c9f9249435090f426 diff --git a/tests/ragger/eip712_input_files/04-long_bytes-data.json b/tests/ragger/eip712_input_files/04-long_bytes-data.json index 5bcfe55..d526774 100644 --- a/tests/ragger/eip712_input_files/04-long_bytes-data.json +++ b/tests/ragger/eip712_input_files/04-long_bytes-data.json @@ -33,10 +33,6 @@ { "name": "chainId", "type": "uint256" }, { "name": "verifyingContract", "type": "address" } ], - "Group": [ - { "name": "name", "type": "string" }, - { "name": "members", "type": "Person[]" } - ], "Mail": [ { "name": "from", "type": "Person" }, { "name": "to", "type": "Person[]" }, diff --git a/tests/ragger/eip712_input_files/04-long_bytes.ini b/tests/ragger/eip712_input_files/04-long_bytes.ini deleted file mode 100644 index 14018b7..0000000 --- a/tests/ragger/eip712_input_files/04-long_bytes.ini +++ /dev/null @@ -1,4 +0,0 @@ -[signature] -v = 1b -r = db18ea1b9757773385138d0802fb2f8107c3e45882962b8e0c6789eccdbfab05 -s = 3d66d4dee47916fb7fec39a538ad8d5e94fbc92f99327410716180ab07591218 diff --git a/tests/ragger/eip712_input_files/05-signed_ints.ini b/tests/ragger/eip712_input_files/05-signed_ints.ini deleted file mode 100644 index 754b2b3..0000000 --- a/tests/ragger/eip712_input_files/05-signed_ints.ini +++ /dev/null @@ -1,4 +0,0 @@ -[signature] -v = 1c -r = 50fb2861367daf3b5b73cac277e698b27bf7627a462fade1acb5a2ef285ba8ae -s = 131a62515a0a5c4b35c5cb672b46f562151c45508d8efcdf78c4608bc14c5f30 diff --git a/tests/ragger/eip712_input_files/06-boolean.ini b/tests/ragger/eip712_input_files/06-boolean.ini deleted file mode 100644 index e7de2b3..0000000 --- a/tests/ragger/eip712_input_files/06-boolean.ini +++ /dev/null @@ -1,4 +0,0 @@ -[signature] -v = 1c -r = 929681d77ed88cd1adef57185a0cd7b3a268aca5d4122b8c0acfd2ce4c0afb18 -s = 5afe8e3004c182b6b02fe7559c26f20f4133ad9b17223658ccd9061b33b021cf diff --git a/tests/ragger/eip712_input_files/07-fixed_bytes.ini b/tests/ragger/eip712_input_files/07-fixed_bytes.ini deleted file mode 100644 index e2f661e..0000000 --- a/tests/ragger/eip712_input_files/07-fixed_bytes.ini +++ /dev/null @@ -1,4 +0,0 @@ -[signature] -v = 1b -r = e021d88afc50079b0341b01193c4687c47b85bcd6749fe69e0b87521d65a1847 -s = 5b7670d2a67c781a11164920403db0f7707161e81d88226cdbf91298390dfeda diff --git a/tests/ragger/eip712_input_files/08-opensea-filter.json b/tests/ragger/eip712_input_files/08-opensea-filter.json index 6f1d9f5..e70eb80 100644 --- a/tests/ragger/eip712_input_files/08-opensea-filter.json +++ b/tests/ragger/eip712_input_files/08-opensea-filter.json @@ -1,9 +1,21 @@ { "name": "OpenSea", "fields": { - "maker": "Maker", - "taker": "Taker", - "basePrice": "Base Price", - "expirationTime": "Expiration Time" + "maker": { + "type": "raw", + "name": "Maker" + }, + "taker": { + "type": "raw", + "name": "Taker" + }, + "basePrice": { + "type": "raw", + "name": "Base Price" + }, + "expirationTime": { + "type": "raw", + "name": "Expiration Time" + } } -} +} \ No newline at end of file diff --git a/tests/ragger/eip712_input_files/08-opensea.ini b/tests/ragger/eip712_input_files/08-opensea.ini deleted file mode 100644 index dfef6bb..0000000 --- a/tests/ragger/eip712_input_files/08-opensea.ini +++ /dev/null @@ -1,4 +0,0 @@ -[signature] -v = 1b -r = 1539547ae7cf8ebcd3eabfb57cd2b1fb7775ce757c3f4a307c7425d35b7bfff7 -s = 47248cb61e554c1f90af6331d9c9e51cbb8655667514194f509abe097a032319 diff --git a/tests/ragger/eip712_input_files/09-rarible.ini b/tests/ragger/eip712_input_files/09-rarible.ini deleted file mode 100644 index d880f0c..0000000 --- a/tests/ragger/eip712_input_files/09-rarible.ini +++ /dev/null @@ -1,4 +0,0 @@ -[signature] -v = 1c -r = 341bca1c0dfd805d4befc21500084424dbe559c7aafd78d8fb461c0c76dfea1d -s = 33ebb7b6fe0691961cd8b263faac20ecbbdcaef3febb57eb76614cad629080ea diff --git a/tests/ragger/eip712_input_files/10-multidimensional_arrays.ini b/tests/ragger/eip712_input_files/10-multidimensional_arrays.ini deleted file mode 100644 index 63113be..0000000 --- a/tests/ragger/eip712_input_files/10-multidimensional_arrays.ini +++ /dev/null @@ -1,4 +0,0 @@ -[signature] -v = 1b -r = d11a91bdf7836288818875d046452061d565cc6dc1bf3dd6216ab27ef9a2844f -s = 4f6bda8ac4c39721aff7ae08989897ede9d573085a192d03ab0eb7735d2ef403 diff --git a/tests/ragger/eip712_input_files/11-complex_structs-filter.json b/tests/ragger/eip712_input_files/11-complex_structs-filter.json index a38240d..7623043 100644 --- a/tests/ragger/eip712_input_files/11-complex_structs-filter.json +++ b/tests/ragger/eip712_input_files/11-complex_structs-filter.json @@ -1,9 +1,21 @@ { "name": "Depthy Test", "fields": { - "contents": "Message", - "from.name": "Sender", - "to.members.[].name": "Recipient", - "attach.list.[].name": "Attachment" + "contents": { + "type": "raw", + "name": "Message" + }, + "from.name": { + "type": "raw", + "name": "Sender" + }, + "to.members.[].name": { + "type": "raw", + "name": "Recipient" + }, + "attach.list.[].name": { + "type": "raw", + "name": "Attachment" + } } -} +} \ No newline at end of file diff --git a/tests/ragger/eip712_input_files/11-complex_structs.ini b/tests/ragger/eip712_input_files/11-complex_structs.ini deleted file mode 100644 index ec35ea3..0000000 --- a/tests/ragger/eip712_input_files/11-complex_structs.ini +++ /dev/null @@ -1,4 +0,0 @@ -[signature] -v = 1c -r = cce2e63aaac6a5f9a74684d8fdddcbc7f3b27aa17235bfab89226821ead933b6 -s = 3f3c93977abcc3f8cc9a3dc1ecc02dbca14aca1a6ecb2fb6ca3d7c713ace1ec4 diff --git a/tests/ragger/eip712_input_files/12-sign_in-filter.json b/tests/ragger/eip712_input_files/12-sign_in-filter.json index 69da4f1..46aa82a 100644 --- a/tests/ragger/eip712_input_files/12-sign_in-filter.json +++ b/tests/ragger/eip712_input_files/12-sign_in-filter.json @@ -1,7 +1,13 @@ { "name": "Ethereum sign-in", "fields": { - "curDate": "Timestamp", - "id": "Identifier" + "curDate": { + "type": "raw", + "name": "Timestamp" + }, + "id": { + "type": "raw", + "name": "Identifier" + } } -} +} \ No newline at end of file diff --git a/tests/ragger/eip712_input_files/12-sign_in.ini b/tests/ragger/eip712_input_files/12-sign_in.ini deleted file mode 100644 index 83047ab..0000000 --- a/tests/ragger/eip712_input_files/12-sign_in.ini +++ /dev/null @@ -1,4 +0,0 @@ -[signature] -v = 1b -r = 7be1671577753c13bfd1da8b234b6df8484daf47351c2366637fd291dd4aa4d9 -s = 1a7ffbb01dc8a64e9ee97d19b8f154e9eecbe0b1bfb9dcfa781a65e474573963 diff --git a/tests/ragger/eip712_input_files/13-empty_arrays-data.json b/tests/ragger/eip712_input_files/13-empty_arrays-data.json index 7a1f939..4bbf129 100644 --- a/tests/ragger/eip712_input_files/13-empty_arrays-data.json +++ b/tests/ragger/eip712_input_files/13-empty_arrays-data.json @@ -6,19 +6,36 @@ "version": "1" }, "message": { - "list1": [], - "list2": [], - "list3": [ + "test1": [], + "test2": [ [ - "1", - "2" + "one", + "two" ], [], [ - "3", - "4" + "three", + "four" ] - ] + ], + "test3": [ + { + "sub": [ + { + "sub": [], + "value": 3 + } + ], + "value": 1 + } + ], + "test4": [ + { + "sub": [], + "value": 2 + } + ], + "test5": [] }, "primaryType": "Struct", "types": { @@ -29,9 +46,22 @@ { "name": "verifyingContract", "type": "address" } ], "Struct": [ - { "name": "list1", "type": "EIP712Domain[]" }, - { "name": "list2", "type": "uint8[]" }, - { "name": "list3", "type": "string[][]" } + { "name": "test1", "type": "uint8[]" }, + { "name": "test2", "type": "string[][]" }, + { "name": "test3", "type": "Top[]" }, + { "name": "test4", "type": "Top[]" }, + { "name": "test5", "type": "Top[]" } + ], + "Bottom": [ + { "name": "value", "type": "uint8" } + ], + "Mid": [ + { "name": "sub", "type": "Bottom[]" }, + { "name": "value", "type": "uint8" } + ], + "Top": [ + { "name": "sub", "type": "Mid[]" }, + { "name": "value", "type": "uint8" } ] } } diff --git a/tests/ragger/eip712_input_files/13-empty_arrays.ini b/tests/ragger/eip712_input_files/13-empty_arrays.ini deleted file mode 100644 index 4784a48..0000000 --- a/tests/ragger/eip712_input_files/13-empty_arrays.ini +++ /dev/null @@ -1,4 +0,0 @@ -[signature] -v = 1b -r = 5d0635a868602e29366da6328f8fadf2d6a9b4e69ee7a65928e85ca56fb1b515 -s = 257364d6faaf5687edf90c3984f4240b0ce7b2dee55aa1f8f39c32d0d4d8c93d diff --git a/tests/ragger/eip712_input_files/14-rabby_bug-data.json b/tests/ragger/eip712_input_files/14-rabby_bug-data.json new file mode 100644 index 0000000..feb160d --- /dev/null +++ b/tests/ragger/eip712_input_files/14-rabby_bug-data.json @@ -0,0 +1,61 @@ +{ + "types": { + "BatchSignedERC721Orders": [ + { "type": "address", "name": "maker" }, + { "type": "uint256", "name": "listingTime" }, + { "type": "uint256", "name": "expiryTime" }, + { "type": "uint256", "name": "startNonce" }, + { "type": "address", "name": "erc20Token" }, + { "type": "address", "name": "platformFeeRecipient" }, + { "type": "BasicCollection[]", "name": "basicCollections" }, + { "type": "Collection[]", "name": "collections" }, + { "type": "uint256", "name": "hashNonce" } + ], + "BasicCollection": [ + { "type": "address", "name": "nftAddress" }, + { "type": "bytes32", "name": "fee" }, + { "type": "bytes32[]", "name": "items" } + ], + "Collection": [ + { "type": "address", "name": "nftAddress" }, + { "type": "bytes32", "name": "fee" }, + { "type": "OrderItem[]", "name": "items" } + ], + "OrderItem": [ + { "type": "uint256", "name": "erc20TokenAmount" }, + { "type": "uint256", "name": "nftId" } + ], + "EIP712Domain": [ + { "name": "name", "type": "string" }, + { "name": "version", "type": "string" }, + { "name": "chainId", "type": "uint256" }, + { "name": "verifyingContract", "type": "address" } + ] + }, + "domain": { + "name": "ElementEx", + "version": "1.0.0", + "chainId": "5000", + "verifyingContract": "0x2fa13cf695ec51ded5b8e45ad0bef838ab17e2af" + }, + "primaryType": "BatchSignedERC721Orders", + "message": { + "maker": "0x6d3b90747dbf5883bf88ff7eb5fcc86f408b5409", + "listingTime": "1706688449", + "expiryTime": "1709280466", + "startNonce": "7", + "erc20Token": "0x09bc4e0d864854c6afb6eb9a9cdf58ac190d0df9", + "platformFeeRecipient": "0x07538262ae993ca117a0e481f908209137a4626e", + "basicCollections": [ + { + "nftAddress": "0xaaaea1fb9f3de3f70e89f37b69ab11b47eb9ce6f", + "fee": "0x000000000000000000c80000000000000000000000000000000000000000000", + "items": [ + "0x000000000000000020c8558000000000000000000000000000000000000005d" + ] + } + ], + "collections": [], + "hashNonce": "0" + } +} diff --git a/tests/ragger/eip712_input_files/address_substitution.json b/tests/ragger/eip712_input_files/address_substitution.json deleted file mode 100644 index 3cff494..0000000 --- a/tests/ragger/eip712_input_files/address_substitution.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "domain": { - "chainId": 1, - "name": "Token test", - "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC", - "version": "1" - }, - "message": { - "from": "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa", - "to": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", - "amount": "117", - "token": "0x6B175474E89094C44Da98b954EedeAC495271d0F" - }, - "primaryType": "Transfer", - "types": { - "EIP712Domain": [ - { "name": "name", "type": "string" }, - { "name": "version", "type": "string" }, - { "name": "chainId", "type": "uint256" }, - { "name": "verifyingContract", "type": "address" } - ], - "Transfer": [ - { "name": "from", "type": "address" }, - { "name": "to", "type": "address" }, - { "name": "amount", "type": "uint256" }, - { "name": "token", "type": "address" } - ] - } -} diff --git a/tests/ragger/requirements.txt b/tests/ragger/requirements.txt index 1149a75..2cf1b16 100644 --- a/tests/ragger/requirements.txt +++ b/tests/ragger/requirements.txt @@ -1,3 +1,5 @@ pytest ecdsa -./client/ +web3~=6.0 +ragger[speculos] +py_ecc diff --git a/tests/speculos/setup.cfg b/tests/ragger/setup.cfg similarity index 52% rename from tests/speculos/setup.cfg rename to tests/ragger/setup.cfg index c79fd88..89bf1ed 100644 --- a/tests/speculos/setup.cfg +++ b/tests/ragger/setup.cfg @@ -7,11 +7,19 @@ disable = C0114, # missing-module-docstring C0116, # missing-function-docstring C0103, # invalid-name R0801, # duplicate-code - R0913 # too-many-arguments + R0903, # too-few-public-methods + R0904, # too-many-public-methods + R0911, # too-many-statements + R0912, # too-many-branches + R0913, # too-many-arguments + R0914, # too-many-locals + W0603, # global-statement + E0401 # import-error extension-pkg-whitelist=hid +max-line-length = 130 [pycodestyle] -max-line-length = 90 +max-line-length = 130 [mypy-hid.*] ignore_missing_imports = True diff --git a/tests/ragger/snapshots/flex/blind-signed_approval/00000.png b/tests/ragger/snapshots/flex/blind-signed_approval/00000.png new file mode 100644 index 0000000..2f16808 Binary files /dev/null and b/tests/ragger/snapshots/flex/blind-signed_approval/00000.png differ diff --git a/tests/ragger/snapshots/flex/blind-signed_approval/00001.png b/tests/ragger/snapshots/flex/blind-signed_approval/00001.png new file mode 100644 index 0000000..f5b3e29 Binary files /dev/null and b/tests/ragger/snapshots/flex/blind-signed_approval/00001.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_non_mainnet/00000.png b/tests/ragger/snapshots/flex/domain_name_non_mainnet/00000.png new file mode 100644 index 0000000..386de61 Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_non_mainnet/00000.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_non_mainnet/00001.png b/tests/ragger/snapshots/flex/domain_name_non_mainnet/00001.png new file mode 100644 index 0000000..77e339b Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_non_mainnet/00001.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_non_mainnet/00002.png b/tests/ragger/snapshots/flex/domain_name_non_mainnet/00002.png new file mode 100644 index 0000000..a917445 Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_non_mainnet/00002.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_non_mainnet/00003.png b/tests/ragger/snapshots/flex/domain_name_non_mainnet/00003.png new file mode 100644 index 0000000..71b2e98 Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_non_mainnet/00003.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_non_mainnet/00004.png b/tests/ragger/snapshots/flex/domain_name_non_mainnet/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_non_mainnet/00004.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_non_mainnet/00005.png b/tests/ragger/snapshots/flex/domain_name_non_mainnet/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_non_mainnet/00005.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_unknown_chain/00000.png b/tests/ragger/snapshots/flex/domain_name_unknown_chain/00000.png new file mode 100644 index 0000000..7dc2eae Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_unknown_chain/00000.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_unknown_chain/00001.png b/tests/ragger/snapshots/flex/domain_name_unknown_chain/00001.png new file mode 100644 index 0000000..bb69fdc Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_unknown_chain/00001.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_unknown_chain/00002.png b/tests/ragger/snapshots/flex/domain_name_unknown_chain/00002.png new file mode 100644 index 0000000..e9331d4 Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_unknown_chain/00002.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_unknown_chain/00003.png b/tests/ragger/snapshots/flex/domain_name_unknown_chain/00003.png new file mode 100644 index 0000000..d5808be Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_unknown_chain/00003.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_unknown_chain/00004.png b/tests/ragger/snapshots/flex/domain_name_unknown_chain/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_unknown_chain/00004.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_unknown_chain/00005.png b/tests/ragger/snapshots/flex/domain_name_unknown_chain/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_unknown_chain/00005.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_verbose_False/00000.png b/tests/ragger/snapshots/flex/domain_name_verbose_False/00000.png new file mode 100644 index 0000000..2cd4319 Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_verbose_False/00000.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_verbose_False/00001.png b/tests/ragger/snapshots/flex/domain_name_verbose_False/00001.png new file mode 100644 index 0000000..77e339b Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_verbose_False/00001.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_verbose_False/00002.png b/tests/ragger/snapshots/flex/domain_name_verbose_False/00002.png new file mode 100644 index 0000000..76e3e70 Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_verbose_False/00002.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_verbose_False/00003.png b/tests/ragger/snapshots/flex/domain_name_verbose_False/00003.png new file mode 100644 index 0000000..99abe61 Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_verbose_False/00003.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_verbose_False/00004.png b/tests/ragger/snapshots/flex/domain_name_verbose_False/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_verbose_False/00004.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_verbose_False/00005.png b/tests/ragger/snapshots/flex/domain_name_verbose_False/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_verbose_False/00005.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_verbose_True/00000.png b/tests/ragger/snapshots/flex/domain_name_verbose_True/00000.png new file mode 100644 index 0000000..2cd4319 Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_verbose_True/00000.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_verbose_True/00001.png b/tests/ragger/snapshots/flex/domain_name_verbose_True/00001.png new file mode 100644 index 0000000..77e339b Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_verbose_True/00001.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_verbose_True/00002.png b/tests/ragger/snapshots/flex/domain_name_verbose_True/00002.png new file mode 100644 index 0000000..d04488b Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_verbose_True/00002.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_verbose_True/00003.png b/tests/ragger/snapshots/flex/domain_name_verbose_True/00003.png new file mode 100644 index 0000000..99abe61 Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_verbose_True/00003.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_verbose_True/00004.png b/tests/ragger/snapshots/flex/domain_name_verbose_True/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_verbose_True/00004.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_verbose_True/00005.png b/tests/ragger/snapshots/flex/domain_name_verbose_True/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_verbose_True/00005.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_wrong_addr/00000.png b/tests/ragger/snapshots/flex/domain_name_wrong_addr/00000.png new file mode 100644 index 0000000..2cd4319 Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_wrong_addr/00000.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_wrong_addr/00001.png b/tests/ragger/snapshots/flex/domain_name_wrong_addr/00001.png new file mode 100644 index 0000000..ed4dc3e Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_wrong_addr/00001.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_wrong_addr/00002.png b/tests/ragger/snapshots/flex/domain_name_wrong_addr/00002.png new file mode 100644 index 0000000..76e3e70 Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_wrong_addr/00002.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_wrong_addr/00003.png b/tests/ragger/snapshots/flex/domain_name_wrong_addr/00003.png new file mode 100644 index 0000000..99abe61 Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_wrong_addr/00003.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_wrong_addr/00004.png b/tests/ragger/snapshots/flex/domain_name_wrong_addr/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_wrong_addr/00004.png differ diff --git a/tests/ragger/snapshots/flex/domain_name_wrong_addr/00005.png b/tests/ragger/snapshots/flex/domain_name_wrong_addr/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/domain_name_wrong_addr/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00000.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00000.png new file mode 100644 index 0000000..3b0deb8 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00001.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00001.png new file mode 100644 index 0000000..9059594 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00002.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00002.png new file mode 100644 index 0000000..a61e457 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00003.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00003.png new file mode 100644 index 0000000..92d1929 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00004.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00004.png new file mode 100644 index 0000000..e3a8717 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00005.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00005.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00006.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00006.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_1/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00000.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00000.png new file mode 100644 index 0000000..982c8de Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00001.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00001.png new file mode 100644 index 0000000..b718b8e Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00002.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00002.png new file mode 100644 index 0000000..62b116d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00003.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00003.png new file mode 100644 index 0000000..bed3797 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00004.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00004.png new file mode 100644 index 0000000..281622f Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00005.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00005.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00006.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00006.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_137/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00000.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00000.png new file mode 100644 index 0000000..f680a46 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00001.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00001.png new file mode 100644 index 0000000..b718b8e Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00002.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00002.png new file mode 100644 index 0000000..72b6fda Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00003.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00003.png new file mode 100644 index 0000000..92d1929 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00004.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00004.png new file mode 100644 index 0000000..ae2e73a Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00005.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00005.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00006.png b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00006.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeBatchTransferFrom_5/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00000.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00000.png new file mode 100644 index 0000000..2d8a17b Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00001.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00001.png new file mode 100644 index 0000000..9059594 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00002.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00002.png new file mode 100644 index 0000000..1ddb16e Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00003.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00003.png new file mode 100644 index 0000000..e4e6c69 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00004.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00004.png new file mode 100644 index 0000000..e77ed86 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00005.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00005.png new file mode 100644 index 0000000..6a11e11 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00006.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00006.png new file mode 100644 index 0000000..6bbdf2f Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00007.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00007.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1-rejected/00007.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00000.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00000.png new file mode 100644 index 0000000..2d8a17b Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00001.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00001.png new file mode 100644 index 0000000..9059594 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00002.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00002.png new file mode 100644 index 0000000..1ddb16e Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00003.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00003.png new file mode 100644 index 0000000..e4e6c69 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00004.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00004.png new file mode 100644 index 0000000..e77ed86 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00005.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00005.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00006.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00006.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_1/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00000.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00000.png new file mode 100644 index 0000000..fd048b2 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00001.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00001.png new file mode 100644 index 0000000..b718b8e Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00002.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00002.png new file mode 100644 index 0000000..ba175d8 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00003.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00003.png new file mode 100644 index 0000000..9ce9e54 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00004.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00004.png new file mode 100644 index 0000000..6e6068c Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00005.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00005.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00006.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00006.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_137/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00000.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00000.png new file mode 100644 index 0000000..4779e90 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00001.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00001.png new file mode 100644 index 0000000..b718b8e Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00002.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00002.png new file mode 100644 index 0000000..f22f03d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00003.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00003.png new file mode 100644 index 0000000..527c57c Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00004.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00004.png new file mode 100644 index 0000000..048bbf4 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00005.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00005.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00006.png b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00006.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_safeTransferFrom_5/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00000.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00000.png new file mode 100644 index 0000000..488291a Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00001.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00001.png new file mode 100644 index 0000000..0854372 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00002.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00002.png new file mode 100644 index 0000000..b16febe Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00003.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00003.png new file mode 100644 index 0000000..bc9c251 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00004.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00005.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_1/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00000.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00000.png new file mode 100644 index 0000000..3be4918 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00001.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00001.png new file mode 100644 index 0000000..f7ea762 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00002.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00002.png new file mode 100644 index 0000000..71ff72f Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00003.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00003.png new file mode 100644 index 0000000..ddb2ddc Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00004.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00005.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00006.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00006.png new file mode 100644 index 0000000..f5b3e29 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_137/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00000.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00000.png new file mode 100644 index 0000000..fbd37e0 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00001.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00001.png new file mode 100644 index 0000000..f7ea762 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00002.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00002.png new file mode 100644 index 0000000..d7c9907 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00003.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00003.png new file mode 100644 index 0000000..3f41be8 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00004.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00005.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00006.png b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00006.png new file mode 100644 index 0000000..f5b3e29 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc1155_setApprovalForAll_5/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_1/00000.png b/tests/ragger/snapshots/flex/erc721_approve_1/00000.png new file mode 100644 index 0000000..488291a Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_1/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_1/00001.png b/tests/ragger/snapshots/flex/erc721_approve_1/00001.png new file mode 100644 index 0000000..47e56f6 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_1/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_1/00002.png b/tests/ragger/snapshots/flex/erc721_approve_1/00002.png new file mode 100644 index 0000000..10012d8 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_1/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_1/00003.png b/tests/ragger/snapshots/flex/erc721_approve_1/00003.png new file mode 100644 index 0000000..bc9c251 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_1/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_1/00004.png b/tests/ragger/snapshots/flex/erc721_approve_1/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_1/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_1/00005.png b/tests/ragger/snapshots/flex/erc721_approve_1/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_1/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_1/00006.png b/tests/ragger/snapshots/flex/erc721_approve_1/00006.png new file mode 100644 index 0000000..f5b3e29 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_1/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_137/00000.png b/tests/ragger/snapshots/flex/erc721_approve_137/00000.png new file mode 100644 index 0000000..8ac194e Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_137/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_137/00001.png b/tests/ragger/snapshots/flex/erc721_approve_137/00001.png new file mode 100644 index 0000000..5c4246e Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_137/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_137/00002.png b/tests/ragger/snapshots/flex/erc721_approve_137/00002.png new file mode 100644 index 0000000..f619df5 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_137/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_137/00003.png b/tests/ragger/snapshots/flex/erc721_approve_137/00003.png new file mode 100644 index 0000000..bed3797 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_137/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_137/00004.png b/tests/ragger/snapshots/flex/erc721_approve_137/00004.png new file mode 100644 index 0000000..4866ce7 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_137/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_137/00005.png b/tests/ragger/snapshots/flex/erc721_approve_137/00005.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_137/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_137/00006.png b/tests/ragger/snapshots/flex/erc721_approve_137/00006.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_137/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_5/00000.png b/tests/ragger/snapshots/flex/erc721_approve_5/00000.png new file mode 100644 index 0000000..f5ff49d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_5/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_5/00001.png b/tests/ragger/snapshots/flex/erc721_approve_5/00001.png new file mode 100644 index 0000000..efaa6cb Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_5/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_5/00002.png b/tests/ragger/snapshots/flex/erc721_approve_5/00002.png new file mode 100644 index 0000000..00c4c4b Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_5/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_5/00003.png b/tests/ragger/snapshots/flex/erc721_approve_5/00003.png new file mode 100644 index 0000000..92d1929 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_5/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_5/00004.png b/tests/ragger/snapshots/flex/erc721_approve_5/00004.png new file mode 100644 index 0000000..66e0703 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_5/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_5/00005.png b/tests/ragger/snapshots/flex/erc721_approve_5/00005.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_5/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc721_approve_5/00006.png b/tests/ragger/snapshots/flex/erc721_approve_5/00006.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_approve_5/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00000.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00000.png new file mode 100644 index 0000000..548ea67 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00001.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00001.png new file mode 100644 index 0000000..e9788a1 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00002.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00002.png new file mode 100644 index 0000000..10012d8 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00003.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00003.png new file mode 100644 index 0000000..1e3909a Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00004.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00004.png new file mode 100644 index 0000000..6a11e11 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00005.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00005.png new file mode 100644 index 0000000..6bbdf2f Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00006.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00006.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00007.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00007.png new file mode 100644 index 0000000..f5b3e29 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1-rejected/00007.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00000.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00000.png new file mode 100644 index 0000000..548ea67 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00001.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00001.png new file mode 100644 index 0000000..e9788a1 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00002.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00002.png new file mode 100644 index 0000000..10012d8 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00003.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00003.png new file mode 100644 index 0000000..1e3909a Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00004.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00005.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00006.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00006.png new file mode 100644 index 0000000..f5b3e29 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_1/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00000.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00000.png new file mode 100644 index 0000000..fd048b2 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00001.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00001.png new file mode 100644 index 0000000..1b9650e Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00002.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00002.png new file mode 100644 index 0000000..f619df5 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00003.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00003.png new file mode 100644 index 0000000..bed3797 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00004.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00004.png new file mode 100644 index 0000000..6e6068c Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00005.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00005.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00006.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00006.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_137/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00000.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00000.png new file mode 100644 index 0000000..4779e90 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00001.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00001.png new file mode 100644 index 0000000..da629f6 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00002.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00002.png new file mode 100644 index 0000000..00c4c4b Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00003.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00003.png new file mode 100644 index 0000000..92d1929 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00004.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00004.png new file mode 100644 index 0000000..048bbf4 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00005.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00005.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00006.png b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00006.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_safeTransferFrom_5/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00000.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00000.png new file mode 100644 index 0000000..488291a Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00001.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00001.png new file mode 100644 index 0000000..20f4fa4 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00002.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00002.png new file mode 100644 index 0000000..86d6d77 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00003.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00003.png new file mode 100644 index 0000000..bc9c251 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00004.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00005.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_1/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00000.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00000.png new file mode 100644 index 0000000..3be4918 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00001.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00001.png new file mode 100644 index 0000000..9ac9a4b Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00002.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00002.png new file mode 100644 index 0000000..60bc788 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00003.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00003.png new file mode 100644 index 0000000..ddb2ddc Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00004.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00005.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00006.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00006.png new file mode 100644 index 0000000..f5b3e29 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_137/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00000.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00000.png new file mode 100644 index 0000000..fbd37e0 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00001.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00001.png new file mode 100644 index 0000000..a550975 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00002.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00002.png new file mode 100644 index 0000000..affd534 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00003.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00003.png new file mode 100644 index 0000000..3f41be8 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00004.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00005.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00006.png b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00006.png new file mode 100644 index 0000000..f5b3e29 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_setApprovalForAll_5/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_1/00000.png b/tests/ragger/snapshots/flex/erc721_transferFrom_1/00000.png new file mode 100644 index 0000000..548ea67 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_1/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_1/00001.png b/tests/ragger/snapshots/flex/erc721_transferFrom_1/00001.png new file mode 100644 index 0000000..e9788a1 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_1/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_1/00002.png b/tests/ragger/snapshots/flex/erc721_transferFrom_1/00002.png new file mode 100644 index 0000000..10012d8 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_1/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_1/00003.png b/tests/ragger/snapshots/flex/erc721_transferFrom_1/00003.png new file mode 100644 index 0000000..1e3909a Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_1/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_1/00004.png b/tests/ragger/snapshots/flex/erc721_transferFrom_1/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_1/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_1/00005.png b/tests/ragger/snapshots/flex/erc721_transferFrom_1/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_1/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_1/00006.png b/tests/ragger/snapshots/flex/erc721_transferFrom_1/00006.png new file mode 100644 index 0000000..f5b3e29 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_1/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_137/00000.png b/tests/ragger/snapshots/flex/erc721_transferFrom_137/00000.png new file mode 100644 index 0000000..fd048b2 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_137/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_137/00001.png b/tests/ragger/snapshots/flex/erc721_transferFrom_137/00001.png new file mode 100644 index 0000000..1b9650e Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_137/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_137/00002.png b/tests/ragger/snapshots/flex/erc721_transferFrom_137/00002.png new file mode 100644 index 0000000..f619df5 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_137/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_137/00003.png b/tests/ragger/snapshots/flex/erc721_transferFrom_137/00003.png new file mode 100644 index 0000000..bed3797 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_137/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_137/00004.png b/tests/ragger/snapshots/flex/erc721_transferFrom_137/00004.png new file mode 100644 index 0000000..6e6068c Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_137/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_137/00005.png b/tests/ragger/snapshots/flex/erc721_transferFrom_137/00005.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_137/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_137/00006.png b/tests/ragger/snapshots/flex/erc721_transferFrom_137/00006.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_137/00006.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_5/00000.png b/tests/ragger/snapshots/flex/erc721_transferFrom_5/00000.png new file mode 100644 index 0000000..4779e90 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_5/00000.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_5/00001.png b/tests/ragger/snapshots/flex/erc721_transferFrom_5/00001.png new file mode 100644 index 0000000..da629f6 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_5/00001.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_5/00002.png b/tests/ragger/snapshots/flex/erc721_transferFrom_5/00002.png new file mode 100644 index 0000000..00c4c4b Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_5/00002.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_5/00003.png b/tests/ragger/snapshots/flex/erc721_transferFrom_5/00003.png new file mode 100644 index 0000000..92d1929 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_5/00003.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_5/00004.png b/tests/ragger/snapshots/flex/erc721_transferFrom_5/00004.png new file mode 100644 index 0000000..048bbf4 Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_5/00004.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_5/00005.png b/tests/ragger/snapshots/flex/erc721_transferFrom_5/00005.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_5/00005.png differ diff --git a/tests/ragger/snapshots/flex/erc721_transferFrom_5/00006.png b/tests/ragger/snapshots/flex/erc721_transferFrom_5/00006.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/erc721_transferFrom_5/00006.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_1/00000.png b/tests/ragger/snapshots/flex/get_pk_1/00000.png new file mode 100644 index 0000000..4affb17 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_1/00000.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_1/00001.png b/tests/ragger/snapshots/flex/get_pk_1/00001.png new file mode 100644 index 0000000..f113a35 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_1/00001.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_1/00002.png b/tests/ragger/snapshots/flex/get_pk_1/00002.png new file mode 100644 index 0000000..4321e60 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_1/00002.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_1/00003.png b/tests/ragger/snapshots/flex/get_pk_1/00003.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_1/00003.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_137/00000.png b/tests/ragger/snapshots/flex/get_pk_137/00000.png new file mode 100644 index 0000000..4781606 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_137/00000.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_137/00001.png b/tests/ragger/snapshots/flex/get_pk_137/00001.png new file mode 100644 index 0000000..f113a35 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_137/00001.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_137/00002.png b/tests/ragger/snapshots/flex/get_pk_137/00002.png new file mode 100644 index 0000000..4321e60 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_137/00002.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_137/00003.png b/tests/ragger/snapshots/flex/get_pk_137/00003.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_137/00003.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_2/00000.png b/tests/ragger/snapshots/flex/get_pk_2/00000.png new file mode 100644 index 0000000..24bb5bb Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_2/00000.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_2/00001.png b/tests/ragger/snapshots/flex/get_pk_2/00001.png new file mode 100644 index 0000000..f113a35 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_2/00001.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_2/00002.png b/tests/ragger/snapshots/flex/get_pk_2/00002.png new file mode 100644 index 0000000..4321e60 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_2/00002.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_2/00003.png b/tests/ragger/snapshots/flex/get_pk_2/00003.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_2/00003.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_5/00000.png b/tests/ragger/snapshots/flex/get_pk_5/00000.png new file mode 100644 index 0000000..49a6c4d Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_5/00000.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_5/00001.png b/tests/ragger/snapshots/flex/get_pk_5/00001.png new file mode 100644 index 0000000..f113a35 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_5/00001.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_5/00002.png b/tests/ragger/snapshots/flex/get_pk_5/00002.png new file mode 100644 index 0000000..4321e60 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_5/00002.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_5/00003.png b/tests/ragger/snapshots/flex/get_pk_5/00003.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_5/00003.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_None/00000.png b/tests/ragger/snapshots/flex/get_pk_None/00000.png new file mode 100644 index 0000000..4affb17 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_None/00000.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_None/00001.png b/tests/ragger/snapshots/flex/get_pk_None/00001.png new file mode 100644 index 0000000..f113a35 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_None/00001.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_None/00002.png b/tests/ragger/snapshots/flex/get_pk_None/00002.png new file mode 100644 index 0000000..4321e60 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_None/00002.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_None/00003.png b/tests/ragger/snapshots/flex/get_pk_None/00003.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_None/00003.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_rejected_60/00000.png b/tests/ragger/snapshots/flex/get_pk_rejected_60/00000.png new file mode 100644 index 0000000..4affb17 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_rejected_60/00000.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_rejected_60/00001.png b/tests/ragger/snapshots/flex/get_pk_rejected_60/00001.png new file mode 100644 index 0000000..f113a35 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_rejected_60/00001.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_rejected_60/00002.png b/tests/ragger/snapshots/flex/get_pk_rejected_60/00002.png new file mode 100644 index 0000000..45c08d4 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_rejected_60/00002.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_rejected_60/00003.png b/tests/ragger/snapshots/flex/get_pk_rejected_60/00003.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_rejected_60/00003.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_rejected_700/00000.png b/tests/ragger/snapshots/flex/get_pk_rejected_700/00000.png new file mode 100644 index 0000000..4affb17 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_rejected_700/00000.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_rejected_700/00001.png b/tests/ragger/snapshots/flex/get_pk_rejected_700/00001.png new file mode 100644 index 0000000..06db2e6 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_rejected_700/00001.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_rejected_700/00002.png b/tests/ragger/snapshots/flex/get_pk_rejected_700/00002.png new file mode 100644 index 0000000..45c08d4 Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_rejected_700/00002.png differ diff --git a/tests/ragger/snapshots/flex/get_pk_rejected_700/00003.png b/tests/ragger/snapshots/flex/get_pk_rejected_700/00003.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/get_pk_rejected_700/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_blind_sign_reject_in_risk_review/00000.png b/tests/ragger/snapshots/flex/test_blind_sign_reject_in_risk_review/00000.png new file mode 100644 index 0000000..10188cd Binary files /dev/null and b/tests/ragger/snapshots/flex/test_blind_sign_reject_in_risk_review/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_blind_sign_reject_in_risk_review/00001.png b/tests/ragger/snapshots/flex/test_blind_sign_reject_in_risk_review/00001.png new file mode 100644 index 0000000..a3c7613 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_blind_sign_reject_in_risk_review/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_blind_sign_reject_in_risk_review/00002.png b/tests/ragger/snapshots/flex/test_blind_sign_reject_in_risk_review/00002.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/test_blind_sign_reject_in_risk_review/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_blind_sign_rejected/00000.png b/tests/ragger/snapshots/flex/test_blind_sign_rejected/00000.png new file mode 100644 index 0000000..10188cd Binary files /dev/null and b/tests/ragger/snapshots/flex/test_blind_sign_rejected/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_blind_sign_rejected/00001.png b/tests/ragger/snapshots/flex/test_blind_sign_rejected/00001.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/test_blind_sign_rejected/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_blind_sign_signed/00000.png b/tests/ragger/snapshots/flex/test_blind_sign_signed/00000.png new file mode 100644 index 0000000..10188cd Binary files /dev/null and b/tests/ragger/snapshots/flex/test_blind_sign_signed/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_blind_sign_signed/00001.png b/tests/ragger/snapshots/flex/test_blind_sign_signed/00001.png new file mode 100644 index 0000000..a3c7613 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_blind_sign_signed/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_blind_sign_signed/00002.png b/tests/ragger/snapshots/flex/test_blind_sign_signed/00002.png new file mode 100644 index 0000000..8949bed Binary files /dev/null and b/tests/ragger/snapshots/flex/test_blind_sign_signed/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_blind_sign_signed/00003.png b/tests/ragger/snapshots/flex/test_blind_sign_signed/00003.png new file mode 100644 index 0000000..2b71d82 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_blind_sign_signed/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_blind_sign_signed/00004.png b/tests/ragger/snapshots/flex/test_blind_sign_signed/00004.png new file mode 100644 index 0000000..68b268c Binary files /dev/null and b/tests/ragger/snapshots/flex/test_blind_sign_signed/00004.png differ diff --git a/tests/ragger/snapshots/flex/test_blind_sign_signed/00005.png b/tests/ragger/snapshots/flex/test_blind_sign_signed/00005.png new file mode 100644 index 0000000..f75df0d Binary files /dev/null and b/tests/ragger/snapshots/flex/test_blind_sign_signed/00005.png differ diff --git a/tests/ragger/snapshots/flex/test_blind_sign_signed/00006.png b/tests/ragger/snapshots/flex/test_blind_sign_signed/00006.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/test_blind_sign_signed/00006.png differ diff --git a/tests/ragger/snapshots/flex/test_clone_thundercore/00000.png b/tests/ragger/snapshots/flex/test_clone_thundercore/00000.png new file mode 100644 index 0000000..238e381 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_clone_thundercore/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_clone_thundercore/00001.png b/tests/ragger/snapshots/flex/test_clone_thundercore/00001.png new file mode 100644 index 0000000..618815b Binary files /dev/null and b/tests/ragger/snapshots/flex/test_clone_thundercore/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_clone_thundercore/00002.png b/tests/ragger/snapshots/flex/test_clone_thundercore/00002.png new file mode 100644 index 0000000..40f6cef Binary files /dev/null and b/tests/ragger/snapshots/flex/test_clone_thundercore/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_clone_thundercore/00003.png b/tests/ragger/snapshots/flex/test_clone_thundercore/00003.png new file mode 100644 index 0000000..e4d7d81 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_clone_thundercore/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_clone_thundercore/00004.png b/tests/ragger/snapshots/flex/test_clone_thundercore/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/test_clone_thundercore/00004.png differ diff --git a/tests/ragger/snapshots/flex/test_clone_thundercore/00005.png b/tests/ragger/snapshots/flex/test_clone_thundercore/00005.png new file mode 100644 index 0000000..83689ec Binary files /dev/null and b/tests/ragger/snapshots/flex/test_clone_thundercore/00005.png differ diff --git a/tests/ragger/snapshots/flex/test_eip712_advanced_filtering/00000.png b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering/00000.png new file mode 100644 index 0000000..14713d8 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_eip712_advanced_filtering/00001.png b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering/00001.png new file mode 100644 index 0000000..0748302 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_eip712_advanced_filtering/00002.png b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering/00002.png new file mode 100644 index 0000000..683ec23 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_eip712_advanced_filtering/00003.png b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering/00003.png new file mode 100644 index 0000000..cbaa889 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_eip712_advanced_filtering/00004.png b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering/00004.png new file mode 100644 index 0000000..8b981d4 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering/00004.png differ diff --git a/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_permit/00000.png b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_permit/00000.png new file mode 100644 index 0000000..14713d8 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_permit/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_permit/00001.png b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_permit/00001.png new file mode 100644 index 0000000..36ee846 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_permit/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_permit/00002.png b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_permit/00002.png new file mode 100644 index 0000000..cbaa889 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_permit/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_permit/00003.png b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_permit/00003.png new file mode 100644 index 0000000..8b981d4 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_permit/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_unlimited/00000.png b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_unlimited/00000.png new file mode 100644 index 0000000..14713d8 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_unlimited/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_unlimited/00001.png b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_unlimited/00001.png new file mode 100644 index 0000000..62be9a3 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_unlimited/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_unlimited/00002.png b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_unlimited/00002.png new file mode 100644 index 0000000..cbaa889 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_unlimited/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_unlimited/00003.png b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_unlimited/00003.png new file mode 100644 index 0000000..8b981d4 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_eip712_advanced_filtering_unlimited/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_get_eth2_pk/00000.png b/tests/ragger/snapshots/flex/test_get_eth2_pk/00000.png new file mode 100644 index 0000000..e19dd34 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_get_eth2_pk/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_get_eth2_pk/00001.png b/tests/ragger/snapshots/flex/test_get_eth2_pk/00001.png new file mode 100644 index 0000000..2239d5e Binary files /dev/null and b/tests/ragger/snapshots/flex/test_get_eth2_pk/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_get_eth2_pk/00002.png b/tests/ragger/snapshots/flex/test_get_eth2_pk/00002.png new file mode 100644 index 0000000..4321e60 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_get_eth2_pk/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_get_eth2_pk/00003.png b/tests/ragger/snapshots/flex/test_get_eth2_pk/00003.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/test_get_eth2_pk/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_legacy_chainid/00000.png b/tests/ragger/snapshots/flex/test_legacy_chainid/00000.png new file mode 100644 index 0000000..7dc2eae Binary files /dev/null and b/tests/ragger/snapshots/flex/test_legacy_chainid/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_legacy_chainid/00001.png b/tests/ragger/snapshots/flex/test_legacy_chainid/00001.png new file mode 100644 index 0000000..ae8de1f Binary files /dev/null and b/tests/ragger/snapshots/flex/test_legacy_chainid/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_legacy_chainid/00002.png b/tests/ragger/snapshots/flex/test_legacy_chainid/00002.png new file mode 100644 index 0000000..ae950c1 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_legacy_chainid/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_legacy_chainid/00003.png b/tests/ragger/snapshots/flex/test_legacy_chainid/00003.png new file mode 100644 index 0000000..d5808be Binary files /dev/null and b/tests/ragger/snapshots/flex/test_legacy_chainid/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_legacy_chainid/00004.png b/tests/ragger/snapshots/flex/test_legacy_chainid/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/test_legacy_chainid/00004.png differ diff --git a/tests/ragger/snapshots/flex/test_legacy_chainid/00005.png b/tests/ragger/snapshots/flex/test_legacy_chainid/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/test_legacy_chainid/00005.png differ diff --git a/tests/ragger/snapshots/flex/test_legacy_send_bsc/00000.png b/tests/ragger/snapshots/flex/test_legacy_send_bsc/00000.png new file mode 100644 index 0000000..c3c7c83 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_legacy_send_bsc/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_legacy_send_bsc/00001.png b/tests/ragger/snapshots/flex/test_legacy_send_bsc/00001.png new file mode 100644 index 0000000..898ca23 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_legacy_send_bsc/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_legacy_send_bsc/00002.png b/tests/ragger/snapshots/flex/test_legacy_send_bsc/00002.png new file mode 100644 index 0000000..520842a Binary files /dev/null and b/tests/ragger/snapshots/flex/test_legacy_send_bsc/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_legacy_send_bsc/00003.png b/tests/ragger/snapshots/flex/test_legacy_send_bsc/00003.png new file mode 100644 index 0000000..cbbc322 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_legacy_send_bsc/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_legacy_send_bsc/00004.png b/tests/ragger/snapshots/flex/test_legacy_send_bsc/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/test_legacy_send_bsc/00004.png differ diff --git a/tests/ragger/snapshots/flex/test_legacy_send_bsc/00005.png b/tests/ragger/snapshots/flex/test_legacy_send_bsc/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/test_legacy_send_bsc/00005.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_metamask/00000.png b/tests/ragger/snapshots/flex/test_personal_sign_metamask/00000.png new file mode 100644 index 0000000..5284835 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_metamask/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_metamask/00001.png b/tests/ragger/snapshots/flex/test_personal_sign_metamask/00001.png new file mode 100644 index 0000000..94eef0f Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_metamask/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_metamask/00002.png b/tests/ragger/snapshots/flex/test_personal_sign_metamask/00002.png new file mode 100644 index 0000000..7a6f3ac Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_metamask/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_metamask/00003.png b/tests/ragger/snapshots/flex/test_personal_sign_metamask/00003.png new file mode 100644 index 0000000..8b981d4 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_metamask/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_metamask/00004.png b/tests/ragger/snapshots/flex/test_personal_sign_metamask/00004.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_metamask/00004.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_non_ascii/00000.png b/tests/ragger/snapshots/flex/test_personal_sign_non_ascii/00000.png new file mode 100644 index 0000000..5284835 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_non_ascii/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_non_ascii/00001.png b/tests/ragger/snapshots/flex/test_personal_sign_non_ascii/00001.png new file mode 100644 index 0000000..8400d50 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_non_ascii/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_non_ascii/00002.png b/tests/ragger/snapshots/flex/test_personal_sign_non_ascii/00002.png new file mode 100644 index 0000000..7a6f3ac Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_non_ascii/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_non_ascii/00003.png b/tests/ragger/snapshots/flex/test_personal_sign_non_ascii/00003.png new file mode 100644 index 0000000..8b981d4 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_non_ascii/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_non_ascii/00004.png b/tests/ragger/snapshots/flex/test_personal_sign_non_ascii/00004.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_non_ascii/00004.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_opensea/00000.png b/tests/ragger/snapshots/flex/test_personal_sign_opensea/00000.png new file mode 100644 index 0000000..5284835 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_opensea/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_opensea/00001.png b/tests/ragger/snapshots/flex/test_personal_sign_opensea/00001.png new file mode 100644 index 0000000..74a695b Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_opensea/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_opensea/00002.png b/tests/ragger/snapshots/flex/test_personal_sign_opensea/00002.png new file mode 100644 index 0000000..f533953 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_opensea/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_opensea/00003.png b/tests/ragger/snapshots/flex/test_personal_sign_opensea/00003.png new file mode 100644 index 0000000..7a6f3ac Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_opensea/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_opensea/00004.png b/tests/ragger/snapshots/flex/test_personal_sign_opensea/00004.png new file mode 100644 index 0000000..8b981d4 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_opensea/00004.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_opensea/00005.png b/tests/ragger/snapshots/flex/test_personal_sign_opensea/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_opensea/00005.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_reject/00000.png b/tests/ragger/snapshots/flex/test_personal_sign_reject/00000.png new file mode 100644 index 0000000..5284835 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_reject/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_reject/00001.png b/tests/ragger/snapshots/flex/test_personal_sign_reject/00001.png new file mode 100644 index 0000000..5c3778e Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_reject/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_reject/00002.png b/tests/ragger/snapshots/flex/test_personal_sign_reject/00002.png new file mode 100644 index 0000000..7a6f3ac Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_reject/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_reject/00003.png b/tests/ragger/snapshots/flex/test_personal_sign_reject/00003.png new file mode 100644 index 0000000..2b40ba7 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_reject/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_reject/00004.png b/tests/ragger/snapshots/flex/test_personal_sign_reject/00004.png new file mode 100644 index 0000000..2d8bbe3 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_reject/00004.png differ diff --git a/tests/ragger/snapshots/flex/test_personal_sign_reject/00005.png b/tests/ragger/snapshots/flex/test_personal_sign_reject/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/test_personal_sign_reject/00005.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_eip_2930/00000.png b/tests/ragger/snapshots/flex/test_sign_eip_2930/00000.png new file mode 100644 index 0000000..2cd4319 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_eip_2930/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_eip_2930/00001.png b/tests/ragger/snapshots/flex/test_sign_eip_2930/00001.png new file mode 100644 index 0000000..4b571d1 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_eip_2930/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_eip_2930/00002.png b/tests/ragger/snapshots/flex/test_sign_eip_2930/00002.png new file mode 100644 index 0000000..729b724 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_eip_2930/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_eip_2930/00003.png b/tests/ragger/snapshots/flex/test_sign_eip_2930/00003.png new file mode 100644 index 0000000..99abe61 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_eip_2930/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_eip_2930/00004.png b/tests/ragger/snapshots/flex/test_sign_eip_2930/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_eip_2930/00004.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_eip_2930/00005.png b/tests/ragger/snapshots/flex/test_sign_eip_2930/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_eip_2930/00005.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_limit_nonce/00000.png b/tests/ragger/snapshots/flex/test_sign_limit_nonce/00000.png new file mode 100644 index 0000000..2cd4319 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_limit_nonce/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_limit_nonce/00001.png b/tests/ragger/snapshots/flex/test_sign_limit_nonce/00001.png new file mode 100644 index 0000000..a348217 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_limit_nonce/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_limit_nonce/00002.png b/tests/ragger/snapshots/flex/test_sign_limit_nonce/00002.png new file mode 100644 index 0000000..78a299b Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_limit_nonce/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_limit_nonce/00003.png b/tests/ragger/snapshots/flex/test_sign_limit_nonce/00003.png new file mode 100644 index 0000000..99abe61 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_limit_nonce/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_limit_nonce/00004.png b/tests/ragger/snapshots/flex/test_sign_limit_nonce/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_limit_nonce/00004.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_limit_nonce/00005.png b/tests/ragger/snapshots/flex/test_sign_limit_nonce/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_limit_nonce/00005.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_nonce_display/00000.png b/tests/ragger/snapshots/flex/test_sign_nonce_display/00000.png new file mode 100644 index 0000000..2cd4319 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_nonce_display/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_nonce_display/00001.png b/tests/ragger/snapshots/flex/test_sign_nonce_display/00001.png new file mode 100644 index 0000000..99c4c46 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_nonce_display/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_nonce_display/00002.png b/tests/ragger/snapshots/flex/test_sign_nonce_display/00002.png new file mode 100644 index 0000000..4802a89 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_nonce_display/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_nonce_display/00003.png b/tests/ragger/snapshots/flex/test_sign_nonce_display/00003.png new file mode 100644 index 0000000..99abe61 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_nonce_display/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_nonce_display/00004.png b/tests/ragger/snapshots/flex/test_sign_nonce_display/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_nonce_display/00004.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_nonce_display/00005.png b/tests/ragger/snapshots/flex/test_sign_nonce_display/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_nonce_display/00005.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_parameter_selector/00000.png b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00000.png new file mode 100644 index 0000000..d614f30 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_parameter_selector/00001.png b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00001.png new file mode 100644 index 0000000..616945d Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_parameter_selector/00002.png b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00002.png new file mode 100644 index 0000000..f6771ab Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_parameter_selector/00003.png b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00003.png new file mode 100644 index 0000000..ec8d2e6 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_parameter_selector/00004.png b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00004.png new file mode 100644 index 0000000..645a768 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00004.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_parameter_selector/00005.png b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00005.png new file mode 100644 index 0000000..f030fb1 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00005.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_parameter_selector/00006.png b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00006.png new file mode 100644 index 0000000..ec8d2e6 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00006.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_parameter_selector/00007.png b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00007.png new file mode 100644 index 0000000..b022c9f Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00007.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_parameter_selector/00008.png b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00008.png new file mode 100644 index 0000000..f030fb1 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00008.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_parameter_selector/00009.png b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00009.png new file mode 100644 index 0000000..10188cd Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00009.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_parameter_selector/00010.png b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00010.png new file mode 100644 index 0000000..a3c7613 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00010.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_parameter_selector/00011.png b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00011.png new file mode 100644 index 0000000..8949bed Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00011.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_parameter_selector/00012.png b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00012.png new file mode 100644 index 0000000..2b71d82 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00012.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_parameter_selector/00013.png b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00013.png new file mode 100644 index 0000000..68b268c Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00013.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_parameter_selector/00014.png b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00014.png new file mode 100644 index 0000000..f75df0d Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00014.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_parameter_selector/00015.png b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00015.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_parameter_selector/00015.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_reject/00000.png b/tests/ragger/snapshots/flex/test_sign_reject/00000.png new file mode 100644 index 0000000..2cd4319 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_reject/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_reject/00001.png b/tests/ragger/snapshots/flex/test_sign_reject/00001.png new file mode 100644 index 0000000..99c4c46 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_reject/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_reject/00002.png b/tests/ragger/snapshots/flex/test_sign_reject/00002.png new file mode 100644 index 0000000..76e3e70 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_reject/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_reject/00003.png b/tests/ragger/snapshots/flex/test_sign_reject/00003.png new file mode 100644 index 0000000..99abe61 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_reject/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_reject/00004.png b/tests/ragger/snapshots/flex/test_sign_reject/00004.png new file mode 100644 index 0000000..6a11e11 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_reject/00004.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_reject/00005.png b/tests/ragger/snapshots/flex/test_sign_reject/00005.png new file mode 100644 index 0000000..6bbdf2f Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_reject/00005.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_reject/00006.png b/tests/ragger/snapshots/flex/test_sign_reject/00006.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_reject/00006.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_simple/00000.png b/tests/ragger/snapshots/flex/test_sign_simple/00000.png new file mode 100644 index 0000000..2cd4319 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_simple/00000.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_simple/00001.png b/tests/ragger/snapshots/flex/test_sign_simple/00001.png new file mode 100644 index 0000000..99c4c46 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_simple/00001.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_simple/00002.png b/tests/ragger/snapshots/flex/test_sign_simple/00002.png new file mode 100644 index 0000000..76e3e70 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_simple/00002.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_simple/00003.png b/tests/ragger/snapshots/flex/test_sign_simple/00003.png new file mode 100644 index 0000000..99abe61 Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_simple/00003.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_simple/00004.png b/tests/ragger/snapshots/flex/test_sign_simple/00004.png new file mode 100644 index 0000000..be51a9d Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_simple/00004.png differ diff --git a/tests/ragger/snapshots/flex/test_sign_simple/00005.png b/tests/ragger/snapshots/flex/test_sign_simple/00005.png new file mode 100644 index 0000000..dabe7af Binary files /dev/null and b/tests/ragger/snapshots/flex/test_sign_simple/00005.png differ diff --git a/tests/ragger/snapshots/nanos/get_pk_rejected/00000.png b/tests/ragger/snapshots/nanos/get_pk_rejected_60/00000.png similarity index 100% rename from tests/ragger/snapshots/nanos/get_pk_rejected/00000.png rename to tests/ragger/snapshots/nanos/get_pk_rejected_60/00000.png diff --git a/tests/ragger/snapshots/nanos/get_pk_rejected/00001.png b/tests/ragger/snapshots/nanos/get_pk_rejected_60/00001.png similarity index 100% rename from tests/ragger/snapshots/nanos/get_pk_rejected/00001.png rename to tests/ragger/snapshots/nanos/get_pk_rejected_60/00001.png diff --git a/tests/ragger/snapshots/nanos/get_pk_rejected/00002.png b/tests/ragger/snapshots/nanos/get_pk_rejected_60/00002.png similarity index 100% rename from tests/ragger/snapshots/nanos/get_pk_rejected/00002.png rename to tests/ragger/snapshots/nanos/get_pk_rejected_60/00002.png diff --git a/tests/ragger/snapshots/nanos/get_pk_rejected/00003.png b/tests/ragger/snapshots/nanos/get_pk_rejected_60/00003.png similarity index 100% rename from tests/ragger/snapshots/nanos/get_pk_rejected/00003.png rename to tests/ragger/snapshots/nanos/get_pk_rejected_60/00003.png diff --git a/tests/ragger/snapshots/nanos/get_pk_rejected/00004.png b/tests/ragger/snapshots/nanos/get_pk_rejected_60/00004.png similarity index 100% rename from tests/ragger/snapshots/nanos/get_pk_rejected/00004.png rename to tests/ragger/snapshots/nanos/get_pk_rejected_60/00004.png diff --git a/tests/ragger/snapshots/nanos/get_pk_rejected/00005.png b/tests/ragger/snapshots/nanos/get_pk_rejected_60/00005.png similarity index 100% rename from tests/ragger/snapshots/nanos/get_pk_rejected/00005.png rename to tests/ragger/snapshots/nanos/get_pk_rejected_60/00005.png diff --git a/tests/ragger/snapshots/nanos/get_pk_rejected/00006.png b/tests/ragger/snapshots/nanos/get_pk_rejected_60/00006.png similarity index 100% rename from tests/ragger/snapshots/nanos/get_pk_rejected/00006.png rename to tests/ragger/snapshots/nanos/get_pk_rejected_60/00006.png diff --git a/tests/speculos/screenshots/pubkey/nanos/get_public_key/00000.png b/tests/ragger/snapshots/nanos/get_pk_rejected_700/00000.png similarity index 100% rename from tests/speculos/screenshots/pubkey/nanos/get_public_key/00000.png rename to tests/ragger/snapshots/nanos/get_pk_rejected_700/00000.png diff --git a/tests/speculos/screenshots/pubkey/nanos/get_public_key/00001.png b/tests/ragger/snapshots/nanos/get_pk_rejected_700/00001.png similarity index 100% rename from tests/speculos/screenshots/pubkey/nanos/get_public_key/00001.png rename to tests/ragger/snapshots/nanos/get_pk_rejected_700/00001.png diff --git a/tests/speculos/screenshots/pubkey/nanos/get_public_key/00002.png b/tests/ragger/snapshots/nanos/get_pk_rejected_700/00002.png similarity index 100% rename from tests/speculos/screenshots/pubkey/nanos/get_public_key/00002.png rename to tests/ragger/snapshots/nanos/get_pk_rejected_700/00002.png diff --git a/tests/speculos/screenshots/pubkey/nanos/get_public_key/00003.png b/tests/ragger/snapshots/nanos/get_pk_rejected_700/00003.png similarity index 100% rename from tests/speculos/screenshots/pubkey/nanos/get_public_key/00003.png rename to tests/ragger/snapshots/nanos/get_pk_rejected_700/00003.png diff --git a/tests/speculos/screenshots/pubkey/nanos/get_public_key/00004.png b/tests/ragger/snapshots/nanos/get_pk_rejected_700/00004.png similarity index 100% rename from tests/speculos/screenshots/pubkey/nanos/get_public_key/00004.png rename to tests/ragger/snapshots/nanos/get_pk_rejected_700/00004.png diff --git a/tests/speculos/screenshots/pubkey/nanos/reject_get_public_key/00005.png b/tests/ragger/snapshots/nanos/get_pk_rejected_700/00005.png similarity index 100% rename from tests/speculos/screenshots/pubkey/nanos/reject_get_public_key/00005.png rename to tests/ragger/snapshots/nanos/get_pk_rejected_700/00005.png diff --git a/tests/zemu/snapshots/nanos_eip191_metamask/00006.png b/tests/ragger/snapshots/nanos/get_pk_rejected_700/00006.png similarity index 100% rename from tests/zemu/snapshots/nanos_eip191_metamask/00006.png rename to tests/ragger/snapshots/nanos/get_pk_rejected_700/00006.png diff --git a/tests/ragger/snapshots/nanos/test_blind_sign_rejected/00000.png b/tests/ragger/snapshots/nanos/test_blind_sign_rejected/00000.png new file mode 100644 index 0000000..2675875 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_blind_sign_rejected/00000.png differ diff --git a/tests/ragger/snapshots/nanos/test_blind_sign_rejected/00001.png b/tests/ragger/snapshots/nanos/test_blind_sign_rejected/00001.png new file mode 100644 index 0000000..2db2dcf Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_blind_sign_rejected/00001.png differ diff --git a/tests/ragger/snapshots/nanos/test_blind_sign_rejected/00002.png b/tests/ragger/snapshots/nanos/test_blind_sign_rejected/00002.png new file mode 100644 index 0000000..a9eca40 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_blind_sign_rejected/00002.png differ diff --git a/tests/speculos/screenshots/sign/nanos/reject/00009.png b/tests/ragger/snapshots/nanos/test_blind_sign_rejected/00003.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/reject/00009.png rename to tests/ragger/snapshots/nanos/test_blind_sign_rejected/00003.png diff --git a/tests/zemu/snapshots/nanos_approve_dai_tokens/00010.png b/tests/ragger/snapshots/nanos/test_blind_sign_rejected/00004.png similarity index 100% rename from tests/zemu/snapshots/nanos_approve_dai_tokens/00010.png rename to tests/ragger/snapshots/nanos/test_blind_sign_rejected/00004.png diff --git a/tests/ragger/snapshots/nanos/test_blind_sign_signed/00000.png b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00000.png new file mode 100644 index 0000000..2675875 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00000.png differ diff --git a/tests/ragger/snapshots/nanos/test_blind_sign_signed/00001.png b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00001.png new file mode 100644 index 0000000..2db2dcf Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00001.png differ diff --git a/tests/ragger/snapshots/nanos/test_blind_sign_signed/00002.png b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00002.png new file mode 100644 index 0000000..a9eca40 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00002.png differ diff --git a/tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00000.png b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00003.png similarity index 100% rename from tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00000.png rename to tests/ragger/snapshots/nanos/test_blind_sign_signed/00003.png diff --git a/tests/ragger/snapshots/nanos/test_blind_sign_signed/00004.png b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00004.png new file mode 100644 index 0000000..0a6a823 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00004.png differ diff --git a/tests/ragger/snapshots/nanos/test_blind_sign_signed/00005.png b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00005.png new file mode 100644 index 0000000..04f6b02 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00005.png differ diff --git a/tests/ragger/snapshots/nanos/test_blind_sign_signed/00006.png b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00006.png new file mode 100644 index 0000000..8a8c617 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00006.png differ diff --git a/tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00001.png b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00007.png similarity index 100% rename from tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00001.png rename to tests/ragger/snapshots/nanos/test_blind_sign_signed/00007.png diff --git a/tests/ragger/snapshots/nanos/test_blind_sign_signed/00008.png b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00008.png new file mode 100644 index 0000000..4249029 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00008.png differ diff --git a/tests/ragger/snapshots/nanos/test_blind_sign_signed/00009.png b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00009.png new file mode 100644 index 0000000..bb4b73f Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00009.png differ diff --git a/tests/ragger/snapshots/nanos/test_blind_sign_signed/00010.png b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00010.png new file mode 100644 index 0000000..b7a5302 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00010.png differ diff --git a/tests/ragger/snapshots/nanos/test_blind_sign_signed/00011.png b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00011.png new file mode 100644 index 0000000..cc968dc Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00011.png differ diff --git a/tests/ragger/snapshots/nanos/test_blind_sign_signed/00012.png b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00012.png new file mode 100644 index 0000000..56d35dd Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00012.png differ diff --git a/tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00006.png b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00013.png similarity index 100% rename from tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00006.png rename to tests/ragger/snapshots/nanos/test_blind_sign_signed/00013.png diff --git a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00010.png b/tests/ragger/snapshots/nanos/test_blind_sign_signed/00014.png similarity index 100% rename from tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00010.png rename to tests/ragger/snapshots/nanos/test_blind_sign_signed/00014.png diff --git a/tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00000.png b/tests/ragger/snapshots/nanos/test_clone_thundercore/00000.png similarity index 100% rename from tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00000.png rename to tests/ragger/snapshots/nanos/test_clone_thundercore/00000.png diff --git a/tests/ragger/snapshots/nanos/test_clone_thundercore/00001.png b/tests/ragger/snapshots/nanos/test_clone_thundercore/00001.png new file mode 100644 index 0000000..83c38d9 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_clone_thundercore/00001.png differ diff --git a/tests/ragger/snapshots/nanos/test_clone_thundercore/00002.png b/tests/ragger/snapshots/nanos/test_clone_thundercore/00002.png new file mode 100644 index 0000000..b874a7f Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_clone_thundercore/00002.png differ diff --git a/tests/ragger/snapshots/nanos/test_clone_thundercore/00003.png b/tests/ragger/snapshots/nanos/test_clone_thundercore/00003.png new file mode 100644 index 0000000..a433722 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_clone_thundercore/00003.png differ diff --git a/tests/ragger/snapshots/nanos/test_clone_thundercore/00004.png b/tests/ragger/snapshots/nanos/test_clone_thundercore/00004.png new file mode 100644 index 0000000..98c2086 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_clone_thundercore/00004.png differ diff --git a/tests/ragger/snapshots/nanos/test_clone_thundercore/00005.png b/tests/ragger/snapshots/nanos/test_clone_thundercore/00005.png new file mode 100644 index 0000000..682555c Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_clone_thundercore/00005.png differ diff --git a/tests/ragger/snapshots/nanos/test_clone_thundercore/00006.png b/tests/ragger/snapshots/nanos/test_clone_thundercore/00006.png new file mode 100644 index 0000000..7ec3b48 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_clone_thundercore/00006.png differ diff --git a/tests/ragger/snapshots/nanos/test_clone_thundercore/00007.png b/tests/ragger/snapshots/nanos/test_clone_thundercore/00007.png new file mode 100644 index 0000000..89f3a23 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_clone_thundercore/00007.png differ diff --git a/tests/ragger/snapshots/nanos/test_clone_thundercore/00008.png b/tests/ragger/snapshots/nanos/test_clone_thundercore/00008.png new file mode 100644 index 0000000..c55dc11 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_clone_thundercore/00008.png differ diff --git a/tests/speculos/screenshots/sign/nanos/blind_simple/00009.png b/tests/ragger/snapshots/nanos/test_clone_thundercore/00009.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/blind_simple/00009.png rename to tests/ragger/snapshots/nanos/test_clone_thundercore/00009.png diff --git a/tests/zemu/snapshots/nanos_eip191_nonascii/00010.png b/tests/ragger/snapshots/nanos/test_clone_thundercore/00010.png similarity index 100% rename from tests/zemu/snapshots/nanos_eip191_nonascii/00010.png rename to tests/ragger/snapshots/nanos/test_clone_thundercore/00010.png diff --git a/tests/ragger/snapshots/nanos/test_get_eth2_pk/00000.png b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00000.png new file mode 100644 index 0000000..1c4d4d7 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00000.png differ diff --git a/tests/ragger/snapshots/nanos/test_get_eth2_pk/00001.png b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00001.png new file mode 100644 index 0000000..e3a34c7 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00001.png differ diff --git a/tests/ragger/snapshots/nanos/test_get_eth2_pk/00002.png b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00002.png new file mode 100644 index 0000000..5e9d109 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00002.png differ diff --git a/tests/ragger/snapshots/nanos/test_get_eth2_pk/00003.png b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00003.png new file mode 100644 index 0000000..b7d21a9 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00003.png differ diff --git a/tests/ragger/snapshots/nanos/test_get_eth2_pk/00004.png b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00004.png new file mode 100644 index 0000000..24be343 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00004.png differ diff --git a/tests/ragger/snapshots/nanos/test_get_eth2_pk/00005.png b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00005.png new file mode 100644 index 0000000..f032e45 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00005.png differ diff --git a/tests/ragger/snapshots/nanos/test_get_eth2_pk/00006.png b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00006.png new file mode 100644 index 0000000..4118dbf Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00006.png differ diff --git a/tests/speculos/screenshots/pubkey/nanos/reject_get_public_key/00004.png b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00007.png similarity index 100% rename from tests/speculos/screenshots/pubkey/nanos/reject_get_public_key/00004.png rename to tests/ragger/snapshots/nanos/test_get_eth2_pk/00007.png diff --git a/tests/zemu/snapshots/nanos_enable_blind_signing/00008.png b/tests/ragger/snapshots/nanos/test_get_eth2_pk/00008.png similarity index 100% rename from tests/zemu/snapshots/nanos_enable_blind_signing/00008.png rename to tests/ragger/snapshots/nanos/test_get_eth2_pk/00008.png diff --git a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00000.png b/tests/ragger/snapshots/nanos/test_legacy_chainid/00000.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00000.png rename to tests/ragger/snapshots/nanos/test_legacy_chainid/00000.png diff --git a/tests/ragger/snapshots/nanos/test_legacy_chainid/00001.png b/tests/ragger/snapshots/nanos/test_legacy_chainid/00001.png new file mode 100644 index 0000000..3bae8ed Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_legacy_chainid/00001.png differ diff --git a/tests/ragger/snapshots/nanos/test_legacy_chainid/00002.png b/tests/ragger/snapshots/nanos/test_legacy_chainid/00002.png new file mode 100644 index 0000000..debf3a1 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_legacy_chainid/00002.png differ diff --git a/tests/ragger/snapshots/nanos/test_legacy_chainid/00003.png b/tests/ragger/snapshots/nanos/test_legacy_chainid/00003.png new file mode 100644 index 0000000..b80c1e4 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_legacy_chainid/00003.png differ diff --git a/tests/ragger/snapshots/nanos/test_legacy_chainid/00004.png b/tests/ragger/snapshots/nanos/test_legacy_chainid/00004.png new file mode 100644 index 0000000..67d53e3 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_legacy_chainid/00004.png differ diff --git a/tests/ragger/snapshots/nanos/test_legacy_chainid/00005.png b/tests/ragger/snapshots/nanos/test_legacy_chainid/00005.png new file mode 100644 index 0000000..682555c Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_legacy_chainid/00005.png differ diff --git a/tests/ragger/snapshots/nanos/test_legacy_chainid/00006.png b/tests/ragger/snapshots/nanos/test_legacy_chainid/00006.png new file mode 100644 index 0000000..7ec3b48 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_legacy_chainid/00006.png differ diff --git a/tests/ragger/snapshots/nanos/test_legacy_chainid/00007.png b/tests/ragger/snapshots/nanos/test_legacy_chainid/00007.png new file mode 100644 index 0000000..89f3a23 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_legacy_chainid/00007.png differ diff --git a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00007.png b/tests/ragger/snapshots/nanos/test_legacy_chainid/00008.png similarity index 100% rename from tests/zemu/snapshots/nanos_transfer_112233445566_network/00007.png rename to tests/ragger/snapshots/nanos/test_legacy_chainid/00008.png diff --git a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00008.png b/tests/ragger/snapshots/nanos/test_legacy_chainid/00009.png similarity index 100% rename from tests/zemu/snapshots/nanos_transfer_112233445566_network/00008.png rename to tests/ragger/snapshots/nanos/test_legacy_chainid/00009.png diff --git a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00010.png b/tests/ragger/snapshots/nanos/test_legacy_chainid/00010.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00010.png rename to tests/ragger/snapshots/nanos/test_legacy_chainid/00010.png diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum/00011.png b/tests/ragger/snapshots/nanos/test_legacy_chainid/00011.png similarity index 100% rename from tests/zemu/snapshots/nanos_transfer_ethereum/00011.png rename to tests/ragger/snapshots/nanos/test_legacy_chainid/00011.png diff --git a/tests/speculos/screenshots/sign/nanos/blind_simple/00000.png b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00000.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/blind_simple/00000.png rename to tests/ragger/snapshots/nanos/test_legacy_send_bsc/00000.png diff --git a/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00001.png b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00001.png new file mode 100644 index 0000000..3bae8ed Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00001.png differ diff --git a/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00002.png b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00002.png new file mode 100644 index 0000000..debf3a1 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00002.png differ diff --git a/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00003.png b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00003.png new file mode 100644 index 0000000..b80c1e4 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00003.png differ diff --git a/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00004.png b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00004.png new file mode 100644 index 0000000..29e5038 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00004.png differ diff --git a/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00005.png b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00005.png new file mode 100644 index 0000000..682555c Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00005.png differ diff --git a/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00006.png b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00006.png new file mode 100644 index 0000000..7ec3b48 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00006.png differ diff --git a/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00007.png b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00007.png new file mode 100644 index 0000000..89f3a23 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00007.png differ diff --git a/tests/zemu/snapshots/nanos_transfer_bsc/00007.png b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00008.png similarity index 100% rename from tests/zemu/snapshots/nanos_transfer_bsc/00007.png rename to tests/ragger/snapshots/nanos/test_legacy_send_bsc/00008.png diff --git a/tests/zemu/snapshots/nanos_transfer_bsc/00008.png b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00009.png similarity index 100% rename from tests/zemu/snapshots/nanos_transfer_bsc/00008.png rename to tests/ragger/snapshots/nanos/test_legacy_send_bsc/00009.png diff --git a/tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00007.png b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00010.png similarity index 100% rename from tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00007.png rename to tests/ragger/snapshots/nanos/test_legacy_send_bsc/00010.png diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00011.png b/tests/ragger/snapshots/nanos/test_legacy_send_bsc/00011.png similarity index 100% rename from tests/zemu/snapshots/nanos_transfer_ethereum_clone/00011.png rename to tests/ragger/snapshots/nanos/test_legacy_send_bsc/00011.png diff --git a/tests/ragger/snapshots/nanos/test_personal_sign_metamask/00000.png b/tests/ragger/snapshots/nanos/test_personal_sign_metamask/00000.png new file mode 100644 index 0000000..041a6a8 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_personal_sign_metamask/00000.png differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_metamask/00001.png b/tests/ragger/snapshots/nanos/test_personal_sign_metamask/00001.png similarity index 100% rename from tests/speculos/screenshots/eip191/nanos/personal_sign_metamask/00001.png rename to tests/ragger/snapshots/nanos/test_personal_sign_metamask/00001.png diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_metamask/00002.png b/tests/ragger/snapshots/nanos/test_personal_sign_metamask/00002.png similarity index 100% rename from tests/speculos/screenshots/eip191/nanos/personal_sign_metamask/00002.png rename to tests/ragger/snapshots/nanos/test_personal_sign_metamask/00002.png diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_metamask/00003.png b/tests/ragger/snapshots/nanos/test_personal_sign_metamask/00003.png similarity index 100% rename from tests/speculos/screenshots/eip191/nanos/personal_sign_metamask/00003.png rename to tests/ragger/snapshots/nanos/test_personal_sign_metamask/00003.png diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00017.png b/tests/ragger/snapshots/nanos/test_personal_sign_metamask/00004.png similarity index 100% rename from tests/zemu/snapshots/nanos_eip191_opensea/00017.png rename to tests/ragger/snapshots/nanos/test_personal_sign_metamask/00004.png diff --git a/tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00000.png b/tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00000.png new file mode 100644 index 0000000..041a6a8 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00000.png differ diff --git a/tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00001.png b/tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00001.png new file mode 100644 index 0000000..dc3315f Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00001.png differ diff --git a/tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00002.png b/tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00002.png new file mode 100644 index 0000000..5b3e16d Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00002.png differ diff --git a/tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00003.png b/tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00003.png new file mode 100644 index 0000000..93165d0 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00003.png differ diff --git a/tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00004.png b/tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00004.png new file mode 100644 index 0000000..c923961 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00004.png differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_non_ascii/00005.png b/tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00005.png similarity index 100% rename from tests/speculos/screenshots/eip191/nanos/personal_sign_non_ascii/00005.png rename to tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00005.png diff --git a/tests/zemu/snapshots/nanos_enable_blind_signing/00000.png b/tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00006.png similarity index 100% rename from tests/zemu/snapshots/nanos_enable_blind_signing/00000.png rename to tests/ragger/snapshots/nanos/test_personal_sign_non_ascii/00006.png diff --git a/tests/ragger/snapshots/nanos/test_personal_sign_reject/00000.png b/tests/ragger/snapshots/nanos/test_personal_sign_reject/00000.png new file mode 100644 index 0000000..041a6a8 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_personal_sign_reject/00000.png differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_reject/00001.png b/tests/ragger/snapshots/nanos/test_personal_sign_reject/00001.png similarity index 100% rename from tests/speculos/screenshots/eip191/nanos/personal_sign_reject/00001.png rename to tests/ragger/snapshots/nanos/test_personal_sign_reject/00001.png diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_reject/00002.png b/tests/ragger/snapshots/nanos/test_personal_sign_reject/00002.png similarity index 100% rename from tests/speculos/screenshots/eip191/nanos/personal_sign_reject/00002.png rename to tests/ragger/snapshots/nanos/test_personal_sign_reject/00002.png diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_reject/00003.png b/tests/ragger/snapshots/nanos/test_personal_sign_reject/00003.png similarity index 100% rename from tests/speculos/screenshots/eip191/nanos/personal_sign_reject/00003.png rename to tests/ragger/snapshots/nanos/test_personal_sign_reject/00003.png diff --git a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00012.png b/tests/ragger/snapshots/nanos/test_personal_sign_reject/00004.png similarity index 100% rename from tests/zemu/snapshots/nanos_transfer_112233445566_network/00012.png rename to tests/ragger/snapshots/nanos/test_personal_sign_reject/00004.png diff --git a/tests/speculos/screenshots/sign/nanos/limit_nonce/00000.png b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00000.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/limit_nonce/00000.png rename to tests/ragger/snapshots/nanos/test_sign_eip_2930/00000.png diff --git a/tests/ragger/snapshots/nanos/test_sign_eip_2930/00001.png b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00001.png new file mode 100644 index 0000000..0a6a823 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00001.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_eip_2930/00002.png b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00002.png new file mode 100644 index 0000000..04f6b02 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00002.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_eip_2930/00003.png b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00003.png new file mode 100644 index 0000000..8a8c617 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00003.png differ diff --git a/tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00001.png b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00004.png similarity index 100% rename from tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00001.png rename to tests/ragger/snapshots/nanos/test_sign_eip_2930/00004.png diff --git a/tests/ragger/snapshots/nanos/test_sign_eip_2930/00005.png b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00005.png new file mode 100644 index 0000000..2b06025 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00005.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_eip_2930/00006.png b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00006.png new file mode 100644 index 0000000..c607194 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00006.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_eip_2930/00007.png b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00007.png new file mode 100644 index 0000000..0e77a58 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00007.png differ diff --git a/tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00005.png b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00008.png similarity index 100% rename from tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00005.png rename to tests/ragger/snapshots/nanos/test_sign_eip_2930/00008.png diff --git a/tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00006.png b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00009.png similarity index 100% rename from tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00006.png rename to tests/ragger/snapshots/nanos/test_sign_eip_2930/00009.png diff --git a/tests/speculos/screenshots/sign/nanos/limit_nonce/00008.png b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00010.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/limit_nonce/00008.png rename to tests/ragger/snapshots/nanos/test_sign_eip_2930/00010.png diff --git a/tests/zemu/snapshots/nanos_transfer_bsc/00012.png b/tests/ragger/snapshots/nanos/test_sign_eip_2930/00011.png similarity index 100% rename from tests/zemu/snapshots/nanos_transfer_bsc/00012.png rename to tests/ragger/snapshots/nanos/test_sign_eip_2930/00011.png diff --git a/tests/speculos/screenshots/sign/nanos/nonce_display/00000.png b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00000.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/nonce_display/00000.png rename to tests/ragger/snapshots/nanos/test_sign_limit_nonce/00000.png diff --git a/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00001.png b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00001.png new file mode 100644 index 0000000..3bae8ed Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00001.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00002.png b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00002.png new file mode 100644 index 0000000..debf3a1 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00002.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00003.png b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00003.png new file mode 100644 index 0000000..b80c1e4 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00003.png differ diff --git a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00002.png b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00004.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00002.png rename to tests/ragger/snapshots/nanos/test_sign_limit_nonce/00004.png diff --git a/tests/speculos/screenshots/sign/nanos/limit_nonce/00002.png b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00005.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/limit_nonce/00002.png rename to tests/ragger/snapshots/nanos/test_sign_limit_nonce/00005.png diff --git a/tests/speculos/screenshots/sign/nanos/limit_nonce/00003.png b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00006.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/limit_nonce/00003.png rename to tests/ragger/snapshots/nanos/test_sign_limit_nonce/00006.png diff --git a/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00007.png b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00007.png new file mode 100644 index 0000000..682555c Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00007.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00008.png b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00008.png new file mode 100644 index 0000000..7ec3b48 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00008.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00009.png b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00009.png new file mode 100644 index 0000000..89f3a23 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00009.png differ diff --git a/tests/speculos/screenshots/sign/nanos/limit_nonce/00007.png b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00010.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/limit_nonce/00007.png rename to tests/ragger/snapshots/nanos/test_sign_limit_nonce/00010.png diff --git a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00011.png b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00011.png similarity index 100% rename from tests/zemu/snapshots/nanos_transfer_112233445566_network/00011.png rename to tests/ragger/snapshots/nanos/test_sign_limit_nonce/00011.png diff --git a/tests/zemu/snapshots/nanos_transfer_palm_network/00012.png b/tests/ragger/snapshots/nanos/test_sign_limit_nonce/00012.png similarity index 100% rename from tests/zemu/snapshots/nanos_transfer_palm_network/00012.png rename to tests/ragger/snapshots/nanos/test_sign_limit_nonce/00012.png diff --git a/tests/speculos/screenshots/sign/nanos/reject/00000.png b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00000.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/reject/00000.png rename to tests/ragger/snapshots/nanos/test_sign_nonce_display/00000.png diff --git a/tests/ragger/snapshots/nanos/test_sign_nonce_display/00001.png b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00001.png new file mode 100644 index 0000000..3bae8ed Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00001.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_nonce_display/00002.png b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00002.png new file mode 100644 index 0000000..debf3a1 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00002.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_nonce_display/00003.png b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00003.png new file mode 100644 index 0000000..b80c1e4 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00003.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_nonce_display/00004.png b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00004.png new file mode 100644 index 0000000..10706b8 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00004.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_nonce_display/00005.png b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00005.png new file mode 100644 index 0000000..682555c Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00005.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_nonce_display/00006.png b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00006.png new file mode 100644 index 0000000..7ec3b48 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00006.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_nonce_display/00007.png b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00007.png new file mode 100644 index 0000000..89f3a23 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00007.png differ diff --git a/tests/speculos/screenshots/sign/nanos/nonce_display/00007.png b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00008.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/nonce_display/00007.png rename to tests/ragger/snapshots/nanos/test_sign_nonce_display/00008.png diff --git a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00009.png b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00009.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00009.png rename to tests/ragger/snapshots/nanos/test_sign_nonce_display/00009.png diff --git a/tests/speculos/screenshots/sign/nanos/nonce_display/00009.png b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00010.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/nonce_display/00009.png rename to tests/ragger/snapshots/nanos/test_sign_nonce_display/00010.png diff --git a/tests/zemu/snapshots/nanos_transfer_eip1559/00009.png b/tests/ragger/snapshots/nanos/test_sign_nonce_display/00011.png similarity index 100% rename from tests/zemu/snapshots/nanos_transfer_eip1559/00009.png rename to tests/ragger/snapshots/nanos/test_sign_nonce_display/00011.png diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00000.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00000.png new file mode 100644 index 0000000..1ae309e Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00000.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00001.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00001.png new file mode 100644 index 0000000..a86ceb0 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00001.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00002.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00002.png new file mode 100644 index 0000000..66c411c Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00002.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00003.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00003.png new file mode 100644 index 0000000..daa3e96 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00003.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00004.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00004.png new file mode 100644 index 0000000..5b07865 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00004.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00005.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00005.png new file mode 100644 index 0000000..12d3fb1 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00005.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00006.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00006.png new file mode 100644 index 0000000..37063fd Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00006.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00007.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00007.png new file mode 100644 index 0000000..66c411c Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00007.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00008.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00008.png new file mode 100644 index 0000000..f6e9b1f Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00008.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00009.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00009.png new file mode 100644 index 0000000..6f079b7 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00009.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00010.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00010.png new file mode 100644 index 0000000..a283d78 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00010.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00011.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00011.png new file mode 100644 index 0000000..66c411c Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00011.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00012.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00012.png new file mode 100644 index 0000000..2675875 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00012.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00013.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00013.png new file mode 100644 index 0000000..2db2dcf Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00013.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00014.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00014.png new file mode 100644 index 0000000..a9eca40 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00014.png differ diff --git a/tests/speculos/screenshots/sign/nanos/simple/00000.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00015.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/simple/00000.png rename to tests/ragger/snapshots/nanos/test_sign_parameter_selector/00015.png diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00016.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00016.png new file mode 100644 index 0000000..0a6a823 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00016.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00017.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00017.png new file mode 100644 index 0000000..04f6b02 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00017.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00018.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00018.png new file mode 100644 index 0000000..8a8c617 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00018.png differ diff --git a/tests/zemu/snapshots/nanos_transfer_eip1559/00001.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00019.png similarity index 100% rename from tests/zemu/snapshots/nanos_transfer_eip1559/00001.png rename to tests/ragger/snapshots/nanos/test_sign_parameter_selector/00019.png diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00020.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00020.png new file mode 100644 index 0000000..4249029 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00020.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00021.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00021.png new file mode 100644 index 0000000..bb4b73f Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00021.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00022.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00022.png new file mode 100644 index 0000000..b7a5302 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00022.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00023.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00023.png new file mode 100644 index 0000000..cc968dc Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00023.png differ diff --git a/tests/speculos/screenshots/sign/nanos/reject/00008.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00024.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/reject/00008.png rename to tests/ragger/snapshots/nanos/test_sign_parameter_selector/00024.png diff --git a/tests/zemu/snapshots/nanos_try_to_blind_sign_with_setting_disabled/00002.png b/tests/ragger/snapshots/nanos/test_sign_parameter_selector/00025.png similarity index 100% rename from tests/zemu/snapshots/nanos_try_to_blind_sign_with_setting_disabled/00002.png rename to tests/ragger/snapshots/nanos/test_sign_parameter_selector/00025.png diff --git a/tests/zemu/snapshots/nanos_approve_dai_tokens/00000.png b/tests/ragger/snapshots/nanos/test_sign_reject/00000.png similarity index 100% rename from tests/zemu/snapshots/nanos_approve_dai_tokens/00000.png rename to tests/ragger/snapshots/nanos/test_sign_reject/00000.png diff --git a/tests/ragger/snapshots/nanos/test_sign_reject/00001.png b/tests/ragger/snapshots/nanos/test_sign_reject/00001.png new file mode 100644 index 0000000..3bae8ed Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_reject/00001.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_reject/00002.png b/tests/ragger/snapshots/nanos/test_sign_reject/00002.png new file mode 100644 index 0000000..debf3a1 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_reject/00002.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_reject/00003.png b/tests/ragger/snapshots/nanos/test_sign_reject/00003.png new file mode 100644 index 0000000..b80c1e4 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_reject/00003.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_reject/00004.png b/tests/ragger/snapshots/nanos/test_sign_reject/00004.png new file mode 100644 index 0000000..10706b8 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_reject/00004.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_reject/00005.png b/tests/ragger/snapshots/nanos/test_sign_reject/00005.png new file mode 100644 index 0000000..682555c Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_reject/00005.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_reject/00006.png b/tests/ragger/snapshots/nanos/test_sign_reject/00006.png new file mode 100644 index 0000000..7ec3b48 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_reject/00006.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_reject/00007.png b/tests/ragger/snapshots/nanos/test_sign_reject/00007.png new file mode 100644 index 0000000..89f3a23 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_reject/00007.png differ diff --git a/tests/speculos/screenshots/sign/nanos/blind_simple/00008.png b/tests/ragger/snapshots/nanos/test_sign_reject/00008.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/blind_simple/00008.png rename to tests/ragger/snapshots/nanos/test_sign_reject/00008.png diff --git a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00009.png b/tests/ragger/snapshots/nanos/test_sign_reject/00009.png similarity index 100% rename from tests/zemu/snapshots/nanos_transfer_112233445566_network/00009.png rename to tests/ragger/snapshots/nanos/test_sign_reject/00009.png diff --git a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00010.png b/tests/ragger/snapshots/nanos/test_sign_reject/00010.png similarity index 100% rename from tests/zemu/snapshots/nanos_transfer_112233445566_network/00010.png rename to tests/ragger/snapshots/nanos/test_sign_reject/00010.png diff --git a/tests/ragger/snapshots/nanos/test_sign_reject/00011.png b/tests/ragger/snapshots/nanos/test_sign_reject/00011.png new file mode 100644 index 0000000..ce795f3 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_reject/00011.png differ diff --git a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00000.png b/tests/ragger/snapshots/nanos/test_sign_simple/00000.png similarity index 100% rename from tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00000.png rename to tests/ragger/snapshots/nanos/test_sign_simple/00000.png diff --git a/tests/ragger/snapshots/nanos/test_sign_simple/00001.png b/tests/ragger/snapshots/nanos/test_sign_simple/00001.png new file mode 100644 index 0000000..3bae8ed Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_simple/00001.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_simple/00002.png b/tests/ragger/snapshots/nanos/test_sign_simple/00002.png new file mode 100644 index 0000000..debf3a1 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_simple/00002.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_simple/00003.png b/tests/ragger/snapshots/nanos/test_sign_simple/00003.png new file mode 100644 index 0000000..b80c1e4 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_simple/00003.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_simple/00004.png b/tests/ragger/snapshots/nanos/test_sign_simple/00004.png new file mode 100644 index 0000000..10706b8 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_simple/00004.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_simple/00005.png b/tests/ragger/snapshots/nanos/test_sign_simple/00005.png new file mode 100644 index 0000000..682555c Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_simple/00005.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_simple/00006.png b/tests/ragger/snapshots/nanos/test_sign_simple/00006.png new file mode 100644 index 0000000..7ec3b48 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_simple/00006.png differ diff --git a/tests/ragger/snapshots/nanos/test_sign_simple/00007.png b/tests/ragger/snapshots/nanos/test_sign_simple/00007.png new file mode 100644 index 0000000..89f3a23 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_simple/00007.png differ diff --git a/tests/speculos/screenshots/sign/nanos/nonce_display/00008.png b/tests/ragger/snapshots/nanos/test_sign_simple/00008.png similarity index 100% rename from tests/speculos/screenshots/sign/nanos/nonce_display/00008.png rename to tests/ragger/snapshots/nanos/test_sign_simple/00008.png diff --git a/tests/zemu/snapshots/nanos_transfer_bsc/00009.png b/tests/ragger/snapshots/nanos/test_sign_simple/00009.png similarity index 100% rename from tests/zemu/snapshots/nanos_transfer_bsc/00009.png rename to tests/ragger/snapshots/nanos/test_sign_simple/00009.png diff --git a/tests/ragger/snapshots/nanos/test_sign_simple/00010.png b/tests/ragger/snapshots/nanos/test_sign_simple/00010.png new file mode 100644 index 0000000..ce795f3 Binary files /dev/null and b/tests/ragger/snapshots/nanos/test_sign_simple/00010.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00001.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00001.png index f9840e3..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00001.png and b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00001.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00002.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00002.png index 6af0ec5..f9840e3 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00002.png and b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00003.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00003.png index 93112b3..a74d347 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00003.png and b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00004.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00004.png index 1bcb787..93112b3 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00004.png and b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00005.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00005.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00005.png and b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00006.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00006.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00006.png and b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution/00006.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00007.png similarity index 100% rename from tests/ragger/snapshots/nanosp/eip712_address_substitution/00006.png rename to tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00007.png diff --git a/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00001.png b/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00001.png index 23d61ed..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00001.png and b/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00001.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00002.png b/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00002.png index 6a5a9d6..23d61ed 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00002.png and b/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00003.png b/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00003.png index 85a797b..375301f 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00003.png and b/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00004.png b/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00004.png index c2a8d90..85a797b 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00004.png and b/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00005.png b/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00005.png index 570ce28..c2a8d90 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00005.png and b/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00006.png b/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00006.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00006.png and b/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00012.png b/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00007.png similarity index 100% rename from tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00012.png rename to tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00007.png diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00001.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00001.png index f9840e3..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00001.png and b/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00001.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00002.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00002.png index 6af0ec5..f9840e3 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00002.png and b/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00003.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00003.png index 1bcb787..a74d347 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00003.png and b/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00004.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00004.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00004.png and b/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00005.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00005.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00005.png and b/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00005.png differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution/00006.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00006.png similarity index 100% rename from tests/ragger/snapshots/nanox/eip712_address_substitution/00006.png rename to tests/ragger/snapshots/nanosp/domain_name_verbose_False/00006.png diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00001.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00001.png index f9840e3..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00001.png and b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00001.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00002.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00002.png index 6af0ec5..f9840e3 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00002.png and b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00003.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00003.png index 6a5a9d6..a74d347 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00003.png and b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00004.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00004.png index 1bcb787..375301f 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00004.png and b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00005.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00005.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00005.png and b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00006.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00006.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00006.png and b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/get_pk_rejected/00004.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00007.png similarity index 100% rename from tests/ragger/snapshots/nanosp/get_pk_rejected/00004.png rename to tests/ragger/snapshots/nanosp/domain_name_verbose_True/00007.png diff --git a/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00001.png b/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00001.png index f9840e3..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00001.png and b/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00001.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00002.png b/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00002.png index 639e421..f9840e3 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00002.png and b/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00003.png b/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00003.png index 1bcb787..24397c2 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00003.png and b/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00004.png b/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00004.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00004.png and b/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00005.png b/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00005.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00005.png and b/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00005.png differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00012.png b/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00006.png similarity index 100% rename from tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00012.png rename to tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00006.png diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution/00001.png b/tests/ragger/snapshots/nanosp/eip712_address_substitution/00001.png deleted file mode 100644 index 5ea6164..0000000 Binary files a/tests/ragger/snapshots/nanosp/eip712_address_substitution/00001.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution/00002.png b/tests/ragger/snapshots/nanosp/eip712_address_substitution/00002.png deleted file mode 100644 index e9adb7c..0000000 Binary files a/tests/ragger/snapshots/nanosp/eip712_address_substitution/00002.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution/00003.png b/tests/ragger/snapshots/nanosp/eip712_address_substitution/00003.png deleted file mode 100644 index 13f8255..0000000 Binary files a/tests/ragger/snapshots/nanosp/eip712_address_substitution/00003.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution/00004.png b/tests/ragger/snapshots/nanosp/eip712_address_substitution/00004.png deleted file mode 100644 index 6983285..0000000 Binary files a/tests/ragger/snapshots/nanosp/eip712_address_substitution/00004.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00001.png b/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00001.png deleted file mode 100644 index 7f1fe8a..0000000 Binary files a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00001.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00002.png b/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00002.png deleted file mode 100644 index 71834ce..0000000 Binary files a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00002.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00003.png b/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00003.png deleted file mode 100644 index 25bfb06..0000000 Binary files a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00003.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00004.png b/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00004.png deleted file mode 100644 index a4619ff..0000000 Binary files a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00004.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00005.png b/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00005.png deleted file mode 100644 index bb49e6d..0000000 Binary files a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00005.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00006.png b/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00006.png deleted file mode 100644 index b9d7e15..0000000 Binary files a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00006.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00007.png b/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00007.png deleted file mode 100644 index 2191773..0000000 Binary files a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00007.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00008.png b/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00008.png deleted file mode 100644 index 394eff6..0000000 Binary files a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00008.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00009.png b/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00009.png deleted file mode 100644 index 139d265..0000000 Binary files a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00009.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00010.png b/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00010.png deleted file mode 100644 index aa7c74d..0000000 Binary files a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00010.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00002.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00002.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00003.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00003.png index 950fd72..79e2760 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00003.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00004.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00004.png index 5906d19..950fd72 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00004.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00005.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00005.png index 1a9d80b..5906d19 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00005.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00006.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00006.png index 1bcb787..1a9d80b 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00006.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00007.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00007.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00007.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00008.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00008.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00008.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00008.png differ diff --git a/tests/ragger/snapshots/nanox/get_pk_rejected/00004.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00009.png similarity index 100% rename from tests/ragger/snapshots/nanox/get_pk_rejected/00004.png rename to tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_1/00009.png diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00002.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00002.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00003.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00003.png index 402128b..79e2760 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00003.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00004.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00004.png index 6e50574..402128b 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00004.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00005.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00005.png index 1a9d80b..6e50574 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00005.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00006.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00006.png index 66ebda5..1a9d80b 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00006.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00007.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00007.png index 73d6bb7..66ebda5 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00007.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00008.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00008.png index 570ce28..73d6bb7 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00008.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00009.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00009.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00010.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_137/00010.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00002.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00002.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00003.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00003.png index 402128b..79e2760 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00003.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00004.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00004.png index 417f99b..402128b 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00004.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00005.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00005.png index 1a9d80b..417f99b 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00005.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00006.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00006.png index 93112b3..1a9d80b 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00006.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00007.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00007.png index 1bcb787..93112b3 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00007.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00008.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00008.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00008.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00009.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00009.png and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00010.png b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc1155_safeBatchTransferFrom_5/00010.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00002.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00002.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00003.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00003.png index 950fd72..79e2760 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00003.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00004.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00004.png index 5906d19..950fd72 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00004.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00005.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00005.png index b0804b0..5906d19 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00005.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00006.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00006.png index 55ce94f..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00006.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00007.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00007.png index 1bcb787..55ce94f 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00007.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00008.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00008.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00008.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00009.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00009.png index e90cd9d..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00009.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00010.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00010.png index 6578872..e90cd9d 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00010.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00010.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00011.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00011.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1-rejected/00011.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00002.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00002.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00003.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00003.png index 950fd72..79e2760 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00003.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00004.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00004.png index 5906d19..950fd72 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00004.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00005.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00005.png index b0804b0..5906d19 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00005.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00006.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00006.png index 55ce94f..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00006.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00007.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00007.png index 1bcb787..55ce94f 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00007.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00008.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00008.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00008.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00009.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00009.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00010.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_1/00010.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00002.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00002.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00003.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00003.png index 402128b..79e2760 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00003.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00004.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00004.png index 6e50574..402128b 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00004.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00005.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00005.png index b0804b0..6e50574 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00005.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00006.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00006.png index 55ce94f..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00006.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00007.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00007.png index 66ebda5..55ce94f 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00007.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00008.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00008.png index 73d6bb7..66ebda5 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00008.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00009.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00009.png index 570ce28..73d6bb7 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00009.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00010.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00010.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00010.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00010.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00011.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00011.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_137/00011.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00002.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00002.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00003.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00003.png index 402128b..79e2760 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00003.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00004.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00004.png index 417f99b..402128b 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00004.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00005.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00005.png index b0804b0..417f99b 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00005.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00006.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00006.png index 55ce94f..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00006.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00007.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00007.png index 93112b3..55ce94f 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00007.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00008.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00008.png index 1bcb787..93112b3 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00008.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00009.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00009.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00009.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00010.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00010.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00010.png and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00010.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00011.png b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00011.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc1155_safeTransferFrom_5/00011.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00002.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00002.png index 4524ac5..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00002.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00003.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00003.png index c5b41a3..4524ac5 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00003.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00004.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00004.png index 5906d19..c5b41a3 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00004.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00005.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00005.png index 1bcb787..5906d19 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00005.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00006.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00006.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00006.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00007.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00007.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00007.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00008.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00008.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_1/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00002.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00002.png index 4524ac5..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00002.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00003.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00003.png index e3e9c91..4524ac5 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00003.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00004.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00004.png index 6e50574..e3e9c91 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00004.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00005.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00005.png index 66ebda5..6e50574 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00005.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00006.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00006.png index 73d6bb7..66ebda5 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00006.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00007.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00007.png index 570ce28..73d6bb7 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00007.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00008.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00008.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00008.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00009.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00009.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_137/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00002.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00002.png index 4524ac5..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00002.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00003.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00003.png index e3e9c91..4524ac5 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00003.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00004.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00004.png index 417f99b..e3e9c91 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00004.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00005.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00005.png index 93112b3..417f99b 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00005.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00006.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00006.png index 1bcb787..93112b3 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00006.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00007.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00007.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00007.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00008.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00008.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00008.png and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00009.png b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00009.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc1155_setApprovalForAll_5/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_1/00002.png b/tests/ragger/snapshots/nanosp/erc721_approve_1/00002.png index ef84a42..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_1/00002.png and b/tests/ragger/snapshots/nanosp/erc721_approve_1/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_1/00003.png b/tests/ragger/snapshots/nanosp/erc721_approve_1/00003.png index 02c6fc7..ef84a42 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_1/00003.png and b/tests/ragger/snapshots/nanosp/erc721_approve_1/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_1/00004.png b/tests/ragger/snapshots/nanosp/erc721_approve_1/00004.png index 185581e..02c6fc7 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_1/00004.png and b/tests/ragger/snapshots/nanosp/erc721_approve_1/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_1/00005.png b/tests/ragger/snapshots/nanosp/erc721_approve_1/00005.png index b0804b0..185581e 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_1/00005.png and b/tests/ragger/snapshots/nanosp/erc721_approve_1/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_1/00006.png b/tests/ragger/snapshots/nanosp/erc721_approve_1/00006.png index 1bcb787..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_1/00006.png and b/tests/ragger/snapshots/nanosp/erc721_approve_1/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_1/00007.png b/tests/ragger/snapshots/nanosp/erc721_approve_1/00007.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_1/00007.png and b/tests/ragger/snapshots/nanosp/erc721_approve_1/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_1/00008.png b/tests/ragger/snapshots/nanosp/erc721_approve_1/00008.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_1/00008.png and b/tests/ragger/snapshots/nanosp/erc721_approve_1/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_1/00009.png b/tests/ragger/snapshots/nanosp/erc721_approve_1/00009.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc721_approve_1/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_137/00002.png b/tests/ragger/snapshots/nanosp/erc721_approve_137/00002.png index ef84a42..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_137/00002.png and b/tests/ragger/snapshots/nanosp/erc721_approve_137/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_137/00003.png b/tests/ragger/snapshots/nanosp/erc721_approve_137/00003.png index 4ef9c7d..ef84a42 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_137/00003.png and b/tests/ragger/snapshots/nanosp/erc721_approve_137/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_137/00004.png b/tests/ragger/snapshots/nanosp/erc721_approve_137/00004.png index 5ec458c..4ef9c7d 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_137/00004.png and b/tests/ragger/snapshots/nanosp/erc721_approve_137/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_137/00005.png b/tests/ragger/snapshots/nanosp/erc721_approve_137/00005.png index b0804b0..5ec458c 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_137/00005.png and b/tests/ragger/snapshots/nanosp/erc721_approve_137/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_137/00006.png b/tests/ragger/snapshots/nanosp/erc721_approve_137/00006.png index 66ebda5..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_137/00006.png and b/tests/ragger/snapshots/nanosp/erc721_approve_137/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_137/00007.png b/tests/ragger/snapshots/nanosp/erc721_approve_137/00007.png index 73d6bb7..66ebda5 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_137/00007.png and b/tests/ragger/snapshots/nanosp/erc721_approve_137/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_137/00008.png b/tests/ragger/snapshots/nanosp/erc721_approve_137/00008.png index 570ce28..73d6bb7 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_137/00008.png and b/tests/ragger/snapshots/nanosp/erc721_approve_137/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_137/00009.png b/tests/ragger/snapshots/nanosp/erc721_approve_137/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_137/00009.png and b/tests/ragger/snapshots/nanosp/erc721_approve_137/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_137/00010.png b/tests/ragger/snapshots/nanosp/erc721_approve_137/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc721_approve_137/00010.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_5/00002.png b/tests/ragger/snapshots/nanosp/erc721_approve_5/00002.png index ef84a42..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_5/00002.png and b/tests/ragger/snapshots/nanosp/erc721_approve_5/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_5/00003.png b/tests/ragger/snapshots/nanosp/erc721_approve_5/00003.png index 994363f..ef84a42 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_5/00003.png and b/tests/ragger/snapshots/nanosp/erc721_approve_5/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_5/00004.png b/tests/ragger/snapshots/nanosp/erc721_approve_5/00004.png index 694eda5..994363f 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_5/00004.png and b/tests/ragger/snapshots/nanosp/erc721_approve_5/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_5/00005.png b/tests/ragger/snapshots/nanosp/erc721_approve_5/00005.png index b0804b0..694eda5 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_5/00005.png and b/tests/ragger/snapshots/nanosp/erc721_approve_5/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_5/00006.png b/tests/ragger/snapshots/nanosp/erc721_approve_5/00006.png index 93112b3..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_5/00006.png and b/tests/ragger/snapshots/nanosp/erc721_approve_5/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_5/00007.png b/tests/ragger/snapshots/nanosp/erc721_approve_5/00007.png index 1bcb787..93112b3 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_5/00007.png and b/tests/ragger/snapshots/nanosp/erc721_approve_5/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_5/00008.png b/tests/ragger/snapshots/nanosp/erc721_approve_5/00008.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_5/00008.png and b/tests/ragger/snapshots/nanosp/erc721_approve_5/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_5/00009.png b/tests/ragger/snapshots/nanosp/erc721_approve_5/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_approve_5/00009.png and b/tests/ragger/snapshots/nanosp/erc721_approve_5/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_approve_5/00010.png b/tests/ragger/snapshots/nanosp/erc721_approve_5/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc721_approve_5/00010.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00002.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00002.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00003.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00003.png index b1d7a7b..79e2760 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00003.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00004.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00004.png index 185581e..b1d7a7b 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00004.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00005.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00005.png index b0804b0..185581e 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00005.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00006.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00006.png index 1bcb787..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00006.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00007.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00007.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00007.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00008.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00008.png index e90cd9d..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00008.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00009.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00009.png index 6578872..e90cd9d 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00009.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00010.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1-rejected/00010.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00002.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00002.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00003.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00003.png index b1d7a7b..79e2760 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00003.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00004.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00004.png index 185581e..b1d7a7b 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00004.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00005.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00005.png index b0804b0..185581e 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00005.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00006.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00006.png index 1bcb787..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00006.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00007.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00007.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00007.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00008.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00008.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00008.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00009.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00009.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_1/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00002.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00002.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00003.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00003.png index 74c9ac0..79e2760 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00003.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00004.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00004.png index 5ec458c..74c9ac0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00004.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00005.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00005.png index b0804b0..5ec458c 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00005.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00006.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00006.png index 66ebda5..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00006.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00007.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00007.png index 73d6bb7..66ebda5 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00007.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00008.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00008.png index 570ce28..73d6bb7 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00008.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00009.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00009.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00010.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_137/00010.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00002.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00002.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00003.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00003.png index 3d7d224..79e2760 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00003.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00004.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00004.png index 694eda5..3d7d224 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00004.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00005.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00005.png index b0804b0..694eda5 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00005.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00006.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00006.png index 93112b3..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00006.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00007.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00007.png index 1bcb787..93112b3 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00007.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00008.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00008.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00008.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00009.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00009.png and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00010.png b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc721_safeTransferFrom_5/00010.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00002.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00002.png index 4524ac5..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00002.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00003.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00003.png index d22cc8c..4524ac5 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00003.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00004.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00004.png index 185581e..d22cc8c 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00004.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00005.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00005.png index 1bcb787..185581e 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00005.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00006.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00006.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00006.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00007.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00007.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00007.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00008.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00008.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_1/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00002.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00002.png index 4524ac5..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00002.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00003.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00003.png index b5fdf8b..4524ac5 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00003.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00004.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00004.png index 5ec458c..b5fdf8b 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00004.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00005.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00005.png index 66ebda5..5ec458c 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00005.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00006.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00006.png index 73d6bb7..66ebda5 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00006.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00007.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00007.png index 570ce28..73d6bb7 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00007.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00008.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00008.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00008.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00009.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00009.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_137/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00002.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00002.png index 4524ac5..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00002.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00003.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00003.png index 63ae03f..4524ac5 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00003.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00004.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00004.png index 694eda5..63ae03f 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00004.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00005.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00005.png index 93112b3..694eda5 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00005.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00006.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00006.png index 1bcb787..93112b3 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00006.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00007.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00007.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00007.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00008.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00008.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00008.png and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00009.png b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00009.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc721_setApprovalForAll_5/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00002.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00002.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00003.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00003.png index b1d7a7b..79e2760 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00003.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00004.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00004.png index 185581e..b1d7a7b 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00004.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00005.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00005.png index b0804b0..185581e 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00005.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00006.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00006.png index 1bcb787..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00006.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00007.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00007.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00007.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00008.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00008.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00008.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00009.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00009.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_1/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00002.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00002.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00003.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00003.png index 74c9ac0..79e2760 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00003.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00004.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00004.png index 5ec458c..74c9ac0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00004.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00005.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00005.png index b0804b0..5ec458c 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00005.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00006.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00006.png index 66ebda5..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00006.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00007.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00007.png index 73d6bb7..66ebda5 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00007.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00008.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00008.png index 570ce28..73d6bb7 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00008.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00009.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00009.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00010.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_137/00010.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00002.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00002.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00003.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00003.png index 3d7d224..79e2760 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00003.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00004.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00004.png index 694eda5..3d7d224 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00004.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00005.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00005.png index b0804b0..694eda5 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00005.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00006.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00006.png index 93112b3..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00006.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00007.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00007.png index 1bcb787..93112b3 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00007.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00008.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00008.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00008.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00009.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00009.png and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00010.png b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/erc721_transferFrom_5/00010.png differ diff --git a/tests/ragger/snapshots/nanosp/get_pk_rejected/00000.png b/tests/ragger/snapshots/nanosp/get_pk_rejected_60/00000.png similarity index 100% rename from tests/ragger/snapshots/nanosp/get_pk_rejected/00000.png rename to tests/ragger/snapshots/nanosp/get_pk_rejected_60/00000.png diff --git a/tests/ragger/snapshots/nanosp/get_pk_rejected/00001.png b/tests/ragger/snapshots/nanosp/get_pk_rejected_60/00001.png similarity index 100% rename from tests/ragger/snapshots/nanosp/get_pk_rejected/00001.png rename to tests/ragger/snapshots/nanosp/get_pk_rejected_60/00001.png diff --git a/tests/ragger/snapshots/nanosp/get_pk_rejected/00002.png b/tests/ragger/snapshots/nanosp/get_pk_rejected_60/00002.png similarity index 100% rename from tests/ragger/snapshots/nanosp/get_pk_rejected/00002.png rename to tests/ragger/snapshots/nanosp/get_pk_rejected_60/00002.png diff --git a/tests/ragger/snapshots/nanosp/get_pk_rejected/00003.png b/tests/ragger/snapshots/nanosp/get_pk_rejected_60/00003.png similarity index 100% rename from tests/ragger/snapshots/nanosp/get_pk_rejected/00003.png rename to tests/ragger/snapshots/nanosp/get_pk_rejected_60/00003.png diff --git a/tests/ragger/snapshots/nanosp/get_pk_rejected_60/00004.png b/tests/ragger/snapshots/nanosp/get_pk_rejected_60/00004.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/get_pk_rejected_60/00004.png differ diff --git a/tests/ragger/snapshots/nanox/get_pk_rejected/00000.png b/tests/ragger/snapshots/nanosp/get_pk_rejected_700/00000.png similarity index 100% rename from tests/ragger/snapshots/nanox/get_pk_rejected/00000.png rename to tests/ragger/snapshots/nanosp/get_pk_rejected_700/00000.png diff --git a/tests/speculos/screenshots/pubkey/nanox/get_public_key/00001.png b/tests/ragger/snapshots/nanosp/get_pk_rejected_700/00001.png similarity index 100% rename from tests/speculos/screenshots/pubkey/nanox/get_public_key/00001.png rename to tests/ragger/snapshots/nanosp/get_pk_rejected_700/00001.png diff --git a/tests/ragger/snapshots/nanox/get_pk_rejected/00002.png b/tests/ragger/snapshots/nanosp/get_pk_rejected_700/00002.png similarity index 100% rename from tests/ragger/snapshots/nanox/get_pk_rejected/00002.png rename to tests/ragger/snapshots/nanosp/get_pk_rejected_700/00002.png diff --git a/tests/ragger/snapshots/nanox/get_pk_rejected/00003.png b/tests/ragger/snapshots/nanosp/get_pk_rejected_700/00003.png similarity index 100% rename from tests/ragger/snapshots/nanox/get_pk_rejected/00003.png rename to tests/ragger/snapshots/nanosp/get_pk_rejected_700/00003.png diff --git a/tests/ragger/snapshots/nanosp/get_pk_rejected_700/00004.png b/tests/ragger/snapshots/nanosp/get_pk_rejected_700/00004.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/get_pk_rejected_700/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00000.png b/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00000.png new file mode 100644 index 0000000..37e5579 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00000.png differ diff --git a/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00001.png b/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00001.png new file mode 100644 index 0000000..8adfe9b Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00001.png differ diff --git a/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00002.png b/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00002.png new file mode 100644 index 0000000..2d1cb47 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00003.png b/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00003.png new file mode 100644 index 0000000..f1ac3da Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00004.png b/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00004.png new file mode 100644 index 0000000..dd0c56e Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00004.png differ diff --git a/tests/speculos/screenshots/sign/nanox/reject/00005.png b/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00005.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/reject/00005.png rename to tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00005.png diff --git a/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00006.png b/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00006.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_blind_sign_rejected/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00000.png b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00000.png new file mode 100644 index 0000000..37e5579 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00000.png differ diff --git a/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00001.png b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00001.png new file mode 100644 index 0000000..8adfe9b Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00001.png differ diff --git a/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00002.png b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00002.png new file mode 100644 index 0000000..2d1cb47 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00003.png b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00003.png new file mode 100644 index 0000000..f1ac3da Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00004.png b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00004.png new file mode 100644 index 0000000..dd0c56e Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00004.png differ diff --git a/tests/speculos/screenshots/eip1559/nanox/sign_eip_1559/00000.png b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00005.png similarity index 100% rename from tests/speculos/screenshots/eip1559/nanox/sign_eip_1559/00000.png rename to tests/ragger/snapshots/nanosp/test_blind_sign_signed/00005.png diff --git a/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00006.png b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00006.png new file mode 100644 index 0000000..1ac2ab0 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00006.png differ diff --git a/tests/speculos/screenshots/eip1559/nanox/sign_eip_1559/00001.png b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00007.png similarity index 100% rename from tests/speculos/screenshots/eip1559/nanox/sign_eip_1559/00001.png rename to tests/ragger/snapshots/nanosp/test_blind_sign_signed/00007.png diff --git a/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00008.png b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00008.png new file mode 100644 index 0000000..d704566 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00008.png differ diff --git a/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00009.png b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00009.png new file mode 100644 index 0000000..0fd18b2 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00010.png b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00010.png new file mode 100644 index 0000000..b499103 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00010.png differ diff --git a/tests/speculos/screenshots/eip1559/nanox/sign_eip_1559/00004.png b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00011.png similarity index 100% rename from tests/speculos/screenshots/eip1559/nanox/sign_eip_1559/00004.png rename to tests/ragger/snapshots/nanosp/test_blind_sign_signed/00011.png diff --git a/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00012.png b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00012.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_blind_sign_signed/00012.png differ diff --git a/tests/ragger/snapshots/nanosp/test_clone_thundercore b/tests/ragger/snapshots/nanosp/test_clone_thundercore new file mode 120000 index 0000000..1de979b --- /dev/null +++ b/tests/ragger/snapshots/nanosp/test_clone_thundercore @@ -0,0 +1 @@ +../nanox/test_clone_thundercore \ No newline at end of file diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution/00000.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00000.png similarity index 100% rename from tests/ragger/snapshots/nanosp/eip712_address_substitution/00000.png rename to tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00000.png diff --git a/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00001.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00001.png new file mode 100644 index 0000000..02ab24d Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00001.png differ diff --git a/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00002.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00002.png new file mode 100644 index 0000000..9379125 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00003.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00003.png new file mode 100644 index 0000000..953bdd2 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00004.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00004.png new file mode 100644 index 0000000..5e15c3b Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00004.png differ diff --git a/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00005.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00005.png new file mode 100644 index 0000000..ec78b45 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution/00005.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00006.png similarity index 100% rename from tests/ragger/snapshots/nanosp/eip712_address_substitution/00005.png rename to tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00006.png diff --git a/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00007.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00007.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering/00007.png differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00000.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_permit/00000.png similarity index 100% rename from tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00000.png rename to tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_permit/00000.png diff --git a/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_permit/00001.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_permit/00001.png new file mode 100644 index 0000000..bf2b3e7 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_permit/00001.png differ diff --git a/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_permit/00002.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_permit/00002.png new file mode 100644 index 0000000..1dfaf83 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_permit/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_permit/00003.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_permit/00003.png new file mode 100644 index 0000000..26d4d84 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_permit/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00011.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_permit/00004.png similarity index 100% rename from tests/ragger/snapshots/nanosp/eip712_address_substitution_verbose/00011.png rename to tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_permit/00004.png diff --git a/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_permit/00005.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_permit/00005.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_permit/00005.png differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution/00000.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_unlimited/00000.png similarity index 100% rename from tests/ragger/snapshots/nanox/eip712_address_substitution/00000.png rename to tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_unlimited/00000.png diff --git a/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_unlimited/00001.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_unlimited/00001.png new file mode 100644 index 0000000..6225fd9 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_unlimited/00001.png differ diff --git a/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_unlimited/00002.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_unlimited/00002.png new file mode 100644 index 0000000..14b865a Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_unlimited/00002.png differ diff --git a/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_unlimited/00003.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_unlimited/00003.png new file mode 100644 index 0000000..5ec054f Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_unlimited/00003.png differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution/00005.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_unlimited/00004.png similarity index 100% rename from tests/ragger/snapshots/nanox/eip712_address_substitution/00005.png rename to tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_unlimited/00004.png diff --git a/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_unlimited/00005.png b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_unlimited/00005.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_eip712_advanced_filtering_unlimited/00005.png differ diff --git a/tests/ragger/snapshots/nanosp/test_get_eth2_pk b/tests/ragger/snapshots/nanosp/test_get_eth2_pk new file mode 120000 index 0000000..dc7c371 --- /dev/null +++ b/tests/ragger/snapshots/nanosp/test_get_eth2_pk @@ -0,0 +1 @@ +../nanox/test_get_eth2_pk \ No newline at end of file diff --git a/tests/ragger/snapshots/nanosp/test_legacy_chainid b/tests/ragger/snapshots/nanosp/test_legacy_chainid new file mode 120000 index 0000000..d359734 --- /dev/null +++ b/tests/ragger/snapshots/nanosp/test_legacy_chainid @@ -0,0 +1 @@ +../nanox/test_legacy_chainid \ No newline at end of file diff --git a/tests/ragger/snapshots/nanosp/test_legacy_send_bsc b/tests/ragger/snapshots/nanosp/test_legacy_send_bsc new file mode 120000 index 0000000..026f196 --- /dev/null +++ b/tests/ragger/snapshots/nanosp/test_legacy_send_bsc @@ -0,0 +1 @@ +../nanox/test_legacy_send_bsc \ No newline at end of file diff --git a/tests/ragger/snapshots/nanosp/test_personal_sign_metamask b/tests/ragger/snapshots/nanosp/test_personal_sign_metamask new file mode 120000 index 0000000..3b23af2 --- /dev/null +++ b/tests/ragger/snapshots/nanosp/test_personal_sign_metamask @@ -0,0 +1 @@ +../nanox/test_personal_sign_metamask \ No newline at end of file diff --git a/tests/ragger/snapshots/nanosp/test_personal_sign_non_ascii b/tests/ragger/snapshots/nanosp/test_personal_sign_non_ascii new file mode 120000 index 0000000..ee2a028 --- /dev/null +++ b/tests/ragger/snapshots/nanosp/test_personal_sign_non_ascii @@ -0,0 +1 @@ +../nanox/test_personal_sign_non_ascii \ No newline at end of file diff --git a/tests/ragger/snapshots/nanosp/test_personal_sign_opensea b/tests/ragger/snapshots/nanosp/test_personal_sign_opensea new file mode 120000 index 0000000..60d0d6f --- /dev/null +++ b/tests/ragger/snapshots/nanosp/test_personal_sign_opensea @@ -0,0 +1 @@ +../nanox/test_personal_sign_opensea/ \ No newline at end of file diff --git a/tests/ragger/snapshots/nanosp/test_personal_sign_reject b/tests/ragger/snapshots/nanosp/test_personal_sign_reject new file mode 120000 index 0000000..5ecbf85 --- /dev/null +++ b/tests/ragger/snapshots/nanosp/test_personal_sign_reject @@ -0,0 +1 @@ +../nanox/test_personal_sign_reject \ No newline at end of file diff --git a/tests/ragger/snapshots/nanosp/test_sign_eip_2930 b/tests/ragger/snapshots/nanosp/test_sign_eip_2930 new file mode 120000 index 0000000..9ce6536 --- /dev/null +++ b/tests/ragger/snapshots/nanosp/test_sign_eip_2930 @@ -0,0 +1 @@ +../nanox/test_sign_eip_2930 \ No newline at end of file diff --git a/tests/ragger/snapshots/nanosp/test_sign_limit_nonce b/tests/ragger/snapshots/nanosp/test_sign_limit_nonce new file mode 120000 index 0000000..9f9d799 --- /dev/null +++ b/tests/ragger/snapshots/nanosp/test_sign_limit_nonce @@ -0,0 +1 @@ +../nanox/test_sign_limit_nonce \ No newline at end of file diff --git a/tests/ragger/snapshots/nanosp/test_sign_nonce_display b/tests/ragger/snapshots/nanosp/test_sign_nonce_display new file mode 120000 index 0000000..1d4b5ed --- /dev/null +++ b/tests/ragger/snapshots/nanosp/test_sign_nonce_display @@ -0,0 +1 @@ +../nanox/test_sign_nonce_display \ No newline at end of file diff --git a/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00000.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00000.png new file mode 100644 index 0000000..83f7a50 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00000.png differ diff --git a/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00001.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00001.png new file mode 100644 index 0000000..293eb07 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00001.png differ diff --git a/tests/speculos/screenshots/pubkey/nanox/get_public_key/00002.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00002.png similarity index 100% rename from tests/speculos/screenshots/pubkey/nanox/get_public_key/00002.png rename to tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00002.png diff --git a/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00003.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00003.png new file mode 100644 index 0000000..a3db166 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00003.png differ diff --git a/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00004.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00004.png new file mode 100644 index 0000000..953ecc7 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00004.png differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00011.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00005.png similarity index 100% rename from tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00011.png rename to tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00005.png diff --git a/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00006.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00006.png new file mode 100644 index 0000000..ecb060c Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00006.png differ diff --git a/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00007.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00007.png new file mode 100644 index 0000000..6fd3a5e Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00007.png differ diff --git a/tests/speculos/screenshots/pubkey/nanox/reject_get_public_key/00002.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00008.png similarity index 100% rename from tests/speculos/screenshots/pubkey/nanox/reject_get_public_key/00002.png rename to tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00008.png diff --git a/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00009.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00009.png new file mode 100644 index 0000000..37e5579 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00009.png differ diff --git a/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00010.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00010.png new file mode 100644 index 0000000..8adfe9b Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00010.png differ diff --git a/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00011.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00011.png new file mode 100644 index 0000000..2d1cb47 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00011.png differ diff --git a/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00012.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00012.png new file mode 100644 index 0000000..f1ac3da Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00012.png differ diff --git a/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00013.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00013.png new file mode 100644 index 0000000..dd0c56e Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00013.png differ diff --git a/tests/speculos/screenshots/eip2930/nanox/sign_eip_2930/00000.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00014.png similarity index 100% rename from tests/speculos/screenshots/eip2930/nanox/sign_eip_2930/00000.png rename to tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00014.png diff --git a/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00015.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00015.png new file mode 100644 index 0000000..1ac2ab0 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00015.png differ diff --git a/tests/zemu/snapshots/nanox_transfer_eip1559/00001.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00016.png similarity index 100% rename from tests/zemu/snapshots/nanox_transfer_eip1559/00001.png rename to tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00016.png diff --git a/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00017.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00017.png new file mode 100644 index 0000000..d704566 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00017.png differ diff --git a/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00018.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00018.png new file mode 100644 index 0000000..0fd18b2 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00018.png differ diff --git a/tests/speculos/screenshots/eip2930/nanox/sign_eip_2930/00005.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00019.png similarity index 100% rename from tests/speculos/screenshots/eip2930/nanox/sign_eip_2930/00005.png rename to tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00019.png diff --git a/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00020.png b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00020.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanosp/test_sign_parameter_selector/00020.png differ diff --git a/tests/ragger/snapshots/nanosp/test_sign_reject b/tests/ragger/snapshots/nanosp/test_sign_reject new file mode 120000 index 0000000..2f1476f --- /dev/null +++ b/tests/ragger/snapshots/nanosp/test_sign_reject @@ -0,0 +1 @@ +../nanox/test_sign_reject \ No newline at end of file diff --git a/tests/ragger/snapshots/nanosp/test_sign_simple b/tests/ragger/snapshots/nanosp/test_sign_simple new file mode 120000 index 0000000..3c8db9e --- /dev/null +++ b/tests/ragger/snapshots/nanosp/test_sign_simple @@ -0,0 +1 @@ +../nanox/test_sign_simple \ No newline at end of file diff --git a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00001.png b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00001.png index f9840e3..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00001.png and b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00001.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00002.png b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00002.png index 6af0ec5..f9840e3 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00002.png and b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00002.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00003.png b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00003.png index 93112b3..a74d347 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00003.png and b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00003.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00004.png b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00004.png index 1bcb787..93112b3 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00004.png and b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00004.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00005.png b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00005.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00005.png and b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00005.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00006.png b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00006.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00006.png and b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00006.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00007.png b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00007.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00007.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00001.png b/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00001.png index 23d61ed..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00001.png and b/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00001.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00002.png b/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00002.png index 6a5a9d6..23d61ed 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00002.png and b/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00002.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00003.png b/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00003.png index 85a797b..375301f 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00003.png and b/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00003.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00004.png b/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00004.png index c2a8d90..85a797b 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00004.png and b/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00004.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00005.png b/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00005.png index 570ce28..c2a8d90 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00005.png and b/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00005.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00006.png b/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00006.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00006.png and b/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00006.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00007.png b/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00007.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00007.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_False/00001.png b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00001.png index f9840e3..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_verbose_False/00001.png and b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00001.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_False/00002.png b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00002.png index 6af0ec5..f9840e3 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_verbose_False/00002.png and b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00002.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_False/00003.png b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00003.png index 1bcb787..a74d347 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_verbose_False/00003.png and b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00003.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_False/00004.png b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00004.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_verbose_False/00004.png and b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00004.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_False/00005.png b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00005.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_verbose_False/00005.png and b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00005.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_False/00006.png b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00006.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00006.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00001.png b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00001.png index f9840e3..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00001.png and b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00001.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00002.png b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00002.png index 6af0ec5..f9840e3 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00002.png and b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00002.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00003.png b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00003.png index 6a5a9d6..a74d347 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00003.png and b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00003.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00004.png b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00004.png index 1bcb787..375301f 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00004.png and b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00004.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00005.png b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00005.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00005.png and b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00005.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00006.png b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00006.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00006.png and b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00006.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00007.png b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00007.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00007.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00001.png b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00001.png index f9840e3..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00001.png and b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00001.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00002.png b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00002.png index 639e421..f9840e3 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00002.png and b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00002.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00003.png b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00003.png index 1bcb787..24397c2 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00003.png and b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00003.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00004.png b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00004.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00004.png and b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00004.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00005.png b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00005.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00005.png and b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00005.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00006.png b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00006.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00006.png differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution/00001.png b/tests/ragger/snapshots/nanox/eip712_address_substitution/00001.png deleted file mode 100644 index 5ea6164..0000000 Binary files a/tests/ragger/snapshots/nanox/eip712_address_substitution/00001.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution/00002.png b/tests/ragger/snapshots/nanox/eip712_address_substitution/00002.png deleted file mode 100644 index e9adb7c..0000000 Binary files a/tests/ragger/snapshots/nanox/eip712_address_substitution/00002.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution/00003.png b/tests/ragger/snapshots/nanox/eip712_address_substitution/00003.png deleted file mode 100644 index 13f8255..0000000 Binary files a/tests/ragger/snapshots/nanox/eip712_address_substitution/00003.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution/00004.png b/tests/ragger/snapshots/nanox/eip712_address_substitution/00004.png deleted file mode 100644 index 6983285..0000000 Binary files a/tests/ragger/snapshots/nanox/eip712_address_substitution/00004.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00001.png b/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00001.png deleted file mode 100644 index 7f1fe8a..0000000 Binary files a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00001.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00002.png b/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00002.png deleted file mode 100644 index 71834ce..0000000 Binary files a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00002.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00003.png b/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00003.png deleted file mode 100644 index 25bfb06..0000000 Binary files a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00003.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00004.png b/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00004.png deleted file mode 100644 index a4619ff..0000000 Binary files a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00004.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00005.png b/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00005.png deleted file mode 100644 index bb49e6d..0000000 Binary files a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00005.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00006.png b/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00006.png deleted file mode 100644 index b9d7e15..0000000 Binary files a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00006.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00007.png b/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00007.png deleted file mode 100644 index 2191773..0000000 Binary files a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00007.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00008.png b/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00008.png deleted file mode 100644 index 394eff6..0000000 Binary files a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00008.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00009.png b/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00009.png deleted file mode 100644 index 139d265..0000000 Binary files a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00009.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00010.png b/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00010.png deleted file mode 100644 index aa7c74d..0000000 Binary files a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00010.png and /dev/null differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00002.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00002.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00003.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00003.png index 950fd72..79e2760 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00003.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00004.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00004.png index 5906d19..950fd72 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00004.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00005.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00005.png index 1a9d80b..5906d19 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00005.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00006.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00006.png index 1bcb787..1a9d80b 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00006.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00007.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00007.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00007.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00008.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00008.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00008.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00009.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00009.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_1/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00002.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00002.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00003.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00003.png index 402128b..79e2760 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00003.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00004.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00004.png index 6e50574..402128b 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00004.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00005.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00005.png index 1a9d80b..6e50574 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00005.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00006.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00006.png index 66ebda5..1a9d80b 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00006.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00007.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00007.png index 73d6bb7..66ebda5 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00007.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00008.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00008.png index 570ce28..73d6bb7 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00008.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00009.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00009.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00010.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_137/00010.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00002.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00002.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00003.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00003.png index 402128b..79e2760 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00003.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00004.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00004.png index 417f99b..402128b 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00004.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00005.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00005.png index 1a9d80b..417f99b 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00005.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00006.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00006.png index 93112b3..1a9d80b 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00006.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00007.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00007.png index 1bcb787..93112b3 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00007.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00008.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00008.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00008.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00009.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00009.png and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00010.png b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc1155_safeBatchTransferFrom_5/00010.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00002.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00002.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00003.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00003.png index 950fd72..79e2760 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00003.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00004.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00004.png index 5906d19..950fd72 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00004.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00005.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00005.png index b0804b0..5906d19 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00005.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00006.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00006.png index 55ce94f..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00006.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00007.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00007.png index 1bcb787..55ce94f 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00007.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00008.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00008.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00008.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00009.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00009.png index e90cd9d..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00009.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00010.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00010.png index 6578872..e90cd9d 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00010.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00010.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00011.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00011.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1-rejected/00011.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00002.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00002.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00003.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00003.png index 950fd72..79e2760 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00003.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00004.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00004.png index 5906d19..950fd72 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00004.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00005.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00005.png index b0804b0..5906d19 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00005.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00006.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00006.png index 55ce94f..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00006.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00007.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00007.png index 1bcb787..55ce94f 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00007.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00008.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00008.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00008.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00009.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00009.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00010.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_1/00010.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00002.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00002.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00003.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00003.png index 402128b..79e2760 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00003.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00004.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00004.png index 6e50574..402128b 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00004.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00005.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00005.png index b0804b0..6e50574 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00005.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00006.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00006.png index 55ce94f..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00006.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00007.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00007.png index 66ebda5..55ce94f 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00007.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00008.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00008.png index 73d6bb7..66ebda5 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00008.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00009.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00009.png index 570ce28..73d6bb7 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00009.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00010.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00010.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00010.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00010.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00011.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00011.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_137/00011.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00002.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00002.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00003.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00003.png index 402128b..79e2760 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00003.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00004.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00004.png index 417f99b..402128b 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00004.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00005.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00005.png index b0804b0..417f99b 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00005.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00006.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00006.png index 55ce94f..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00006.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00007.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00007.png index 93112b3..55ce94f 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00007.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00008.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00008.png index 1bcb787..93112b3 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00008.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00009.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00009.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00009.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00010.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00010.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00010.png and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00010.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00011.png b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00011.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc1155_safeTransferFrom_5/00011.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00002.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00002.png index 4524ac5..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00002.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00003.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00003.png index c5b41a3..4524ac5 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00003.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00004.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00004.png index 5906d19..c5b41a3 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00004.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00005.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00005.png index 1bcb787..5906d19 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00005.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00006.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00006.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00006.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00007.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00007.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00007.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00008.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00008.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_1/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00002.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00002.png index 4524ac5..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00002.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00003.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00003.png index e3e9c91..4524ac5 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00003.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00004.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00004.png index 6e50574..e3e9c91 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00004.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00005.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00005.png index 66ebda5..6e50574 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00005.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00006.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00006.png index 73d6bb7..66ebda5 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00006.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00007.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00007.png index 570ce28..73d6bb7 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00007.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00008.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00008.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00008.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00009.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00009.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_137/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00002.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00002.png index 4524ac5..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00002.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00003.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00003.png index e3e9c91..4524ac5 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00003.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00004.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00004.png index 417f99b..e3e9c91 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00004.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00005.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00005.png index 93112b3..417f99b 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00005.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00006.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00006.png index 1bcb787..93112b3 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00006.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00007.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00007.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00007.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00008.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00008.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00008.png and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00009.png b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00009.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc1155_setApprovalForAll_5/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_1/00002.png b/tests/ragger/snapshots/nanox/erc721_approve_1/00002.png index ef84a42..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_1/00002.png and b/tests/ragger/snapshots/nanox/erc721_approve_1/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_1/00003.png b/tests/ragger/snapshots/nanox/erc721_approve_1/00003.png index 02c6fc7..ef84a42 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_1/00003.png and b/tests/ragger/snapshots/nanox/erc721_approve_1/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_1/00004.png b/tests/ragger/snapshots/nanox/erc721_approve_1/00004.png index 185581e..02c6fc7 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_1/00004.png and b/tests/ragger/snapshots/nanox/erc721_approve_1/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_1/00005.png b/tests/ragger/snapshots/nanox/erc721_approve_1/00005.png index b0804b0..185581e 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_1/00005.png and b/tests/ragger/snapshots/nanox/erc721_approve_1/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_1/00006.png b/tests/ragger/snapshots/nanox/erc721_approve_1/00006.png index 1bcb787..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_1/00006.png and b/tests/ragger/snapshots/nanox/erc721_approve_1/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_1/00007.png b/tests/ragger/snapshots/nanox/erc721_approve_1/00007.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_1/00007.png and b/tests/ragger/snapshots/nanox/erc721_approve_1/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_1/00008.png b/tests/ragger/snapshots/nanox/erc721_approve_1/00008.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_1/00008.png and b/tests/ragger/snapshots/nanox/erc721_approve_1/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_1/00009.png b/tests/ragger/snapshots/nanox/erc721_approve_1/00009.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc721_approve_1/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_137/00002.png b/tests/ragger/snapshots/nanox/erc721_approve_137/00002.png index ef84a42..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_137/00002.png and b/tests/ragger/snapshots/nanox/erc721_approve_137/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_137/00003.png b/tests/ragger/snapshots/nanox/erc721_approve_137/00003.png index 4ef9c7d..ef84a42 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_137/00003.png and b/tests/ragger/snapshots/nanox/erc721_approve_137/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_137/00004.png b/tests/ragger/snapshots/nanox/erc721_approve_137/00004.png index 5ec458c..4ef9c7d 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_137/00004.png and b/tests/ragger/snapshots/nanox/erc721_approve_137/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_137/00005.png b/tests/ragger/snapshots/nanox/erc721_approve_137/00005.png index b0804b0..5ec458c 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_137/00005.png and b/tests/ragger/snapshots/nanox/erc721_approve_137/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_137/00006.png b/tests/ragger/snapshots/nanox/erc721_approve_137/00006.png index 66ebda5..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_137/00006.png and b/tests/ragger/snapshots/nanox/erc721_approve_137/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_137/00007.png b/tests/ragger/snapshots/nanox/erc721_approve_137/00007.png index 73d6bb7..66ebda5 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_137/00007.png and b/tests/ragger/snapshots/nanox/erc721_approve_137/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_137/00008.png b/tests/ragger/snapshots/nanox/erc721_approve_137/00008.png index 570ce28..73d6bb7 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_137/00008.png and b/tests/ragger/snapshots/nanox/erc721_approve_137/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_137/00009.png b/tests/ragger/snapshots/nanox/erc721_approve_137/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_137/00009.png and b/tests/ragger/snapshots/nanox/erc721_approve_137/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_137/00010.png b/tests/ragger/snapshots/nanox/erc721_approve_137/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc721_approve_137/00010.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_5/00002.png b/tests/ragger/snapshots/nanox/erc721_approve_5/00002.png index ef84a42..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_5/00002.png and b/tests/ragger/snapshots/nanox/erc721_approve_5/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_5/00003.png b/tests/ragger/snapshots/nanox/erc721_approve_5/00003.png index 994363f..ef84a42 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_5/00003.png and b/tests/ragger/snapshots/nanox/erc721_approve_5/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_5/00004.png b/tests/ragger/snapshots/nanox/erc721_approve_5/00004.png index 694eda5..994363f 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_5/00004.png and b/tests/ragger/snapshots/nanox/erc721_approve_5/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_5/00005.png b/tests/ragger/snapshots/nanox/erc721_approve_5/00005.png index b0804b0..694eda5 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_5/00005.png and b/tests/ragger/snapshots/nanox/erc721_approve_5/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_5/00006.png b/tests/ragger/snapshots/nanox/erc721_approve_5/00006.png index 93112b3..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_5/00006.png and b/tests/ragger/snapshots/nanox/erc721_approve_5/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_5/00007.png b/tests/ragger/snapshots/nanox/erc721_approve_5/00007.png index 1bcb787..93112b3 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_5/00007.png and b/tests/ragger/snapshots/nanox/erc721_approve_5/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_5/00008.png b/tests/ragger/snapshots/nanox/erc721_approve_5/00008.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_5/00008.png and b/tests/ragger/snapshots/nanox/erc721_approve_5/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_5/00009.png b/tests/ragger/snapshots/nanox/erc721_approve_5/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_approve_5/00009.png and b/tests/ragger/snapshots/nanox/erc721_approve_5/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_approve_5/00010.png b/tests/ragger/snapshots/nanox/erc721_approve_5/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc721_approve_5/00010.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00002.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00002.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00003.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00003.png index b1d7a7b..79e2760 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00003.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00004.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00004.png index 185581e..b1d7a7b 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00004.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00005.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00005.png index b0804b0..185581e 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00005.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00006.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00006.png index 1bcb787..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00006.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00007.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00007.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00007.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00008.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00008.png index e90cd9d..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00008.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00009.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00009.png index 6578872..e90cd9d 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00009.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00010.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1-rejected/00010.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00002.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00002.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00003.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00003.png index b1d7a7b..79e2760 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00003.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00004.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00004.png index 185581e..b1d7a7b 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00004.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00005.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00005.png index b0804b0..185581e 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00005.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00006.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00006.png index 1bcb787..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00006.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00007.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00007.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00007.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00008.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00008.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00008.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00009.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00009.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_1/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00002.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00002.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00003.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00003.png index 74c9ac0..79e2760 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00003.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00004.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00004.png index 5ec458c..74c9ac0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00004.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00005.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00005.png index b0804b0..5ec458c 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00005.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00006.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00006.png index 66ebda5..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00006.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00007.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00007.png index 73d6bb7..66ebda5 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00007.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00008.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00008.png index 570ce28..73d6bb7 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00008.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00009.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00009.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00010.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_137/00010.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00002.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00002.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00003.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00003.png index 3d7d224..79e2760 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00003.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00004.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00004.png index 694eda5..3d7d224 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00004.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00005.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00005.png index b0804b0..694eda5 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00005.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00006.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00006.png index 93112b3..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00006.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00007.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00007.png index 1bcb787..93112b3 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00007.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00008.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00008.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00008.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00009.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00009.png and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00010.png b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc721_safeTransferFrom_5/00010.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00002.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00002.png index 4524ac5..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00002.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00003.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00003.png index d22cc8c..4524ac5 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00003.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00004.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00004.png index 185581e..d22cc8c 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00004.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00005.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00005.png index 1bcb787..185581e 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00005.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00006.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00006.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00006.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00007.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00007.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00007.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00008.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00008.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_1/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00002.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00002.png index 4524ac5..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00002.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00003.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00003.png index b5fdf8b..4524ac5 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00003.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00004.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00004.png index 5ec458c..b5fdf8b 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00004.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00005.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00005.png index 66ebda5..5ec458c 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00005.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00006.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00006.png index 73d6bb7..66ebda5 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00006.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00007.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00007.png index 570ce28..73d6bb7 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00007.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00008.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00008.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00008.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00009.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00009.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_137/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00002.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00002.png index 4524ac5..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00002.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00003.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00003.png index 63ae03f..4524ac5 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00003.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00004.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00004.png index 694eda5..63ae03f 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00004.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00005.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00005.png index 93112b3..694eda5 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00005.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00006.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00006.png index 1bcb787..93112b3 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00006.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00007.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00007.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00007.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00008.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00008.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00008.png and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00009.png b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00009.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc721_setApprovalForAll_5/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00002.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00002.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00003.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00003.png index b1d7a7b..79e2760 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00003.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00004.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00004.png index 185581e..b1d7a7b 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00004.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00005.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00005.png index b0804b0..185581e 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00005.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00006.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00006.png index 1bcb787..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00006.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00007.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00007.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00007.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00008.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00008.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00008.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00009.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00009.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc721_transferFrom_1/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00002.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00002.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00003.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00003.png index 74c9ac0..79e2760 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00003.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00004.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00004.png index 5ec458c..74c9ac0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00004.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00005.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00005.png index b0804b0..5ec458c 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00005.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00006.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00006.png index 66ebda5..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00006.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00007.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00007.png index 73d6bb7..66ebda5 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00007.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00008.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00008.png index 570ce28..73d6bb7 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00008.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00009.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00009.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00010.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc721_transferFrom_137/00010.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00002.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00002.png index 79e2760..1ac2ab0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00002.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00002.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00003.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00003.png index 3d7d224..79e2760 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00003.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00003.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00004.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00004.png index 694eda5..3d7d224 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00004.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00004.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00005.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00005.png index b0804b0..694eda5 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00005.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00005.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00006.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00006.png index 93112b3..b0804b0 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00006.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00006.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00007.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00007.png index 1bcb787..93112b3 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00007.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00007.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00008.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00008.png index 570ce28..1bcb787 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00008.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00008.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00009.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00009.png index 6578872..570ce28 100644 Binary files a/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00009.png and b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00009.png differ diff --git a/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00010.png b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/erc721_transferFrom_5/00010.png differ diff --git a/tests/speculos/screenshots/pubkey/nanox/get_public_key/00000.png b/tests/ragger/snapshots/nanox/get_pk_rejected_60/00000.png similarity index 100% rename from tests/speculos/screenshots/pubkey/nanox/get_public_key/00000.png rename to tests/ragger/snapshots/nanox/get_pk_rejected_60/00000.png diff --git a/tests/ragger/snapshots/nanox/get_pk_rejected/00001.png b/tests/ragger/snapshots/nanox/get_pk_rejected_60/00001.png similarity index 100% rename from tests/ragger/snapshots/nanox/get_pk_rejected/00001.png rename to tests/ragger/snapshots/nanox/get_pk_rejected_60/00001.png diff --git a/tests/ragger/snapshots/nanox/get_pk_rejected_60/00002.png b/tests/ragger/snapshots/nanox/get_pk_rejected_60/00002.png new file mode 100644 index 0000000..53ae651 Binary files /dev/null and b/tests/ragger/snapshots/nanox/get_pk_rejected_60/00002.png differ diff --git a/tests/speculos/screenshots/pubkey/nanox/reject_get_public_key/00003.png b/tests/ragger/snapshots/nanox/get_pk_rejected_60/00003.png similarity index 100% rename from tests/speculos/screenshots/pubkey/nanox/reject_get_public_key/00003.png rename to tests/ragger/snapshots/nanox/get_pk_rejected_60/00003.png diff --git a/tests/ragger/snapshots/nanox/get_pk_rejected_60/00004.png b/tests/ragger/snapshots/nanox/get_pk_rejected_60/00004.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/get_pk_rejected_60/00004.png differ diff --git a/tests/speculos/screenshots/pubkey/nanox/reject_get_public_key/00000.png b/tests/ragger/snapshots/nanox/get_pk_rejected_700/00000.png similarity index 100% rename from tests/speculos/screenshots/pubkey/nanox/reject_get_public_key/00000.png rename to tests/ragger/snapshots/nanox/get_pk_rejected_700/00000.png diff --git a/tests/speculos/screenshots/pubkey/nanox/reject_get_public_key/00001.png b/tests/ragger/snapshots/nanox/get_pk_rejected_700/00001.png similarity index 100% rename from tests/speculos/screenshots/pubkey/nanox/reject_get_public_key/00001.png rename to tests/ragger/snapshots/nanox/get_pk_rejected_700/00001.png diff --git a/tests/ragger/snapshots/nanox/get_pk_rejected_700/00002.png b/tests/ragger/snapshots/nanox/get_pk_rejected_700/00002.png new file mode 100644 index 0000000..53ae651 Binary files /dev/null and b/tests/ragger/snapshots/nanox/get_pk_rejected_700/00002.png differ diff --git a/tests/ragger/snapshots/nanox/get_pk_rejected_700/00003.png b/tests/ragger/snapshots/nanox/get_pk_rejected_700/00003.png new file mode 100644 index 0000000..e90cd9d Binary files /dev/null and b/tests/ragger/snapshots/nanox/get_pk_rejected_700/00003.png differ diff --git a/tests/ragger/snapshots/nanox/get_pk_rejected_700/00004.png b/tests/ragger/snapshots/nanox/get_pk_rejected_700/00004.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/get_pk_rejected_700/00004.png differ diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00000.png b/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00000.png new file mode 100644 index 0000000..37e5579 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00000.png differ diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00001.png b/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00001.png new file mode 100644 index 0000000..8adfe9b Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00001.png differ diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00002.png b/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00002.png new file mode 100644 index 0000000..2d1cb47 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00002.png differ diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00003.png b/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00003.png new file mode 100644 index 0000000..f1ac3da Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00003.png differ diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00004.png b/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00004.png new file mode 100644 index 0000000..dd0c56e Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00004.png differ diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00005.png b/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00005.png new file mode 100644 index 0000000..e90cd9d Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00005.png differ diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00006.png b/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00006.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_rejected/00006.png differ diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_signed/00000.png b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00000.png new file mode 100644 index 0000000..37e5579 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00000.png differ diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_signed/00001.png b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00001.png new file mode 100644 index 0000000..8adfe9b Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00001.png differ diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_signed/00002.png b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00002.png new file mode 100644 index 0000000..2d1cb47 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00002.png differ diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_signed/00003.png b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00003.png new file mode 100644 index 0000000..f1ac3da Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00003.png differ diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_signed/00004.png b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00004.png new file mode 100644 index 0000000..dd0c56e Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00004.png differ diff --git a/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00000.png b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00005.png similarity index 100% rename from tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00000.png rename to tests/ragger/snapshots/nanox/test_blind_sign_signed/00005.png diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_signed/00006.png b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00006.png new file mode 100644 index 0000000..1ac2ab0 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00006.png differ diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_signed/00007.png b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00007.png new file mode 100644 index 0000000..cdcc19d Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00007.png differ diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_signed/00008.png b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00008.png new file mode 100644 index 0000000..d704566 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00008.png differ diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_signed/00009.png b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00009.png new file mode 100644 index 0000000..0fd18b2 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00009.png differ diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_signed/00010.png b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00010.png new file mode 100644 index 0000000..b499103 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00010.png differ diff --git a/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00007.png b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00011.png similarity index 100% rename from tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00007.png rename to tests/ragger/snapshots/nanox/test_blind_sign_signed/00011.png diff --git a/tests/ragger/snapshots/nanox/test_blind_sign_signed/00012.png b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00012.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_blind_sign_signed/00012.png differ diff --git a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00000.png b/tests/ragger/snapshots/nanox/test_clone_thundercore/00000.png similarity index 100% rename from tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00000.png rename to tests/ragger/snapshots/nanox/test_clone_thundercore/00000.png diff --git a/tests/ragger/snapshots/nanox/test_clone_thundercore/00001.png b/tests/ragger/snapshots/nanox/test_clone_thundercore/00001.png new file mode 100644 index 0000000..09e00c6 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_clone_thundercore/00001.png differ diff --git a/tests/ragger/snapshots/nanox/test_clone_thundercore/00002.png b/tests/ragger/snapshots/nanox/test_clone_thundercore/00002.png new file mode 100644 index 0000000..af5ca55 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_clone_thundercore/00002.png differ diff --git a/tests/ragger/snapshots/nanox/test_clone_thundercore/00003.png b/tests/ragger/snapshots/nanox/test_clone_thundercore/00003.png new file mode 100644 index 0000000..eb15b72 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_clone_thundercore/00003.png differ diff --git a/tests/ragger/snapshots/nanox/test_clone_thundercore/00004.png b/tests/ragger/snapshots/nanox/test_clone_thundercore/00004.png new file mode 100644 index 0000000..16fbf15 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_clone_thundercore/00004.png differ diff --git a/tests/speculos/screenshots/sign/nanox/blind_simple/00005.png b/tests/ragger/snapshots/nanox/test_clone_thundercore/00005.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/blind_simple/00005.png rename to tests/ragger/snapshots/nanox/test_clone_thundercore/00005.png diff --git a/tests/ragger/snapshots/nanox/test_clone_thundercore/00006.png b/tests/ragger/snapshots/nanox/test_clone_thundercore/00006.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_clone_thundercore/00006.png differ diff --git a/tests/zemu/snapshots/nanox_transfer_eip1559/00007.png b/tests/ragger/snapshots/nanox/test_clone_thundercore/00007.png similarity index 100% rename from tests/zemu/snapshots/nanox_transfer_eip1559/00007.png rename to tests/ragger/snapshots/nanox/test_clone_thundercore/00007.png diff --git a/tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00000.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00000.png similarity index 100% rename from tests/ragger/snapshots/nanox/eip712_address_substitution_verbose/00000.png rename to tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00000.png diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00001.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00001.png new file mode 100644 index 0000000..02ab24d Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00001.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00002.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00002.png new file mode 100644 index 0000000..9379125 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00002.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00003.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00003.png new file mode 100644 index 0000000..953bdd2 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00003.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00004.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00004.png new file mode 100644 index 0000000..5e15c3b Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00004.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00005.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00005.png new file mode 100644 index 0000000..ec78b45 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00005.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00006.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00006.png new file mode 100644 index 0000000..53ae651 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00006.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00007.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00007.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering/00007.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00000.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00000.png new file mode 100644 index 0000000..b546f65 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00000.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00001.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00001.png new file mode 100644 index 0000000..bf2b3e7 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00001.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00002.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00002.png new file mode 100644 index 0000000..1dfaf83 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00002.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00003.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00003.png new file mode 100644 index 0000000..26d4d84 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00003.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00004.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00004.png new file mode 100644 index 0000000..53ae651 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00004.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00005.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00005.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_permit/00005.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00000.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00000.png new file mode 100644 index 0000000..b546f65 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00000.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00001.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00001.png new file mode 100644 index 0000000..6225fd9 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00001.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00002.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00002.png new file mode 100644 index 0000000..14b865a Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00002.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00003.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00003.png new file mode 100644 index 0000000..5ec054f Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00003.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00004.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00004.png new file mode 100644 index 0000000..53ae651 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00004.png differ diff --git a/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00005.png b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00005.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_eip712_advanced_filtering_unlimited/00005.png differ diff --git a/tests/ragger/snapshots/nanox/test_get_eth2_pk/00000.png b/tests/ragger/snapshots/nanox/test_get_eth2_pk/00000.png new file mode 100644 index 0000000..bb3289d Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_get_eth2_pk/00000.png differ diff --git a/tests/ragger/snapshots/nanox/test_get_eth2_pk/00001.png b/tests/ragger/snapshots/nanox/test_get_eth2_pk/00001.png new file mode 100644 index 0000000..aa05c8c Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_get_eth2_pk/00001.png differ diff --git a/tests/ragger/snapshots/nanox/test_get_eth2_pk/00002.png b/tests/ragger/snapshots/nanox/test_get_eth2_pk/00002.png new file mode 100644 index 0000000..5eb4dd4 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_get_eth2_pk/00002.png differ diff --git a/tests/ragger/snapshots/nanox/test_get_eth2_pk/00003.png b/tests/ragger/snapshots/nanox/test_get_eth2_pk/00003.png new file mode 100644 index 0000000..53ae651 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_get_eth2_pk/00003.png differ diff --git a/tests/ragger/snapshots/nanox/test_get_eth2_pk/00004.png b/tests/ragger/snapshots/nanox/test_get_eth2_pk/00004.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_get_eth2_pk/00004.png differ diff --git a/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00000.png b/tests/ragger/snapshots/nanox/test_legacy_chainid/00000.png similarity index 100% rename from tests/speculos/screenshots/erc721/nanox/transfer_erc721/00000.png rename to tests/ragger/snapshots/nanox/test_legacy_chainid/00000.png diff --git a/tests/ragger/snapshots/nanox/test_legacy_chainid/00001.png b/tests/ragger/snapshots/nanox/test_legacy_chainid/00001.png new file mode 100644 index 0000000..b8e2d05 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_legacy_chainid/00001.png differ diff --git a/tests/ragger/snapshots/nanox/test_legacy_chainid/00002.png b/tests/ragger/snapshots/nanox/test_legacy_chainid/00002.png new file mode 100644 index 0000000..86eecc0 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_legacy_chainid/00002.png differ diff --git a/tests/ragger/snapshots/nanox/test_legacy_chainid/00003.png b/tests/ragger/snapshots/nanox/test_legacy_chainid/00003.png new file mode 100644 index 0000000..eb15b72 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_legacy_chainid/00003.png differ diff --git a/tests/zemu/snapshots/nanox_transfer_112233445566_network/00003.png b/tests/ragger/snapshots/nanox/test_legacy_chainid/00004.png similarity index 100% rename from tests/zemu/snapshots/nanox_transfer_112233445566_network/00003.png rename to tests/ragger/snapshots/nanox/test_legacy_chainid/00004.png diff --git a/tests/ragger/snapshots/nanox/test_legacy_chainid/00005.png b/tests/ragger/snapshots/nanox/test_legacy_chainid/00005.png new file mode 100644 index 0000000..c2a8d90 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_legacy_chainid/00005.png differ diff --git a/tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00006.png b/tests/ragger/snapshots/nanox/test_legacy_chainid/00006.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00006.png rename to tests/ragger/snapshots/nanox/test_legacy_chainid/00006.png diff --git a/tests/ragger/snapshots/nanox/test_legacy_chainid/00007.png b/tests/ragger/snapshots/nanox/test_legacy_chainid/00007.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_legacy_chainid/00007.png differ diff --git a/tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00000.png b/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00000.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00000.png rename to tests/ragger/snapshots/nanox/test_legacy_send_bsc/00000.png diff --git a/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00001.png b/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00001.png new file mode 100644 index 0000000..b8e2d05 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00001.png differ diff --git a/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00002.png b/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00002.png new file mode 100644 index 0000000..1d220e0 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00002.png differ diff --git a/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00003.png b/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00003.png new file mode 100644 index 0000000..eb15b72 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00003.png differ diff --git a/tests/zemu/snapshots/nanox_transfer_bsc/00003.png b/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00004.png similarity index 100% rename from tests/zemu/snapshots/nanox_transfer_bsc/00003.png rename to tests/ragger/snapshots/nanox/test_legacy_send_bsc/00004.png diff --git a/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00005.png b/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00005.png new file mode 100644 index 0000000..cf48bdf Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00005.png differ diff --git a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00009.png b/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00006.png similarity index 100% rename from tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00009.png rename to tests/ragger/snapshots/nanox/test_legacy_send_bsc/00006.png diff --git a/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00007.png b/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00007.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_legacy_send_bsc/00007.png differ diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_metamask/00000.png b/tests/ragger/snapshots/nanox/test_personal_sign_metamask/00000.png new file mode 100644 index 0000000..a2e0c30 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_metamask/00000.png differ diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_metamask/00001.png b/tests/ragger/snapshots/nanox/test_personal_sign_metamask/00001.png new file mode 100644 index 0000000..b0936ad Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_metamask/00001.png differ diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00005.png b/tests/ragger/snapshots/nanox/test_personal_sign_metamask/00002.png similarity index 100% rename from tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00005.png rename to tests/ragger/snapshots/nanox/test_personal_sign_metamask/00002.png diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_metamask/00003.png b/tests/ragger/snapshots/nanox/test_personal_sign_metamask/00003.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_metamask/00003.png differ diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_non_ascii/00000.png b/tests/ragger/snapshots/nanox/test_personal_sign_non_ascii/00000.png new file mode 100644 index 0000000..a2e0c30 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_non_ascii/00000.png differ diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_non_ascii/00001.png b/tests/ragger/snapshots/nanox/test_personal_sign_non_ascii/00001.png new file mode 100644 index 0000000..c965f50 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_non_ascii/00001.png differ diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_non_ascii/00002.png b/tests/ragger/snapshots/nanox/test_personal_sign_non_ascii/00002.png new file mode 100644 index 0000000..234ab06 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_non_ascii/00002.png differ diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00005.png b/tests/ragger/snapshots/nanox/test_personal_sign_non_ascii/00003.png similarity index 100% rename from tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00005.png rename to tests/ragger/snapshots/nanox/test_personal_sign_non_ascii/00003.png diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_non_ascii/00004.png b/tests/ragger/snapshots/nanox/test_personal_sign_non_ascii/00004.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_non_ascii/00004.png differ diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00000.png b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00000.png new file mode 100644 index 0000000..a2e0c30 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00000.png differ diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00001.png b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00001.png similarity index 91% rename from tests/zemu/snapshots/nanox_eip191_opensea/00001.png rename to tests/ragger/snapshots/nanox/test_personal_sign_opensea/00001.png index 4f59a8d..e1159c5 100644 Binary files a/tests/zemu/snapshots/nanox_eip191_opensea/00001.png and b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00001.png differ diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00002.png b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00002.png new file mode 100644 index 0000000..3f76142 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00002.png differ diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00003.png b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00003.png new file mode 100644 index 0000000..685ff39 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00003.png differ diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00004.png b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00004.png new file mode 100644 index 0000000..668a2a6 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00004.png differ diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00005.png b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00005.png similarity index 100% rename from tests/zemu/snapshots/nanox_eip191_opensea/00005.png rename to tests/ragger/snapshots/nanox/test_personal_sign_opensea/00005.png diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00006.png b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00006.png new file mode 100644 index 0000000..a3799d2 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00006.png differ diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00007.png b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00007.png similarity index 100% rename from tests/zemu/snapshots/nanox_eip191_opensea/00007.png rename to tests/ragger/snapshots/nanox/test_personal_sign_opensea/00007.png diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00008.png b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00008.png similarity index 100% rename from tests/zemu/snapshots/nanox_eip191_opensea/00008.png rename to tests/ragger/snapshots/nanox/test_personal_sign_opensea/00008.png diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00009.png b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00009.png new file mode 100644 index 0000000..e7ffedd Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00009.png differ diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00010.png b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00010.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_opensea/00010.png differ diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_reject/00000.png b/tests/ragger/snapshots/nanox/test_personal_sign_reject/00000.png new file mode 100644 index 0000000..a2e0c30 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_reject/00000.png differ diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_reject/00001.png b/tests/ragger/snapshots/nanox/test_personal_sign_reject/00001.png new file mode 100644 index 0000000..380d883 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_reject/00001.png differ diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_reject/00002.png b/tests/ragger/snapshots/nanox/test_personal_sign_reject/00002.png new file mode 100644 index 0000000..e7ffedd Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_reject/00002.png differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_reject/00003.png b/tests/ragger/snapshots/nanox/test_personal_sign_reject/00003.png similarity index 100% rename from tests/speculos/screenshots/eip191/nanox/personal_sign_reject/00003.png rename to tests/ragger/snapshots/nanox/test_personal_sign_reject/00003.png diff --git a/tests/ragger/snapshots/nanox/test_personal_sign_reject/00004.png b/tests/ragger/snapshots/nanox/test_personal_sign_reject/00004.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_personal_sign_reject/00004.png differ diff --git a/tests/speculos/screenshots/sign/nanox/blind_simple/00000.png b/tests/ragger/snapshots/nanox/test_sign_eip_2930/00000.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/blind_simple/00000.png rename to tests/ragger/snapshots/nanox/test_sign_eip_2930/00000.png diff --git a/tests/ragger/snapshots/nanox/test_sign_eip_2930/00001.png b/tests/ragger/snapshots/nanox/test_sign_eip_2930/00001.png new file mode 100644 index 0000000..1ac2ab0 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_eip_2930/00001.png differ diff --git a/tests/speculos/screenshots/eip2930/nanox/sign_eip_2930/00001.png b/tests/ragger/snapshots/nanox/test_sign_eip_2930/00002.png similarity index 100% rename from tests/speculos/screenshots/eip2930/nanox/sign_eip_2930/00001.png rename to tests/ragger/snapshots/nanox/test_sign_eip_2930/00002.png diff --git a/tests/ragger/snapshots/nanox/test_sign_eip_2930/00003.png b/tests/ragger/snapshots/nanox/test_sign_eip_2930/00003.png new file mode 100644 index 0000000..3c30720 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_eip_2930/00003.png differ diff --git a/tests/speculos/screenshots/eip2930/nanox/sign_eip_2930/00003.png b/tests/ragger/snapshots/nanox/test_sign_eip_2930/00004.png similarity index 100% rename from tests/speculos/screenshots/eip2930/nanox/sign_eip_2930/00003.png rename to tests/ragger/snapshots/nanox/test_sign_eip_2930/00004.png diff --git a/tests/speculos/screenshots/eip2930/nanox/sign_eip_2930/00004.png b/tests/ragger/snapshots/nanox/test_sign_eip_2930/00005.png similarity index 100% rename from tests/speculos/screenshots/eip2930/nanox/sign_eip_2930/00004.png rename to tests/ragger/snapshots/nanox/test_sign_eip_2930/00005.png diff --git a/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00007.png b/tests/ragger/snapshots/nanox/test_sign_eip_2930/00006.png similarity index 100% rename from tests/speculos/screenshots/erc721/nanox/transfer_erc721/00007.png rename to tests/ragger/snapshots/nanox/test_sign_eip_2930/00006.png diff --git a/tests/ragger/snapshots/nanox/test_sign_eip_2930/00007.png b/tests/ragger/snapshots/nanox/test_sign_eip_2930/00007.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_eip_2930/00007.png differ diff --git a/tests/speculos/screenshots/sign/nanox/limit_nonce/00000.png b/tests/ragger/snapshots/nanox/test_sign_limit_nonce/00000.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/limit_nonce/00000.png rename to tests/ragger/snapshots/nanox/test_sign_limit_nonce/00000.png diff --git a/tests/ragger/snapshots/nanox/test_sign_limit_nonce/00001.png b/tests/ragger/snapshots/nanox/test_sign_limit_nonce/00001.png new file mode 100644 index 0000000..b8e2d05 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_limit_nonce/00001.png differ diff --git a/tests/speculos/screenshots/sign/nanox/limit_nonce/00001.png b/tests/ragger/snapshots/nanox/test_sign_limit_nonce/00002.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/limit_nonce/00001.png rename to tests/ragger/snapshots/nanox/test_sign_limit_nonce/00002.png diff --git a/tests/ragger/snapshots/nanox/test_sign_limit_nonce/00003.png b/tests/ragger/snapshots/nanox/test_sign_limit_nonce/00003.png new file mode 100644 index 0000000..eb15b72 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_limit_nonce/00003.png differ diff --git a/tests/speculos/screenshots/sign/nanox/limit_nonce/00003.png b/tests/ragger/snapshots/nanox/test_sign_limit_nonce/00004.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/limit_nonce/00003.png rename to tests/ragger/snapshots/nanox/test_sign_limit_nonce/00004.png diff --git a/tests/speculos/screenshots/sign/nanox/nonce_display/00005.png b/tests/ragger/snapshots/nanox/test_sign_limit_nonce/00005.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/nonce_display/00005.png rename to tests/ragger/snapshots/nanox/test_sign_limit_nonce/00005.png diff --git a/tests/ragger/snapshots/nanox/test_sign_limit_nonce/00006.png b/tests/ragger/snapshots/nanox/test_sign_limit_nonce/00006.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_limit_nonce/00006.png differ diff --git a/tests/speculos/screenshots/sign/nanox/nonce_display/00000.png b/tests/ragger/snapshots/nanox/test_sign_nonce_display/00000.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/nonce_display/00000.png rename to tests/ragger/snapshots/nanox/test_sign_nonce_display/00000.png diff --git a/tests/ragger/snapshots/nanox/test_sign_nonce_display/00001.png b/tests/ragger/snapshots/nanox/test_sign_nonce_display/00001.png new file mode 100644 index 0000000..b8e2d05 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_nonce_display/00001.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_nonce_display/00002.png b/tests/ragger/snapshots/nanox/test_sign_nonce_display/00002.png new file mode 100644 index 0000000..36ecb93 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_nonce_display/00002.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_nonce_display/00003.png b/tests/ragger/snapshots/nanox/test_sign_nonce_display/00003.png new file mode 100644 index 0000000..eb15b72 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_nonce_display/00003.png differ diff --git a/tests/speculos/screenshots/sign/nanox/nonce_display/00003.png b/tests/ragger/snapshots/nanox/test_sign_nonce_display/00004.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/nonce_display/00003.png rename to tests/ragger/snapshots/nanox/test_sign_nonce_display/00004.png diff --git a/tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00005.png b/tests/ragger/snapshots/nanox/test_sign_nonce_display/00005.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00005.png rename to tests/ragger/snapshots/nanox/test_sign_nonce_display/00005.png diff --git a/tests/speculos/screenshots/sign/nanox/limit_nonce/00004.png b/tests/ragger/snapshots/nanox/test_sign_nonce_display/00006.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/limit_nonce/00004.png rename to tests/ragger/snapshots/nanox/test_sign_nonce_display/00006.png diff --git a/tests/ragger/snapshots/nanox/test_sign_nonce_display/00007.png b/tests/ragger/snapshots/nanox/test_sign_nonce_display/00007.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_nonce_display/00007.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00000.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00000.png new file mode 100644 index 0000000..83f7a50 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00000.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00001.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00001.png new file mode 100644 index 0000000..293eb07 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00001.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00002.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00002.png new file mode 100644 index 0000000..53ae651 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00002.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00003.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00003.png new file mode 100644 index 0000000..a3db166 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00003.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00004.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00004.png new file mode 100644 index 0000000..953ecc7 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00004.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00005.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00005.png new file mode 100644 index 0000000..53ae651 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00005.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00006.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00006.png new file mode 100644 index 0000000..ecb060c Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00006.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00007.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00007.png new file mode 100644 index 0000000..6fd3a5e Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00007.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00008.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00008.png new file mode 100644 index 0000000..53ae651 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00008.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00009.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00009.png new file mode 100644 index 0000000..37e5579 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00009.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00010.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00010.png new file mode 100644 index 0000000..8adfe9b Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00010.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00011.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00011.png new file mode 100644 index 0000000..2d1cb47 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00011.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00012.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00012.png new file mode 100644 index 0000000..f1ac3da Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00012.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00013.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00013.png new file mode 100644 index 0000000..dd0c56e Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00013.png differ diff --git a/tests/speculos/screenshots/sign/nanox/reject/00000.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00014.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/reject/00000.png rename to tests/ragger/snapshots/nanox/test_sign_parameter_selector/00014.png diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00015.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00015.png new file mode 100644 index 0000000..1ac2ab0 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00015.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00016.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00016.png new file mode 100644 index 0000000..cdcc19d Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00016.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00017.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00017.png new file mode 100644 index 0000000..d704566 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00017.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00018.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00018.png new file mode 100644 index 0000000..0fd18b2 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00018.png differ diff --git a/tests/speculos/screenshots/sign/nanox/reject/00004.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00019.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/reject/00004.png rename to tests/ragger/snapshots/nanox/test_sign_parameter_selector/00019.png diff --git a/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00020.png b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00020.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_parameter_selector/00020.png differ diff --git a/tests/speculos/screenshots/sign/nanox/simple/00000.png b/tests/ragger/snapshots/nanox/test_sign_reject/00000.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/simple/00000.png rename to tests/ragger/snapshots/nanox/test_sign_reject/00000.png diff --git a/tests/ragger/snapshots/nanox/test_sign_reject/00001.png b/tests/ragger/snapshots/nanox/test_sign_reject/00001.png new file mode 100644 index 0000000..b8e2d05 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_reject/00001.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_reject/00002.png b/tests/ragger/snapshots/nanox/test_sign_reject/00002.png new file mode 100644 index 0000000..36ecb93 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_reject/00002.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_reject/00003.png b/tests/ragger/snapshots/nanox/test_sign_reject/00003.png new file mode 100644 index 0000000..eb15b72 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_reject/00003.png differ diff --git a/tests/speculos/screenshots/sign/nanox/blind_simple/00004.png b/tests/ragger/snapshots/nanox/test_sign_reject/00004.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/blind_simple/00004.png rename to tests/ragger/snapshots/nanox/test_sign_reject/00004.png diff --git a/tests/zemu/snapshots/nanox_approve_dai_tokens/00005.png b/tests/ragger/snapshots/nanox/test_sign_reject/00005.png similarity index 100% rename from tests/zemu/snapshots/nanox_approve_dai_tokens/00005.png rename to tests/ragger/snapshots/nanox/test_sign_reject/00005.png diff --git a/tests/ragger/snapshots/nanox/test_sign_reject/00006.png b/tests/ragger/snapshots/nanox/test_sign_reject/00006.png new file mode 100644 index 0000000..e90cd9d Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_reject/00006.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_reject/00007.png b/tests/ragger/snapshots/nanox/test_sign_reject/00007.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_reject/00007.png differ diff --git a/tests/zemu/snapshots/nanox_approve_dai_tokens/00000.png b/tests/ragger/snapshots/nanox/test_sign_simple/00000.png similarity index 100% rename from tests/zemu/snapshots/nanox_approve_dai_tokens/00000.png rename to tests/ragger/snapshots/nanox/test_sign_simple/00000.png diff --git a/tests/ragger/snapshots/nanox/test_sign_simple/00001.png b/tests/ragger/snapshots/nanox/test_sign_simple/00001.png new file mode 100644 index 0000000..b8e2d05 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_simple/00001.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_simple/00002.png b/tests/ragger/snapshots/nanox/test_sign_simple/00002.png new file mode 100644 index 0000000..36ecb93 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_simple/00002.png differ diff --git a/tests/ragger/snapshots/nanox/test_sign_simple/00003.png b/tests/ragger/snapshots/nanox/test_sign_simple/00003.png new file mode 100644 index 0000000..eb15b72 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_simple/00003.png differ diff --git a/tests/speculos/screenshots/sign/nanox/nonce_display/00004.png b/tests/ragger/snapshots/nanox/test_sign_simple/00004.png similarity index 100% rename from tests/speculos/screenshots/sign/nanox/nonce_display/00004.png rename to tests/ragger/snapshots/nanox/test_sign_simple/00004.png diff --git a/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00005.png b/tests/ragger/snapshots/nanox/test_sign_simple/00005.png similarity index 100% rename from tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00005.png rename to tests/ragger/snapshots/nanox/test_sign_simple/00005.png diff --git a/tests/ragger/snapshots/nanox/test_sign_simple/00006.png b/tests/ragger/snapshots/nanox/test_sign_simple/00006.png new file mode 100644 index 0000000..6578872 Binary files /dev/null and b/tests/ragger/snapshots/nanox/test_sign_simple/00006.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00000.png b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00000.png index 0108042..2e8a828 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00000.png and b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00000.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00001.png b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00001.png index 9c677e2..138bada 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00001.png and b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00001.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00002.png b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00002.png index 5bc6ddc..1d8135b 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00002.png and b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00002.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00003.png b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00003.png index a21279c..392165d 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00003.png and b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00003.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00004.png b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00004.png index 7a05bf7..339db1b 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00004.png and b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00004.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00005.png b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00005.png new file mode 100644 index 0000000..b1ff1b3 Binary files /dev/null and b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00005.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_unknown_chain/00000.png b/tests/ragger/snapshots/stax/domain_name_unknown_chain/00000.png index 74fa840..b861aca 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_unknown_chain/00000.png and b/tests/ragger/snapshots/stax/domain_name_unknown_chain/00000.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_unknown_chain/00001.png b/tests/ragger/snapshots/stax/domain_name_unknown_chain/00001.png index 5962c92..36cae6f 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_unknown_chain/00001.png and b/tests/ragger/snapshots/stax/domain_name_unknown_chain/00001.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_unknown_chain/00002.png b/tests/ragger/snapshots/stax/domain_name_unknown_chain/00002.png index 285801c..63f066b 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_unknown_chain/00002.png and b/tests/ragger/snapshots/stax/domain_name_unknown_chain/00002.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_unknown_chain/00003.png b/tests/ragger/snapshots/stax/domain_name_unknown_chain/00003.png index aed7d33..e91c222 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_unknown_chain/00003.png and b/tests/ragger/snapshots/stax/domain_name_unknown_chain/00003.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_unknown_chain/00004.png b/tests/ragger/snapshots/stax/domain_name_unknown_chain/00004.png index a21279c..392165d 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_unknown_chain/00004.png and b/tests/ragger/snapshots/stax/domain_name_unknown_chain/00004.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_unknown_chain/00005.png b/tests/ragger/snapshots/stax/domain_name_unknown_chain/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/domain_name_unknown_chain/00005.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_False/00000.png b/tests/ragger/snapshots/stax/domain_name_verbose_False/00000.png index f992e71..646ad0e 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_verbose_False/00000.png and b/tests/ragger/snapshots/stax/domain_name_verbose_False/00000.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_False/00001.png b/tests/ragger/snapshots/stax/domain_name_verbose_False/00001.png index b12e252..0129b92 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_verbose_False/00001.png and b/tests/ragger/snapshots/stax/domain_name_verbose_False/00001.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_False/00002.png b/tests/ragger/snapshots/stax/domain_name_verbose_False/00002.png index bc1ca93..d3fa2f4 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_verbose_False/00002.png and b/tests/ragger/snapshots/stax/domain_name_verbose_False/00002.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_False/00003.png b/tests/ragger/snapshots/stax/domain_name_verbose_False/00003.png index a21279c..392165d 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_verbose_False/00003.png and b/tests/ragger/snapshots/stax/domain_name_verbose_False/00003.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_False/00004.png b/tests/ragger/snapshots/stax/domain_name_verbose_False/00004.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/domain_name_verbose_False/00004.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_False/00005.png b/tests/ragger/snapshots/stax/domain_name_verbose_False/00005.png new file mode 100644 index 0000000..b1ff1b3 Binary files /dev/null and b/tests/ragger/snapshots/stax/domain_name_verbose_False/00005.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_True/00000.png b/tests/ragger/snapshots/stax/domain_name_verbose_True/00000.png index f992e71..5638399 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_verbose_True/00000.png and b/tests/ragger/snapshots/stax/domain_name_verbose_True/00000.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_True/00001.png b/tests/ragger/snapshots/stax/domain_name_verbose_True/00001.png index 0318492..1ddf313 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_verbose_True/00001.png and b/tests/ragger/snapshots/stax/domain_name_verbose_True/00001.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_True/00002.png b/tests/ragger/snapshots/stax/domain_name_verbose_True/00002.png index d4429dd..d6c26c7 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_verbose_True/00002.png and b/tests/ragger/snapshots/stax/domain_name_verbose_True/00002.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_True/00003.png b/tests/ragger/snapshots/stax/domain_name_verbose_True/00003.png index 687a019..b5d99f6 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_verbose_True/00003.png and b/tests/ragger/snapshots/stax/domain_name_verbose_True/00003.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_True/00004.png b/tests/ragger/snapshots/stax/domain_name_verbose_True/00004.png index a21279c..392165d 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_verbose_True/00004.png and b/tests/ragger/snapshots/stax/domain_name_verbose_True/00004.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_True/00005.png b/tests/ragger/snapshots/stax/domain_name_verbose_True/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/domain_name_verbose_True/00005.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_wrong_addr/00000.png b/tests/ragger/snapshots/stax/domain_name_wrong_addr/00000.png index f992e71..646ad0e 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_wrong_addr/00000.png and b/tests/ragger/snapshots/stax/domain_name_wrong_addr/00000.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_wrong_addr/00001.png b/tests/ragger/snapshots/stax/domain_name_wrong_addr/00001.png index 4fdbc62..a913de8 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_wrong_addr/00001.png and b/tests/ragger/snapshots/stax/domain_name_wrong_addr/00001.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_wrong_addr/00002.png b/tests/ragger/snapshots/stax/domain_name_wrong_addr/00002.png index bc1ca93..d3fa2f4 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_wrong_addr/00002.png and b/tests/ragger/snapshots/stax/domain_name_wrong_addr/00002.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_wrong_addr/00003.png b/tests/ragger/snapshots/stax/domain_name_wrong_addr/00003.png index a21279c..392165d 100644 Binary files a/tests/ragger/snapshots/stax/domain_name_wrong_addr/00003.png and b/tests/ragger/snapshots/stax/domain_name_wrong_addr/00003.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_wrong_addr/00004.png b/tests/ragger/snapshots/stax/domain_name_wrong_addr/00004.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/domain_name_wrong_addr/00004.png differ diff --git a/tests/ragger/snapshots/stax/domain_name_wrong_addr/00005.png b/tests/ragger/snapshots/stax/domain_name_wrong_addr/00005.png new file mode 100644 index 0000000..b1ff1b3 Binary files /dev/null and b/tests/ragger/snapshots/stax/domain_name_wrong_addr/00005.png differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution/00000.png b/tests/ragger/snapshots/stax/eip712_address_substitution/00000.png deleted file mode 100644 index 7c64769..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution/00000.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution/00001.png b/tests/ragger/snapshots/stax/eip712_address_substitution/00001.png deleted file mode 100644 index 7437b4f..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution/00001.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution/00002.png b/tests/ragger/snapshots/stax/eip712_address_substitution/00002.png deleted file mode 100644 index 7d3100b..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution/00002.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution/00003.png b/tests/ragger/snapshots/stax/eip712_address_substitution/00003.png deleted file mode 100644 index 404c495..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution/00003.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution/00004.png b/tests/ragger/snapshots/stax/eip712_address_substitution/00004.png deleted file mode 100644 index 987479c..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution/00004.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution/00005.png b/tests/ragger/snapshots/stax/eip712_address_substitution/00005.png deleted file mode 100644 index 726c927..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution/00005.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution/00006.png b/tests/ragger/snapshots/stax/eip712_address_substitution/00006.png deleted file mode 100644 index 1c2d6cd..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution/00006.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00000.png b/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00000.png deleted file mode 100644 index 7c64769..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00000.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00001.png b/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00001.png deleted file mode 100644 index eb09cbf..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00001.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00002.png b/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00002.png deleted file mode 100644 index ebd8116..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00002.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00003.png b/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00003.png deleted file mode 100644 index 539bd78..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00003.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00004.png b/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00004.png deleted file mode 100644 index 249ca4f..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00004.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00005.png b/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00005.png deleted file mode 100644 index c9f59eb..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00005.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00006.png b/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00006.png deleted file mode 100644 index 8da1fa8..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00006.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00007.png b/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00007.png deleted file mode 100644 index 26ca679..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00007.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00008.png b/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00008.png deleted file mode 100644 index dee5c6c..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00008.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00009.png b/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00009.png deleted file mode 100644 index fa8a88e..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00009.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00010.png b/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00010.png deleted file mode 100644 index 606a1ed..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00010.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00011.png b/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00011.png deleted file mode 100644 index 726c927..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00011.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00012.png b/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00012.png deleted file mode 100644 index 1c2d6cd..0000000 Binary files a/tests/ragger/snapshots/stax/eip712_address_substitution_verbose/00012.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00000.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00000.png index a052cf5..f1b9f80 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00000.png and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00001.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00001.png index fff290d..43f68af 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00001.png and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00002.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00002.png index 8a12928..f10dda9 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00002.png and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00003.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00003.png index 3add68c..15ac71a 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00003.png and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00004.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00004.png index a21279c..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00004.png and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00005.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_1/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00000.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00000.png index 793dc7c..5afbca6 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00000.png and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00001.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00001.png index ac999f4..29267f7 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00001.png and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00002.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00002.png index ebba918..1c6f5b5 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00002.png and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00003.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00003.png index 97b18b8..2c45d20 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00003.png and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00004.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00004.png index f1745c6..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00004.png and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00005.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00005.png index a21279c..339db1b 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00005.png and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_137/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00000.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00000.png index 2f11ba6..6287c4f 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00000.png and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00001.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00001.png index ac999f4..29267f7 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00001.png and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00002.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00002.png index 013c76c..a705c15 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00002.png and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00003.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00003.png index 637827a..48a5f5b 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00003.png and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00004.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00004.png index 1ebf85c..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00004.png and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00005.png b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00005.png index a21279c..339db1b 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00005.png and b/tests/ragger/snapshots/stax/erc1155_safeBatchTransferFrom_5/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00000.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00000.png index 4db1d2e..9a0e146 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00000.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00001.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00001.png index 8e0349c..43f68af 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00001.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00002.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00002.png index eb3fbaf..6ba7104 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00002.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00003.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00003.png index 637827a..205e02a 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00003.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00004.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00004.png index 2e4e974..abc9677 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00004.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00005.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00005.png index 9d26114..2b66970 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00005.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00006.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00006.png index cebc8be..339db1b 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00006.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1-rejected/00006.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00000.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00000.png index 4db1d2e..9a0e146 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00000.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00001.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00001.png index 8e0349c..43f68af 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00001.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00002.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00002.png index eb3fbaf..6ba7104 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00002.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00003.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00003.png index 637827a..205e02a 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00003.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00004.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00004.png index 2e4e974..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00004.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00005.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00005.png index a21279c..339db1b 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00005.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_1/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00000.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00000.png index 84aef9b..b8f06d4 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00000.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00001.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00001.png index ac999f4..29267f7 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00001.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00002.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00002.png index c735e5b..01857eb 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00002.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00003.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00003.png index 31f1490..1e9a74f 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00003.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00004.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00004.png index 82b2b67..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00004.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00005.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00005.png index a21279c..339db1b 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00005.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_137/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00000.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00000.png index b4c13a1..111fb39 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00000.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00001.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00001.png index ac999f4..29267f7 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00001.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00002.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00002.png index f8ef328..73c44ef 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00002.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00003.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00003.png index 902eaba..5ec9569 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00003.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00004.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00004.png index 61c8576..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00004.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00005.png b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00005.png index a21279c..339db1b 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00005.png and b/tests/ragger/snapshots/stax/erc1155_safeTransferFrom_5/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00000.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00000.png index 3507984..7838b75 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00000.png and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00001.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00001.png index d77ef27..3f64a16 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00001.png and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00002.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00002.png index 079bac2..b268e2a 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00002.png and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00003.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00003.png index 4ea9006..ed27647 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00003.png and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00004.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00004.png index a21279c..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00004.png and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00005.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_1/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00000.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00000.png index ea3b044..ad2d747 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00000.png and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00001.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00001.png index 783fdca..1fd5f83 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00001.png and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00002.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00002.png index 2889b80..5f2b12d 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00002.png and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00003.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00003.png index 5aa28c7..13a8a17 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00003.png and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00004.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00004.png index a21279c..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00004.png and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00005.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_137/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00000.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00000.png index 7a48edd..e15cfa6 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00000.png and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00001.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00001.png index 783fdca..1fd5f83 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00001.png and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00002.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00002.png index 50a0880..f18835c 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00002.png and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00003.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00003.png index c51949c..3399124 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00003.png and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00004.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00004.png index a21279c..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00004.png and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00005.png b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/erc1155_setApprovalForAll_5/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_1/00000.png b/tests/ragger/snapshots/stax/erc721_approve_1/00000.png index 3507984..7838b75 100644 Binary files a/tests/ragger/snapshots/stax/erc721_approve_1/00000.png and b/tests/ragger/snapshots/stax/erc721_approve_1/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_1/00001.png b/tests/ragger/snapshots/stax/erc721_approve_1/00001.png index a479dee..06242c1 100644 Binary files a/tests/ragger/snapshots/stax/erc721_approve_1/00001.png and b/tests/ragger/snapshots/stax/erc721_approve_1/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_1/00002.png b/tests/ragger/snapshots/stax/erc721_approve_1/00002.png index ec7ce09..ffdaeec 100644 Binary files a/tests/ragger/snapshots/stax/erc721_approve_1/00002.png and b/tests/ragger/snapshots/stax/erc721_approve_1/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_1/00003.png b/tests/ragger/snapshots/stax/erc721_approve_1/00003.png index 4ea9006..ed27647 100644 Binary files a/tests/ragger/snapshots/stax/erc721_approve_1/00003.png and b/tests/ragger/snapshots/stax/erc721_approve_1/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_1/00004.png b/tests/ragger/snapshots/stax/erc721_approve_1/00004.png index a21279c..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc721_approve_1/00004.png and b/tests/ragger/snapshots/stax/erc721_approve_1/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_1/00005.png b/tests/ragger/snapshots/stax/erc721_approve_1/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/erc721_approve_1/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_137/00000.png b/tests/ragger/snapshots/stax/erc721_approve_137/00000.png index ea3b044..ad2d747 100644 Binary files a/tests/ragger/snapshots/stax/erc721_approve_137/00000.png and b/tests/ragger/snapshots/stax/erc721_approve_137/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_137/00001.png b/tests/ragger/snapshots/stax/erc721_approve_137/00001.png index 8a1c953..cc31d88 100644 Binary files a/tests/ragger/snapshots/stax/erc721_approve_137/00001.png and b/tests/ragger/snapshots/stax/erc721_approve_137/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_137/00002.png b/tests/ragger/snapshots/stax/erc721_approve_137/00002.png index 4e99e67..106b8af 100644 Binary files a/tests/ragger/snapshots/stax/erc721_approve_137/00002.png and b/tests/ragger/snapshots/stax/erc721_approve_137/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_137/00003.png b/tests/ragger/snapshots/stax/erc721_approve_137/00003.png index 97b18b8..13a8a17 100644 Binary files a/tests/ragger/snapshots/stax/erc721_approve_137/00003.png and b/tests/ragger/snapshots/stax/erc721_approve_137/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_137/00004.png b/tests/ragger/snapshots/stax/erc721_approve_137/00004.png index 1fc04a3..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc721_approve_137/00004.png and b/tests/ragger/snapshots/stax/erc721_approve_137/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_137/00005.png b/tests/ragger/snapshots/stax/erc721_approve_137/00005.png index a21279c..339db1b 100644 Binary files a/tests/ragger/snapshots/stax/erc721_approve_137/00005.png and b/tests/ragger/snapshots/stax/erc721_approve_137/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_5/00000.png b/tests/ragger/snapshots/stax/erc721_approve_5/00000.png index 7a48edd..e15cfa6 100644 Binary files a/tests/ragger/snapshots/stax/erc721_approve_5/00000.png and b/tests/ragger/snapshots/stax/erc721_approve_5/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_5/00001.png b/tests/ragger/snapshots/stax/erc721_approve_5/00001.png index 675b1ae..f6753ed 100644 Binary files a/tests/ragger/snapshots/stax/erc721_approve_5/00001.png and b/tests/ragger/snapshots/stax/erc721_approve_5/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_5/00002.png b/tests/ragger/snapshots/stax/erc721_approve_5/00002.png index 186b27c..a217801 100644 Binary files a/tests/ragger/snapshots/stax/erc721_approve_5/00002.png and b/tests/ragger/snapshots/stax/erc721_approve_5/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_5/00003.png b/tests/ragger/snapshots/stax/erc721_approve_5/00003.png index 637827a..3399124 100644 Binary files a/tests/ragger/snapshots/stax/erc721_approve_5/00003.png and b/tests/ragger/snapshots/stax/erc721_approve_5/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_5/00004.png b/tests/ragger/snapshots/stax/erc721_approve_5/00004.png index 107ce91..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc721_approve_5/00004.png and b/tests/ragger/snapshots/stax/erc721_approve_5/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc721_approve_5/00005.png b/tests/ragger/snapshots/stax/erc721_approve_5/00005.png index a21279c..339db1b 100644 Binary files a/tests/ragger/snapshots/stax/erc721_approve_5/00005.png and b/tests/ragger/snapshots/stax/erc721_approve_5/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00000.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00000.png index 4db1d2e..9a0e146 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00000.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00001.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00001.png index 9488ed1..72ce397 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00001.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00002.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00002.png index ec7ce09..ffdaeec 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00002.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00003.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00003.png index b73cefa..205e02a 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00003.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00004.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00004.png index 9d26114..abc9677 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00004.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00005.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00005.png index cebc8be..2b66970 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00005.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00006.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00006.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1-rejected/00006.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00000.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00000.png index 4db1d2e..9a0e146 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00000.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00001.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00001.png index 9488ed1..72ce397 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00001.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00002.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00002.png index ec7ce09..ffdaeec 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00002.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00003.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00003.png index b73cefa..205e02a 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00003.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00004.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00004.png index a21279c..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00004.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00005.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_1/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00000.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00000.png index 84aef9b..b8f06d4 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00000.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00001.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00001.png index 4d9ac34..76d10cb 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00001.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00002.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00002.png index 4e99e67..106b8af 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00002.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00003.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00003.png index 97b18b8..1e9a74f 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00003.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00004.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00004.png index 82b2b67..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00004.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00005.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00005.png index a21279c..339db1b 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00005.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_137/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00000.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00000.png index b4c13a1..111fb39 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00000.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00001.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00001.png index 759bdc4..2020f0e 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00001.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00002.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00002.png index 186b27c..a217801 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00002.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00003.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00003.png index 637827a..5ec9569 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00003.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00004.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00004.png index 61c8576..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00004.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00005.png b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00005.png index a21279c..339db1b 100644 Binary files a/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00005.png and b/tests/ragger/snapshots/stax/erc721_safeTransferFrom_5/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00000.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00000.png index 3507984..7838b75 100644 Binary files a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00000.png and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00001.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00001.png index d64e222..8a53736 100644 Binary files a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00001.png and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00002.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00002.png index 7de0c0e..4fb537c 100644 Binary files a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00002.png and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00003.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00003.png index 4ea9006..ed27647 100644 Binary files a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00003.png and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00004.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00004.png index a21279c..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00004.png and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00005.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_1/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00000.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00000.png index ea3b044..ad2d747 100644 Binary files a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00000.png and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00001.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00001.png index 36791d8..1f94ad4 100644 Binary files a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00001.png and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00002.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00002.png index 7479cde..e8aa3ef 100644 Binary files a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00002.png and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00003.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00003.png index 5aa28c7..13a8a17 100644 Binary files a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00003.png and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00004.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00004.png index a21279c..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00004.png and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00005.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_137/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00000.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00000.png index 7a48edd..e15cfa6 100644 Binary files a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00000.png and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00001.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00001.png index 49d18f1..272200d 100644 Binary files a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00001.png and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00002.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00002.png index acad067..0f0b663 100644 Binary files a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00002.png and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00003.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00003.png index c51949c..3399124 100644 Binary files a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00003.png and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00004.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00004.png index a21279c..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00004.png and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00005.png b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/erc721_setApprovalForAll_5/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_1/00000.png b/tests/ragger/snapshots/stax/erc721_transferFrom_1/00000.png index 4db1d2e..9a0e146 100644 Binary files a/tests/ragger/snapshots/stax/erc721_transferFrom_1/00000.png and b/tests/ragger/snapshots/stax/erc721_transferFrom_1/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_1/00001.png b/tests/ragger/snapshots/stax/erc721_transferFrom_1/00001.png index 9488ed1..72ce397 100644 Binary files a/tests/ragger/snapshots/stax/erc721_transferFrom_1/00001.png and b/tests/ragger/snapshots/stax/erc721_transferFrom_1/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_1/00002.png b/tests/ragger/snapshots/stax/erc721_transferFrom_1/00002.png index ec7ce09..ffdaeec 100644 Binary files a/tests/ragger/snapshots/stax/erc721_transferFrom_1/00002.png and b/tests/ragger/snapshots/stax/erc721_transferFrom_1/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_1/00003.png b/tests/ragger/snapshots/stax/erc721_transferFrom_1/00003.png index b73cefa..205e02a 100644 Binary files a/tests/ragger/snapshots/stax/erc721_transferFrom_1/00003.png and b/tests/ragger/snapshots/stax/erc721_transferFrom_1/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_1/00004.png b/tests/ragger/snapshots/stax/erc721_transferFrom_1/00004.png index a21279c..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc721_transferFrom_1/00004.png and b/tests/ragger/snapshots/stax/erc721_transferFrom_1/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_1/00005.png b/tests/ragger/snapshots/stax/erc721_transferFrom_1/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/erc721_transferFrom_1/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_137/00000.png b/tests/ragger/snapshots/stax/erc721_transferFrom_137/00000.png index 84aef9b..b8f06d4 100644 Binary files a/tests/ragger/snapshots/stax/erc721_transferFrom_137/00000.png and b/tests/ragger/snapshots/stax/erc721_transferFrom_137/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_137/00001.png b/tests/ragger/snapshots/stax/erc721_transferFrom_137/00001.png index 4d9ac34..76d10cb 100644 Binary files a/tests/ragger/snapshots/stax/erc721_transferFrom_137/00001.png and b/tests/ragger/snapshots/stax/erc721_transferFrom_137/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_137/00002.png b/tests/ragger/snapshots/stax/erc721_transferFrom_137/00002.png index 4e99e67..106b8af 100644 Binary files a/tests/ragger/snapshots/stax/erc721_transferFrom_137/00002.png and b/tests/ragger/snapshots/stax/erc721_transferFrom_137/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_137/00003.png b/tests/ragger/snapshots/stax/erc721_transferFrom_137/00003.png index 97b18b8..1e9a74f 100644 Binary files a/tests/ragger/snapshots/stax/erc721_transferFrom_137/00003.png and b/tests/ragger/snapshots/stax/erc721_transferFrom_137/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_137/00004.png b/tests/ragger/snapshots/stax/erc721_transferFrom_137/00004.png index 82b2b67..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc721_transferFrom_137/00004.png and b/tests/ragger/snapshots/stax/erc721_transferFrom_137/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_137/00005.png b/tests/ragger/snapshots/stax/erc721_transferFrom_137/00005.png index a21279c..339db1b 100644 Binary files a/tests/ragger/snapshots/stax/erc721_transferFrom_137/00005.png and b/tests/ragger/snapshots/stax/erc721_transferFrom_137/00005.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_5/00000.png b/tests/ragger/snapshots/stax/erc721_transferFrom_5/00000.png index b4c13a1..111fb39 100644 Binary files a/tests/ragger/snapshots/stax/erc721_transferFrom_5/00000.png and b/tests/ragger/snapshots/stax/erc721_transferFrom_5/00000.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_5/00001.png b/tests/ragger/snapshots/stax/erc721_transferFrom_5/00001.png index 759bdc4..2020f0e 100644 Binary files a/tests/ragger/snapshots/stax/erc721_transferFrom_5/00001.png and b/tests/ragger/snapshots/stax/erc721_transferFrom_5/00001.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_5/00002.png b/tests/ragger/snapshots/stax/erc721_transferFrom_5/00002.png index 186b27c..a217801 100644 Binary files a/tests/ragger/snapshots/stax/erc721_transferFrom_5/00002.png and b/tests/ragger/snapshots/stax/erc721_transferFrom_5/00002.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_5/00003.png b/tests/ragger/snapshots/stax/erc721_transferFrom_5/00003.png index 637827a..5ec9569 100644 Binary files a/tests/ragger/snapshots/stax/erc721_transferFrom_5/00003.png and b/tests/ragger/snapshots/stax/erc721_transferFrom_5/00003.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_5/00004.png b/tests/ragger/snapshots/stax/erc721_transferFrom_5/00004.png index 61c8576..392165d 100644 Binary files a/tests/ragger/snapshots/stax/erc721_transferFrom_5/00004.png and b/tests/ragger/snapshots/stax/erc721_transferFrom_5/00004.png differ diff --git a/tests/ragger/snapshots/stax/erc721_transferFrom_5/00005.png b/tests/ragger/snapshots/stax/erc721_transferFrom_5/00005.png index a21279c..339db1b 100644 Binary files a/tests/ragger/snapshots/stax/erc721_transferFrom_5/00005.png and b/tests/ragger/snapshots/stax/erc721_transferFrom_5/00005.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_1/00000.png b/tests/ragger/snapshots/stax/get_pk_1/00000.png index 7593390..8b86980 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_1/00000.png and b/tests/ragger/snapshots/stax/get_pk_1/00000.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_1/00001.png b/tests/ragger/snapshots/stax/get_pk_1/00001.png index 16af88b..74e666d 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_1/00001.png and b/tests/ragger/snapshots/stax/get_pk_1/00001.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_1/00002.png b/tests/ragger/snapshots/stax/get_pk_1/00002.png index 13499fc..7a49478 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_1/00002.png and b/tests/ragger/snapshots/stax/get_pk_1/00002.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_1/00003.png b/tests/ragger/snapshots/stax/get_pk_1/00003.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/get_pk_1/00003.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_137/00000.png b/tests/ragger/snapshots/stax/get_pk_137/00000.png index 9e93052..2713f4b 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_137/00000.png and b/tests/ragger/snapshots/stax/get_pk_137/00000.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_137/00001.png b/tests/ragger/snapshots/stax/get_pk_137/00001.png index 16af88b..74e666d 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_137/00001.png and b/tests/ragger/snapshots/stax/get_pk_137/00001.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_137/00002.png b/tests/ragger/snapshots/stax/get_pk_137/00002.png index 13499fc..7a49478 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_137/00002.png and b/tests/ragger/snapshots/stax/get_pk_137/00002.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_137/00003.png b/tests/ragger/snapshots/stax/get_pk_137/00003.png index b1ff1b3..339db1b 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_137/00003.png and b/tests/ragger/snapshots/stax/get_pk_137/00003.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_2/00000.png b/tests/ragger/snapshots/stax/get_pk_2/00000.png index 123dc8c..499da81 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_2/00000.png and b/tests/ragger/snapshots/stax/get_pk_2/00000.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_2/00001.png b/tests/ragger/snapshots/stax/get_pk_2/00001.png index 16af88b..74e666d 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_2/00001.png and b/tests/ragger/snapshots/stax/get_pk_2/00001.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_2/00002.png b/tests/ragger/snapshots/stax/get_pk_2/00002.png index 13499fc..7a49478 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_2/00002.png and b/tests/ragger/snapshots/stax/get_pk_2/00002.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_2/00003.png b/tests/ragger/snapshots/stax/get_pk_2/00003.png index b1ff1b3..339db1b 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_2/00003.png and b/tests/ragger/snapshots/stax/get_pk_2/00003.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_5/00000.png b/tests/ragger/snapshots/stax/get_pk_5/00000.png index 2400ed1..4e0ec82 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_5/00000.png and b/tests/ragger/snapshots/stax/get_pk_5/00000.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_5/00001.png b/tests/ragger/snapshots/stax/get_pk_5/00001.png index 16af88b..74e666d 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_5/00001.png and b/tests/ragger/snapshots/stax/get_pk_5/00001.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_5/00002.png b/tests/ragger/snapshots/stax/get_pk_5/00002.png index 13499fc..7a49478 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_5/00002.png and b/tests/ragger/snapshots/stax/get_pk_5/00002.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_5/00003.png b/tests/ragger/snapshots/stax/get_pk_5/00003.png index b1ff1b3..339db1b 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_5/00003.png and b/tests/ragger/snapshots/stax/get_pk_5/00003.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_None/00000.png b/tests/ragger/snapshots/stax/get_pk_None/00000.png index 7593390..8b86980 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_None/00000.png and b/tests/ragger/snapshots/stax/get_pk_None/00000.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_None/00001.png b/tests/ragger/snapshots/stax/get_pk_None/00001.png index 16af88b..74e666d 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_None/00001.png and b/tests/ragger/snapshots/stax/get_pk_None/00001.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_None/00002.png b/tests/ragger/snapshots/stax/get_pk_None/00002.png index 13499fc..7a49478 100644 Binary files a/tests/ragger/snapshots/stax/get_pk_None/00002.png and b/tests/ragger/snapshots/stax/get_pk_None/00002.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_None/00003.png b/tests/ragger/snapshots/stax/get_pk_None/00003.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/get_pk_None/00003.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_rejected/00000.png b/tests/ragger/snapshots/stax/get_pk_rejected/00000.png deleted file mode 100644 index 7593390..0000000 Binary files a/tests/ragger/snapshots/stax/get_pk_rejected/00000.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/get_pk_rejected/00001.png b/tests/ragger/snapshots/stax/get_pk_rejected/00001.png deleted file mode 100644 index 16af88b..0000000 Binary files a/tests/ragger/snapshots/stax/get_pk_rejected/00001.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/get_pk_rejected/00002.png b/tests/ragger/snapshots/stax/get_pk_rejected/00002.png deleted file mode 100644 index b0eba3f..0000000 Binary files a/tests/ragger/snapshots/stax/get_pk_rejected/00002.png and /dev/null differ diff --git a/tests/ragger/snapshots/stax/get_pk_rejected_60/00000.png b/tests/ragger/snapshots/stax/get_pk_rejected_60/00000.png new file mode 100644 index 0000000..8b86980 Binary files /dev/null and b/tests/ragger/snapshots/stax/get_pk_rejected_60/00000.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_rejected_60/00001.png b/tests/ragger/snapshots/stax/get_pk_rejected_60/00001.png new file mode 100644 index 0000000..74e666d Binary files /dev/null and b/tests/ragger/snapshots/stax/get_pk_rejected_60/00001.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_rejected_60/00002.png b/tests/ragger/snapshots/stax/get_pk_rejected_60/00002.png new file mode 100644 index 0000000..94c91bb Binary files /dev/null and b/tests/ragger/snapshots/stax/get_pk_rejected_60/00002.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_rejected_60/00003.png b/tests/ragger/snapshots/stax/get_pk_rejected_60/00003.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/get_pk_rejected_60/00003.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_rejected_700/00000.png b/tests/ragger/snapshots/stax/get_pk_rejected_700/00000.png new file mode 100644 index 0000000..8b86980 Binary files /dev/null and b/tests/ragger/snapshots/stax/get_pk_rejected_700/00000.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_rejected_700/00001.png b/tests/ragger/snapshots/stax/get_pk_rejected_700/00001.png new file mode 100644 index 0000000..59b34f6 Binary files /dev/null and b/tests/ragger/snapshots/stax/get_pk_rejected_700/00001.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_rejected_700/00002.png b/tests/ragger/snapshots/stax/get_pk_rejected_700/00002.png new file mode 100644 index 0000000..94c91bb Binary files /dev/null and b/tests/ragger/snapshots/stax/get_pk_rejected_700/00002.png differ diff --git a/tests/ragger/snapshots/stax/get_pk_rejected_700/00003.png b/tests/ragger/snapshots/stax/get_pk_rejected_700/00003.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/get_pk_rejected_700/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_blind_sign_reject_in_risk_review/00000.png b/tests/ragger/snapshots/stax/test_blind_sign_reject_in_risk_review/00000.png new file mode 100644 index 0000000..a84d3f9 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_blind_sign_reject_in_risk_review/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_blind_sign_reject_in_risk_review/00001.png b/tests/ragger/snapshots/stax/test_blind_sign_reject_in_risk_review/00001.png new file mode 100644 index 0000000..193370d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_blind_sign_reject_in_risk_review/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_blind_sign_reject_in_risk_review/00002.png b/tests/ragger/snapshots/stax/test_blind_sign_reject_in_risk_review/00002.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_blind_sign_reject_in_risk_review/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_blind_sign_rejected/00000.png b/tests/ragger/snapshots/stax/test_blind_sign_rejected/00000.png new file mode 100644 index 0000000..a84d3f9 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_blind_sign_rejected/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_blind_sign_rejected/00001.png b/tests/ragger/snapshots/stax/test_blind_sign_rejected/00001.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_blind_sign_rejected/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_blind_sign_signed/00000.png b/tests/ragger/snapshots/stax/test_blind_sign_signed/00000.png new file mode 100644 index 0000000..a84d3f9 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_blind_sign_signed/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_blind_sign_signed/00001.png b/tests/ragger/snapshots/stax/test_blind_sign_signed/00001.png new file mode 100644 index 0000000..193370d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_blind_sign_signed/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_blind_sign_signed/00002.png b/tests/ragger/snapshots/stax/test_blind_sign_signed/00002.png new file mode 100644 index 0000000..d1b475b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_blind_sign_signed/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_blind_sign_signed/00003.png b/tests/ragger/snapshots/stax/test_blind_sign_signed/00003.png new file mode 100644 index 0000000..83bb1fe Binary files /dev/null and b/tests/ragger/snapshots/stax/test_blind_sign_signed/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_blind_sign_signed/00004.png b/tests/ragger/snapshots/stax/test_blind_sign_signed/00004.png new file mode 100644 index 0000000..2a79919 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_blind_sign_signed/00004.png differ diff --git a/tests/ragger/snapshots/stax/test_blind_sign_signed/00005.png b/tests/ragger/snapshots/stax/test_blind_sign_signed/00005.png new file mode 100644 index 0000000..392165d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_blind_sign_signed/00005.png differ diff --git a/tests/ragger/snapshots/stax/test_blind_sign_signed/00006.png b/tests/ragger/snapshots/stax/test_blind_sign_signed/00006.png new file mode 100644 index 0000000..2ba6d27 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_blind_sign_signed/00006.png differ diff --git a/tests/ragger/snapshots/stax/test_clone_thundercore/00000.png b/tests/ragger/snapshots/stax/test_clone_thundercore/00000.png new file mode 100644 index 0000000..6528f4a Binary files /dev/null and b/tests/ragger/snapshots/stax/test_clone_thundercore/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_clone_thundercore/00001.png b/tests/ragger/snapshots/stax/test_clone_thundercore/00001.png new file mode 100644 index 0000000..3be9c65 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_clone_thundercore/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_clone_thundercore/00002.png b/tests/ragger/snapshots/stax/test_clone_thundercore/00002.png new file mode 100644 index 0000000..9d7c316 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_clone_thundercore/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_clone_thundercore/00003.png b/tests/ragger/snapshots/stax/test_clone_thundercore/00003.png new file mode 100644 index 0000000..392165d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_clone_thundercore/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_clone_thundercore/00004.png b/tests/ragger/snapshots/stax/test_clone_thundercore/00004.png new file mode 100644 index 0000000..be4fbb0 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_clone_thundercore/00004.png differ diff --git a/tests/ragger/snapshots/stax/test_eip712_advanced_filtering/00000.png b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering/00000.png new file mode 100644 index 0000000..eb8072d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_eip712_advanced_filtering/00001.png b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering/00001.png new file mode 100644 index 0000000..37698d3 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_eip712_advanced_filtering/00002.png b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering/00002.png new file mode 100644 index 0000000..91fa3b1 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_eip712_advanced_filtering/00003.png b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering/00003.png new file mode 100644 index 0000000..fbea72d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_eip712_advanced_filtering/00004.png b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering/00004.png new file mode 100644 index 0000000..cfee3ae Binary files /dev/null and b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering/00004.png differ diff --git a/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_permit/00000.png b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_permit/00000.png new file mode 100644 index 0000000..eb8072d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_permit/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_permit/00001.png b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_permit/00001.png new file mode 100644 index 0000000..c57d9b8 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_permit/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_permit/00002.png b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_permit/00002.png new file mode 100644 index 0000000..fbea72d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_permit/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_permit/00003.png b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_permit/00003.png new file mode 100644 index 0000000..cfee3ae Binary files /dev/null and b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_permit/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_unlimited/00000.png b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_unlimited/00000.png new file mode 100644 index 0000000..eb8072d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_unlimited/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_unlimited/00001.png b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_unlimited/00001.png new file mode 100644 index 0000000..9d2c54e Binary files /dev/null and b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_unlimited/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_unlimited/00002.png b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_unlimited/00002.png new file mode 100644 index 0000000..fbea72d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_unlimited/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_unlimited/00003.png b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_unlimited/00003.png new file mode 100644 index 0000000..cfee3ae Binary files /dev/null and b/tests/ragger/snapshots/stax/test_eip712_advanced_filtering_unlimited/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_get_eth2_pk/00000.png b/tests/ragger/snapshots/stax/test_get_eth2_pk/00000.png new file mode 100644 index 0000000..1115702 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_get_eth2_pk/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_get_eth2_pk/00001.png b/tests/ragger/snapshots/stax/test_get_eth2_pk/00001.png new file mode 100644 index 0000000..4a25c17 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_get_eth2_pk/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_get_eth2_pk/00002.png b/tests/ragger/snapshots/stax/test_get_eth2_pk/00002.png new file mode 100644 index 0000000..7a49478 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_get_eth2_pk/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_get_eth2_pk/00003.png b/tests/ragger/snapshots/stax/test_get_eth2_pk/00003.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_get_eth2_pk/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_legacy_chainid/00000.png b/tests/ragger/snapshots/stax/test_legacy_chainid/00000.png new file mode 100644 index 0000000..b861aca Binary files /dev/null and b/tests/ragger/snapshots/stax/test_legacy_chainid/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_legacy_chainid/00001.png b/tests/ragger/snapshots/stax/test_legacy_chainid/00001.png new file mode 100644 index 0000000..91b08b4 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_legacy_chainid/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_legacy_chainid/00002.png b/tests/ragger/snapshots/stax/test_legacy_chainid/00002.png new file mode 100644 index 0000000..d081f46 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_legacy_chainid/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_legacy_chainid/00003.png b/tests/ragger/snapshots/stax/test_legacy_chainid/00003.png new file mode 100644 index 0000000..e91c222 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_legacy_chainid/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_legacy_chainid/00004.png b/tests/ragger/snapshots/stax/test_legacy_chainid/00004.png new file mode 100644 index 0000000..392165d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_legacy_chainid/00004.png differ diff --git a/tests/ragger/snapshots/stax/test_legacy_chainid/00005.png b/tests/ragger/snapshots/stax/test_legacy_chainid/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_legacy_chainid/00005.png differ diff --git a/tests/ragger/snapshots/stax/test_legacy_send_bsc/00000.png b/tests/ragger/snapshots/stax/test_legacy_send_bsc/00000.png new file mode 100644 index 0000000..2a42d69 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_legacy_send_bsc/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_legacy_send_bsc/00001.png b/tests/ragger/snapshots/stax/test_legacy_send_bsc/00001.png new file mode 100644 index 0000000..5a3513e Binary files /dev/null and b/tests/ragger/snapshots/stax/test_legacy_send_bsc/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_legacy_send_bsc/00002.png b/tests/ragger/snapshots/stax/test_legacy_send_bsc/00002.png new file mode 100644 index 0000000..8c511b0 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_legacy_send_bsc/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_legacy_send_bsc/00003.png b/tests/ragger/snapshots/stax/test_legacy_send_bsc/00003.png new file mode 100644 index 0000000..f6640bf Binary files /dev/null and b/tests/ragger/snapshots/stax/test_legacy_send_bsc/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_legacy_send_bsc/00004.png b/tests/ragger/snapshots/stax/test_legacy_send_bsc/00004.png new file mode 100644 index 0000000..392165d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_legacy_send_bsc/00004.png differ diff --git a/tests/ragger/snapshots/stax/test_legacy_send_bsc/00005.png b/tests/ragger/snapshots/stax/test_legacy_send_bsc/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_legacy_send_bsc/00005.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_metamask/00000.png b/tests/ragger/snapshots/stax/test_personal_sign_metamask/00000.png new file mode 100644 index 0000000..9579414 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_metamask/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_metamask/00001.png b/tests/ragger/snapshots/stax/test_personal_sign_metamask/00001.png new file mode 100644 index 0000000..c6f00c3 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_metamask/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_metamask/00002.png b/tests/ragger/snapshots/stax/test_personal_sign_metamask/00002.png new file mode 100644 index 0000000..87505b5 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_metamask/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_metamask/00003.png b/tests/ragger/snapshots/stax/test_personal_sign_metamask/00003.png new file mode 100644 index 0000000..cfee3ae Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_metamask/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_metamask/00004.png b/tests/ragger/snapshots/stax/test_personal_sign_metamask/00004.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_metamask/00004.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_non_ascii/00000.png b/tests/ragger/snapshots/stax/test_personal_sign_non_ascii/00000.png new file mode 100644 index 0000000..9579414 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_non_ascii/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_non_ascii/00001.png b/tests/ragger/snapshots/stax/test_personal_sign_non_ascii/00001.png new file mode 100644 index 0000000..3df6e84 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_non_ascii/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_non_ascii/00002.png b/tests/ragger/snapshots/stax/test_personal_sign_non_ascii/00002.png new file mode 100644 index 0000000..87505b5 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_non_ascii/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_non_ascii/00003.png b/tests/ragger/snapshots/stax/test_personal_sign_non_ascii/00003.png new file mode 100644 index 0000000..cfee3ae Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_non_ascii/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_non_ascii/00004.png b/tests/ragger/snapshots/stax/test_personal_sign_non_ascii/00004.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_non_ascii/00004.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_opensea/00000.png b/tests/ragger/snapshots/stax/test_personal_sign_opensea/00000.png new file mode 100644 index 0000000..9579414 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_opensea/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_opensea/00001.png b/tests/ragger/snapshots/stax/test_personal_sign_opensea/00001.png new file mode 100644 index 0000000..095e861 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_opensea/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_opensea/00002.png b/tests/ragger/snapshots/stax/test_personal_sign_opensea/00002.png new file mode 100644 index 0000000..4bed4eb Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_opensea/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_opensea/00003.png b/tests/ragger/snapshots/stax/test_personal_sign_opensea/00003.png new file mode 100644 index 0000000..87505b5 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_opensea/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_opensea/00004.png b/tests/ragger/snapshots/stax/test_personal_sign_opensea/00004.png new file mode 100644 index 0000000..cfee3ae Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_opensea/00004.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_opensea/00005.png b/tests/ragger/snapshots/stax/test_personal_sign_opensea/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_opensea/00005.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_reject/00000.png b/tests/ragger/snapshots/stax/test_personal_sign_reject/00000.png new file mode 100644 index 0000000..9579414 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_reject/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_reject/00001.png b/tests/ragger/snapshots/stax/test_personal_sign_reject/00001.png new file mode 100644 index 0000000..77ea986 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_reject/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_reject/00002.png b/tests/ragger/snapshots/stax/test_personal_sign_reject/00002.png new file mode 100644 index 0000000..87505b5 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_reject/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_reject/00003.png b/tests/ragger/snapshots/stax/test_personal_sign_reject/00003.png new file mode 100644 index 0000000..45414d5 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_reject/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_reject/00004.png b/tests/ragger/snapshots/stax/test_personal_sign_reject/00004.png new file mode 100644 index 0000000..fecace7 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_reject/00004.png differ diff --git a/tests/ragger/snapshots/stax/test_personal_sign_reject/00005.png b/tests/ragger/snapshots/stax/test_personal_sign_reject/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_personal_sign_reject/00005.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_eip_2930/00000.png b/tests/ragger/snapshots/stax/test_sign_eip_2930/00000.png new file mode 100644 index 0000000..5638399 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_eip_2930/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_eip_2930/00001.png b/tests/ragger/snapshots/stax/test_sign_eip_2930/00001.png new file mode 100644 index 0000000..cf76c1e Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_eip_2930/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_eip_2930/00002.png b/tests/ragger/snapshots/stax/test_sign_eip_2930/00002.png new file mode 100644 index 0000000..04b298b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_eip_2930/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_eip_2930/00003.png b/tests/ragger/snapshots/stax/test_sign_eip_2930/00003.png new file mode 100644 index 0000000..b5d99f6 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_eip_2930/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_eip_2930/00004.png b/tests/ragger/snapshots/stax/test_sign_eip_2930/00004.png new file mode 100644 index 0000000..392165d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_eip_2930/00004.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_eip_2930/00005.png b/tests/ragger/snapshots/stax/test_sign_eip_2930/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_eip_2930/00005.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_limit_nonce/00000.png b/tests/ragger/snapshots/stax/test_sign_limit_nonce/00000.png new file mode 100644 index 0000000..5638399 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_limit_nonce/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_limit_nonce/00001.png b/tests/ragger/snapshots/stax/test_sign_limit_nonce/00001.png new file mode 100644 index 0000000..d03fac9 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_limit_nonce/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_limit_nonce/00002.png b/tests/ragger/snapshots/stax/test_sign_limit_nonce/00002.png new file mode 100644 index 0000000..c7f4180 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_limit_nonce/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_limit_nonce/00003.png b/tests/ragger/snapshots/stax/test_sign_limit_nonce/00003.png new file mode 100644 index 0000000..b5d99f6 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_limit_nonce/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_limit_nonce/00004.png b/tests/ragger/snapshots/stax/test_sign_limit_nonce/00004.png new file mode 100644 index 0000000..392165d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_limit_nonce/00004.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_limit_nonce/00005.png b/tests/ragger/snapshots/stax/test_sign_limit_nonce/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_limit_nonce/00005.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_nonce_display/00000.png b/tests/ragger/snapshots/stax/test_sign_nonce_display/00000.png new file mode 100644 index 0000000..5638399 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_nonce_display/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_nonce_display/00001.png b/tests/ragger/snapshots/stax/test_sign_nonce_display/00001.png new file mode 100644 index 0000000..2127bf1 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_nonce_display/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_nonce_display/00002.png b/tests/ragger/snapshots/stax/test_sign_nonce_display/00002.png new file mode 100644 index 0000000..d6c26c7 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_nonce_display/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_nonce_display/00003.png b/tests/ragger/snapshots/stax/test_sign_nonce_display/00003.png new file mode 100644 index 0000000..b5d99f6 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_nonce_display/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_nonce_display/00004.png b/tests/ragger/snapshots/stax/test_sign_nonce_display/00004.png new file mode 100644 index 0000000..392165d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_nonce_display/00004.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_nonce_display/00005.png b/tests/ragger/snapshots/stax/test_sign_nonce_display/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_nonce_display/00005.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_parameter_selector/00000.png b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00000.png new file mode 100644 index 0000000..6145b4d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_parameter_selector/00001.png b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00001.png new file mode 100644 index 0000000..71e083b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_parameter_selector/00002.png b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00002.png new file mode 100644 index 0000000..ab57c8f Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_parameter_selector/00003.png b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00003.png new file mode 100644 index 0000000..e8e7bd3 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_parameter_selector/00004.png b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00004.png new file mode 100644 index 0000000..da2ee31 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00004.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_parameter_selector/00005.png b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00005.png new file mode 100644 index 0000000..e649f0e Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00005.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_parameter_selector/00006.png b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00006.png new file mode 100644 index 0000000..e8e7bd3 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00006.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_parameter_selector/00007.png b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00007.png new file mode 100644 index 0000000..05ddaee Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00007.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_parameter_selector/00008.png b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00008.png new file mode 100644 index 0000000..e649f0e Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00008.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_parameter_selector/00009.png b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00009.png new file mode 100644 index 0000000..a84d3f9 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00009.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_parameter_selector/00010.png b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00010.png new file mode 100644 index 0000000..193370d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00010.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_parameter_selector/00011.png b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00011.png new file mode 100644 index 0000000..d1b475b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00011.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_parameter_selector/00012.png b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00012.png new file mode 100644 index 0000000..83bb1fe Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00012.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_parameter_selector/00013.png b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00013.png new file mode 100644 index 0000000..2a79919 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00013.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_parameter_selector/00014.png b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00014.png new file mode 100644 index 0000000..392165d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_parameter_selector/00014.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_reject/00000.png b/tests/ragger/snapshots/stax/test_sign_reject/00000.png new file mode 100644 index 0000000..646ad0e Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_reject/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_reject/00001.png b/tests/ragger/snapshots/stax/test_sign_reject/00001.png new file mode 100644 index 0000000..0c61971 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_reject/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_reject/00002.png b/tests/ragger/snapshots/stax/test_sign_reject/00002.png new file mode 100644 index 0000000..d3fa2f4 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_reject/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_reject/00003.png b/tests/ragger/snapshots/stax/test_sign_reject/00003.png new file mode 100644 index 0000000..abc9677 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_reject/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_reject/00004.png b/tests/ragger/snapshots/stax/test_sign_reject/00004.png new file mode 100644 index 0000000..2b66970 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_reject/00004.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_reject/00005.png b/tests/ragger/snapshots/stax/test_sign_reject/00005.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_reject/00005.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_reject/00006.png b/tests/ragger/snapshots/stax/test_sign_reject/00006.png new file mode 100644 index 0000000..b1ff1b3 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_reject/00006.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_simple/00000.png b/tests/ragger/snapshots/stax/test_sign_simple/00000.png new file mode 100644 index 0000000..646ad0e Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_simple/00000.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_simple/00001.png b/tests/ragger/snapshots/stax/test_sign_simple/00001.png new file mode 100644 index 0000000..0c61971 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_simple/00001.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_simple/00002.png b/tests/ragger/snapshots/stax/test_sign_simple/00002.png new file mode 100644 index 0000000..d3fa2f4 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_simple/00002.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_simple/00003.png b/tests/ragger/snapshots/stax/test_sign_simple/00003.png new file mode 100644 index 0000000..392165d Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_simple/00003.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_simple/00004.png b/tests/ragger/snapshots/stax/test_sign_simple/00004.png new file mode 100644 index 0000000..339db1b Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_simple/00004.png differ diff --git a/tests/ragger/snapshots/stax/test_sign_simple/00005.png b/tests/ragger/snapshots/stax/test_sign_simple/00005.png new file mode 100644 index 0000000..b1ff1b3 Binary files /dev/null and b/tests/ragger/snapshots/stax/test_sign_simple/00005.png differ diff --git a/tests/ragger/staking_deposit/key_handling/key_derivation/path.py b/tests/ragger/staking_deposit/key_handling/key_derivation/path.py new file mode 100644 index 0000000..cb13719 --- /dev/null +++ b/tests/ragger/staking_deposit/key_handling/key_derivation/path.py @@ -0,0 +1,40 @@ +from typing import List + +from bip_utils import Bip39SeedGenerator +from bip_utils.utils.mnemonic import Mnemonic + +from staking_deposit.key_handling.key_derivation.tree import ( + derive_master_SK, + derive_child_SK, +) + + +def path_to_nodes(path: str) -> List[int]: + """ + Maps from a path string to a list of indices where each index represents the corresponding level in the path. + """ + path = path.replace(' ', '') + if not set(path).issubset(set('m1234567890/')): + raise ValueError(f"Invalid path {path}") + + indices = path.split('/') + + if indices[0] != 'm': + raise ValueError(f"The first character of path should be `m`. Got {indices[0]}.") + indices.pop(0) + + return [int(index) for index in indices] + + +def mnemonic_and_path_to_key(mnemonic: str, path: str) -> int: + """ + Return the SK at position `path`, derived from `mnemonic`. The password is to be + compliant with BIP39 mnemonics that use passwords, but is not used by this CLI outside of tests. + """ + #seed = get_seed(mnemonic) + seed = Bip39SeedGenerator(Mnemonic.FromString(mnemonic)).Generate() + + sk = derive_master_SK(seed) + for node in path_to_nodes(path): + sk = derive_child_SK(parent_SK=sk, index=node) + return sk diff --git a/tests/ragger/staking_deposit/key_handling/key_derivation/tree.py b/tests/ragger/staking_deposit/key_handling/key_derivation/tree.py new file mode 100644 index 0000000..977017f --- /dev/null +++ b/tests/ragger/staking_deposit/key_handling/key_derivation/tree.py @@ -0,0 +1,86 @@ +from typing import List + +from staking_deposit.utils.crypto import ( + HKDF, + SHA256, +) +from py_ecc.optimized_bls12_381 import curve_order as bls_curve_order + + +def _flip_bits_256(value: int) -> int: + """ + Flips 256 bits worth of `value`. + """ + return value ^ (2**256 - 1) + + +def _IKM_to_lamport_SK(*, IKM: bytes, salt: bytes) -> List[bytes]: + """ + Derives the lamport SK for a given `IKM` and `salt`. + + Ref: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2333.md#ikm_to_lamport_sk + """ + OKM = HKDF(salt=salt, IKM=IKM, L=8160) + lamport_SK = [OKM[i: i + 32] for i in range(0, 8160, 32)] + return lamport_SK + + +def _parent_SK_to_lamport_PK(*, parent_SK: int, index: int) -> bytes: + """ + Derives the `index`th child's lamport PK from the `parent_SK`. + + Ref: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2333.md#parent_sk_to_lamport_pk + """ + salt = index.to_bytes(4, byteorder='big') + IKM = parent_SK.to_bytes(32, byteorder='big') + lamport_0 = _IKM_to_lamport_SK(IKM=IKM, salt=salt) + not_IKM = _flip_bits_256(parent_SK).to_bytes(32, byteorder='big') + lamport_1 = _IKM_to_lamport_SK(IKM=not_IKM, salt=salt) + lamport_SKs = lamport_0 + lamport_1 + lamport_PKs = [SHA256(sk) for sk in lamport_SKs] + compressed_PK = SHA256(b''.join(lamport_PKs)) + return compressed_PK + + +def _HKDF_mod_r(*, IKM: bytes, key_info: bytes=b'') -> int: + """ + Hashes the IKM using HKDF and returns the answer as an int modulo r, the BLS field order. + + Ref: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2333.md#hkdf_mod_r + """ + L = 48 # `ceil((3 * ceil(log2(r))) / 16)`, where `r` is the order of the BLS 12-381 curve + salt = b'BLS-SIG-KEYGEN-SALT-' + SK = 0 + while SK == 0: + salt = SHA256(salt) + okm = HKDF( + salt=salt, + IKM=IKM + b'\x00', # add postfix `I2OSP(0, 1)` + L=L, + info=key_info + L.to_bytes(2, 'big'), + ) + SK = int.from_bytes(okm, byteorder='big') % bls_curve_order + return SK + + +def derive_child_SK(*, parent_SK: int, index: int) -> int: + """ + Given a parent SK `parent_SK`, return the child SK at the supplied `index`. + + Ref: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2333.md#derive_child_sk + """ + if index < 0 or index >= 2**32: + raise IndexError(f"`index` should be greater than or equal to 0 and less than 2**32. Got index={index}.") + lamport_PK = _parent_SK_to_lamport_PK(parent_SK=parent_SK, index=index) + return _HKDF_mod_r(IKM=lamport_PK) + + +def derive_master_SK(seed: bytes) -> int: + """ + Given a seed, derive the master SK. + + Ref: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2333.md#derive_master_sk + """ + if len(seed) < 32: + raise ValueError(f"`len(seed)` should be greater than or equal to 32. Got {len(seed)}.") + return _HKDF_mod_r(IKM=seed) diff --git a/tests/ragger/staking_deposit/utils/crypto.py b/tests/ragger/staking_deposit/utils/crypto.py new file mode 100644 index 0000000..e018d49 --- /dev/null +++ b/tests/ragger/staking_deposit/utils/crypto.py @@ -0,0 +1,52 @@ +from typing import Any + +from Crypto.Hash import ( + SHA256 as _sha256, + SHA512 as _sha512, +) +from Crypto.Protocol.KDF import ( + scrypt as _scrypt, + HKDF as _HKDF, + PBKDF2 as _PBKDF2, +) +from Crypto.Cipher import ( + AES as _AES +) + + +def SHA256(x: bytes) -> bytes: + return _sha256.new(x).digest() + + +def scrypt(*, password: str, salt: str, n: int, r: int, p: int, dklen: int) -> bytes: + if n * r * p < 2**20: # 128 MB memory usage + raise ValueError("The Scrypt parameters chosen are not secure.") + if n >= 2**(128 * r / 8): + raise ValueError("The given `n` should be less than `2**(128 * r / 8)`." + f"\tGot `n={n}`, r={r}, 2**(128 * r / 8)={2**(128 * r / 8)}") + res = _scrypt(password=password, salt=salt, key_len=dklen, N=n, r=r, p=p) + return res if isinstance(res, bytes) else res[0] # PyCryptodome can return Tuple[bytes] + + +def PBKDF2(*, password: bytes, salt: bytes, dklen: int, c: int, prf: str) -> bytes: + if 'sha' not in prf: + raise ValueError(f"String 'sha' is not in `prf`({prf})") + if 'sha256' in prf and c < 2**18: + # Verify the number of rounds of SHA256-PBKDF2. SHA512 not checked as use in BIP39 + # does not require, and therefore doesn't use, safe parameters (c=2048). + # Ref: https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki#from-mnemonic-to-seed + raise ValueError("The PBKDF2 parameters chosen are not secure.") + _hash = _sha256 if 'sha256' in prf else _sha512 + res = _PBKDF2(password=password, salt=salt, dkLen=dklen, count=c, hmac_hash_module=_hash) # type: ignore + return res if isinstance(res, bytes) else res[0] # PyCryptodome can return Tuple[bytes] + + +def HKDF(*, salt: bytes, IKM: bytes, L: int, info: bytes=b'') -> bytes: + res = _HKDF(master=IKM, key_len=L, salt=salt, hashmod=_sha256, context=info) + return res if isinstance(res, bytes) else res[0] # PyCryptodome can return Tuple[bytes] + + +def AES_128_CTR(*, key: bytes, iv: bytes) -> Any: + if len(key) != 16: + raise ValueError(f"The key length should be 16. Got {len(key)}.") + return _AES.new(key=key, mode=_AES.MODE_CTR, initial_value=iv, nonce=b'') diff --git a/tests/ragger/test_blind_sign.py b/tests/ragger/test_blind_sign.py index a4ed767..0885389 100644 --- a/tests/ragger/test_blind_sign.py +++ b/tests/ragger/test_blind_sign.py @@ -1,21 +1,35 @@ +from pathlib import Path import json +from typing import Optional +import pytest +from web3 import Web3 + from ragger.backend import BackendInterface from ragger.firmware import Firmware from ragger.navigator import Navigator, NavInsID from ragger.error import ExceptionRAPDU -from ledger_app_clients.ethereum.client import EthAppClient -from web3 import Web3 -from constants import ROOT_SNAPSHOT_PATH, ABIS_FOLDER + +from constants import ABIS_FOLDER + +from client.client import EthAppClient, StatusWord +from client.settings import SettingID, settings_toggle +import client.response_parser as ResponseParser +from client.utils import recover_transaction -# Token approval, would require loading the "internal plugin" & -# providing the token metadata from the CAL -def test_blind_sign(firmware: Firmware, - backend: BackendInterface, - navigator: Navigator): - app_client = EthAppClient(backend) +BIP32_PATH = "m/44'/60'/0'/0/0" +DEVICE_ADDR: Optional[bytes] = None - with open("%s/erc20.json" % (ABIS_FOLDER)) as file: +# TODO: do one test with nonce display + + +@pytest.fixture(name="sign", params=[True, False]) +def sign_fixture(request) -> bool: + return request.param + + +def common_tx_params() -> dict: + with open(f"{ABIS_FOLDER}/erc20.json", encoding="utf-8") as file: contract = Web3().eth.contract( abi=json.load(file), address=None @@ -25,7 +39,7 @@ def test_blind_sign(firmware: Firmware, bytes.fromhex("000000000022d473030f116ddee9f6b43ac78ba3"), Web3.to_wei("2", "ether") ]) - tx_params = { + return { "nonce": 235, "maxFeePerGas": Web3.to_wei(100, "gwei"), "maxPriorityFeePerGas": Web3.to_wei(10, "gwei"), @@ -35,21 +49,159 @@ def test_blind_sign(firmware: Firmware, "data": data, "chainId": 1 } - try: - with app_client.sign("m/44'/60'/0'/0/0", tx_params): - pass - except ExceptionRAPDU: - pass - else: - assert False - moves = list() - if firmware.device.startswith("nano"): - if firmware.device == "nanos": - moves += [NavInsID.RIGHT_CLICK] - moves += [NavInsID.BOTH_CLICK] + +# Token approval, would require loading the "internal plugin" & +# providing the token metadata from the CAL +def test_blind_sign(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + default_screenshot_path: Path, + test_name: str, + sign: bool): + global DEVICE_ADDR + app_client = EthAppClient(backend) + + if DEVICE_ADDR is None: + with app_client.get_public_addr(bip32_path=BIP32_PATH, display=False): + pass + _, DEVICE_ADDR, _ = ResponseParser.pk_addr(app_client.response().data) + + tx_params = common_tx_params() + try: + with app_client.sign(BIP32_PATH, tx_params): + if sign: + test_name += "_signed" + else: + test_name += "_rejected" + + moves = [] + if firmware.is_nano: + if firmware == Firmware.NANOS: + moves += [NavInsID.RIGHT_CLICK] * 2 + else: + moves += [NavInsID.RIGHT_CLICK] * 4 + + if not sign: + moves += [NavInsID.RIGHT_CLICK] + + moves += [NavInsID.BOTH_CLICK] + + if sign: + if firmware == Firmware.NANOS: + moves += [NavInsID.RIGHT_CLICK] * 10 + else: + moves += [NavInsID.RIGHT_CLICK] * 6 + moves += [NavInsID.BOTH_CLICK] + else: + if firmware == Firmware.STAX: + tap_number = 2 + else: + tap_number = 3 + if sign: + moves += [NavInsID.USE_CASE_CHOICE_REJECT] + moves += [NavInsID.USE_CASE_CHOICE_CONFIRM] + moves += [NavInsID.SWIPE_CENTER_TO_LEFT] * tap_number + moves += [NavInsID.USE_CASE_REVIEW_CONFIRM] + else: + moves += [NavInsID.USE_CASE_CHOICE_CONFIRM] + navigator.navigate_and_compare(default_screenshot_path, + test_name, + moves) + except ExceptionRAPDU as e: + assert e.status == StatusWord.INVALID_DATA else: - moves += [NavInsID.USE_CASE_CHOICE_CONFIRM] - navigator.navigate_and_compare(ROOT_SNAPSHOT_PATH, - "blind-signed_approval", - moves) + assert sign is True + # verify signature + vrs = ResponseParser.signature(app_client.response().data) + addr = recover_transaction(tx_params, vrs) + assert addr == DEVICE_ADDR + + +def test_blind_sign_reject_in_risk_review(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + default_screenshot_path: Path, + test_name: str): + app_client = EthAppClient(backend) + + if firmware.is_nano: + pytest.skip("Not supported on non-NBGL apps") + + try: + with app_client.sign(BIP32_PATH, common_tx_params()): + moves = [NavInsID.USE_CASE_CHOICE_REJECT] * 2 + navigator.navigate_and_compare(default_screenshot_path, + test_name, + moves) + except ExceptionRAPDU as e: + assert e.status == StatusWord.INVALID_DATA + else: + assert False # Should have thrown + + +# Token approval, would require loading the "internal plugin" & +# providing the token metadata from the CAL +def test_sign_parameter_selector(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + test_name: str, + default_screenshot_path: Path): + global DEVICE_ADDR + app_client = EthAppClient(backend) + + if DEVICE_ADDR is None: + with app_client.get_public_addr(bip32_path=BIP32_PATH, display=False): + pass + _, DEVICE_ADDR, _ = ResponseParser.pk_addr(app_client.response().data) + + settings_toggle(firmware, navigator, [SettingID.DEBUG_DATA]) + + tx_params = common_tx_params() + data_len = len(bytes.fromhex(tx_params["data"][2:])) + # selector + flows = 1 + data_len -= 4 + # parameters + flows += data_len // 32 + with app_client.sign(BIP32_PATH, tx_params): + moves = [] + if firmware.is_nano: + if firmware == Firmware.NANOS: + moves += [NavInsID.RIGHT_CLICK] * 2 + [NavInsID.BOTH_CLICK] + # Parameters on Nano S are split on multiple pages, hardcoded because the two parameters don't use the + # same amount of pages because of non-monospace fonts + moves += [NavInsID.RIGHT_CLICK] * 4 + [NavInsID.BOTH_CLICK] + moves += [NavInsID.RIGHT_CLICK] * 3 + [NavInsID.BOTH_CLICK] + else: + moves += ([NavInsID.RIGHT_CLICK] * 2 + [NavInsID.BOTH_CLICK]) * flows + + if firmware == Firmware.NANOS: + moves += [NavInsID.RIGHT_CLICK] * 2 + else: + moves += [NavInsID.RIGHT_CLICK] * 4 + moves += [NavInsID.BOTH_CLICK] + + if firmware == Firmware.NANOS: + moves += [NavInsID.RIGHT_CLICK] * 9 + else: + moves += [NavInsID.RIGHT_CLICK] * 5 + moves += [NavInsID.BOTH_CLICK] + else: + if firmware == Firmware.STAX: + tap_number = 2 + else: + tap_number = 3 + moves += ([NavInsID.SWIPE_CENTER_TO_LEFT] * 2 + [NavInsID.USE_CASE_REVIEW_CONFIRM]) * flows + moves += [NavInsID.USE_CASE_CHOICE_REJECT] + moves += [NavInsID.USE_CASE_CHOICE_CONFIRM] + moves += [NavInsID.SWIPE_CENTER_TO_LEFT] * tap_number + moves += [NavInsID.USE_CASE_REVIEW_CONFIRM] + navigator.navigate_and_compare(default_screenshot_path, + test_name, + moves) + + # verify signature + vrs = ResponseParser.signature(app_client.response().data) + addr = recover_transaction(tx_params, vrs) + assert addr == DEVICE_ADDR diff --git a/tests/ragger/test_clone.py b/tests/ragger/test_clone.py new file mode 100644 index 0000000..4419227 --- /dev/null +++ b/tests/ragger/test_clone.py @@ -0,0 +1,36 @@ +from pathlib import Path +from web3 import Web3 + +from ragger.backend import BackendInterface +from ragger.firmware import Firmware +from ragger.navigator import Navigator +from ragger.navigator.navigation_scenario import NavigateWithScenario + +from test_sign import common + + +# Values used across all tests +ADDR = bytes.fromhex("5a321744667052affa8386ed49e00ef223cbffc3") +BIP32_PATH = "m/44'/1001'/0'/0/0" +NONCE = 68 +GAS_PRICE = 13 +GAS_LIMIT = 21000 +VALUE = 0.31415 + + +# Transfer on Clone app +def test_clone_thundercore(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + scenario_navigator: NavigateWithScenario, + default_screenshot_path: Path, + test_name: str): + tx_params: dict = { + "nonce": NONCE, + "gasPrice": Web3.to_wei(GAS_PRICE, 'gwei'), + "gas": GAS_LIMIT, + "to": ADDR, + "value": Web3.to_wei(VALUE, "ether"), + "chainId": 108 + } + common(firmware, backend, navigator, scenario_navigator, default_screenshot_path, tx_params, test_name, BIP32_PATH) diff --git a/tests/ragger/test_configuration_cmd.py b/tests/ragger/test_configuration_cmd.py new file mode 100644 index 0000000..99e8760 --- /dev/null +++ b/tests/ragger/test_configuration_cmd.py @@ -0,0 +1,49 @@ +from pathlib import Path +from typing import List +import re + +from ragger.backend import BackendInterface +from ragger.utils.misc import get_current_app_name_and_version + + +def test_check_version(backend: BackendInterface): + """Check version and name""" + + # Send the APDU + app_name, version = get_current_app_name_and_version(backend) + print(f" Name: {app_name}") + print(f" Version: {version}") + _verify_version(version.split("-")[0]) + + +def _verify_version(version: str) -> None: + """Verify the app version, based on defines in Makefile + + Args: + Version (str): Version to be checked + """ + + vers_dict = {} + vers_str = "" + lines = _read_makefile() + version_re = re.compile(r"^APPVERSION_(?P\w)\s?=\s?(?P\d*)", re.I) + for line in lines: + info = version_re.match(line) + if info: + dinfo = info.groupdict() + vers_dict[dinfo["part"]] = dinfo["val"] + try: + vers_str = f"{vers_dict['M']}.{vers_dict['N']}.{vers_dict['P']}" + except KeyError: + pass + assert version == vers_str + + +def _read_makefile() -> List[str]: + """Read lines from the parent Makefile """ + + parent = Path(__file__).parent.parent.parent.resolve() + makefile = f"{parent}/Makefile" + with open(makefile, "r", encoding="utf-8") as f_p: + lines = f_p.readlines() + return lines diff --git a/tests/ragger/test_domain_name.py b/tests/ragger/test_domain_name.py index 71eea7b..96fa270 100644 --- a/tests/ragger/test_domain_name.py +++ b/tests/ragger/test_domain_name.py @@ -1,15 +1,15 @@ import pytest +from web3 import Web3 + from ragger.backend import BackendInterface from ragger.firmware import Firmware from ragger.error import ExceptionRAPDU -from ragger.navigator import Navigator, NavInsID -from constants import ROOT_SNAPSHOT_PATH +from ragger.navigator import Navigator +from ragger.navigator.navigation_scenario import NavigateWithScenario -import ledger_app_clients.ethereum.response_parser as ResponseParser -from ledger_app_clients.ethereum.client import EthAppClient, StatusWord -from ledger_app_clients.ethereum.settings import SettingID, settings_toggle - -from web3 import Web3 +import client.response_parser as ResponseParser +from client.client import EthAppClient, StatusWord +from client.settings import SettingID, settings_toggle # Values used across all tests @@ -25,32 +25,31 @@ GAS_LIMIT = 21000 AMOUNT = 1.22 -@pytest.fixture(params=[False, True]) -def verbose(request) -> bool: +@pytest.fixture(name="verbose", params=[False, True]) +def verbose_fixture(request) -> bool: return request.param -def common(app_client: EthAppClient) -> int: - if app_client._client.firmware.device == "nanos": +def common(firmware: Firmware, app_client: EthAppClient) -> int: + + if firmware == Firmware.NANOS: pytest.skip("Not supported on LNS") - with app_client.get_challenge(): - pass - return ResponseParser.challenge(app_client.response().data) + challenge = app_client.get_challenge() + return ResponseParser.challenge(challenge.data) def test_send_fund(firmware: Firmware, backend: BackendInterface, navigator: Navigator, - test_name: str, + scenario_navigator: NavigateWithScenario, verbose: bool): app_client = EthAppClient(backend) - challenge = common(app_client) + challenge = common(firmware, app_client) if verbose: settings_toggle(firmware, navigator, [SettingID.VERBOSE_ENS]) - with app_client.provide_domain_name(challenge, NAME, ADDR): - pass + app_client.provide_domain_name(challenge, NAME, ADDR) with app_client.sign(BIP32_PATH, { @@ -61,46 +60,30 @@ def test_send_fund(firmware: Firmware, "value": Web3.to_wei(AMOUNT, "ether"), "chainId": CHAIN_ID }): - moves = list() - if firmware.device.startswith("nano"): - moves += [NavInsID.RIGHT_CLICK] * 4 - if verbose: - moves += [NavInsID.RIGHT_CLICK] - moves += [NavInsID.BOTH_CLICK] + if firmware.is_nano: + end_text = "Accept" else: - moves += [NavInsID.USE_CASE_REVIEW_TAP] * 2 - if verbose: - moves += [NavInsID.USE_CASE_REVIEW_TAP] - moves += [NavInsID.USE_CASE_REVIEW_CONFIRM] - navigator.navigate_and_compare(ROOT_SNAPSHOT_PATH, - "domain_name_verbose_" + str(verbose), - moves) + end_text = "Sign" + + scenario_navigator.review_approve(test_name=f"domain_name_verbose_{str(verbose)}", custom_screen_text=end_text) -def test_send_fund_wrong_challenge(firmware: Firmware, - backend: BackendInterface, - navigator: Navigator): +def test_send_fund_wrong_challenge(firmware: Firmware, backend: BackendInterface): app_client = EthAppClient(backend) - challenge = common(app_client) + challenge = common(firmware, app_client) - try: - with app_client.provide_domain_name(~challenge & 0xffffffff, NAME, ADDR): - pass - except ExceptionRAPDU as e: - assert e.status == StatusWord.INVALID_DATA - else: - assert False # An exception should have been raised + with pytest.raises(ExceptionRAPDU) as e: + app_client.provide_domain_name(~challenge & 0xffffffff, NAME, ADDR) + assert e.value.status == StatusWord.INVALID_DATA def test_send_fund_wrong_addr(firmware: Firmware, backend: BackendInterface, - navigator: Navigator, - test_name: str): + scenario_navigator: NavigateWithScenario): app_client = EthAppClient(backend) - challenge = common(app_client) + challenge = common(firmware, app_client) - with app_client.provide_domain_name(challenge, NAME, ADDR): - pass + app_client.provide_domain_name(challenge, NAME, ADDR) addr = bytearray(ADDR) addr.reverse() @@ -114,27 +97,21 @@ def test_send_fund_wrong_addr(firmware: Firmware, "value": Web3.to_wei(AMOUNT, "ether"), "chainId": CHAIN_ID }): - moves = list() - if firmware.device.startswith("nano"): - moves += [NavInsID.RIGHT_CLICK] * 4 - moves += [NavInsID.BOTH_CLICK] + if firmware.is_nano: + end_text = "Accept" else: - moves += [NavInsID.USE_CASE_REVIEW_TAP] * 2 - moves += [NavInsID.USE_CASE_REVIEW_CONFIRM] - navigator.navigate_and_compare(ROOT_SNAPSHOT_PATH, - "domain_name_wrong_addr", - moves) + end_text = "Sign" + + scenario_navigator.review_approve(test_name="domain_name_wrong_addr", custom_screen_text=end_text) def test_send_fund_non_mainnet(firmware: Firmware, backend: BackendInterface, - navigator: Navigator, - test_name: str): + scenario_navigator: NavigateWithScenario): app_client = EthAppClient(backend) - challenge = common(app_client) + challenge = common(firmware, app_client) - with app_client.provide_domain_name(challenge, NAME, ADDR): - pass + app_client.provide_domain_name(challenge, NAME, ADDR) with app_client.sign(BIP32_PATH, { @@ -145,27 +122,21 @@ def test_send_fund_non_mainnet(firmware: Firmware, "value": Web3.to_wei(AMOUNT, "ether"), "chainId": 5 }): - moves = list() - if firmware.device.startswith("nano"): - moves += [NavInsID.RIGHT_CLICK] * 5 - moves += [NavInsID.BOTH_CLICK] + if firmware.is_nano: + end_text = "Accept" else: - moves += [NavInsID.USE_CASE_REVIEW_TAP] * 2 - moves += [NavInsID.USE_CASE_REVIEW_CONFIRM] - navigator.navigate_and_compare(ROOT_SNAPSHOT_PATH, - "domain_name_non_mainnet", - moves) + end_text = "Sign" + + scenario_navigator.review_approve(test_name="domain_name_non_mainnet", custom_screen_text=end_text) def test_send_fund_unknown_chain(firmware: Firmware, backend: BackendInterface, - navigator: Navigator, - test_name: str): + scenario_navigator: NavigateWithScenario): app_client = EthAppClient(backend) - challenge = common(app_client) + challenge = common(firmware, app_client) - with app_client.provide_domain_name(challenge, NAME, ADDR): - pass + app_client.provide_domain_name(challenge, NAME, ADDR) with app_client.sign(BIP32_PATH, { @@ -176,73 +147,45 @@ def test_send_fund_unknown_chain(firmware: Firmware, "value": Web3.to_wei(AMOUNT, "ether"), "chainId": 9 }): - moves = list() - if firmware.device.startswith("nano"): - moves += [NavInsID.RIGHT_CLICK] * 5 - moves += [NavInsID.BOTH_CLICK] + if firmware.is_nano: + end_text = "Accept" else: - moves += [NavInsID.USE_CASE_REVIEW_TAP] * 3 - moves += [NavInsID.USE_CASE_REVIEW_CONFIRM] - navigator.navigate_and_compare(ROOT_SNAPSHOT_PATH, - "domain_name_unknown_chain", - moves) + end_text = "Sign" + + scenario_navigator.review_approve(test_name="domain_name_unknown_chain", custom_screen_text=end_text) -def test_send_fund_domain_too_long(firmware: Firmware, - backend: BackendInterface, - navigator: Navigator): +def test_send_fund_domain_too_long(firmware: Firmware, backend: BackendInterface): app_client = EthAppClient(backend) - challenge = common(app_client) + challenge = common(firmware, app_client) - try: - with app_client.provide_domain_name(challenge, "ledger" + "0"*25 + ".eth", ADDR): - pass - except ExceptionRAPDU as e: - assert e.status == StatusWord.INVALID_DATA - else: - assert False # An exception should have been raised + with pytest.raises(ExceptionRAPDU) as e: + app_client.provide_domain_name(challenge, "ledger" + "0"*25 + ".eth", ADDR) + assert e.value.status == StatusWord.INVALID_DATA -def test_send_fund_domain_invalid_character(firmware: Firmware, - backend: BackendInterface, - navigator: Navigator): +def test_send_fund_domain_invalid_character(firmware: Firmware, backend: BackendInterface): app_client = EthAppClient(backend) - challenge = common(app_client) + challenge = common(firmware, app_client) - try: - with app_client.provide_domain_name(challenge, "l\xe8dger.eth", ADDR): - pass - except ExceptionRAPDU as e: - assert e.status == StatusWord.INVALID_DATA - else: - assert False # An exception should have been raised + with pytest.raises(ExceptionRAPDU) as e: + app_client.provide_domain_name(challenge, "l\xe8dger.eth", ADDR) + assert e.value.status == StatusWord.INVALID_DATA -def test_send_fund_uppercase(firmware: Firmware, - backend: BackendInterface, - navigator: Navigator): +def test_send_fund_uppercase(firmware: Firmware, backend: BackendInterface): app_client = EthAppClient(backend) - challenge = common(app_client) + challenge = common(firmware, app_client) - try: - with app_client.provide_domain_name(challenge, NAME.upper(), ADDR): - pass - except ExceptionRAPDU as e: - assert e.status == StatusWord.INVALID_DATA - else: - assert False # An exception should have been raised + with pytest.raises(ExceptionRAPDU) as e: + app_client.provide_domain_name(challenge, NAME.upper(), ADDR) + assert e.value.status == StatusWord.INVALID_DATA -def test_send_fund_domain_non_ens(firmware: Firmware, - backend: BackendInterface, - navigator: Navigator): +def test_send_fund_domain_non_ens(firmware: Firmware, backend: BackendInterface): app_client = EthAppClient(backend) - challenge = common(app_client) + challenge = common(firmware, app_client) - try: - with app_client.provide_domain_name(challenge, "ledger.hte", ADDR): - pass - except ExceptionRAPDU as e: - assert e.status == StatusWord.INVALID_DATA - else: - assert False # An exception should have been raised + with pytest.raises(ExceptionRAPDU) as e: + app_client.provide_domain_name(challenge, "ledger.hte", ADDR) + assert e.value.status == StatusWord.INVALID_DATA diff --git a/tests/ragger/test_eip191.py b/tests/ragger/test_eip191.py new file mode 100644 index 0000000..1edd22e --- /dev/null +++ b/tests/ragger/test_eip191.py @@ -0,0 +1,87 @@ +import pytest + +from ragger.error import ExceptionRAPDU +from ragger.backend import BackendInterface +from ragger.firmware import Firmware +from ragger.navigator.navigation_scenario import NavigateWithScenario + +from client.client import EthAppClient, StatusWord +import client.response_parser as ResponseParser +from client.utils import recover_message + + +BIP32_PATH = "m/44'/60'/0'/0/0" + + +def common(backend: BackendInterface, + scenario: NavigateWithScenario, + test_name: str, + msg: str): + + app_client = EthAppClient(backend) + + with app_client.get_public_addr(display=False): + pass + _, DEVICE_ADDR, _ = ResponseParser.pk_addr(app_client.response().data) + + with app_client.personal_sign(BIP32_PATH, msg.encode('utf-8')): + scenario.review_approve(test_name=test_name, custom_screen_text="Sign") + + # verify signature + vrs = ResponseParser.signature(app_client.response().data) + addr = recover_message(msg.encode('utf-8'), vrs) + assert addr == DEVICE_ADDR + + +def test_personal_sign_metamask(backend: BackendInterface, + scenario_navigator: NavigateWithScenario, + test_name: str): + + msg = "Example `personal_sign` message" + common(backend, scenario_navigator, test_name, msg) + + +def test_personal_sign_non_ascii(backend: BackendInterface, + scenario_navigator: NavigateWithScenario, + test_name: str): + + msg = "0x9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658" + common(backend, scenario_navigator, test_name, msg) + + +def test_personal_sign_opensea(firmware: Firmware, + backend: BackendInterface, + scenario_navigator: NavigateWithScenario, + test_name: str): + + if firmware == Firmware.NANOS: + pytest.skip("Not supported on LNS") + + msg = "Welcome to OpenSea!\n\n" + msg += "Click to sign in and accept the OpenSea Terms of Service: https://opensea.io/tos\n\n" + msg += "This request will not trigger a blockchain transaction or cost any gas fees.\n\n" + msg += "Your authentication status will reset after 24 hours.\n\n" + msg += "Wallet address:\n0x9858effd232b4033e47d90003d41ec34ecaeda94\n\nNonce:\n2b02c8a0-f74f-4554-9821-a28054dc9121" + common(backend, scenario_navigator, test_name, msg) + + +def test_personal_sign_reject(firmware: Firmware, + backend: BackendInterface, + scenario_navigator: NavigateWithScenario): + + msg = "This is an reject sign" + + app_client = EthAppClient(backend) + + try: + with app_client.personal_sign(BIP32_PATH, msg.encode('utf-8')): + if firmware.is_nano: + end_text = "Cancel" + else: + end_text = "Sign" + scenario_navigator.review_reject(custom_screen_text=end_text) + + except ExceptionRAPDU as e: + assert e.status == StatusWord.CONDITION_NOT_SATISFIED + else: + assert False # An exception should have been raised diff --git a/tests/ragger/test_eip712.py b/tests/ragger/test_eip712.py index b455188..1f64fb1 100644 --- a/tests/ragger/test_eip712.py +++ b/tests/ragger/test_eip712.py @@ -1,21 +1,24 @@ import fnmatch import os -import pytest -import time -from configparser import ConfigParser from functools import partial from pathlib import Path +import json +from typing import Optional +from ctypes import c_uint64 +import pytest +from eth_account.messages import encode_typed_data +import web3 + from ragger.backend import BackendInterface from ragger.firmware import Firmware from ragger.navigator import Navigator, NavInsID -import json -from typing import Optional -from constants import ROOT_SNAPSHOT_PATH +from ragger.navigator.navigation_scenario import NavigateWithScenario -import ledger_app_clients.ethereum.response_parser as ResponseParser -from ledger_app_clients.ethereum.client import EthAppClient -from ledger_app_clients.ethereum.eip712 import InputData -from ledger_app_clients.ethereum.settings import SettingID, settings_toggle +import client.response_parser as ResponseParser +from client.utils import recover_message +from client.client import EthAppClient +from client.eip712 import InputData +from client.settings import SettingID, settings_toggle class SnapshotsConfig: @@ -28,11 +31,12 @@ class SnapshotsConfig: BIP32_PATH = "m/44'/60'/0'/0/0" -snaps_config: Optional[SnapshotsConfig] = None +SNAPS_CONFIG: Optional[SnapshotsConfig] = None +WALLET_ADDR: Optional[bytes] = None def eip712_json_path() -> str: - return "%s/eip712_input_files" % (os.path.dirname(__file__)) + return f"{os.path.dirname(__file__)}/eip712_input_files" def input_files() -> list[str]: @@ -43,201 +47,393 @@ def input_files() -> list[str]: return sorted(files) -@pytest.fixture(params=input_files()) -def input_file(request) -> str: +@pytest.fixture(name="input_file", params=input_files()) +def input_file_fixture(request) -> str: return Path(request.param) -@pytest.fixture(params=[True, False]) -def verbose(request) -> bool: +@pytest.fixture(name="verbose", params=[True, False]) +def verbose_fixture(request) -> bool: return request.param -@pytest.fixture(params=[False, True]) -def filtering(request) -> bool: +@pytest.fixture(name="filtering", params=[False, True]) +def filtering_fixture(request) -> bool: return request.param -def test_eip712_legacy(firmware: Firmware, - backend: BackendInterface, - navigator: Navigator): +def get_wallet_addr(client: EthAppClient) -> bytes: + global WALLET_ADDR + + # don't ask again if we already have it + if WALLET_ADDR is None: + with client.get_public_addr(display=False): + pass + _, WALLET_ADDR, _ = ResponseParser.pk_addr(client.response().data) + return WALLET_ADDR + + +def test_eip712_legacy(backend: BackendInterface, scenario_navigator: NavigateWithScenario): app_client = EthAppClient(backend) - with app_client.eip712_sign_legacy( - BIP32_PATH, - bytes.fromhex('6137beb405d9ff777172aa879e33edb34a1460e701802746c5ef96e741710e59'), - bytes.fromhex('eb4221181ff3f1a83ea7313993ca9218496e424604ba9492bb4052c03d5c3df8')): - moves = list() - if firmware.device.startswith("nano"): - moves += [NavInsID.RIGHT_CLICK] - if firmware.device == "nanos": - screens_per_hash = 4 - else: - screens_per_hash = 2 - moves += [NavInsID.RIGHT_CLICK] * screens_per_hash * 2 - moves += [NavInsID.BOTH_CLICK] - else: - moves += [NavInsID.USE_CASE_REVIEW_TAP] * 2 - moves += [NavInsID.USE_CASE_REVIEW_CONFIRM] - navigator.navigate(moves) - v, r, s = ResponseParser.signature(app_client.response().data) + with open(input_files()[0], encoding="utf-8") as file: + data = json.load(file) + smsg = encode_typed_data(full_message=data) + with app_client.eip712_sign_legacy(BIP32_PATH, smsg.header, smsg.body): + scenario_navigator.review_approve(custom_screen_text="Sign", do_comparison=False) - assert v == bytes.fromhex("1c") - assert r == bytes.fromhex("ea66f747173762715751c889fea8722acac3fc35db2c226d37a2e58815398f64") - assert s == bytes.fromhex("52d8ba9153de9255da220ffd36762c0b027701a3b5110f0a765f94b16a9dfb55") + vrs = ResponseParser.signature(app_client.response().data) + recovered_addr = recover_message(data, vrs) + + assert recovered_addr == get_wallet_addr(app_client) -def autonext(fw: Firmware, nav: Navigator): - moves = list() - if fw.device.startswith("nano"): +def autonext(firmware: Firmware, navigator: Navigator, default_screenshot_path: Path): + moves = [] + if firmware.is_nano: moves = [NavInsID.RIGHT_CLICK] else: - moves = [NavInsID.USE_CASE_REVIEW_TAP] - if snaps_config is not None: - nav.navigate_and_compare(ROOT_SNAPSHOT_PATH, - snaps_config.test_name, - moves, - screen_change_before_first_instruction=False, - screen_change_after_last_instruction=False, - snap_start_idx=snaps_config.idx) - snaps_config.idx += 1 + moves = [NavInsID.SWIPE_CENTER_TO_LEFT] + if SNAPS_CONFIG is not None: + navigator.navigate_and_compare(default_screenshot_path, + SNAPS_CONFIG.test_name, + moves, + screen_change_before_first_instruction=False, + screen_change_after_last_instruction=False, + snap_start_idx=SNAPS_CONFIG.idx) + SNAPS_CONFIG.idx += 1 else: - nav.navigate(moves, - screen_change_before_first_instruction=False, - screen_change_after_last_instruction=False) + navigator.navigate(moves, + screen_change_before_first_instruction=False, + screen_change_after_last_instruction=False) -def eip712_new_common(fw: Firmware, - nav: Navigator, +def eip712_new_common(firmware: Firmware, + navigator: Navigator, + default_screenshot_path: Path, app_client: EthAppClient, json_data: dict, filters: Optional[dict], - verbose: bool): + verbose: bool, + golden_run: bool): assert InputData.process_data(app_client, json_data, filters, - partial(autonext, fw, nav)) + partial(autonext, firmware, navigator, default_screenshot_path), + golden_run) with app_client.eip712_sign_new(BIP32_PATH): - moves = list() - if fw.device.startswith("nano"): + moves = [] + if firmware.is_nano: # need to skip the message hash if not verbose and filters is None: - moves = [NavInsID.RIGHT_CLICK] * 2 + moves += [NavInsID.RIGHT_CLICK] * 2 moves += [NavInsID.BOTH_CLICK] else: - time.sleep(1.5) + # this move is necessary most of the times, but can't be 100% sure with the fields grouping + moves += [NavInsID.SWIPE_CENTER_TO_LEFT] # need to skip the message hash if not verbose and filters is None: - moves += [NavInsID.USE_CASE_REVIEW_TAP] + moves += [NavInsID.SWIPE_CENTER_TO_LEFT] moves += [NavInsID.USE_CASE_REVIEW_CONFIRM] - if snaps_config is not None: - nav.navigate_and_compare(ROOT_SNAPSHOT_PATH, - snaps_config.test_name, - moves, - snap_start_idx=snaps_config.idx) - snaps_config.idx += 1 + if SNAPS_CONFIG is not None: + # Could break (time-out) if given a JSON that requires less moves + # TODO: Maybe take list of moves as input instead of trying to guess them ? + navigator.navigate_and_compare(default_screenshot_path, + SNAPS_CONFIG.test_name, + moves, + snap_start_idx=SNAPS_CONFIG.idx) else: - nav.navigate(moves) + # Do them one-by-one to prevent an unnecessary move from timing-out and failing the test + for move in moves: + navigator.navigate([move], + screen_change_before_first_instruction=False, + screen_change_after_last_instruction=False) return ResponseParser.signature(app_client.response().data) def test_eip712_new(firmware: Firmware, backend: BackendInterface, navigator: Navigator, + default_screenshot_path: Path, input_file: Path, verbose: bool, filtering: bool): app_client = EthAppClient(backend) - if firmware.device == "nanos": + if firmware == Firmware.NANOS: pytest.skip("Not supported on LNS") - else: - test_path = "%s/%s" % (input_file.parent, "-".join(input_file.stem.split("-")[:-1])) - conf_file = "%s.ini" % (test_path) - filters = None - if filtering: - try: - with open("%s-filter.json" % (test_path)) as f: - filters = json.load(f) - except (IOError, json.decoder.JSONDecodeError) as e: - pytest.skip("Filter file error: %s" % (e.strerror)) + test_path = f"{input_file.parent}/{'-'.join(input_file.stem.split('-')[:-1])}" - config = ConfigParser() - config.read(conf_file) + filters = None + if filtering: + try: + filterfile = Path(f"{test_path}-filter.json") + with open(filterfile, encoding="utf-8") as f: + filters = json.load(f) + except (IOError, json.decoder.JSONDecodeError) as e: + pytest.skip(f"{filterfile.name}: {e.strerror}") - # sanity check - assert "signature" in config.sections() - assert "v" in config["signature"] - assert "r" in config["signature"] - assert "s" in config["signature"] + if verbose: + settings_toggle(firmware, navigator, [SettingID.VERBOSE_EIP712]) - if verbose: - settings_toggle(firmware, navigator, [SettingID.VERBOSE_EIP712]) + with open(input_file, encoding="utf-8") as file: + data = json.load(file) + vrs = eip712_new_common(firmware, + navigator, + default_screenshot_path, + app_client, + data, + filters, + verbose, + False) - with open(input_file) as file: - v, r, s = eip712_new_common(firmware, - navigator, - app_client, - json.load(file), - filters, - verbose) + recovered_addr = recover_message(data, vrs) - assert v == bytes.fromhex(config["signature"]["v"]) - assert r == bytes.fromhex(config["signature"]["r"]) - assert s == bytes.fromhex(config["signature"]["s"]) + assert recovered_addr == get_wallet_addr(app_client) -def test_eip712_address_substitution(firmware: Firmware, - backend: BackendInterface, - navigator: Navigator, - verbose: bool): - global snaps_config +class DataSet(): + data: dict + filters: dict + suffix: str + + def __init__(self, data: dict, filters: dict, suffix: str = ""): + self.data = data + self.filters = filters + self.suffix = suffix + + +ADVANCED_DATA_SETS = [ + DataSet( + { + "domain": { + "chainId": 1, + "name": "Advanced test", + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC", + "version": "1" + }, + "message": { + "with": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", + "value_recv": 10000000000000000, + "token_send": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "value_send": 24500000000000000000, + "token_recv": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "expires": 1714559400, + }, + "primaryType": "Transfer", + "types": { + "EIP712Domain": [ + {"name": "name", "type": "string"}, + {"name": "version", "type": "string"}, + {"name": "chainId", "type": "uint256"}, + {"name": "verifyingContract", "type": "address"} + ], + "Transfer": [ + {"name": "with", "type": "address"}, + {"name": "value_recv", "type": "uint256"}, + {"name": "token_send", "type": "address"}, + {"name": "value_send", "type": "uint256"}, + {"name": "token_recv", "type": "address"}, + {"name": "expires", "type": "uint64"}, + ] + } + }, + { + "name": "Advanced Filtering", + "tokens": [ + { + "addr": "0x6b175474e89094c44da98b954eedeac495271d0f", + "ticker": "DAI", + "decimals": 18, + "chain_id": 1, + }, + { + "addr": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "ticker": "WETH", + "decimals": 18, + "chain_id": 1, + }, + ], + "fields": { + "value_send": { + "type": "amount_join_value", + "name": "Send", + "token": 0, + }, + "token_send": { + "type": "amount_join_token", + "token": 0, + }, + "value_recv": { + "type": "amount_join_value", + "name": "Receive", + "token": 1, + }, + "token_recv": { + "type": "amount_join_token", + "token": 1, + }, + "with": { + "type": "raw", + "name": "With", + }, + "expires": { + "type": "datetime", + "name": "Will Expire" + }, + } + } + ), + DataSet( + { + "types": { + "EIP712Domain": [ + {"name": "name", "type": "string"}, + {"name": "version", "type": "string"}, + {"name": "chainId", "type": "uint256"}, + {"name": "verifyingContract", "type": "address"}, + ], + "Permit": [ + {"name": "owner", "type": "address"}, + {"name": "spender", "type": "address"}, + {"name": "value", "type": "uint256"}, + {"name": "nonce", "type": "uint256"}, + {"name": "deadline", "type": "uint256"}, + ] + }, + "primaryType": "Permit", + "domain": { + "name": "ENS", + "version": "1", + "verifyingContract": "0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72", + "chainId": 1, + }, + "message": { + "owner": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", + "spender": "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4", + "value": 4200000000000000000, + "nonce": 0, + "deadline": 1719756000, + } + }, + { + "name": "Permit filtering", + "tokens": [ + { + "addr": "0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72", + "ticker": "ENS", + "decimals": 18, + "chain_id": 1, + }, + ], + "fields": { + "value": { + "type": "amount_join_value", + "name": "Send", + }, + "deadline": { + "type": "datetime", + "name": "Deadline", + }, + } + }, + "_permit" + ), + DataSet( + { + "types": { + "EIP712Domain": [ + {"name": "name", "type": "string"}, + {"name": "version", "type": "string"}, + {"name": "chainId", "type": "uint256"}, + {"name": "verifyingContract", "type": "address"}, + ], + "Root": [ + {"name": "token_big", "type": "address"}, + {"name": "value_big", "type": "uint256"}, + {"name": "token_biggest", "type": "address"}, + {"name": "value_biggest", "type": "uint256"}, + ] + }, + "primaryType": "Root", + "domain": { + "name": "test", + "version": "1", + "verifyingContract": "0x0000000000000000000000000000000000000000", + "chainId": 1, + }, + "message": { + "token_big": "0x6b175474e89094c44da98b954eedeac495271d0f", + "value_big": c_uint64(-1).value, + "token_biggest": "0x6b175474e89094c44da98b954eedeac495271d0f", + "value_biggest": int(web3.constants.MAX_INT, 0), + } + }, + { + "name": "Unlimited test", + "tokens": [ + { + "addr": "0x6b175474e89094c44da98b954eedeac495271d0f", + "ticker": "DAI", + "decimals": 18, + "chain_id": 1, + }, + ], + "fields": { + "token_big": { + "type": "amount_join_token", + "token": 0, + }, + "value_big": { + "type": "amount_join_value", + "name": "Big", + "token": 0, + }, + "token_biggest": { + "type": "amount_join_token", + "token": 0, + }, + "value_biggest": { + "type": "amount_join_value", + "name": "Biggest", + "token": 0, + }, + } + }, + "_unlimited" + ), +] + + +@pytest.fixture(name="data_set", params=ADVANCED_DATA_SETS) +def data_set_fixture(request) -> DataSet: + return request.param + + +def test_eip712_advanced_filtering(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + default_screenshot_path: Path, + test_name: str, + data_set: DataSet, + golden_run: bool): + global SNAPS_CONFIG app_client = EthAppClient(backend) - if firmware.device == "nanos": + if firmware == Firmware.NANOS: pytest.skip("Not supported on LNS") - else: - test_name = "eip712_address_substitution" - if verbose: - test_name += "_verbose" - snaps_config = SnapshotsConfig(test_name) - with open("%s/address_substitution.json" % (eip712_json_path())) as file: - data = json.load(file) - with app_client.provide_token_metadata("DAI", - bytes.fromhex(data["message"]["token"][2:]), - 18, - 1): - pass + SNAPS_CONFIG = SnapshotsConfig(test_name + data_set.suffix) - with app_client.get_challenge(): - pass - challenge = ResponseParser.challenge(app_client.response().data) - with app_client.provide_domain_name(challenge, - "vitalik.eth", - bytes.fromhex(data["message"]["to"][2:])): - pass + vrs = eip712_new_common(firmware, + navigator, + default_screenshot_path, + app_client, + data_set.data, + data_set.filters, + False, + golden_run) - if verbose: - settings_toggle(firmware, navigator, [SettingID.VERBOSE_EIP712]) - filters = None - else: - filters = { - "name": "Token test", - "fields": { - "amount": "Amount", - "token": "Token", - "to": "To", - } - } - - v, r, s = eip712_new_common(firmware, - navigator, - app_client, - data, - filters, - verbose) - - assert v == bytes.fromhex("1b") - assert r == bytes.fromhex("d4a0e058251cdc3845aaa5eb8409d8a189ac668db7c55a64eb3121b0db7fd8c0") - assert s == bytes.fromhex("3221800e4f45272c6fa8fafda5e94c848d1a4b90c442aa62afa8e8d6a9af0f00") + # verify signature + addr = recover_message(data_set.data, vrs) + assert addr == get_wallet_addr(app_client) diff --git a/tests/ragger/test_erc20information.py b/tests/ragger/test_erc20information.py new file mode 100644 index 0000000..a858f55 --- /dev/null +++ b/tests/ragger/test_erc20information.py @@ -0,0 +1,27 @@ +import pytest + +from ragger.error import ExceptionRAPDU +from ragger.backend import BackendInterface + +from client.client import EthAppClient, StatusWord + + +def test_provide_erc20_token(backend: BackendInterface): + + app_client = EthAppClient(backend) + + addr = bytes.fromhex("e41d2489571d322189246dafa5ebde1f4699f498") + response = app_client.provide_token_metadata("ZRX", addr, 18, 1) + assert response.status == StatusWord.OK + + +def test_provide_erc20_token_error(backend: BackendInterface): + + app_client = EthAppClient(backend) + + addr = bytes.fromhex("e41d2489571d322189246dafa5ebde1f4699f498") + sign = bytes.fromhex("deadbeef") + with pytest.raises(ExceptionRAPDU) as e: + app_client.provide_token_metadata("ZRX", addr, 18, 1, sign) + + assert e.value.status == StatusWord.INVALID_DATA diff --git a/tests/ragger/test_get_address.py b/tests/ragger/test_get_address.py index 60cf4bb..035c598 100644 --- a/tests/ragger/test_get_address.py +++ b/tests/ragger/test_get_address.py @@ -1,82 +1,82 @@ -import pytest from typing import Optional +import pytest + +from py_ecc.bls import G2ProofOfPossession as bls + +from staking_deposit.key_handling.key_derivation.path import mnemonic_and_path_to_key + +from ragger.bip.seed import SPECULOS_MNEMONIC from ragger.error import ExceptionRAPDU from ragger.firmware import Firmware from ragger.backend import BackendInterface -from ragger.navigator import Navigator, NavInsID -from ledger_app_clients.ethereum.client import EthAppClient, StatusWord -import ledger_app_clients.ethereum.response_parser as ResponseParser +from ragger.navigator.navigation_scenario import NavigateWithScenario from ragger.bip import calculate_public_key_and_chaincode, CurveChoice -from constants import ROOT_SNAPSHOT_PATH + +from client.client import EthAppClient, StatusWord +import client.response_parser as ResponseParser -@pytest.fixture(params=[True, False]) -def with_chaincode(request) -> bool: +@pytest.fixture(name="with_chaincode", params=[True, False]) +def with_chaincode_fixture(request) -> bool: return request.param -@pytest.fixture(params=[None, 1, 2, 5, 137]) -def chain(request) -> Optional[int]: +@pytest.fixture(name="chain", params=[None, 1, 2, 5, 137]) +def chain_fixture(request) -> Optional[int]: return request.param -def get_moves(firmware: Firmware, - navigator: BackendInterface, - chain: Optional[int] = None, - reject: bool = False): - moves = list() - - if firmware.is_nano: - moves += [NavInsID.RIGHT_CLICK] - if firmware.device == "nanos": - moves += [NavInsID.RIGHT_CLICK] * 3 - else: - moves += [NavInsID.RIGHT_CLICK] - if reject: - moves += [NavInsID.RIGHT_CLICK] - moves += [NavInsID.BOTH_CLICK] - else: - moves += [NavInsID.USE_CASE_REVIEW_TAP] - if chain is not None and chain > 1: - moves += [NavInsID.USE_CASE_ADDRESS_CONFIRMATION_TAP] - if reject: - moves += [NavInsID.USE_CASE_ADDRESS_CONFIRMATION_CANCEL] - else: - moves += [NavInsID.USE_CASE_ADDRESS_CONFIRMATION_CONFIRM] - - return moves - - -def test_get_pk_rejected(firmware: Firmware, - backend: BackendInterface, - navigator: Navigator): +@pytest.mark.parametrize( + "path, suffix", + [ + ("m/44'/60'/0'/0/0", "60"), + ("m/44'/700'/1'/0/0", "700") + ], +) +def test_get_pk_rejected(backend: BackendInterface, + scenario_navigator: NavigateWithScenario, + path, + suffix): app_client = EthAppClient(backend) - try: - with app_client.get_public_addr(): - navigator.navigate_and_compare(ROOT_SNAPSHOT_PATH, - "get_pk_rejected", - get_moves(firmware, navigator, reject=True)) - except ExceptionRAPDU as e: - assert e.status == StatusWord.CONDITION_NOT_SATISFIED - else: - assert False # An exception should have been raised + with pytest.raises(ExceptionRAPDU) as e: + with app_client.get_public_addr(bip32_path=path): + scenario_navigator.address_review_reject(test_name=f"get_pk_rejected_{suffix}") + + assert e.value.status == StatusWord.CONDITION_NOT_SATISFIED -def test_get_pk(firmware: Firmware, - backend: BackendInterface, - navigator: Navigator, +def test_get_pk(backend: BackendInterface, + scenario_navigator: NavigateWithScenario, with_chaincode: bool, chain: Optional[int]): app_client = EthAppClient(backend) with app_client.get_public_addr(chaincode=with_chaincode, chain_id=chain): - navigator.navigate_and_compare(ROOT_SNAPSHOT_PATH, - "get_pk_%s" % (chain), - get_moves(firmware, navigator, chain=chain)) - pk, addr, chaincode = ResponseParser.pk_addr(app_client.response().data, with_chaincode) + scenario_navigator.address_review_approve(test_name=f"get_pk_{chain}") + + pk, _, chaincode = ResponseParser.pk_addr(app_client.response().data, with_chaincode) ref_pk, ref_chaincode = calculate_public_key_and_chaincode(curve=CurveChoice.Secp256k1, path="m/44'/60'/0'/0/0") assert pk.hex() == ref_pk if with_chaincode: assert chaincode.hex() == ref_chaincode + + +def test_get_eth2_pk(firmware: Firmware, + backend: BackendInterface, + scenario_navigator: NavigateWithScenario, + test_name: str): + + app_client = EthAppClient(backend) + + path="m/12381/3600/0/0" + with app_client.get_eth2_public_addr(bip32_path=path): + scenario_navigator.address_review_approve(test_name=test_name) + + pk = app_client.response().data + ref_pk = bls.SkToPk(mnemonic_and_path_to_key(SPECULOS_MNEMONIC, path)) + if firmware in (Firmware.STAX, Firmware.FLEX): + pk = pk[1:49] + + assert pk == ref_pk diff --git a/tests/ragger/test_nft.py b/tests/ragger/test_nft.py index fd39871..38ffa62 100644 --- a/tests/ragger/test_nft.py +++ b/tests/ragger/test_nft.py @@ -1,17 +1,18 @@ +from typing import Callable, Optional, Any +import json import pytest -from typing import Optional, Any -from pathlib import Path -from typing import Callable +from web3 import Web3 + from ragger.error import ExceptionRAPDU from ragger.firmware import Firmware from ragger.backend import BackendInterface -from ragger.navigator import Navigator, NavInsID -from ledger_app_clients.ethereum.client import EthAppClient, StatusWord -import ledger_app_clients.ethereum.response_parser as ResponseParser -from ledger_app_clients.ethereum.utils import get_selector_from_data, recover_transaction -from web3 import Web3 -import json -from constants import ROOT_SNAPSHOT_PATH, ABIS_FOLDER +from ragger.navigator.navigation_scenario import NavigateWithScenario + +from constants import ABIS_FOLDER + +from client.client import EthAppClient, StatusWord +import client.response_parser as ResponseParser +from client.utils import get_selector_from_data, recover_transaction BIP32_PATH = "m/44'/60'/0'/0/0" @@ -40,54 +41,23 @@ class NFTCollection: class Action: fn_name: str fn_args: list[Any] - nav_fn: Callable - def __init__(self, fn_name: str, fn_args: list[Any], nav_fn: Callable): + def __init__(self, fn_name: str, fn_args: list[Any]): self.fn_name = fn_name self.fn_args = fn_args - self.nav_fn = nav_fn -def common_nav_nft(is_nano: bool, - nano_steps: int, - stax_steps: int, - reject: bool) -> list[NavInsID]: - moves = list() - if is_nano: - moves += [NavInsID.RIGHT_CLICK] * nano_steps - if reject: - moves += [NavInsID.RIGHT_CLICK] - moves += [NavInsID.BOTH_CLICK] - else: - moves += [NavInsID.USE_CASE_REVIEW_TAP] * stax_steps - if reject: - moves += [ - NavInsID.USE_CASE_REVIEW_REJECT, - NavInsID.USE_CASE_CHOICE_CONFIRM - ] - else: - moves += [NavInsID.USE_CASE_REVIEW_CONFIRM] - return moves - - -def snapshot_test_name(nft_type: str, fn: str, chain_id: int, reject: bool) -> str: - name = "%s_%s_%s" % (nft_type, fn, str(chain_id)) - if reject: - name += "-rejected" - return name - - -def common_test_nft(fw: Firmware, - back: BackendInterface, - nav: Navigator, +def common_test_nft(firmware: Firmware, + backend: BackendInterface, + scenario_navigator: NavigateWithScenario, collec: NFTCollection, action: Action, reject: bool, plugin_name: str): global DEVICE_ADDR - app_client = EthAppClient(back) + app_client = EthAppClient(backend) - if app_client._client.firmware.name == "nanos": + if firmware == Firmware.NANOS: pytest.skip("Not supported on LNS") if DEVICE_ADDR is None: # to only have to request it once @@ -96,13 +66,11 @@ def common_test_nft(fw: Firmware, _, DEVICE_ADDR, _ = ResponseParser.pk_addr(app_client.response().data) data = collec.contract.encodeABI(action.fn_name, action.fn_args) - with app_client.set_plugin(plugin_name, - collec.addr, - get_selector_from_data(data), - collec.chain_id): - pass - with app_client.provide_nft_metadata(collec.name, collec.addr, collec.chain_id): - pass + app_client.set_plugin(plugin_name, + collec.addr, + get_selector_from_data(data), + collec.chain_id) + app_client.provide_nft_metadata(collec.name, collec.addr, collec.chain_id) tx_params = { "nonce": NONCE, "gasPrice": Web3.to_wei(GAS_PRICE, "gwei"), @@ -113,14 +81,17 @@ def common_test_nft(fw: Firmware, "data": data, } with app_client.sign(BIP32_PATH, tx_params): - nav.navigate_and_compare(ROOT_SNAPSHOT_PATH, - snapshot_test_name(plugin_name.lower(), - action.fn_name, - collec.chain_id, - reject), - action.nav_fn(fw.is_nano, - collec.chain_id, - reject)) + test_name = f"{plugin_name.lower()}_{action.fn_name}_{str(collec.chain_id)}" + if reject: + test_name += "-rejected" + scenario_navigator.review_reject(test_name=test_name) + else: + if firmware.is_nano: + end_text = "Accept" + else: + end_text = "Sign" + scenario_navigator.review_approve(test_name=test_name, custom_screen_text=end_text) + # verify signature vrs = ResponseParser.signature(app_client.response().data) addr = recover_transaction(tx_params, vrs) @@ -128,62 +99,26 @@ def common_test_nft(fw: Firmware, def common_test_nft_reject(test_fn: Callable, - fw: Firmware, - back: BackendInterface, - nav: Navigator, + firmware: Firmware, + backend: BackendInterface, + scenario_navigator: NavigateWithScenario, collec: NFTCollection, action: Action): - try: - test_fn(fw, back, nav, collec, action, True) - except ExceptionRAPDU as e: - assert e.status == StatusWord.CONDITION_NOT_SATISFIED - else: - assert False # An exception should have been raised + with pytest.raises(ExceptionRAPDU) as e: + test_fn(firmware, backend, scenario_navigator, collec, action, True) + assert e.value.status == StatusWord.CONDITION_NOT_SATISFIED # ERC-721 ERC721_PLUGIN = "ERC721" -with open("%s/erc721.json" % (ABIS_FOLDER)) as file: +with open(f"{ABIS_FOLDER}/erc721.json", encoding="utf-8") as file: contract_erc721 = Web3().eth.contract( abi=json.load(file), address=bytes(20) ) -# ui nav functions - -def nav_erc721_transfer_from(is_nano: bool, - chain_id: int, - reject: bool) -> list[NavInsID]: - nano_steps = 7 - stax_steps = 3 - if chain_id != 1: - nano_steps += 1 - stax_steps += 1 - return common_nav_nft(is_nano, nano_steps, stax_steps, reject) - - -def nav_erc721_approve(is_nano: bool, - chain_id: int, - reject: bool) -> list[NavInsID]: - nano_steps = 7 - stax_steps = 3 - if chain_id != 1: - nano_steps += 1 - stax_steps += 1 - return common_nav_nft(is_nano, nano_steps, stax_steps, reject) - - -def nav_erc721_set_approval_for_all(is_nano: bool, - chain_id: int, - reject: bool) -> list[NavInsID]: - nano_steps = 6 - if chain_id != 1: - nano_steps += 1 - return common_nav_nft(is_nano, nano_steps, 3, reject) - - collecs_721 = [ NFTCollection(bytes.fromhex("bc4ca0eda7647a8ab7c2061c2e118a18a936f13d"), "Bored Ape Yacht Club", @@ -199,43 +134,33 @@ collecs_721 = [ contract_erc721), ] actions_721 = [ - Action("safeTransferFrom", - [FROM, TO, NFTS[0][0], DATA], - nav_erc721_transfer_from), - Action("safeTransferFrom", - [FROM, TO, NFTS[0][0]], - nav_erc721_transfer_from), - Action("transferFrom", - [FROM, TO, NFTS[0][0]], - nav_erc721_transfer_from), - Action("approve", - [TO, NFTS[0][0]], - nav_erc721_approve), - Action("setApprovalForAll", - [TO, False], - nav_erc721_set_approval_for_all), + Action("safeTransferFrom", [FROM, TO, NFTS[0][0], DATA]), + Action("safeTransferFrom", [FROM, TO, NFTS[0][0]]), + Action("transferFrom", [FROM, TO, NFTS[0][0]]), + Action("approve", [TO, NFTS[0][0]]), + Action("setApprovalForAll", [TO, False]), ] -@pytest.fixture(params=collecs_721) -def collec_721(request) -> NFTCollection: +@pytest.fixture(name="collec_721", params=collecs_721) +def collec_721_fixture(request) -> NFTCollection: return request.param -@pytest.fixture(params=actions_721) -def action_721(request) -> Action: +@pytest.fixture(name="action_721", params=actions_721) +def action_721_fixture(request) -> Action: return request.param def test_erc721(firmware: Firmware, backend: BackendInterface, - navigator: Navigator, + scenario_navigator: NavigateWithScenario, collec_721: NFTCollection, action_721: Action, reject: bool = False): common_test_nft(firmware, backend, - navigator, + scenario_navigator, collec_721, action_721, reject, @@ -244,11 +169,11 @@ def test_erc721(firmware: Firmware, def test_erc721_reject(firmware: Firmware, backend: BackendInterface, - navigator: Navigator): + scenario_navigator: NavigateWithScenario): common_test_nft_reject(test_erc721, firmware, backend, - navigator, + scenario_navigator, collecs_721[0], actions_721[0]) @@ -257,44 +182,13 @@ def test_erc721_reject(firmware: Firmware, ERC1155_PLUGIN = "ERC1155" -with open("%s/erc1155.json" % (ABIS_FOLDER)) as file: +with open(f"{ABIS_FOLDER}/erc1155.json", encoding="utf-8") as file: contract_erc1155 = Web3().eth.contract( abi=json.load(file), address=bytes(20) ) -# ui nav functions - -def nav_erc1155_safe_transfer_from(is_nano: bool, - chain_id: int, - reject: bool) -> list: - nano_steps = 8 - if chain_id != 1: - nano_steps += 1 - return common_nav_nft(is_nano, nano_steps, 4, reject) - - -def nav_erc1155_safe_batch_transfer_from(is_nano: bool, - chain_id: int, - reject: bool) -> list: - nano_steps = 7 - stax_steps = 3 - if chain_id != 1: - nano_steps += 1 - stax_steps += 1 - return common_nav_nft(is_nano, nano_steps, stax_steps, reject) - - -def nav_erc1155_set_approval_for_all(is_nano: bool, - chain_id: int, - reject: bool) -> list: - nano_steps = 6 - if chain_id != 1: - nano_steps += 1 - return common_nav_nft(is_nano, nano_steps, 3, reject) - - collecs_1155 = [ NFTCollection(bytes.fromhex("495f947276749ce646f68ac8c248420045cb7b5e"), "OpenSea Shared Storefront", @@ -310,9 +204,7 @@ collecs_1155 = [ contract_erc1155), ] actions_1155 = [ - Action("safeTransferFrom", - [FROM, TO, NFTS[0][0], NFTS[0][1], DATA], - nav_erc1155_safe_transfer_from), + Action("safeTransferFrom", [FROM, TO, NFTS[0][0], NFTS[0][1], DATA]), Action("safeBatchTransferFrom", [ FROM, @@ -320,33 +212,30 @@ actions_1155 = [ list(map(lambda nft: nft[0], NFTS)), list(map(lambda nft: nft[1], NFTS)), DATA - ], - nav_erc1155_safe_batch_transfer_from), - Action("setApprovalForAll", - [TO, False], - nav_erc1155_set_approval_for_all), + ]), + Action("setApprovalForAll", [TO, False]), ] -@pytest.fixture(params=collecs_1155) -def collec_1155(request) -> bool: +@pytest.fixture(name="collec_1155", params=collecs_1155) +def collec_1155_fixture(request) -> bool: return request.param -@pytest.fixture(params=actions_1155) -def action_1155(request) -> Action: +@pytest.fixture(name="action_1155", params=actions_1155) +def action_1155_fixture(request) -> Action: return request.param def test_erc1155(firmware: Firmware, backend: BackendInterface, - navigator: Navigator, + scenario_navigator: NavigateWithScenario, collec_1155: NFTCollection, action_1155: Action, reject: bool = False): common_test_nft(firmware, backend, - navigator, + scenario_navigator, collec_1155, action_1155, reject, @@ -355,10 +244,10 @@ def test_erc1155(firmware: Firmware, def test_erc1155_reject(firmware: Firmware, backend: BackendInterface, - navigator: Navigator): + scenario_navigator: NavigateWithScenario): common_test_nft_reject(test_erc1155, firmware, backend, - navigator, + scenario_navigator, collecs_1155[0], actions_1155[0]) diff --git a/tests/ragger/test_privacy_operation.py b/tests/ragger/test_privacy_operation.py new file mode 100644 index 0000000..4cd2dea --- /dev/null +++ b/tests/ragger/test_privacy_operation.py @@ -0,0 +1,34 @@ +import pytest + +from ragger.backend import BackendInterface +from ragger.backend.speculos import SpeculosBackend + +from client.client import EthAppClient, StatusWord + + +def test_perform_privacy_operation_public(backend: BackendInterface): + + if isinstance(backend, SpeculosBackend): + pytest.skip("Not supported on speculos") + + app_client = EthAppClient(backend) + + response = app_client.perform_privacy_operation() + assert response.status == StatusWord.OK + assert len(response.data) == 32 + print(f"Data: {response.data.hex()}") + + +def test_perform_privacy_operation_secret(backend: BackendInterface): + + if isinstance(backend, SpeculosBackend): + pytest.skip("Not supported on speculos") + + pubkey = "5901c19a086d1be4b907ec0325bffa758c3eb78192c3df4afa2afd2736a39963".encode("utf-8") + + app_client = EthAppClient(backend) + + response = app_client.perform_privacy_operation(pubkey=pubkey) + assert response.status == StatusWord.OK + assert len(response.data) == 32 + print(f"Data: {response.data.hex()}") diff --git a/tests/ragger/test_sign.py b/tests/ragger/test_sign.py index 401be19..f7b720b 100644 --- a/tests/ragger/test_sign.py +++ b/tests/ragger/test_sign.py @@ -1,42 +1,63 @@ +from pathlib import Path +from web3 import Web3 + +from ragger.error import ExceptionRAPDU from ragger.backend import BackendInterface from ragger.firmware import Firmware from ragger.navigator import Navigator, NavInsID -from ledger_app_clients.ethereum.client import EthAppClient -import ledger_app_clients.ethereum.response_parser as ResponseParser -from ledger_app_clients.ethereum.utils import recover_transaction -from web3 import Web3 +from ragger.navigator.navigation_scenario import NavigateWithScenario + +from client.client import EthAppClient, StatusWord +import client.response_parser as ResponseParser +from client.settings import SettingID, settings_toggle +from client.utils import recover_transaction # Values used across all tests CHAIN_ID = 1 ADDR = bytes.fromhex("0011223344556677889900112233445566778899") +ADDR2 = bytes.fromhex("5a321744667052affa8386ed49e00ef223cbffc3") +ADDR3 = bytes.fromhex("dac17f958d2ee523a2206206994597c13d831ec7") +ADDR4 = bytes.fromhex("b2bb2b958afa2e96dab3f3ce7162b87daea39017") BIP32_PATH = "m/44'/60'/0'/0/0" +BIP32_PATH2 = "m/44'/60'/1'/0/0" NONCE = 21 +NONCE2 = 68 GAS_PRICE = 13 +GAS_PRICE2 = 5 GAS_LIMIT = 21000 AMOUNT = 1.22 +AMOUNT2 = 0.31415 -def common(fw: Firmware, - back: BackendInterface, - nav: Navigator, - tx_params: dict): - app_client = EthAppClient(back) +def common(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + scenario_navigator: NavigateWithScenario, + default_screenshot_path: Path, + tx_params: dict, + test_name: str = "", + path: str = BIP32_PATH, + confirm: bool = False): + app_client = EthAppClient(backend) - with app_client.get_public_addr(display=False): + with app_client.get_public_addr(bip32_path=path, display=False): pass _, DEVICE_ADDR, _ = ResponseParser.pk_addr(app_client.response().data) - with app_client.sign(BIP32_PATH, tx_params): - if fw.device.startswith("nano"): - next_action = NavInsID.RIGHT_CLICK - confirm_action = NavInsID.BOTH_CLICK + with app_client.sign(path, tx_params): + if not firmware.is_nano and confirm: + navigator.navigate_and_compare(default_screenshot_path, + f"{test_name}/confirm", + [NavInsID.USE_CASE_CHOICE_CONFIRM], + screen_change_after_last_instruction=False) + + if firmware.is_nano: end_text = "Accept" else: - next_action = NavInsID.USE_CASE_REVIEW_TAP - confirm_action = NavInsID.USE_CASE_REVIEW_CONFIRM end_text = "Sign" - nav.navigate_until_text(next_action, [confirm_action], end_text) + + scenario_navigator.review_approve(custom_screen_text=end_text, do_comparison=test_name!="") # verify signature vrs = ResponseParser.signature(app_client.response().data) @@ -44,19 +65,109 @@ def common(fw: Firmware, assert addr == DEVICE_ADDR -def test_legacy(firmware: Firmware, backend: BackendInterface, navigator: Navigator): - common(firmware, backend, navigator, { +def common_reject(backend: BackendInterface, + scenario_navigator: NavigateWithScenario, + tx_params: dict, + path: str = BIP32_PATH): + app_client = EthAppClient(backend) + + try: + with app_client.sign(path, tx_params): + scenario_navigator.review_reject() + + except ExceptionRAPDU as e: + assert e.status == StatusWord.CONDITION_NOT_SATISFIED + else: + assert False # An exception should have been raised + + +def common_fail(backend: BackendInterface, + tx_params: dict, + expected: StatusWord, + path: str = BIP32_PATH): + app_client = EthAppClient(backend) + + try: + with app_client.sign(path, tx_params): + pass + + except ExceptionRAPDU as e: + assert e.status == expected + else: + assert False # An exception should have been raised + + +def test_legacy(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + scenario_navigator: NavigateWithScenario, + default_screenshot_path: Path): + tx_params: dict = { "nonce": NONCE, "gasPrice": Web3.to_wei(GAS_PRICE, "gwei"), "gas": GAS_LIMIT, "to": ADDR, "value": Web3.to_wei(AMOUNT, "ether"), "chainId": CHAIN_ID - }) + } + common(firmware, backend, navigator, scenario_navigator, default_screenshot_path, tx_params) -def test_1559(firmware: Firmware, backend: BackendInterface, navigator: Navigator): - common(firmware, backend, navigator, { +# Transfer amount >= 2^87 Eth on Ethereum app should fail +def test_legacy_send_error(backend: BackendInterface): + tx_params: dict = { + "nonce": 38, + "gasPrice": 56775612312210000000001234554332, + "gas": GAS_LIMIT, + "to": ADDR3, + "value": 12345678912345678912345678000000000000000000, + "chainId": CHAIN_ID + } + common_fail(backend, tx_params, StatusWord.EXCEPTION_OVERFLOW, path=BIP32_PATH2) + + +# Transfer bsc +def test_legacy_send_bsc(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + scenario_navigator: NavigateWithScenario, + test_name: str, + default_screenshot_path: Path): + tx_params: dict = { + "nonce": 1, + "gasPrice": Web3.to_wei(GAS_PRICE2, 'gwei'), + "gas": GAS_LIMIT, + "to": ADDR2, + "value": Web3.to_wei(AMOUNT2, "ether"), + "chainId": 56 + } + common(firmware, backend, navigator, scenario_navigator, default_screenshot_path, tx_params, test_name, BIP32_PATH2) + + +# Transfer on network 112233445566 on Ethereum +def test_legacy_chainid(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + scenario_navigator: NavigateWithScenario, + test_name: str, + default_screenshot_path: Path): + tx_params: dict = { + "nonce": NONCE2, + "gasPrice": Web3.to_wei(GAS_PRICE, 'gwei'), + "gas": GAS_LIMIT, + "to": ADDR2, + "value": Web3.to_wei(AMOUNT2, "ether"), + "chainId": 112233445566 + } + common(firmware, backend, navigator, scenario_navigator, default_screenshot_path, tx_params, test_name, BIP32_PATH2) + + +def test_1559(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + scenario_navigator: NavigateWithScenario, + default_screenshot_path: Path): + tx_params: dict = { "nonce": NONCE, "maxFeePerGas": Web3.to_wei(145, "gwei"), "maxPriorityFeePerGas": Web3.to_wei(1.5, "gwei"), @@ -64,4 +175,119 @@ def test_1559(firmware: Firmware, backend: BackendInterface, navigator: Navigato "to": ADDR, "value": Web3.to_wei(AMOUNT, "ether"), "chainId": CHAIN_ID - }) + } + common(firmware, backend, navigator, scenario_navigator, default_screenshot_path, tx_params) + + +def test_sign_simple(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + scenario_navigator: NavigateWithScenario, + test_name: str, + default_screenshot_path: Path): + tx_params: dict = { + "nonce": NONCE2, + "gasPrice": Web3.to_wei(GAS_PRICE, 'gwei'), + "gas": GAS_LIMIT, + "to": ADDR2, + "value": Web3.to_wei(AMOUNT2, "ether"), + "chainId": CHAIN_ID + } + common(firmware, backend, navigator, scenario_navigator, default_screenshot_path, tx_params, test_name, "m/44'/60'/1'/0/0") + + +def test_sign_limit_nonce(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + scenario_navigator: NavigateWithScenario, + test_name: str, + default_screenshot_path: Path): + tx_params: dict = { + "nonce": 2**64-1, + "gasPrice": 10, + "gas": 50000, + "to": ADDR2, + "value": 0x08762, + "chainId": CHAIN_ID + } + common(firmware, backend, navigator, scenario_navigator, default_screenshot_path, tx_params, test_name, "m/44'/60'/1'/0/0") + + +def test_sign_nonce_display(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + scenario_navigator: NavigateWithScenario, + test_name: str, + default_screenshot_path: Path): + + settings_toggle(firmware, navigator, [SettingID.NONCE]) + + tx_params: dict = { + "nonce": NONCE2, + "gasPrice": Web3.to_wei(GAS_PRICE, 'gwei'), + "gas": GAS_LIMIT, + "to": ADDR2, + "value": Web3.to_wei(AMOUNT2, "ether"), + "chainId": CHAIN_ID + } + common(firmware, backend, navigator, scenario_navigator, default_screenshot_path, tx_params, test_name, "m/44'/60'/1'/0/0") + + +def test_sign_reject(backend: BackendInterface, scenario_navigator: NavigateWithScenario): + tx_params: dict = { + "nonce": NONCE2, + "gasPrice": Web3.to_wei(GAS_PRICE, 'gwei'), + "gas": GAS_LIMIT, + "to": ADDR2, + "value": Web3.to_wei(AMOUNT2, "ether"), + "chainId": CHAIN_ID + } + common_reject(backend, scenario_navigator, tx_params, "m/44'/60'/1'/0/0") + + +def test_sign_error_transaction_type(backend: BackendInterface): + tx_params: dict = { + "type": 0, + "nonce": 0, + "gasPrice": 10, + "gas": 50000, + "to": ADDR2, + "value": 0x19, + "chainId": CHAIN_ID + } + + app_client = EthAppClient(backend) + try: + with app_client.sign(BIP32_PATH2, tx_params): + pass + + except TypeError: + pass + else: + assert False # An exception should have been raised + + +def test_sign_eip_2930(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + scenario_navigator: NavigateWithScenario, + test_name: str, + default_screenshot_path: Path): + + tx_params = { + "nonce": NONCE, + "gasPrice": Web3.to_wei(GAS_PRICE2, "gwei"), + "gas": GAS_LIMIT, + "to": ADDR4, + "value": Web3.to_wei(0.01, "ether"), + "chainId": 3, + "accessList": [ + { + "address": "0x0000000000000000000000000000000000000001", + "storageKeys": [ + "0x0100000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + } + common(firmware, backend, navigator, scenario_navigator, default_screenshot_path, tx_params, test_name) diff --git a/tests/ragger/usage.md b/tests/ragger/usage.md new file mode 100644 index 0000000..a7f83e1 --- /dev/null +++ b/tests/ragger/usage.md @@ -0,0 +1,93 @@ +# How to use the Ragger test framework + +This framework allows testing the application on the Speculos emulator or on a real device using `LedgerComm` or `LedgerWallet` + +## Quickly get started with Ragger and Speculos + +### Install ragger and dependencies + +```shell +pip install --extra-index-url https://test.pypi.org/simple/ -r requirements.txt +sudo apt-get update && sudo apt-get install qemu-user-static +``` + +### Compile the application + +The application to test must be compiled for all required devices. +You can use for this the container `ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite`: + +```shell +docker pull ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite:latest +cd +docker run --user "$(id -u)":"$(id -g)" --rm -ti -v "$(realpath .):/app" --privileged -v "/dev/bus/usb:/dev/bus/usb" ledger-app-builder-lite:latest +make clean && make BOLOS_SDK=$_SDK # replace with one of [NANOS, NANOX, NANOSP, STAX] +exit +``` + +### Run a simple test using the Speculos emulator + +You can use the following command to get your first experience with Ragger and Speculos + +```shell +pytest -v --tb=short --device nanox --display +``` + +Or you can refer to the section `Available pytest options` to configure the options you want to use + +### Run a simple test using a real device + +The application to test must be loaded and started on a Ledger device plugged in USB. +You can use for this the container `ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite`: + +```shell +docker pull ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite:latest +cd app-/ # replace with the name of your app, (eg boilerplate) +docker run --user "$(id -u)":"$(id -g)" --rm -ti -v "$(realpath .):/app" --privileged -v "/dev/bus/usb:/dev/bus/usb" ledger-app-builder-lite:latest +make clean && make BOLOS_SDK=$_SDK load # replace with one of [NANOS, NANOX, NANOSP, STAX] +exit +``` + +You can use the following command to get your first experience with Ragger and Ledgerwallet on a NANOX. +Make sure that the device is plugged, unlocked, and that the tested application is open. + +```shell +pytest -v --tb=short --device nanox --backend ledgerwallet +``` + +Or you can refer to the section `Available pytest options` to configure the options you want to use + +### Ethereum specific + +With Ethereum App, it is also possible to load an app (like a _plugin_), and use the `app-ethereum` like a _library_. +Such case is tested with application clone, using `ThunderCore`. + +This special configuration needs an additional command line parameter `--with_lib_mode`, +where only the dedicated tests are selected. + +## Adding a test + +When adding new Module for tests, just be carrefull to declare it correctly in order to be handled +following the parameter `--with_lib_mode`. please refer to `conftest.py`. + +## Available pytest options + +Standard useful pytest options + +```shell + -v formats the test summary in a readable way + -s enable logs for successful tests, on Speculos it will enable app logs if compiled with DEBUG=1 + -k only run the tests that contain in their names + --tb=short in case of errors, formats the test traceback in a readable way +``` + +Custom pytest options + +```shell + --with_lib_mode run the test(s) dedicated to Library Mode + --device run the test on the specified device [nanos,nanox,nanosp,stax,all]. This parameter is mandatory + --backend run the tests against the backend [speculos, ledgercomm, ledgerwallet]. Speculos is the default + --display on Speculos, enables the display of the app screen using QT + --golden_run on Speculos, screen comparison functions will save the current screen instead of comparing + --log_apdu_file log all apdu exchanges to the file in parameter. The previous file content is erased + --seed=SEED set a custom seed +``` diff --git a/tests/speculos/.gitignore b/tests/speculos/.gitignore deleted file mode 100644 index 94026aa..0000000 --- a/tests/speculos/.gitignore +++ /dev/null @@ -1,25 +0,0 @@ -__pycache__/ -*.py[cod] -*$py.class - - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# generated by pip -pip-wheel-metadata/ - -# pytest debug logs generated via --debug -pytestdebug.log -.cache -.pytest_cache -.mypy_cache -.coverage -.coverage.* -coverage.xml \ No newline at end of file diff --git a/tests/speculos/README.md b/tests/speculos/README.md deleted file mode 100644 index 68d1468..0000000 --- a/tests/speculos/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Speculos functional tests - -These tests are implemented in Python with the `SpeculosClient` interface which allows easy execution on the [Speculos](https://github.com/LedgerHQ/speculos) emulator. - -## Requirements - -- [python >= 3.8](https://www.python.org/downloads/) -- [pip](https://pip.pypa.io/en/stable/installation/) - -### Dependencies -Python dependencies are listed in [requirements.txt](requirements.txt) - -```shell -python3 -m pip install -r requirements.txt -``` - -## Usage - -### Compilation app - -Go to the root of the repository: -```sh -make DEBUG=1 NFT_TESTING_KEY=1 BOLOS_SDK=$NANOX_SDK -mv bin/app.elf tests/speculos/.elf -``` - -Given the requirements are installed, just do (by default command): - -``` -cd tests/speculos/ -pytest -``` - -### Custom options -- **--model:** "nanos", "nanox", "nanosp" | default: "nanos" -- **--display:** "qt", "headless" | default: "qt" -- **--path:** the path of the binary app | default: path of makefile compilation - -## Example - -With `nanox` binary app: -```sh -# the --path is variable to where you put your binary - -pytest --model nanox --path ./elfs/nanox.elf - -# Execute specific test: -pytest --model nanox --path ./elfs/nanox.elf test_pubkey_cmd.py -``` diff --git a/tests/speculos/conftest.py b/tests/speculos/conftest.py deleted file mode 100644 index 4d68fc6..0000000 --- a/tests/speculos/conftest.py +++ /dev/null @@ -1,39 +0,0 @@ -from pathlib import Path -import pytest - -from speculos.client import SpeculosClient - -from ethereum_client.ethereum_cmd import EthereumCommand - - -SCRIPT_DIR = Path(__file__).absolute().parent -API_URL = "http://127.0.0.1:5000" - - -def pytest_addoption(parser): - # nanos, nanox, nanosp - parser.addoption("--model", action="store", default="nanos") - # qt: default, requires a X server - # headless: nothing is displayed - parser.addoption("--display", action="store", default="qt") - - path: str = SCRIPT_DIR.parent.parent / "bin" / "app.elf" - parser.addoption("--path", action="store", default=path) - -@pytest.fixture() -def client(pytestconfig): - file_path = pytestconfig.getoption("path") - model = pytestconfig.getoption("model") - - args = ['--log-level', 'speculos:DEBUG','--model', model, '--display', pytestconfig.getoption("display")] - with SpeculosClient(app=str(file_path), args=args) as client: - yield client - - -@pytest.fixture() -def cmd(client, pytestconfig): - yield EthereumCommand( - client=client, - debug=True, - model=pytestconfig.getoption("model"), - ) diff --git a/tests/speculos/docs/README.md b/tests/speculos/docs/README.md deleted file mode 100644 index eb6df71..0000000 --- a/tests/speculos/docs/README.md +++ /dev/null @@ -1,133 +0,0 @@ -# Documentation of Ethereum's client test - -```sh -. -├── conftest.py # Configuration for pytest -├── ethereum_client # All utils of client test -│ ├── ethereum_cmd_builder.py # Creation of apdu to send -│ ├── ethereum_cmd.py # Send Apdu and parsing of response -│ ├── exception -│ │ ├── device_exception.py -│ │ └── errors.py -│ ├── plugin.py # Creation of content apdu which manage plugin, erc20Information, provide nft information -│ ├── transaction.py # Creation of content apdu which manage personal tx, transaction, eip712 -│ └── utils.py -├── requirements.txt -├── screenshots # All screenshot of nanoS,X,SP for compare in tests -├── setup.cfg - -# ========= All Tests ========= -├── test_configuration_cmd.py -├── test_eip1559.py -├── test_eip191.py -├── test_eip2930.py -├── test_eip712.py -├── test_erc1155.py -├── test_erc20information.py -├── test_erc721.py -├── test_pubkey_cmd.py -└── test_sign_cmd.py -``` - -## Ethereum_client - -### Ethereum_cmd_builder -```py -def chunked(size, source) - -class EthereumCommandBuilder: - # Creation of the apdu - def get_configuration(self) -> bytes: - def set_plugin(self, plugin: Plugin) -> bytes: - def provide_nft_information(self, plugin: Plugin) -> bytes: - def provide_erc20_token_information(self, info: ERC20Information): - def get_public_key(self, bip32_path: str, display: bool = False) -> bytes: - def perform_privacy_operation(self, bip32_path: str, display: bool, shared_secret: bool) -> bytes: - def simple_sign_tx(self, bip32_path: str, transaction: Transaction) -> bytes: - def sign_eip712(self, bip32_path: str, transaction: EIP712) -> bytes: - def personal_sign_tx(self, bip32_path: str, transaction: PersonalTransaction) -> Tuple[bool,bytes]: -``` - -### Ethereum_cmd -```py -class EthereumCommand: - # Sending apdu and parsing the response in the right form - def get_configuration(self) -> Tuple[int, int, int, int]: - def set_plugin(self, plugin: Plugin): - def provide_nft_information(self, plugin: Plugin): - def provide_erc20_token_information(self, info: ERC20Information): - def get_public_key(self, bip32_path: str, result: List, display: bool = False) -> Tuple[bytes, bytes, bytes]: - def perform_privacy_operation(self, bip32_path: str, result: List, display: bool = False, shared_secret: bool = False) -> Tuple[bytes, bytes, bytes]: - def simple_sign_tx(self, bip32_path: str, transaction: Transaction, result: List = list()) -> None: - def sign_eip712(self, bip32_path: str, transaction: EIP712, result: List = list()) -> None: - def personal_sign_tx(self, bip32_path: str, transaction: PersonalTransaction, result: List = list()) -> None: - - - # Allows to send an apdu without return of speculos - def send_apdu(self, apdu: bytes) -> bytes: - # Allows to send an apdu with return of speculos - def send_apdu_context(self, apdu: bytes, result: List = list()) -> bytes: - -``` - -### Utils -```py -def save_screenshot(cmd, path: str): -def compare_screenshot(cmd, path: str): -def parse_sign_response(response : bytes) -> Tuple[bytes, bytes, bytes]: -def bip32_path_from_string(path: str) -> List[bytes]: -def packed_bip32_path_from_string(path: str) -> bytes: -def write_varint(n: int) -> bytes: -def read_varint(buf: BytesIO, prefix: Optional[bytes] = None) -> int: -def read(buf: BytesIO, size: int) -> bytes: -def read_uint(buf: BytesIO, -``` - -## Tests new apdu - -If a new instruction is programmed it will be necessary to create 2 new functions. -one in `ethereum_cmd_builder` : -- Creation of the raw apdu you can find some examples in this same file - -and one in `ethereum_cmd`: -- Send the apdu to speculos and parse the answer in a `list` named result you can find some examples in this same file - -## Example for write new tests - -To send several apdu and get the return - -```py -FIRST = bytes.fromhex("{YourAPDU}") -SECOND = bytes.fromhex("{YourAPDU}") - -def test_multiple_raw_apdu(cmd): - result: list = [] - - cmd.send_apdu(FIRST) - with cmd.send_apdu_context(SECOND, result) as ex: - sleep(0.5) - # Here your code for press button and compare screen if you want - - response: bytes = result[0] # response returning - # Here you function to parse response of some code - v, r, s = parse_sign_response(response) - - # And here assertion of your tests - assert v == 0x25 # 37 - assert r.hex() == "68ba082523584adbfc31d36d68b51d6f209ce0838215026bf1802a8f17dcdff4" - assert s.hex() == "7c92908fa05c8bc86507a3d6a1c8b3c2722ee01c836d89a61df60c1ab0b43fff" -``` - -To test an error - -```py -def test_some_error(cmd): - result: list = [] - - with pytest.raises(ethereum_client.exception.errors.UnknownDeviceError) as error: - # With an function in ethereum_cmd - with cmd.send_apdu_context(bytes.fromhex("{YourAPDU}"), result) as ex: - pass - assert error.args[0] == '0x6a80' -``` - diff --git a/tests/speculos/ethereum_client/ethereum_cmd.py b/tests/speculos/ethereum_client/ethereum_cmd.py deleted file mode 100644 index a13a817..0000000 --- a/tests/speculos/ethereum_client/ethereum_cmd.py +++ /dev/null @@ -1,226 +0,0 @@ -from ast import List -from contextlib import contextmanager -import struct -from time import sleep -from typing import Tuple - -from speculos.client import SpeculosClient, ApduException - -from ethereum_client.ethereum_cmd_builder import EthereumCommandBuilder, InsType -from ethereum_client.exception import DeviceException -from ethereum_client.transaction import EIP712, PersonalTransaction, Transaction -from ethereum_client.plugin import ERC20Information, Plugin -from ethereum_client.utils import parse_sign_response - - -class EthereumCommand: - def __init__(self, - client: SpeculosClient, - debug: bool = False, - model: str = "nanos") -> None: - self.client = client - self.builder = EthereumCommandBuilder(debug=debug) - self.debug = debug - self.model = model - - def get_configuration(self) -> Tuple[int, int, int, int]: - try: - response = self.client._apdu_exchange( - self.builder.get_configuration() - ) # type: int, bytes - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=InsType.INS_GET_VERSION) - - # response = FLAG (1) || MAJOR (1) || MINOR (1) || PATCH (1) - assert len(response) == 4 - - info, major, minor, patch = struct.unpack( - "BBBB", - response - ) # type: int, int, int - - return info, major, minor, patch - - def set_plugin(self, plugin: Plugin): - try: - self.client._apdu_exchange( - self.builder.set_plugin(plugin=plugin) - ) - - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=InsType.INS_SET_PLUGIN) - - def provide_nft_information(self, plugin: Plugin): - try: - self.client._apdu_exchange( - self.builder.provide_nft_information(plugin=plugin) - ) - - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=InsType.INS_PROVIDE_NFT_INFORMATION) - - def provide_erc20_token_information(self, info: ERC20Information): - try: - self.client._apdu_exchange( - self.builder.provide_erc20_token_information(info=info) - ) - - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=InsType.INS_PROVIDE_ERC20) - - - @contextmanager - def get_public_key(self, bip32_path: str, result: List, display: bool = False) -> Tuple[bytes, bytes, bytes]: - try: - chunk: bytes = self.builder.get_public_key(bip32_path=bip32_path, display=display) - - with self.client.apdu_exchange_nowait(cla=chunk[0], ins=chunk[1], - p1=chunk[2], p2=chunk[3], - data=chunk[5:]) as exchange: - yield exchange - response: bytes = exchange.receive() - - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=InsType.INS_GET_PUBLIC_KEY) - - # response = pub_key_len (1) || - # pub_key (var) || - # chain_code_len (1) || - # chain_code (var) - offset: int = 0 - - pub_key_len: int = response[offset] - offset += 1 - - uncompressed_addr_len: bytes = response[offset:offset + pub_key_len] - offset += pub_key_len - - eth_addr_len: int = response[offset] - offset += 1 - - eth_addr: bytes = response[offset:offset + eth_addr_len] - offset += eth_addr_len - - chain_code: bytes = response[offset:] - - assert len(response) == 1 + pub_key_len + 1 + eth_addr_len + 32 # 32 -> chain_code_len - - result.append(uncompressed_addr_len) - result.append(eth_addr) - result.append(chain_code) - - - @contextmanager - def perform_privacy_operation(self, bip32_path: str, result: List, display: bool = False, shared_secret: bool = False) -> Tuple[bytes, bytes, bytes]: - try: - chunk: bytes = self.builder.perform_privacy_operation(bip32_path=bip32_path, display=display, shared_secret=shared_secret) - - with self.client.apdu_exchange_nowait(cla=chunk[0], ins=chunk[1], - p1=chunk[2], p2=chunk[3], - data=chunk[5:]) as exchange: - yield exchange - response: bytes = exchange.receive() - - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=InsType.INS_PERFORM_PRIVACY_OPERATION) - - # response = Public encryption key or shared secret (32) - assert len(response) == 32 - - result.append(response) - - def send_apdu(self, apdu: bytes) -> bytes: - try: - self.client.apdu_exchange(cla=apdu[0], ins=apdu[1], - p1=apdu[2], p2=apdu[3], - data=apdu[5:]) - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=InsType.INS_SIGN_TX) - - @contextmanager - def send_apdu_context(self, apdu: bytes, result: List = list()) -> bytes: - try: - - with self.client.apdu_exchange_nowait(cla=apdu[0], ins=apdu[1], - p1=apdu[2], p2=apdu[3], - data=apdu[5:]) as exchange: - yield exchange - result.append(exchange.receive()) - - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=InsType.INS_SIGN_TX) - - - - @contextmanager - def simple_sign_tx(self, bip32_path: str, transaction: Transaction, result: List = list()) -> None: - try: - chunk: bytes = self.builder.simple_sign_tx(bip32_path=bip32_path, transaction=transaction) - - with self.client.apdu_exchange_nowait(cla=chunk[0], ins=chunk[1], - p1=chunk[2], p2=chunk[3], - data=chunk[5:]) as exchange: - yield exchange - response: bytes = exchange.receive() - - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=InsType.INS_SIGN_TX) - - # response = V (1) || R (32) || S (32) - assert len(response) == 65 - v, r, s = parse_sign_response(response) - - result.append(v) - result.append(r) - result.append(s) - - - @contextmanager - def sign_eip712(self, bip32_path: str, transaction: EIP712, result: List = list()) -> None: - try: - chunk: bytes = self.builder.sign_eip712(bip32_path=bip32_path, transaction=transaction) - - with self.client.apdu_exchange_nowait(cla=chunk[0], ins=chunk[1], - p1=chunk[2], p2=chunk[3], - data=chunk[5:]) as exchange: - yield exchange - response: bytes = exchange.receive() - - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=InsType.INS_SIGN_EIP712) - - # response = V (1) || R (32) || S (32) - assert len(response) == 65 - v, r, s = parse_sign_response(response) - - result.append(v) - result.append(r) - result.append(s) - - - @contextmanager - def personal_sign_tx(self, bip32_path: str, transaction: PersonalTransaction, result: List = list()) -> None: - try: - for islast_apdu, apdu in self.builder.personal_sign_tx(bip32_path=bip32_path, transaction=transaction): - if islast_apdu: - with self.client.apdu_exchange_nowait(cla=apdu[0], ins=apdu[1], - p1=apdu[2], p2=apdu[3], - data=apdu[5:]) as exchange: - # the "yield" here allows to wait for a button interaction (click right, left, both) - yield exchange - response: bytes = exchange.receive() - else: - self.send_apdu(apdu) - - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=InsType.INS_SIGN_TX) - - # response = V (1) || R (32) || S (32) - v, r, s = parse_sign_response(response) - - result.append(v) - result.append(r) - result.append(s) - - - diff --git a/tests/speculos/ethereum_client/ethereum_cmd_builder.py b/tests/speculos/ethereum_client/ethereum_cmd_builder.py deleted file mode 100644 index f2f721e..0000000 --- a/tests/speculos/ethereum_client/ethereum_cmd_builder.py +++ /dev/null @@ -1,293 +0,0 @@ -import enum -import logging -import struct -from typing import List, Tuple, Union, Iterator, cast - -from ethereum_client.transaction import EIP712, PersonalTransaction, Transaction -from ethereum_client.plugin import ERC20Information, Plugin -from ethereum_client.utils import packed_bip32_path_from_string - -MAX_APDU_LEN: int = 255 - -def chunked(size, source): - for i in range(0, len(source), size): - yield source[i:i+size] - -def chunkify(data: bytes, chunk_len: int) -> Iterator[Tuple[bool, bytes]]: - size: int = len(data) - - if size <= chunk_len: - yield True, data - return - - chunk: int = size // chunk_len - remaining: int = size % chunk_len - offset: int = 0 - - for i in range(chunk): - yield False, data[offset:offset + chunk_len] - offset += chunk_len - - if remaining: - yield True, data[offset:] - -class InsType(enum.IntEnum): - INS_GET_PUBLIC_KEY = 0x02 - INS_SIGN_TX = 0x04 - INS_GET_CONFIGURATION = 0x06 - INS_SIGN_PERSONAL_TX = 0x08 - INS_PROVIDE_ERC20 = 0x0A - INS_SIGN_EIP712 = 0x0c - INS_ETH2_GET_PUBLIC_KEY = 0x0E - INS_SET_ETH2_WITHDRAWAL = 0x10 - INS_SET_EXTERNAL_PLUGIN = 0x12 - INS_PROVIDE_NFT_INFORMATION = 0x14 - INS_SET_PLUGIN = 0x16 - INS_PERFORM_PRIVACY_OPERATION = 0x18 - - -class EthereumCommandBuilder: - """APDU command builder for the Boilerplate application. - - Parameters - ---------- - debug: bool - Whether you want to see logging or not. - - Attributes - ---------- - debug: bool - Whether you want to see logging or not. - - """ - CLA: int = 0xE0 - - def __init__(self, debug: bool = False): - """Init constructor.""" - self.debug = debug - - def serialize(self, - cla: int, - ins: Union[int, enum.IntEnum], - p1: int = 0, - p2: int = 0, - cdata: bytes = b"") -> bytes: - """Serialize the whole APDU command (header + data). - - Parameters - ---------- - cla : int - Instruction class: CLA (1 byte) - ins : Union[int, IntEnum] - Instruction code: INS (1 byte) - p1 : int - Instruction parameter 1: P1 (1 byte). - p2 : int - Instruction parameter 2: P2 (1 byte). - cdata : bytes - Bytes of command data. - - Returns - ------- - bytes - Bytes of a complete APDU command. - - """ - ins = cast(int, ins.value) if isinstance(ins, enum.IntEnum) else cast(int, ins) - - header: bytes = struct.pack("BBBBB", - cla, - ins, - p1, - p2, - len(cdata)) # add Lc to APDU header - - if self.debug: - logging.info("header: %s", header.hex()) - logging.info("cdata: %s", cdata.hex()) - - return header + cdata - - def get_configuration(self) -> bytes: - """Command builder for GET_CONFIGURATON - - Returns - ------- - bytes - APDU command for GET_CONFIGURATON - - """ - return self.serialize(cla=self.CLA, - ins=InsType.INS_GET_CONFIGURATION, - p1=0x00, - p2=0x00, - cdata=b"") - - def _same_header_builder(self, data: Union[Plugin, ERC20Information], ins: int) -> bytes: - return self.serialize(cla=self.CLA, - ins=ins, - p1=0x00, - p2=0x00, - cdata=data.serialize()) - - def set_plugin(self, plugin: Plugin) -> bytes: - return self._same_header_builder(plugin, InsType.INS_SET_PLUGIN) - - def provide_nft_information(self, plugin: Plugin) -> bytes: - return self._same_header_builder(plugin, InsType.INS_PROVIDE_NFT_INFORMATION) - - def provide_erc20_token_information(self, info: ERC20Information): - return self._same_header_builder(info, InsType.INS_PROVIDE_ERC20) - - def get_public_key(self, bip32_path: str, display: bool = False) -> bytes: - """Command builder for GET_PUBLIC_KEY. - - Parameters - ---------- - bip32_path: str - String representation of BIP32 path. - display : bool - Whether you want to display the address on the device. - - Returns - ------- - bytes - APDU command for GET_PUBLIC_KEY. - - """ - cdata = packed_bip32_path_from_string(bip32_path) - - return self.serialize(cla=self.CLA, - ins=InsType.INS_GET_PUBLIC_KEY, - p1=0x01 if display else 0x00, - p2=0x01, - cdata=cdata) - - def perform_privacy_operation(self, bip32_path: str, display: bool, shared_secret: bool) -> bytes: - """Command builder for INS_PERFORM_PRIVACY_OPERATION. - - Parameters - ---------- - bip32_path : str - String representation of BIP32 path. - Third party public key on Curve25519 : 32 bytes - Optionnal if returning the shared secret - - """ - cdata = packed_bip32_path_from_string(bip32_path) - - return self.serialize(cla=self.CLA, - ins=InsType.INS_PERFORM_PRIVACY_OPERATION, - p1=0x01 if display else 0x00, - p2=0x01 if shared_secret else 0x00, - cdata=cdata) - - - def simple_sign_tx(self, bip32_path: str, transaction: Transaction) -> bytes: - """Command builder for INS_SIGN_TX. - - Parameters - ---------- - bip32_path : str - String representation of BIP32 path. - transaction : Transaction - Representation of the transaction to be signed. - - Yields - ------- - bytes - APDU command chunk for INS_SIGN_TX. - - """ - cdata = packed_bip32_path_from_string(bip32_path) - - tx: bytes = transaction.serialize() - - cdata = cdata + tx - - return self.serialize(cla=self.CLA, - ins=InsType.INS_SIGN_TX, - p1=0x00, - p2=0x00, - cdata=cdata) - - def sign_eip712(self, bip32_path: str, transaction: EIP712) -> bytes: - """Command builder for INS_SIGN_EIP712. - - Parameters - ---------- - bip32_path : str - String representation of BIP32 path. - transaction : EIP712 - Domain hash -> 32 bytes - Message hash -> 32 bytes - - Yields - ------- - bytes - APDU command chunk for INS_SIGN_EIP712. - - """ - cdata = packed_bip32_path_from_string(bip32_path) - - - tx: bytes = transaction.serialize() - - cdata = cdata + tx - - return self.serialize(cla=self.CLA, - ins=InsType.INS_SIGN_EIP712, - p1=0x00, - p2=0x00, - cdata=cdata) - - def personal_sign_tx(self, bip32_path: str, transaction: PersonalTransaction) -> Tuple[bool,bytes]: - """Command builder for INS_SIGN_PERSONAL_TX. - - Parameters - ---------- - bip32_path : str - String representation of BIP32 path. - transaction : Transaction - Representation of the transaction to be signed. - - Yields - ------- - bytes - APDU command chunk for INS_SIGN_PERSONAL_TX. - - """ - - cdata = packed_bip32_path_from_string(bip32_path) - - tx: bytes = transaction.serialize() - - cdata = cdata + tx - last_chunk = len(cdata) // MAX_APDU_LEN - - # The generator allows to send apdu frames because we can't send an apdu > 255 - for i, (chunk) in enumerate(chunked(MAX_APDU_LEN, cdata)): - if i == 0 and i == last_chunk: - yield True, self.serialize(cla=self.CLA, - ins=InsType.INS_SIGN_PERSONAL_TX, - p1=0x00, - p2=0x00, - cdata=chunk) - elif i == 0: - yield False, self.serialize(cla=self.CLA, - ins=InsType.INS_SIGN_PERSONAL_TX, - p1=0x00, - p2=0x00, - cdata=chunk) - elif i == last_chunk: - yield True, self.serialize(cla=self.CLA, - ins=InsType.INS_SIGN_PERSONAL_TX, - p1=0x80, - p2=0x00, - cdata=chunk) - else: - yield False, self.serialize(cla=self.CLA, - ins=InsType.INS_SIGN_PERSONAL_TX, - p1=0x80, - p2=0x00, - cdata=chunk) \ No newline at end of file diff --git a/tests/speculos/ethereum_client/exception/__init__.py b/tests/speculos/ethereum_client/exception/__init__.py deleted file mode 100644 index acb2bb8..0000000 --- a/tests/speculos/ethereum_client/exception/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -from .device_exception import DeviceException -from .errors import (UnknownDeviceError, - DenyError, - WrongP1P2Error, - WrongDataLengthError, - InsNotSupportedError, - ClaNotSupportedError, - WrongResponseLengthError, - DisplayBip32PathFailError, - DisplayAddressFailError, - DisplayAmountFailError, - WrongTxLengthError, - TxParsingFailError, - TxHashFail, - BadStateError, - SignatureFailError) - -__all__ = [ - "DeviceException", - "DenyError", - "UnknownDeviceError", - "WrongP1P2Error", - "WrongDataLengthError", - "InsNotSupportedError", - "ClaNotSupportedError", - "WrongResponseLengthError", - "DisplayBip32PathFailError", - "DisplayAddressFailError", - "DisplayAmountFailError", - "WrongTxLengthError", - "TxParsingFailError", - "TxHashFail", - "BadStateError", - "SignatureFailError" -] diff --git a/tests/speculos/ethereum_client/exception/device_exception.py b/tests/speculos/ethereum_client/exception/device_exception.py deleted file mode 100644 index 7cd26f2..0000000 --- a/tests/speculos/ethereum_client/exception/device_exception.py +++ /dev/null @@ -1,38 +0,0 @@ -import enum -from typing import Dict, Any, Union - -from .errors import * - - -class DeviceException(Exception): # pylint: disable=too-few-public-methods - exc: Dict[int, Any] = { - 0x6985: DenyError, - 0x6A86: WrongP1P2Error, - 0x6A87: WrongDataLengthError, - 0x6D00: InsNotSupportedError, - 0x6E00: ClaNotSupportedError, - 0xB000: WrongResponseLengthError, - 0xB001: DisplayBip32PathFailError, - 0xB002: DisplayAddressFailError, - 0xB003: DisplayAmountFailError, - 0xB004: WrongTxLengthError, - 0xB005: TxParsingFailError, - 0xB006: TxHashFail, - 0xB007: BadStateError, - 0xB008: SignatureFailError - } - - def __new__(cls, - error_code: int, - ins: Union[int, enum.IntEnum, None] = None, - message: str = "" - ) -> Any: - error_message: str = (f"Error in {ins!r} command" - if ins else "Error in command") - - if error_code in DeviceException.exc: - return DeviceException.exc[error_code](hex(error_code), - error_message, - message) - - return UnknownDeviceError(hex(error_code), error_message, message) diff --git a/tests/speculos/ethereum_client/exception/errors.py b/tests/speculos/ethereum_client/exception/errors.py deleted file mode 100644 index a9a853d..0000000 --- a/tests/speculos/ethereum_client/exception/errors.py +++ /dev/null @@ -1,58 +0,0 @@ -class UnknownDeviceError(Exception): - pass - - -class DenyError(Exception): - pass - - -class WrongP1P2Error(Exception): - pass - - -class WrongDataLengthError(Exception): - pass - - -class InsNotSupportedError(Exception): - pass - - -class ClaNotSupportedError(Exception): - pass - - -class WrongResponseLengthError(Exception): - pass - - -class DisplayBip32PathFailError(Exception): - pass - - -class DisplayAddressFailError(Exception): - pass - - -class DisplayAmountFailError(Exception): - pass - - -class WrongTxLengthError(Exception): - pass - - -class TxParsingFailError(Exception): - pass - - -class TxHashFail(Exception): - pass - - -class BadStateError(Exception): - pass - - -class SignatureFailError(Exception): - pass diff --git a/tests/speculos/ethereum_client/plugin.py b/tests/speculos/ethereum_client/plugin.py deleted file mode 100644 index 9274fde..0000000 --- a/tests/speculos/ethereum_client/plugin.py +++ /dev/null @@ -1,70 +0,0 @@ -import string -from typing import Union - -from ethereum_client.utils import write_varint - -class ERC20Information: - def __init__(self, erc20_ticker: string , addr: Union[str, bytes], nb_decimals: int, chainID: int, sign: str) -> None: - self.erc20_ticker: bytes = bytes.fromhex(erc20_ticker) - self.addr: bytes = bytes.fromhex(addr[2:]) if isinstance(addr, str) else addr - self.nb_decimals: int = nb_decimals - self.chainID: int = chainID - self.sign: bytes = bytes.fromhex(sign) - - def serialize(self) -> bytes: - return b"".join([ - write_varint(len(self.erc20_ticker)), - self.erc20_ticker, - - self.addr, - - self.nb_decimals.to_bytes(4, byteorder="big"), - - self.chainID.to_bytes(4, byteorder="big"), - - self.sign, - ]) - -class Plugin: - """Plugin class - Allows to generate an apdu of the SET_PLUGIN command or PROVIDE_NFT_INFORMATION - - PROVIDE_NFT_INFORMATION - ---- - do not define a selector - - """ - def __init__(self, type: int, version: int, name: str, addr: Union[str, bytes], selector: int = -1, chainID: int = 1, keyID: int = 0, algorithm: int = 1, sign: str = "") -> None: - self.type: int = type - self.version: int = version - self.name: bytes = bytes(name, 'UTF-8') - self.addr: bytes = bytes.fromhex(addr[2:]) if isinstance(addr, str) else addr - self.selector: int = selector - self.chainID: int = chainID - self.keyID: int = keyID - self.algorithm: int = algorithm - self.sign: bytes = bytes.fromhex(sign) - - def serialize(self) -> bytes: - return b"".join([ - self.type.to_bytes(1, byteorder="big"), - - self.version.to_bytes(1, byteorder="big"), - - write_varint(len(self.name)), - self.name, - - self.addr, - - b'' if self.selector == -1 else self.selector.to_bytes(4, byteorder="big"), - - self.chainID.to_bytes(8, byteorder="big"), - - self.keyID.to_bytes(1, byteorder="big"), - - self.algorithm.to_bytes(1, byteorder="big"), - - write_varint(len(self.sign)), - self.sign, - - ]) \ No newline at end of file diff --git a/tests/speculos/ethereum_client/transaction.py b/tests/speculos/ethereum_client/transaction.py deleted file mode 100644 index 4c9fe23..0000000 --- a/tests/speculos/ethereum_client/transaction.py +++ /dev/null @@ -1,96 +0,0 @@ -from typing import Union - -from ethereum_client.utils import write_varint, UINT64_MAX - - -class TransactionError(Exception): - pass - -EIP2930 = 1 -EIP1559 = 2 - -class PersonalTransaction: - def __init__(self, msg: Union[str, bytes]) -> None: - # If you want to send bytes directly you have to put "0x" before the string - if msg[0:2] == "0x": - self.msg: bytes = bytes.fromhex(msg[2:]) - else: - self.msg: bytes = bytes(msg, "utf-8") - - def serialize(self) -> bytes: - return b"".join([ - len(self.msg).to_bytes(4, byteorder="big"), - self.msg, - ]) - -class Transaction: - def __init__(self, txType: int, nonce: int, gasPrice: int, gasLimit: int, to: Union[str, bytes], value: int, data: Union[str, bytes] = "", chainID: int = -1) -> None: - self.txType: int = txType - self.nonce: int = nonce - self.gasPrice: int = gasPrice - self.gasLimit: int = gasLimit - self.to: bytes = bytes.fromhex(to[2:]) if isinstance(to, str) else to - self.value: int = value - self.data: bytes = bytes(data, "utf-8") - self.chainID = b'' - - if not (0 <= self.nonce <= UINT64_MAX): - raise TransactionError(f"Bad nonce: '{self.nonce}'!") - - if not (0 <= self.value <= UINT64_MAX): - raise TransactionError(f"Bad value: '{self.value}'!") - - if len(self.to) != 20: - raise TransactionError(f"Bad address: '{self.to}'!") - - self.lenNonce = int((len(hex(self.nonce)) - 1) / 2) - self.lenGP = int((len(hex(self.gasPrice)) - 1) / 2) - self.lenGL = int((len(hex(self.gasLimit)) - 1) / 2) - self.lenValue = int((len(hex(self.value)) - 1) / 2) - - self.lenChainID = int((len(hex(chainID)) - 1) / 2) - - if chainID != -1: - self.chainID = b"".join([ - b'' if self.lenChainID == 1 else (self.lenChainID + 0x80).to_bytes(1, byteorder="big"), - chainID.to_bytes(self.lenChainID, byteorder="big"), - write_varint(0 + 0x80), - write_varint(0 + 0x80), - ]) - - def serialize(self) -> bytes: - return b"".join([ - self.txType.to_bytes(1, byteorder="big"), - - b'' if self.lenNonce == 1 else write_varint(self.lenNonce + 0x80), - self.nonce.to_bytes(self.lenNonce, byteorder="big"), - - write_varint(self.lenGP + 0x80), - self.gasPrice.to_bytes(self.lenGP, byteorder="big"), - - write_varint(self.lenGL + 0x80), - self.gasLimit.to_bytes(self.lenGL, byteorder="big"), - - write_varint(len(self.to) + 0x80), - self.to, - - write_varint(self.lenValue + 0x80), - self.value.to_bytes(self.lenValue, byteorder="big"), - - write_varint(len(self.data) + 0x80), - self.data, - - self.chainID, - - ]) - -class EIP712: - def __init__(self, domain_hash: str, msg_hash: str) -> None: - self.domain_hash = bytes.fromhex(domain_hash) - self.msg_hash = bytes.fromhex(msg_hash) - - def serialize(self) -> bytes: - return b"".join([ - self.domain_hash, - self.msg_hash - ]) \ No newline at end of file diff --git a/tests/speculos/ethereum_client/utils.py b/tests/speculos/ethereum_client/utils.py deleted file mode 100644 index be3cdde..0000000 --- a/tests/speculos/ethereum_client/utils.py +++ /dev/null @@ -1,115 +0,0 @@ -from io import BytesIO -from typing import List, Optional, Literal, Tuple -import PIL.Image as Image - -import speculos.client - -UINT64_MAX: int = 18446744073709551615 -UINT32_MAX: int = 4294967295 -UINT16_MAX: int = 65535 - -# Association tableau si écran nanos ou nanox -PATH_IMG = {"nanos": "nanos", "nanox": "nanox", "nanosp": "nanox"} - -def save_screenshot(cmd, path: str): - screenshot = cmd.client.get_screenshot() - img = Image.open(BytesIO(screenshot)) - img.save(path) - - -def compare_screenshot(cmd, path: str): - screenshot = cmd.client.get_screenshot() - assert speculos.client.screenshot_equal(path, BytesIO(screenshot)) - - -def parse_sign_response(response : bytes) -> Tuple[bytes, bytes, bytes]: - assert len(response) == 65 - - offset: int = 0 - - v: bytes = response[offset] - offset += 1 - - r: bytes = response[offset:offset + 32] - offset += 32 - - s: bytes = response[offset:] - - return (v, r, s) - - -def bip32_path_from_string(path: str) -> List[bytes]: - splitted_path: List[str] = path.split("/") - - if not splitted_path: - raise Exception(f"BIP32 path format error: '{path}'") - - if "m" in splitted_path and splitted_path[0] == "m": - splitted_path = splitted_path[1:] - - return [int(p).to_bytes(4, byteorder="big") if "'" not in p - else (0x80000000 | int(p[:-1])).to_bytes(4, byteorder="big") - for p in splitted_path] - - -def packed_bip32_path_from_string(path: str) -> bytes: - bip32_paths = bip32_path_from_string(path) - - return b"".join([ - len(bip32_paths).to_bytes(1, byteorder="big"), - *bip32_paths - ]) - - -def write_varint(n: int) -> bytes: - if n < 0xFC: - return n.to_bytes(1, byteorder="little") - - if n <= UINT16_MAX: - return b"\xFD" + n.to_bytes(2, byteorder="little") - - if n <= UINT32_MAX: - return b"\xFE" + n.to_bytes(4, byteorder="little") - - if n <= UINT64_MAX: - return b"\xFF" + n.to_bytes(8, byteorder="little") - - raise ValueError(f"Can't write to varint: '{n}'!") - - -def read_varint(buf: BytesIO, - prefix: Optional[bytes] = None) -> int: - b: bytes = prefix if prefix else buf.read(1) - - if not b: - raise ValueError(f"Can't read prefix: '{b}'!") - - n: int = {b"\xfd": 2, b"\xfe": 4, b"\xff": 8}.get(b, 1) # default to 1 - - b = buf.read(n) if n > 1 else b - - if len(b) != n: - raise ValueError("Can't read varint!") - - return int.from_bytes(b, byteorder="little") - - -def read(buf: BytesIO, size: int) -> bytes: - b: bytes = buf.read(size) - - if len(b) < size: - raise ValueError(f"Cant read {size} bytes in buffer!") - - return b - - -def read_uint(buf: BytesIO, - bit_len: int, - byteorder: Literal['big', 'little'] = 'little') -> int: - size: int = bit_len // 8 - b: bytes = buf.read(size) - - if len(b) < size: - raise ValueError(f"Can't read u{bit_len} in buffer!") - - return int.from_bytes(b, byteorder) diff --git a/tests/speculos/old_test_eip191.py b/tests/speculos/old_test_eip191.py deleted file mode 100644 index d24ad0b..0000000 --- a/tests/speculos/old_test_eip191.py +++ /dev/null @@ -1,209 +0,0 @@ -from time import sleep - -import pytest - -import ethereum_client -from ethereum_client.utils import compare_screenshot, compare_screenshot, parse_sign_response, save_screenshot, PATH_IMG -from ethereum_client.transaction import PersonalTransaction - -def test_personal_sign_metamask(cmd): - result: list = [] - - bip32_path="44'/60'/0'/0/0" - transaction = PersonalTransaction( - msg="Example `personal_sign` message" - ) - - with cmd.personal_sign_tx(bip32_path=bip32_path, transaction=transaction, result=result) as ex: - sleep(0.5) - - if cmd.model == "nanos": - # Sign message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_metamask/00000.png") - cmd.client.press_and_release('right') - - # Message 1/2, 2/2 - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_metamask/00001.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_metamask/00002.png") - cmd.client.press_and_release('right') - - # Sign message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_metamask/00003.png") - cmd.client.press_and_release('both') - if cmd.model == "nanox" or cmd.model == "nanosp": - # Sign message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_metamask/00000.png") - cmd.client.press_and_release('right') - - # Message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_metamask/00001.png") - cmd.client.press_and_release('right') - - # Sign message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_metamask/00002.png") - cmd.client.press_and_release('both') - - v, r, s = result - - assert v == 0x1c # 28 - assert r.hex() == "916099cf0d9c21911c85f0770a47a9696a8189e78c259cf099749748c507baae" - assert s.hex() == "0d72234bc0ac2e94c5f7a5f4f9cd8610a52be4ea55515a85b9703f1bb158415c" - -def test_personal_sign_reject(cmd): - result: list = [] - - bip32_path="44'/60'/0'/0/0" - transaction = PersonalTransaction( - msg="This is an reject sign" - ) - - with pytest.raises(ethereum_client.exception.errors.DenyError) as error: - with cmd.personal_sign_tx(bip32_path=bip32_path, transaction=transaction, result=result) as ex: - sleep(0.5) - - if cmd.model == "nanos": - # Sign message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_reject/00000.png") - cmd.client.press_and_release('right') - - # Message 1/2, 2/2 - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_reject/00001.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_reject/00002.png") - cmd.client.press_and_release('right') - - # Sign message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_reject/00003.png") - cmd.client.press_and_release('right') - - # Cancel signature - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_reject/00004.png") - cmd.client.press_and_release('both') - - if cmd.model == "nanox" or cmd.model == "nanosp": - # Sign message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_reject/00000.png") - cmd.client.press_and_release('right') - - # Message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_reject/00001.png") - cmd.client.press_and_release('right') - - # Sign message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_reject/00002.png") - cmd.client.press_and_release('right') - - # Cancel signature - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_reject/00003.png") - cmd.client.press_and_release('both') - assert error.args[0] == '0x6985' - -def test_personal_sign_non_ascii(cmd): - result: list = [] - - bip32_path="44'/60'/0'/0/0" - transaction = PersonalTransaction( - msg="0x9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658" - ) - - with cmd.personal_sign_tx(bip32_path=bip32_path, transaction=transaction, result=result) as ex: - sleep(0.5) - - if cmd.model == "nanos": - # Sign message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_non_ascii/00000.png") - cmd.client.press_and_release('right') - - # Message 1/4, 2/4, 3/4, 4/4 - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_non_ascii/00001.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_non_ascii/00002.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_non_ascii/00003.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_non_ascii/00004.png") - cmd.client.press_and_release('right') - - # Sign message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_non_ascii/00005.png") - cmd.client.press_and_release('both') - if cmd.model == "nanox" or cmd.model == "nanosp": - # Sign message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_non_ascii/00000.png") - cmd.client.press_and_release('right') - - # Message 1/2, 2/2 - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_non_ascii/00001.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_non_ascii/00002.png") - cmd.client.press_and_release('right') - - # Sign message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_non_ascii/00003.png") - cmd.client.press_and_release('both') - - v, r, s = result - - assert v == 0x1c # 28 - assert r.hex() == "64bdbdb6959425445d00ff2536a7018d2dce904e1f7475938fe4221c3c72500c" - assert s.hex() == "7c9208e99b6b9266a73aae17b73472d06499746edec34fd47a9dab42f06f2e42" - -def test_personal_sign_opensea(cmd): - result: list = [] - - bip32_path="44'/60'/0'/0/0" - transaction = PersonalTransaction( - msg="Welcome to OpenSea!\n\nClick to sign in and accept the OpenSea Terms of Service: https://opensea.io/tos\n\nThis request will not trigger a blockchain transaction or cost any gas fees.\n\nYour authentication status will reset after 24 hours.\n\nWallet address:\n0x9858effd232b4033e47d90003d41ec34ecaeda94\n\nNonce:\n2b02c8a0-f74f-4554-9821-a28054dc9121" - ) - - with cmd.personal_sign_tx(bip32_path, transaction, result) as ex: - sleep(0.5) - - if cmd.model == "nanos": - # Sign message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_opensea/00000.png") - cmd.client.press_and_release('right') - - # Message 1/5, 2/5, 3/5, 4/5, 5/5 - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_opensea/00001.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_opensea/00002.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_opensea/00003.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_opensea/00004.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_opensea/00005.png") - cmd.client.press_and_release('right') - - # Sign message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_opensea/00006.png") - cmd.client.press_and_release('both') - - if cmd.model == "nanox" or cmd.model == "nanosp": - # Sign message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_opensea/00000.png") - cmd.client.press_and_release('right') - - # Message 1/5, 2/5, 3/5, 4/5, 5/5 - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_opensea/00001.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_opensea/00002.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_opensea/00003.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_opensea/00004.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_opensea/00005.png") - cmd.client.press_and_release('right') - - # Sign message - compare_screenshot(cmd, f"screenshots/eip191/{PATH_IMG[cmd.model]}/personal_sign_opensea/00006.png") - cmd.client.press_and_release('both') - - v, r, s = result - - assert v == 0x1c # 28 - assert r.hex() == "61a68c986f087730d2f6ecf89d6d1e48ab963ac461102bb02664bc05c3db75bb" - assert s.hex() == "5714729ef441e097673a7b29a681e97f6963d875eeed2081f26b0b6686cd2bd2" diff --git a/tests/speculos/requirements.txt b/tests/speculos/requirements.txt deleted file mode 100644 index 2744c35..0000000 --- a/tests/speculos/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -speculos -pytest>=6.1.1,<7.0.0 -ledgercomm>=1.1.0,<1.2.0 -ecdsa>=0.16.1,<0.17.0 -pysha3>=1.0.0,<2.0.0 diff --git a/tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00002.png b/tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00002.png deleted file mode 100644 index 701b26b..0000000 Binary files a/tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00003.png b/tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00003.png deleted file mode 100644 index 32a2ee9..0000000 Binary files a/tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00004.png b/tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00004.png deleted file mode 100644 index 1ed3d77..0000000 Binary files a/tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00005.png b/tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00005.png deleted file mode 100644 index f19d91c..0000000 Binary files a/tests/speculos/screenshots/eip1559/nanos/sign_eip_1559/00005.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip1559/nanox/sign_eip_1559/00002.png b/tests/speculos/screenshots/eip1559/nanox/sign_eip_1559/00002.png deleted file mode 100644 index 5b65b54..0000000 Binary files a/tests/speculos/screenshots/eip1559/nanox/sign_eip_1559/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip1559/nanox/sign_eip_1559/00003.png b/tests/speculos/screenshots/eip1559/nanox/sign_eip_1559/00003.png deleted file mode 100644 index a1e3cc0..0000000 Binary files a/tests/speculos/screenshots/eip1559/nanox/sign_eip_1559/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_metamask/00000.png b/tests/speculos/screenshots/eip191/nanos/personal_sign_metamask/00000.png deleted file mode 100644 index ab16f62..0000000 Binary files a/tests/speculos/screenshots/eip191/nanos/personal_sign_metamask/00000.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_non_ascii/00000.png b/tests/speculos/screenshots/eip191/nanos/personal_sign_non_ascii/00000.png deleted file mode 100644 index ab16f62..0000000 Binary files a/tests/speculos/screenshots/eip191/nanos/personal_sign_non_ascii/00000.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_non_ascii/00001.png b/tests/speculos/screenshots/eip191/nanos/personal_sign_non_ascii/00001.png deleted file mode 100644 index ad00cb8..0000000 Binary files a/tests/speculos/screenshots/eip191/nanos/personal_sign_non_ascii/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_non_ascii/00002.png b/tests/speculos/screenshots/eip191/nanos/personal_sign_non_ascii/00002.png deleted file mode 100644 index b435297..0000000 Binary files a/tests/speculos/screenshots/eip191/nanos/personal_sign_non_ascii/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_non_ascii/00003.png b/tests/speculos/screenshots/eip191/nanos/personal_sign_non_ascii/00003.png deleted file mode 100644 index fcd68b2..0000000 Binary files a/tests/speculos/screenshots/eip191/nanos/personal_sign_non_ascii/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_non_ascii/00004.png b/tests/speculos/screenshots/eip191/nanos/personal_sign_non_ascii/00004.png deleted file mode 100644 index 251c562..0000000 Binary files a/tests/speculos/screenshots/eip191/nanos/personal_sign_non_ascii/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00000.png b/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00000.png deleted file mode 100644 index ab16f62..0000000 Binary files a/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00000.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00001.png b/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00001.png deleted file mode 100644 index bdbb3a0..0000000 Binary files a/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00002.png b/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00002.png deleted file mode 100644 index 0676953..0000000 Binary files a/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00003.png b/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00003.png deleted file mode 100644 index 582648d..0000000 Binary files a/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00004.png b/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00004.png deleted file mode 100644 index 53e1317..0000000 Binary files a/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00005.png b/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00005.png deleted file mode 100644 index 228f924..0000000 Binary files a/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00005.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00006.png b/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00006.png deleted file mode 100644 index f5c2d67..0000000 Binary files a/tests/speculos/screenshots/eip191/nanos/personal_sign_opensea/00006.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_reject/00000.png b/tests/speculos/screenshots/eip191/nanos/personal_sign_reject/00000.png deleted file mode 100644 index ab16f62..0000000 Binary files a/tests/speculos/screenshots/eip191/nanos/personal_sign_reject/00000.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanos/personal_sign_reject/00004.png b/tests/speculos/screenshots/eip191/nanos/personal_sign_reject/00004.png deleted file mode 100644 index d55782f..0000000 Binary files a/tests/speculos/screenshots/eip191/nanos/personal_sign_reject/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_metamask/00000.png b/tests/speculos/screenshots/eip191/nanox/personal_sign_metamask/00000.png deleted file mode 100644 index 1b27154..0000000 Binary files a/tests/speculos/screenshots/eip191/nanox/personal_sign_metamask/00000.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_metamask/00001.png b/tests/speculos/screenshots/eip191/nanox/personal_sign_metamask/00001.png deleted file mode 100644 index 58f0606..0000000 Binary files a/tests/speculos/screenshots/eip191/nanox/personal_sign_metamask/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_metamask/00002.png b/tests/speculos/screenshots/eip191/nanox/personal_sign_metamask/00002.png deleted file mode 100644 index c9da92b..0000000 Binary files a/tests/speculos/screenshots/eip191/nanox/personal_sign_metamask/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_non_ascii/00000.png b/tests/speculos/screenshots/eip191/nanox/personal_sign_non_ascii/00000.png deleted file mode 100644 index 1b27154..0000000 Binary files a/tests/speculos/screenshots/eip191/nanox/personal_sign_non_ascii/00000.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_non_ascii/00001.png b/tests/speculos/screenshots/eip191/nanox/personal_sign_non_ascii/00001.png deleted file mode 100644 index 93eda35..0000000 Binary files a/tests/speculos/screenshots/eip191/nanox/personal_sign_non_ascii/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_non_ascii/00002.png b/tests/speculos/screenshots/eip191/nanox/personal_sign_non_ascii/00002.png deleted file mode 100644 index 873634e..0000000 Binary files a/tests/speculos/screenshots/eip191/nanox/personal_sign_non_ascii/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_non_ascii/00003.png b/tests/speculos/screenshots/eip191/nanox/personal_sign_non_ascii/00003.png deleted file mode 100644 index c9da92b..0000000 Binary files a/tests/speculos/screenshots/eip191/nanox/personal_sign_non_ascii/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00000.png b/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00000.png deleted file mode 100644 index 1b27154..0000000 Binary files a/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00000.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00001.png b/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00001.png deleted file mode 100644 index 802fad5..0000000 Binary files a/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00002.png b/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00002.png deleted file mode 100644 index a3ba739..0000000 Binary files a/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00003.png b/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00003.png deleted file mode 100644 index 4601bca..0000000 Binary files a/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00004.png b/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00004.png deleted file mode 100644 index eab9f1d..0000000 Binary files a/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00005.png b/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00005.png deleted file mode 100644 index 0b4bdbd..0000000 Binary files a/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00005.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00006.png b/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00006.png deleted file mode 100644 index c9da92b..0000000 Binary files a/tests/speculos/screenshots/eip191/nanox/personal_sign_opensea/00006.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_reject/00000.png b/tests/speculos/screenshots/eip191/nanox/personal_sign_reject/00000.png deleted file mode 100644 index 1b27154..0000000 Binary files a/tests/speculos/screenshots/eip191/nanox/personal_sign_reject/00000.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_reject/00001.png b/tests/speculos/screenshots/eip191/nanox/personal_sign_reject/00001.png deleted file mode 100644 index 717f3a5..0000000 Binary files a/tests/speculos/screenshots/eip191/nanox/personal_sign_reject/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip191/nanox/personal_sign_reject/00002.png b/tests/speculos/screenshots/eip191/nanox/personal_sign_reject/00002.png deleted file mode 100644 index c9da92b..0000000 Binary files a/tests/speculos/screenshots/eip191/nanox/personal_sign_reject/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00002.png b/tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00002.png deleted file mode 100644 index 304f99e..0000000 Binary files a/tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00003.png b/tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00003.png deleted file mode 100644 index cdb80b7..0000000 Binary files a/tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00004.png b/tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00004.png deleted file mode 100644 index 39f91a1..0000000 Binary files a/tests/speculos/screenshots/eip2930/nanos/sign_eip_2930/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip2930/nanox/sign_eip_2930/00002.png b/tests/speculos/screenshots/eip2930/nanox/sign_eip_2930/00002.png deleted file mode 100644 index 8588465..0000000 Binary files a/tests/speculos/screenshots/eip2930/nanox/sign_eip_2930/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00000.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00000.png deleted file mode 100644 index 910bc43..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00000.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00001.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00001.png deleted file mode 100644 index 1492bd7..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00002.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00002.png deleted file mode 100644 index f6dba7e..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00003.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00003.png deleted file mode 100644 index 21193e0..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00004.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00004.png deleted file mode 100644 index 45c88a3..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00005.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00005.png deleted file mode 100644 index a512c88..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00005.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00006.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00006.png deleted file mode 100644 index 489127f..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00006.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00007.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00007.png deleted file mode 100644 index 61bcb2d..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00007.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00008.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00008.png deleted file mode 100644 index 3265601..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00008.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00009.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00009.png deleted file mode 100644 index f5c2d67..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg/00009.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00000.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00000.png deleted file mode 100644 index 910bc43..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00000.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00001.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00001.png deleted file mode 100644 index 1492bd7..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00002.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00002.png deleted file mode 100644 index f6dba7e..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00003.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00003.png deleted file mode 100644 index 21193e0..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00004.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00004.png deleted file mode 100644 index 45c88a3..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00005.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00005.png deleted file mode 100644 index a512c88..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00005.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00006.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00006.png deleted file mode 100644 index 489127f..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00006.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00007.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00007.png deleted file mode 100644 index 61bcb2d..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00007.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00008.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00008.png deleted file mode 100644 index 3265601..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00008.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00009.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00009.png deleted file mode 100644 index f5c2d67..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00009.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00010.png b/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00010.png deleted file mode 100644 index d55782f..0000000 Binary files a/tests/speculos/screenshots/eip712/nanos/sign_eip_712_hashed_msg_reject/00010.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00000.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00000.png deleted file mode 100644 index 00a89fd..0000000 Binary files a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00000.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00001.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00001.png deleted file mode 100644 index dfd24f4..0000000 Binary files a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00002.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00002.png deleted file mode 100644 index 542bf19..0000000 Binary files a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00003.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00003.png deleted file mode 100644 index ae1ff79..0000000 Binary files a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00004.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00004.png deleted file mode 100644 index 034e96f..0000000 Binary files a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00000.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00000.png deleted file mode 100644 index 00a89fd..0000000 Binary files a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00000.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00001.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00001.png deleted file mode 100644 index dfd24f4..0000000 Binary files a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00002.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00002.png deleted file mode 100644 index 542bf19..0000000 Binary files a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00003.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00003.png deleted file mode 100644 index ae1ff79..0000000 Binary files a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00004.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00004.png deleted file mode 100644 index 034e96f..0000000 Binary files a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00006.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00006.png deleted file mode 100644 index 121cfd5..0000000 Binary files a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00006.png and /dev/null differ diff --git a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00009.png b/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00009.png deleted file mode 100644 index 121cfd5..0000000 Binary files a/tests/speculos/screenshots/eip712/nanox/sign_eip_712_hashed_msg_reject/00009.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00001.png b/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00001.png deleted file mode 100644 index ba1dfa0..0000000 Binary files a/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00002.png b/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00002.png deleted file mode 100644 index 7d01fe8..0000000 Binary files a/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00003.png b/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00003.png deleted file mode 100644 index 950fd72..0000000 Binary files a/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00004.png b/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00004.png deleted file mode 100644 index 5906d19..0000000 Binary files a/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00005.png b/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00005.png deleted file mode 100644 index 05c1afa..0000000 Binary files a/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00005.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00006.png b/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00006.png deleted file mode 100644 index fb49360..0000000 Binary files a/tests/speculos/screenshots/erc1155/nanox/test_transfer_batch_erc1155/00006.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00001.png b/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00001.png deleted file mode 100644 index 2b0fd14..0000000 Binary files a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00002.png b/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00002.png deleted file mode 100644 index 7d01fe8..0000000 Binary files a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00003.png b/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00003.png deleted file mode 100644 index a5790c1..0000000 Binary files a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00004.png b/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00004.png deleted file mode 100644 index 5906d19..0000000 Binary files a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00005.png b/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00005.png deleted file mode 100644 index d6257d3..0000000 Binary files a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00005.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00006.png b/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00006.png deleted file mode 100644 index 061c754..0000000 Binary files a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00006.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00007.png b/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00007.png deleted file mode 100644 index c748a75..0000000 Binary files a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00007.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00008.png b/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00008.png deleted file mode 100644 index 432e634..0000000 Binary files a/tests/speculos/screenshots/erc1155/nanox/transfer_erc1155/00008.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00001.png b/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00001.png deleted file mode 100644 index 2b0fd14..0000000 Binary files a/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00002.png b/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00002.png deleted file mode 100644 index 7d01fe8..0000000 Binary files a/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00003.png b/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00003.png deleted file mode 100644 index 9e8c446..0000000 Binary files a/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00004.png b/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00004.png deleted file mode 100644 index 23f2a45..0000000 Binary files a/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00005.png b/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00005.png deleted file mode 100644 index e369a1b..0000000 Binary files a/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00005.png and /dev/null differ diff --git a/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00006.png b/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00006.png deleted file mode 100644 index 10b862e..0000000 Binary files a/tests/speculos/screenshots/erc721/nanox/transfer_erc721/00006.png and /dev/null differ diff --git a/tests/speculos/screenshots/pubkey/nanos/reject_get_public_key/00000.png b/tests/speculos/screenshots/pubkey/nanos/reject_get_public_key/00000.png deleted file mode 100644 index 63778c4..0000000 Binary files a/tests/speculos/screenshots/pubkey/nanos/reject_get_public_key/00000.png and /dev/null differ diff --git a/tests/speculos/screenshots/pubkey/nanos/reject_get_public_key/00001.png b/tests/speculos/screenshots/pubkey/nanos/reject_get_public_key/00001.png deleted file mode 100644 index 63fe23c..0000000 Binary files a/tests/speculos/screenshots/pubkey/nanos/reject_get_public_key/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/pubkey/nanos/reject_get_public_key/00002.png b/tests/speculos/screenshots/pubkey/nanos/reject_get_public_key/00002.png deleted file mode 100644 index b79ecb4..0000000 Binary files a/tests/speculos/screenshots/pubkey/nanos/reject_get_public_key/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/pubkey/nanos/reject_get_public_key/00003.png b/tests/speculos/screenshots/pubkey/nanos/reject_get_public_key/00003.png deleted file mode 100644 index 0b61bde..0000000 Binary files a/tests/speculos/screenshots/pubkey/nanos/reject_get_public_key/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00001.png b/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00001.png deleted file mode 100644 index b2ab371..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00003.png b/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00003.png deleted file mode 100644 index c2af54e..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00004.png b/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00004.png deleted file mode 100644 index a54fefd..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00005.png b/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00005.png deleted file mode 100644 index 8656b81..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00005.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00006.png b/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00006.png deleted file mode 100644 index fd3155c..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00006.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00007.png b/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00007.png deleted file mode 100644 index c63f25f..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00007.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00008.png b/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00008.png deleted file mode 100644 index 0aa6e19..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/blind_and_nonce_display/00008.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/blind_simple/00001.png b/tests/speculos/screenshots/sign/nanos/blind_simple/00001.png deleted file mode 100644 index b2ab371..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/blind_simple/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/blind_simple/00002.png b/tests/speculos/screenshots/sign/nanos/blind_simple/00002.png deleted file mode 100644 index 7ebda4f..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/blind_simple/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/blind_simple/00003.png b/tests/speculos/screenshots/sign/nanos/blind_simple/00003.png deleted file mode 100644 index c2af54e..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/blind_simple/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/blind_simple/00004.png b/tests/speculos/screenshots/sign/nanos/blind_simple/00004.png deleted file mode 100644 index a54fefd..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/blind_simple/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/blind_simple/00005.png b/tests/speculos/screenshots/sign/nanos/blind_simple/00005.png deleted file mode 100644 index 8656b81..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/blind_simple/00005.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/blind_simple/00006.png b/tests/speculos/screenshots/sign/nanos/blind_simple/00006.png deleted file mode 100644 index fd3155c..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/blind_simple/00006.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/blind_simple/00007.png b/tests/speculos/screenshots/sign/nanos/blind_simple/00007.png deleted file mode 100644 index c63f25f..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/blind_simple/00007.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/limit_nonce/00001.png b/tests/speculos/screenshots/sign/nanos/limit_nonce/00001.png deleted file mode 100644 index 7ebda4f..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/limit_nonce/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/limit_nonce/00004.png b/tests/speculos/screenshots/sign/nanos/limit_nonce/00004.png deleted file mode 100644 index 8656b81..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/limit_nonce/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/limit_nonce/00005.png b/tests/speculos/screenshots/sign/nanos/limit_nonce/00005.png deleted file mode 100644 index fd3155c..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/limit_nonce/00005.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/limit_nonce/00006.png b/tests/speculos/screenshots/sign/nanos/limit_nonce/00006.png deleted file mode 100644 index c63f25f..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/limit_nonce/00006.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/nonce_display/00001.png b/tests/speculos/screenshots/sign/nanos/nonce_display/00001.png deleted file mode 100644 index 7ebda4f..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/nonce_display/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/nonce_display/00002.png b/tests/speculos/screenshots/sign/nanos/nonce_display/00002.png deleted file mode 100644 index c2af54e..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/nonce_display/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/nonce_display/00003.png b/tests/speculos/screenshots/sign/nanos/nonce_display/00003.png deleted file mode 100644 index a54fefd..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/nonce_display/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/nonce_display/00004.png b/tests/speculos/screenshots/sign/nanos/nonce_display/00004.png deleted file mode 100644 index 8656b81..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/nonce_display/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/nonce_display/00005.png b/tests/speculos/screenshots/sign/nanos/nonce_display/00005.png deleted file mode 100644 index fd3155c..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/nonce_display/00005.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/nonce_display/00006.png b/tests/speculos/screenshots/sign/nanos/nonce_display/00006.png deleted file mode 100644 index c63f25f..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/nonce_display/00006.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/reject/00001.png b/tests/speculos/screenshots/sign/nanos/reject/00001.png deleted file mode 100644 index 7ebda4f..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/reject/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/reject/00002.png b/tests/speculos/screenshots/sign/nanos/reject/00002.png deleted file mode 100644 index c2af54e..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/reject/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/reject/00003.png b/tests/speculos/screenshots/sign/nanos/reject/00003.png deleted file mode 100644 index a54fefd..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/reject/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/reject/00004.png b/tests/speculos/screenshots/sign/nanos/reject/00004.png deleted file mode 100644 index 8656b81..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/reject/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/reject/00005.png b/tests/speculos/screenshots/sign/nanos/reject/00005.png deleted file mode 100644 index fd3155c..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/reject/00005.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/reject/00006.png b/tests/speculos/screenshots/sign/nanos/reject/00006.png deleted file mode 100644 index c63f25f..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/reject/00006.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/reject/00007.png b/tests/speculos/screenshots/sign/nanos/reject/00007.png deleted file mode 100644 index c84d3ec..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/reject/00007.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/simple/00001.png b/tests/speculos/screenshots/sign/nanos/simple/00001.png deleted file mode 100644 index 7ebda4f..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/simple/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/simple/00002.png b/tests/speculos/screenshots/sign/nanos/simple/00002.png deleted file mode 100644 index c2af54e..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/simple/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/simple/00003.png b/tests/speculos/screenshots/sign/nanos/simple/00003.png deleted file mode 100644 index a54fefd..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/simple/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/simple/00004.png b/tests/speculos/screenshots/sign/nanos/simple/00004.png deleted file mode 100644 index 8656b81..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/simple/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/simple/00005.png b/tests/speculos/screenshots/sign/nanos/simple/00005.png deleted file mode 100644 index fd3155c..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/simple/00005.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/simple/00006.png b/tests/speculos/screenshots/sign/nanos/simple/00006.png deleted file mode 100644 index c63f25f..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/simple/00006.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/simple/00007.png b/tests/speculos/screenshots/sign/nanos/simple/00007.png deleted file mode 100644 index c84d3ec..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/simple/00007.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanos/simple/00008.png b/tests/speculos/screenshots/sign/nanos/simple/00008.png deleted file mode 100644 index 1c9156c..0000000 Binary files a/tests/speculos/screenshots/sign/nanos/simple/00008.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00001.png b/tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00001.png deleted file mode 100644 index b4d7bef..0000000 Binary files a/tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00002.png b/tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00002.png deleted file mode 100644 index 0976a31..0000000 Binary files a/tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00003.png b/tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00003.png deleted file mode 100644 index 0f18eee..0000000 Binary files a/tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00004.png b/tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00004.png deleted file mode 100644 index 61f3687..0000000 Binary files a/tests/speculos/screenshots/sign/nanox/blind_and_nonce_display/00004.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanox/blind_simple/00001.png b/tests/speculos/screenshots/sign/nanox/blind_simple/00001.png deleted file mode 100644 index b4d7bef..0000000 Binary files a/tests/speculos/screenshots/sign/nanox/blind_simple/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanox/blind_simple/00002.png b/tests/speculos/screenshots/sign/nanox/blind_simple/00002.png deleted file mode 100644 index 0976a31..0000000 Binary files a/tests/speculos/screenshots/sign/nanox/blind_simple/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanox/blind_simple/00003.png b/tests/speculos/screenshots/sign/nanox/blind_simple/00003.png deleted file mode 100644 index 0f18eee..0000000 Binary files a/tests/speculos/screenshots/sign/nanox/blind_simple/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanox/limit_nonce/00002.png b/tests/speculos/screenshots/sign/nanox/limit_nonce/00002.png deleted file mode 100644 index 0f18eee..0000000 Binary files a/tests/speculos/screenshots/sign/nanox/limit_nonce/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanox/nonce_display/00001.png b/tests/speculos/screenshots/sign/nanox/nonce_display/00001.png deleted file mode 100644 index 0976a31..0000000 Binary files a/tests/speculos/screenshots/sign/nanox/nonce_display/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanox/nonce_display/00002.png b/tests/speculos/screenshots/sign/nanox/nonce_display/00002.png deleted file mode 100644 index 0f18eee..0000000 Binary files a/tests/speculos/screenshots/sign/nanox/nonce_display/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanox/reject/00001.png b/tests/speculos/screenshots/sign/nanox/reject/00001.png deleted file mode 100644 index 0976a31..0000000 Binary files a/tests/speculos/screenshots/sign/nanox/reject/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanox/reject/00002.png b/tests/speculos/screenshots/sign/nanox/reject/00002.png deleted file mode 100644 index 0f18eee..0000000 Binary files a/tests/speculos/screenshots/sign/nanox/reject/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanox/reject/00003.png b/tests/speculos/screenshots/sign/nanox/reject/00003.png deleted file mode 100644 index 1bcb787..0000000 Binary files a/tests/speculos/screenshots/sign/nanox/reject/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanox/simple/00001.png b/tests/speculos/screenshots/sign/nanox/simple/00001.png deleted file mode 100644 index 0976a31..0000000 Binary files a/tests/speculos/screenshots/sign/nanox/simple/00001.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanox/simple/00002.png b/tests/speculos/screenshots/sign/nanox/simple/00002.png deleted file mode 100644 index 0f18eee..0000000 Binary files a/tests/speculos/screenshots/sign/nanox/simple/00002.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanox/simple/00003.png b/tests/speculos/screenshots/sign/nanox/simple/00003.png deleted file mode 100644 index 1bcb787..0000000 Binary files a/tests/speculos/screenshots/sign/nanox/simple/00003.png and /dev/null differ diff --git a/tests/speculos/screenshots/sign/nanox/simple/00004.png b/tests/speculos/screenshots/sign/nanox/simple/00004.png deleted file mode 100644 index 570ce28..0000000 Binary files a/tests/speculos/screenshots/sign/nanox/simple/00004.png and /dev/null differ diff --git a/tests/speculos/test_configuration_cmd.py b/tests/speculos/test_configuration_cmd.py deleted file mode 100644 index c279156..0000000 --- a/tests/speculos/test_configuration_cmd.py +++ /dev/null @@ -1,3 +0,0 @@ - -def test_configuration(cmd): - assert cmd.get_configuration() == (2, 1, 10, 4) diff --git a/tests/speculos/test_eip1559.py b/tests/speculos/test_eip1559.py deleted file mode 100644 index f834df3..0000000 --- a/tests/speculos/test_eip1559.py +++ /dev/null @@ -1,64 +0,0 @@ -from time import sleep - -from ethereum_client.utils import compare_screenshot, save_screenshot, PATH_IMG, parse_sign_response - -def test_sign_eip_1559(cmd): - result: list = [] - # with bip32_path "44'/60'/0'/0/0" - apdu_sign_eip_1559 = bytes.fromhex("e004000088058000002c8000003c80000000000000000000000002f87001018502540be4008502540be40086246139ca800094cccccccccccccccccccccccccccccccccccccccc8000c001a0e07fb8a64ea3786c9a6649e54429e2786af3ea31c6d06165346678cf8ce44f9ba00e4a0526db1e905b7164a858fd5ebd2f1759e22e6955499448bd276a6aa62830") - - with cmd.send_apdu_context(apdu_sign_eip_1559, result) as ex: - sleep(0.5) - - if cmd.model == "nanos": - # Review transaction - compare_screenshot(cmd, f"screenshots/eip1559/{PATH_IMG[cmd.model]}/sign_eip_1559/00000.png") - cmd.client.press_and_release('right') - - # Amount - compare_screenshot(cmd, f"screenshots/eip1559/{PATH_IMG[cmd.model]}/sign_eip_1559/00001.png") - cmd.client.press_and_release('right') - - # Address 1/3, 2/3, 3/3 - compare_screenshot(cmd, f"screenshots/eip1559/{PATH_IMG[cmd.model]}/sign_eip_1559/00002.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip1559/{PATH_IMG[cmd.model]}/sign_eip_1559/00003.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip1559/{PATH_IMG[cmd.model]}/sign_eip_1559/00004.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/eip1559/{PATH_IMG[cmd.model]}/sign_eip_1559/00005.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/eip1559/{PATH_IMG[cmd.model]}/sign_eip_1559/00006.png") - cmd.client.press_and_release('both') - - if cmd.model == "nanox" or cmd.model == "nanosp": - # Review transaction - compare_screenshot(cmd, f"screenshots/eip1559/{PATH_IMG[cmd.model]}/sign_eip_1559/00000.png") - cmd.client.press_and_release('right') - - # Amount - compare_screenshot(cmd, f"screenshots/eip1559/{PATH_IMG[cmd.model]}/sign_eip_1559/00001.png") - cmd.client.press_and_release('right') - - # Address - compare_screenshot(cmd, f"screenshots/eip1559/{PATH_IMG[cmd.model]}/sign_eip_1559/00002.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/eip1559/{PATH_IMG[cmd.model]}/sign_eip_1559/00003.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/eip1559/{PATH_IMG[cmd.model]}/sign_eip_1559/00004.png") - cmd.client.press_and_release('both') - - response: bytes = result[0] - v, r, s = parse_sign_response(response) - - assert v == 0x01 - assert r.hex() == "3d6dfabc6c52374bfa34cb2c433856a0bcd9484870dd1b50249f7164a5fce052" - assert s.hex() == "0548a774dd0b63930d83cb2e1a836fe3ef24444e8b758b00585d9a076c0e98a8" diff --git a/tests/speculos/test_eip2930.py b/tests/speculos/test_eip2930.py deleted file mode 100644 index 972cbc5..0000000 --- a/tests/speculos/test_eip2930.py +++ /dev/null @@ -1,72 +0,0 @@ -from time import sleep - -from ethereum_client.utils import compare_screenshot, save_screenshot, PATH_IMG, parse_sign_response - -def test_sign_eip_2930(cmd): - result: list = [] - apdu_sign_eip_2930 = bytes.fromhex("e004000096058000002c8000003c80000000000000000000000001f886030685012a05f20082520894b2bb2b958afa2e96dab3f3ce7162b87daea39017872386f26fc1000080f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000007") - - with cmd.send_apdu_context(apdu_sign_eip_2930, result) as ex: - sleep(0.5) - - if cmd.model == "nanos": - # Review transaction - compare_screenshot(cmd, f"screenshots/eip2930/{PATH_IMG[cmd.model]}/sign_eip_2930/00000.png") - cmd.client.press_and_release('right') - - # Amount - compare_screenshot(cmd, f"screenshots/eip2930/{PATH_IMG[cmd.model]}/sign_eip_2930/00001.png") - cmd.client.press_and_release('right') - - # Address 1/3, 2/3, 3/3 - compare_screenshot(cmd, f"screenshots/eip2930/{PATH_IMG[cmd.model]}/sign_eip_2930/00002.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip2930/{PATH_IMG[cmd.model]}/sign_eip_2930/00003.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip2930/{PATH_IMG[cmd.model]}/sign_eip_2930/00004.png") - cmd.client.press_and_release('right') - - # Network - compare_screenshot(cmd, f"screenshots/eip2930/{PATH_IMG[cmd.model]}/sign_eip_2930/00005.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/eip2930/{PATH_IMG[cmd.model]}/sign_eip_2930/00006.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/eip2930/{PATH_IMG[cmd.model]}/sign_eip_2930/00007.png") - cmd.client.press_and_release('both') - - if cmd.model == "nanox" or cmd.model == "nanosp": - # Review transaction - compare_screenshot(cmd, f"screenshots/eip2930/{PATH_IMG[cmd.model]}/sign_eip_2930/00000.png") - cmd.client.press_and_release('right') - - # Amount - compare_screenshot(cmd, f"screenshots/eip2930/{PATH_IMG[cmd.model]}/sign_eip_2930/00001.png") - cmd.client.press_and_release('right') - - # Address - compare_screenshot(cmd, f"screenshots/eip2930/{PATH_IMG[cmd.model]}/sign_eip_2930/00002.png") - cmd.client.press_and_release('right') - - # Network - compare_screenshot(cmd, f"screenshots/eip2930/{PATH_IMG[cmd.model]}/sign_eip_2930/00003.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/eip2930/{PATH_IMG[cmd.model]}/sign_eip_2930/00004.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/eip2930/{PATH_IMG[cmd.model]}/sign_eip_2930/00005.png") - cmd.client.press_and_release('both') - - - response: bytes = result[0] - v, r, s = parse_sign_response(response) - - assert v == 0x01 - assert r.hex() == "a74d82400f49d1f9d85f734c22a1648d4ab74bb6367bef54c6abb0936be3d8b7" - assert s.hex() == "7a84a09673394c3c1bd76be05620ee17a2d0ff32837607625efa433cc017854e" diff --git a/tests/speculos/test_eip712.py b/tests/speculos/test_eip712.py deleted file mode 100644 index 6a72aa4..0000000 --- a/tests/speculos/test_eip712.py +++ /dev/null @@ -1,179 +0,0 @@ -from time import sleep - -import pytest - -from ethereum_client.utils import compare_screenshot, save_screenshot, PATH_IMG, parse_sign_response -from ethereum_client.transaction import EIP712 -import ethereum_client - -def test_sign_eip_712_hashed_msg(cmd): - result: list = [] - - bip32_path="44'/60'/0'/0'/0" - transaction = EIP712( - domain_hash="c24f499b8c957196651b13edd64aaccc3980009674b2aea0966c8a56ba81278e", - msg_hash="9d96be8a7cca396e711a3ba356bd9878df02a726d753ddb6cda3c507d888bc77" - ) - - with cmd.sign_eip712(bip32_path=bip32_path, transaction=transaction, result=result) as ex: - sleep(0.5) - - if cmd.model == "nanos": - # Sign typed message - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg/00000.png") - cmd.client.press_and_release('right') - - # Domain hash 1/4, 2/4, 3/4, 4/4 - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg/00001.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg/00002.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg/00003.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg/00004.png") - cmd.client.press_and_release('right') - - # Message hash 1/4, 2/4, 3/4, 4/4 - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg/00005.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg/00006.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg/00007.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg/00008.png") - cmd.client.press_and_release('right') - - # Sign message - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg/00009.png") - cmd.client.press_and_release('both') - - if cmd.model == "nanox" or cmd.model == "nanosp": - # Sign typed message - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg/00000.png") - cmd.client.press_and_release('right') - - # Domain hash 1/2, 2/2 - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg/00001.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg/00002.png") - cmd.client.press_and_release('right') - - # Message hash 1/2, 2/2 - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg/00003.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg/00004.png") - cmd.client.press_and_release('right') - - # Sign message - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg/00005.png") - cmd.client.press_and_release('both') - - v, r, s = result - - assert v == 0x1B #27 - assert r.hex() == "b1cf3dd6f2902ae9b181e158cc07f6ee6e6c456360b18842ece0b947dec89f07" - assert s.hex() == "5372a9b1a495b76ccd75347b6f591867859fb73aa05a546b79c81073ddff5e8a" - -def test_sign_eip_712_hashed_msg_reject(cmd): - result: list = [] - - bip32_path="44'/60'/0'/0'/0" - transaction = EIP712( - domain_hash="c24f499b8c957196651b13edd64aaccc3980009674b2aea0966c8a56ba81278e", - msg_hash="9d96be8a7cca396e711a3ba356bd9878df02a726d753ddb6cda3c507d888bc77" - ) - - with pytest.raises(ethereum_client.exception.errors.DenyError) as error: - with cmd.sign_eip712(bip32_path=bip32_path, transaction=transaction, result=result) as ex: - sleep(0.5) - - if cmd.model == "nanos": - # Sign typed message - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00000.png") - cmd.client.press_and_release('right') - - # Domain hash 1/4, 2/4, 3/4, 4/4 - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00001.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00002.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00003.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00004.png") - cmd.client.press_and_release('right') - - # Message hash 1/4, 2/4, 3/4, 4/4 - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00005.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00006.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00007.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00008.png") - cmd.client.press_and_release('right') - - # Sign message - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00009.png") - cmd.client.press_and_release('right') - - # Cancel signature - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00010.png") - cmd.client.press_and_release('both') - - if cmd.model == "nanox" or cmd.model == "nanosp": - # Sign typed message - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00000.png") - cmd.client.press_and_release('right') - - # Domain hash 1/2, 2/2 - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00001.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00002.png") - cmd.client.press_and_release('right') - - # Message hash 1/2, 2/2 - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00003.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00004.png") - cmd.client.press_and_release('right') - - # Sign message - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00005.png") - cmd.client.press_and_release('right') - - # Cancel signature - compare_screenshot(cmd, f"screenshots/eip712/{PATH_IMG[cmd.model]}/sign_eip_712_hashed_msg_reject/00006.png") - cmd.client.press_and_release('both') - assert error.args[0] == '0x6985' - -def test_sign_eip_712_bad_domain(cmd): - result: list = [] - - bip32_path="44'/60'/0'/0'/0" - transaction = EIP712( - domain_hash="deadbeef", - msg_hash="9d96be8a7cca396e711a3ba356bd9878df02a726d753ddb6cda3c507d888bc77" - ) - - with pytest.raises(ethereum_client.exception.errors.UnknownDeviceError) as error: - - with cmd.sign_eip712(bip32_path=bip32_path, transaction=transaction, result=result) as ex: - pass - - assert error.args[0] == '0x6a80' - -def test_sign_eip_712_bad_msg(cmd): - result: list = [] - - bip32_path="44'/60'/0'/0'/0" - transaction = EIP712( - domain_hash="c24f499b8c957196651b13edd64aaccc3980009674b2aea0966c8a56ba81278e", - msg_hash="deadbeef" - ) - - with pytest.raises(ethereum_client.exception.errors.UnknownDeviceError) as error: - - with cmd.sign_eip712(bip32_path=bip32_path, transaction=transaction, result=result) as ex: - pass - - assert error.args[0] == '0x6a80' \ No newline at end of file diff --git a/tests/speculos/test_erc1155.py b/tests/speculos/test_erc1155.py deleted file mode 100644 index b0692ec..0000000 --- a/tests/speculos/test_erc1155.py +++ /dev/null @@ -1,208 +0,0 @@ -from time import sleep - -import pytest - -import ethereum_client -from ethereum_client.utils import compare_screenshot, save_screenshot, PATH_IMG, parse_sign_response -from ethereum_client.plugin import Plugin - -SIGN_FIRST = bytes.fromhex("e004000096058000002c8000003c800000000000000000000000f901090b8520b673dd0082bcb394495f947276749ce646f68ac8c248420045cb7b5e80b8e4f242432a0000000000000000000000006cbcd73cd8e8a42844662f0a0e76d7f79afd933d000000000000000000000000c2907efcce4011c491bbeda8a0fa63ba7aab596cabf06640f8ca8fc5e0ed471b10befcdf65a33e4300000000") -SIGN_MORE = bytes.fromhex("e00480008b00006a0000000064000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000043078303000000000000000000000000000000000000000000000000000000000018080") - -PLUGIN = Plugin( - type=1, - version=1, - name="ERC1155", - addr="0x495f947276749ce646f68ac8c248420045cb7b5e", - selector=0xf242432a, - chainID=1, - keyID=0, - algorithm=1, - sign="3045022100ec4377d17e8d98d424bf16b29c691bc1a010825fb5b8a35de0268a9dc22eab2402206701b016fe6718bf519d18cc12e9838e9ef898cc4c143017839023c3260b2d74", -) - -PROVIDE_NFT_INFORMATION = Plugin( - type=1, - version=1, - name="OpenSea Collection", - addr="0x495f947276749ce646f68ac8c248420045cb7b5e", - chainID=1, - keyID=0, - algorithm=1, - sign="304502210083e357a828f13d574b1296214a3749c194ab1df1f8a243655c053b1c72f91e0c02201ed93cfac7e87759445c4da2e4bfd6e1cf0405ea37c7293bc965948f51bef5cc", -) - -def test_transfer_erc1155(cmd): - result: list = [] - - if cmd.model == "nanox" or cmd.model == "nanosp": - cmd.set_plugin(plugin=PLUGIN) - cmd.provide_nft_information(plugin=PROVIDE_NFT_INFORMATION) - - cmd.send_apdu(SIGN_FIRST) - - with cmd.send_apdu_context(SIGN_MORE, result) as ex: - sleep(0.5) - # Review transaction - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/transfer_erc1155/00000.png") - cmd.client.press_and_release('right') - - # NFT Transfert - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/transfer_erc1155/00001.png") - cmd.client.press_and_release('right') - - # To - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/transfer_erc1155/00002.png") - cmd.client.press_and_release('right') - - # Collection Name - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/transfer_erc1155/00003.png") - cmd.client.press_and_release('right') - - # NFT Address - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/transfer_erc1155/00004.png") - cmd.client.press_and_release('right') - - # NFT ID 1/2, 2/2 - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/transfer_erc1155/00005.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/transfer_erc1155/00006.png") - cmd.client.press_and_release('right') - - # Quantity - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/transfer_erc1155/00007.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/transfer_erc1155/00008.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/transfer_erc1155/00009.png") - cmd.client.press_and_release('both') - - - response: bytes = result[0] - v, r, s = parse_sign_response(response) - - assert v == 0x25 # 37 - assert r.hex() == "ab3eca1a0b5c66bfe603252037682a024a12f92d799b4d74993a8bf4221bbe7d" - assert s.hex() == "24de0c0598d1d8e5ea99b75fa26105478f45f43b510e504fc1b14f07fe7dda2a" - - -def test_transfer_erc1155_without_nft_provide_info(cmd): - result: list = [] - - if cmd.model == "nanox" or cmd.model == "nanosp": - with pytest.raises(ethereum_client.exception.errors.UnknownDeviceError) as error: - - cmd.set_plugin(plugin=PLUGIN) - - - cmd.send_apdu(SIGN_FIRST) - - with cmd.send_apdu_context(SIGN_MORE, result) as ex: - pass - - assert error.args[0] == '0x6a80' - - -def test_transfer_erc1155_without_set_plugin(cmd): - result: list = [] - - if cmd.model == "nanox" or cmd.model == "nanosp": - with pytest.raises(ethereum_client.exception.errors.DenyError) as error: - - cmd.provide_nft_information(plugin=PROVIDE_NFT_INFORMATION) - - cmd.send_apdu(SIGN_FIRST) - - with cmd.send_apdu_context(SIGN_MORE, result) as ex: - pass - - assert error.args[0] == '0x6985' - - -# =========================== -# Batch -# =========================== - -SIGN_FIRST_BATCH = bytes.fromhex("e004000096058000002c8000003c800000000000000000000000f9020b0e850d8cfd86008301617d94495f947276749ce646f68ac8c248420045cb7b5e80b901e42eb2c2d60000000000000000000000006cbcd73cd8e8a42844662f0a0e76d7f79afd933d000000000000000000000000c2907efcce4011c491bbeda8a0fa63ba7aab596c00000000000000000000000000000000000000000000") -SIGN_MORE_1_BATCH = bytes.fromhex("e004800096000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000003abf06640f8ca8fc5e0ed471b10befcdf65a33e430000000000006a0000000064def9d99ff495856496c028c0") -SIGN_MORE_2_BATCH = bytes.fromhex("e00480009689732473fcd0bbbe000000000000a30000000001abf06640f8ca8fc5e0ed471b10befcdf65a33e430000000000006a00000000640000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000010000") -SIGN_MORE_3_BATCH = bytes.fromhex("e00480006100000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043078303000000000000000000000000000000000000000000000000000000000018080") - -PLUGIN_BATCH = Plugin( - type=1, - version=1, - name="ERC1155", - addr="0x495f947276749ce646f68ac8c248420045cb7b5e", - selector=0x2eb2c2d6, - chainID=1, - keyID=0, - algorithm=1, - sign="304502210087b35cefc53fd94e25404933eb0d5ff08f20ba655d181de3b24ff0099dc3317f02204a216aa9e0b84bef6e20fcb036bd49647bf0cab66732b99b49ec277ffb682aa1", -) - -PROVIDE_NFT_INFORMATION_BATCH = Plugin( - type=1, - version=1, - name="OpenSea Shared Storefront", - addr="0x495f947276749ce646f68ac8c248420045cb7b5e", - chainID=1, - keyID=0, - algorithm=1, - sign="3045022100c74cd613a27a9f4887210f5a3a0e12745e1ba0ab3a0d284cb6485d89c3cce4e602205a13e62a91164985cf58a838f8f531c0b91b980d206a5ba8df28270023ef93a3", -) - -def test_transfer_batch_erc1155(cmd): - result: list = [] - - if cmd.model == "nanox" or cmd.model == "nanosp": - cmd.set_plugin(plugin=PLUGIN_BATCH) - cmd.provide_nft_information(plugin=PROVIDE_NFT_INFORMATION_BATCH) - - cmd.send_apdu(SIGN_FIRST_BATCH) - cmd.send_apdu(SIGN_MORE_1_BATCH) - cmd.send_apdu(SIGN_MORE_2_BATCH) - - with cmd.send_apdu_context(SIGN_MORE_3_BATCH, result) as ex: - sleep(0.5) - # Review transaction - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/test_transfer_batch_erc1155/00000.png") - cmd.client.press_and_release('right') - - # NFT Batch Transfer - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/test_transfer_batch_erc1155/00001.png") - cmd.client.press_and_release('right') - - # To - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/test_transfer_batch_erc1155/00002.png") - cmd.client.press_and_release('right') - - # Collection Name - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/test_transfer_batch_erc1155/00003.png") - cmd.client.press_and_release('right') - - # NFT Address - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/test_transfer_batch_erc1155/00004.png") - cmd.client.press_and_release('right') - - # Total Quantity - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/test_transfer_batch_erc1155/00005.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/test_transfer_batch_erc1155/00006.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/erc1155/{PATH_IMG[cmd.model]}/test_transfer_batch_erc1155/00007.png") - cmd.client.press_and_release('both') - - response: bytes = result[0] - v, r, s = parse_sign_response(response) - - assert v == 0x25 # 37 - assert r.hex() == "ee17b599747775a5056c6f654b476bdec0f3fea2c03a4754a31f736e61015082" - assert s.hex() == "3d76f264da438a5bda69389e59c08216e98ddb6649323bd5055980ae31f79c1c" diff --git a/tests/speculos/test_erc20information.py b/tests/speculos/test_erc20information.py deleted file mode 100644 index 9af2c7b..0000000 --- a/tests/speculos/test_erc20information.py +++ /dev/null @@ -1,31 +0,0 @@ -import pytest -from ethereum_client.plugin import ERC20Information -import ethereum_client - -def test_provide_erc20_token(cmd): - erc20_info = ERC20Information( - erc20_ticker="5a5258", - addr="0xe41d2489571d322189246dafa5ebde1f4699f498", - nb_decimals=18, - chainID=1, - sign="304402200ae8634c22762a8ba41d2acb1e068dcce947337c6dd984f13b820d396176952302203306a49d8a6c35b11a61088e1570b3928ca3a0db6bd36f577b5ef87628561ff7" - ) - - # Test if return 9000 - try: - cmd.provide_erc20_token_information(info=erc20_info) - except: - raise - -def test_provide_erc20_token_error(cmd): - erc20_info = ERC20Information( - erc20_ticker="5a5258", - addr="0xe41d2489571d322189246dafa5ebde1f4699f498", - nb_decimals=18, - chainID=1, - sign="deadbeef" - ) - - with pytest.raises(ethereum_client.exception.errors.UnknownDeviceError) as error: - cmd.provide_erc20_token_information(info=erc20_info) - assert error.args[0] == '0x6a80' \ No newline at end of file diff --git a/tests/speculos/test_erc721.py b/tests/speculos/test_erc721.py deleted file mode 100644 index 8652501..0000000 --- a/tests/speculos/test_erc721.py +++ /dev/null @@ -1,115 +0,0 @@ -from time import sleep - -import pytest - -import ethereum_client -from ethereum_client.utils import compare_screenshot, save_screenshot, PATH_IMG, parse_sign_response -from ethereum_client.plugin import Plugin - -SIGN_FIRST = bytes.fromhex("e004000096058000002c8000003c800000000000000000000000f88a0a852c3ce1ec008301f5679460f80121c31a0d46b5279700f9df786054aa5ee580b86442842e0e0000000000000000000000006cbcd73cd8e8a42844662f0a0e76d7f79afd933d000000000000000000000000c2907efcce4011c491bbeda8a0fa63ba7aab596c000000000000000000000000000000000000000000000000") -SIGN_MORE = bytes.fromhex("e00480000b0000000000112999018080") - -PLUGIN = Plugin( - type=1, - version=1, - name="ERC721", - addr="0x60f80121c31a0d46b5279700f9df786054aa5ee5", - selector=0x42842e0e, - chainID=1, - keyID=0, - algorithm=1, - sign="304502202e2282d7d3ea714da283010f517af469e1d59654aaee0fc438f017aa557eaea50221008b369679381065bbe01135723a4f9adb229295017d37c4d30138b90a51cf6ab6", -) - -PROVIDE_NFT_INFORMATION = Plugin( - type=1, - version=1, - name="Rarible", - addr="0x60f80121c31a0d46b5279700f9df786054aa5ee5", - chainID=1, - keyID=0, - algorithm=1, - sign="3045022025696986ef5f0ee2f72d9c6e41d7e2bf2e4f06373ab26d73ebe326c7fd4c7a6602210084f6b064d8750ae68ed5dd012296f37030390ec06ff534c5da6f0f4a4460af33", -) - -def test_transfer_erc721(cmd): - result: list = [] - - if cmd.model == "nanox" or cmd.model == "nanosp": - cmd.set_plugin(plugin=PLUGIN) - cmd.provide_nft_information(plugin=PROVIDE_NFT_INFORMATION) - - cmd.send_apdu(SIGN_FIRST) - - with cmd.send_apdu_context(SIGN_MORE, result) as ex: - sleep(0.5) - # Review transaction - compare_screenshot(cmd, f"screenshots/erc721/{PATH_IMG[cmd.model]}/transfer_erc721/00000.png") - cmd.client.press_and_release('right') - - # NFT Transfer - compare_screenshot(cmd, f"screenshots/erc721/{PATH_IMG[cmd.model]}/transfer_erc721/00001.png") - cmd.client.press_and_release('right') - - # To - compare_screenshot(cmd, f"screenshots/erc721/{PATH_IMG[cmd.model]}/transfer_erc721/00002.png") - cmd.client.press_and_release('right') - - # Collection Name - compare_screenshot(cmd, f"screenshots/erc721/{PATH_IMG[cmd.model]}/transfer_erc721/00003.png") - cmd.client.press_and_release('right') - - # NFT Address - compare_screenshot(cmd, f"screenshots/erc721/{PATH_IMG[cmd.model]}/transfer_erc721/00004.png") - cmd.client.press_and_release('right') - - # NFT ID - compare_screenshot(cmd, f"screenshots/erc721/{PATH_IMG[cmd.model]}/transfer_erc721/00005.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/erc721/{PATH_IMG[cmd.model]}/transfer_erc721/00006.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/erc721/{PATH_IMG[cmd.model]}/transfer_erc721/00007.png") - cmd.client.press_and_release('both') - - response: bytes = result[0] - v, r, s = parse_sign_response(response) - - assert v == 0x25 # 37 - assert r.hex() == "68ba082523584adbfc31d36d68b51d6f209ce0838215026bf1802a8f17dcdff4" - assert s.hex() == "7c92908fa05c8bc86507a3d6a1c8b3c2722ee01c836d89a61df60c1ab0b43fff" - - -def test_transfer_erc721_without_nft_provide_info(cmd): - result: list = [] - - if cmd.model == "nanox" or cmd.model == "nanosp": - with pytest.raises(ethereum_client.exception.errors.UnknownDeviceError) as error: - - cmd.set_plugin(plugin=PLUGIN) - - cmd.send_apdu(SIGN_FIRST) - - with cmd.send_apdu_context(SIGN_MORE, result) as ex: - pass - - assert error.args[0] == '0x6a80' - - - -def test_transfer_erc721_without_set_plugin(cmd): - result: list = [] - - if cmd.model == "nanox" or cmd.model == "nanosp": - with pytest.raises(ethereum_client.exception.errors.DenyError) as error: - cmd.provide_nft_information(plugin=PROVIDE_NFT_INFORMATION) - - cmd.send_apdu(SIGN_FIRST) - - with cmd.send_apdu_context(SIGN_MORE, result) as ex: - pass - - assert error.args[0] == '0x6985' \ No newline at end of file diff --git a/tests/speculos/test_pubkey_cmd.py b/tests/speculos/test_pubkey_cmd.py deleted file mode 100644 index 17f1d78..0000000 --- a/tests/speculos/test_pubkey_cmd.py +++ /dev/null @@ -1,117 +0,0 @@ -from time import sleep - -import pytest - -import ethereum_client -from ethereum_client.utils import compare_screenshot, save_screenshot, PATH_IMG - - -def test_get_public_key(cmd): - # ETHER COIN without display - result: list = [] - with cmd.get_public_key(bip32_path="44'/60'/1'/0/0", display=False, result=result) as exchange: - pass - - uncompressed_addr_len, eth_addr, chain_code = result - - assert len(uncompressed_addr_len) == 65 - assert len(eth_addr) == 40 - assert len(chain_code) == 32 - - assert uncompressed_addr_len == b'\x04\xea\x02&\x91\xc7\x87\x00\xd2\xc3\xa0\xc7E\xbe\xa4\xf2\xb8\xe5\xe3\x13\x97j\x10B\xf6\xa1Vc\\\xb2\x05\xda\x1a\xcb\xfe\x04*\nZ\x89eyn6"E\x89\x0eT\xbd-\xbex\xec\x1e\x18df\xf2\xe9\xd0\xf5\xd5\xd8\xdf' - assert eth_addr == b'463e4e114AA57F54f2Fd2C3ec03572C6f75d84C2' - assert chain_code == b'\xaf\x89\xcd)\xea${8I\xec\xc80\xc2\xc8\x94\\e1\xd6P\x87\x07?\x9f\xd09\x00\xa0\xea\xa7\x96\xc8' - - # DAI COIN with display - result: list = [] - with cmd.get_public_key(bip32_path="44'/700'/1'/0/0", display=True, result=result) as exchange: - sleep(0.5) - - if cmd.model == "nanos": - # Verify address - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/get_public_key/00000.png") - cmd.client.press_and_release('right') - - # Address 1/3, 2/3, 3/3 - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/get_public_key/00001.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/get_public_key/00002.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/get_public_key/00003.png") - cmd.client.press_and_release('right') - - # Approved - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/get_public_key/00004.png") - cmd.client.press_and_release('both') - - if cmd.model == "nanox" or cmd.model == "nanosp": - # Verify address - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/get_public_key/00000.png") - cmd.client.press_and_release('right') - - # Address - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/get_public_key/00001.png") - cmd.client.press_and_release('right') - - # Approve - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/get_public_key/00002.png") - cmd.client.press_and_release('both') - - uncompressed_addr_len, eth_addr, chain_code = result - assert len(uncompressed_addr_len) == 65 - assert len(eth_addr) == 40 - assert len(chain_code) == 32 - - assert uncompressed_addr_len == b'\x04V\x8a\x15\xdc\xed\xc8[\x16\x17\x8d\xaf\xcax\x91v~{\x9c\x06\xba\xaa\xde\xf4\xe7\x9f\x86\x1d~\xed)\xdc\n8\x9c\x84\xf01@E\x13]\xd7~6\x8e\x8e\xabb-\xad\xcdo\xc3Fw\xb7\xc8y\xdbQ/\xc3\xe5\x18' - assert eth_addr == b'Ba9A9aED0a1AbBE1da1155F64e73e57Af7995880' - assert chain_code == b'4\xaa\x95\xf4\x02\x12\x12-T\x155\x86\xed\xc5\x0b\x1d8\x81\xae\xce\xbd\x1a\xbbv\x9a\xc7\xd5\x1a\xd0KT\xe4' - - -def test_reject_get_public_key(cmd): - # DAI COIN with display - result: list = [] - - with pytest.raises(ethereum_client.exception.errors.DenyError) as error: - - with cmd.get_public_key(bip32_path="44'/700'/1'/0/0", display=True, result=result) as exchange: - sleep(0.5) - - if cmd.model == "nanos": - # Verify address - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/reject_get_public_key/00000.png") - cmd.client.press_and_release('right') - - # Address 1/3, 2/3, 3/3 - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/reject_get_public_key/00001.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/reject_get_public_key/00002.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/reject_get_public_key/00003.png") - cmd.client.press_and_release('right') - - # Approve - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/reject_get_public_key/00004.png") - cmd.client.press_and_release('right') - - # Reject - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/reject_get_public_key/00005.png") - cmd.client.press_and_release('both') - - if cmd.model == "nanox" or cmd.model == "nanosp": - # Verify address - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/reject_get_public_key/00000.png") - cmd.client.press_and_release('right') - - # Address - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/reject_get_public_key/00001.png") - cmd.client.press_and_release('right') - - # Approve - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/reject_get_public_key/00002.png") - cmd.client.press_and_release('right') - - # Reject - compare_screenshot(cmd, f"screenshots/pubkey/{PATH_IMG[cmd.model]}/reject_get_public_key/00003.png") - cmd.client.press_and_release('both') - - assert error.args[0] == '0x6985' diff --git a/tests/speculos/test_sign_cmd.py b/tests/speculos/test_sign_cmd.py deleted file mode 100644 index 90879ac..0000000 --- a/tests/speculos/test_sign_cmd.py +++ /dev/null @@ -1,620 +0,0 @@ -from time import sleep - -import pytest - -import ethereum_client -from ethereum_client.utils import compare_screenshot, compare_screenshot, save_screenshot, PATH_IMG -from ethereum_client.transaction import Transaction - - -# https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md - -def test_sign_simple(cmd): - result: list = [] - - # Ether coin type - bip32_path="44'/60'/1'/0/0" - - transaction = Transaction( - txType=0xEB, - nonce=68, - gasPrice=0x0306dc4200, - gasLimit=0x5208, - to="0x5a321744667052affa8386ed49e00ef223cbffc3", - value=0x6f9c9e7bf61818, - chainID=1, - ) - - with cmd.simple_sign_tx(bip32_path=bip32_path, transaction=transaction, result=result) as ex: - sleep(0.5) - - if cmd.model == "nanos": - # Review transaction - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/simple/00000.png") - cmd.client.press_and_release('right') - - # Amount 1/3, 2/3, 3/3 - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/simple/00001.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/simple/00002.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/simple/00003.png") - cmd.client.press_and_release('right') - - # Address 1/3, 2/3, 3/3 - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/simple/00004.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/simple/00005.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/simple/00006.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/simple/00007.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/simple/00008.png") - cmd.client.press_and_release('both') - - if cmd.model == "nanox" or cmd.model == "nanosp": - # Review transaction - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/simple/00000.png") - cmd.client.press_and_release('right') - - # Amount - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/simple/00001.png") - cmd.client.press_and_release('right') - - # Address - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/simple/00002.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/simple/00003.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/simple/00004.png") - cmd.client.press_and_release('both') - - v, r, s = result - - assert v == 0x26 # 38 - assert r.hex() == "6f389d15320f0501383526ed03de917c14212716f09a262dbc98431086a5db49" - assert s.hex() == "0dc994b7b97230bb35fdf6fec2f4d8ff4cfb8bfeb2a652c364c738ff033c05dd" - - -def test_sign_reject(cmd): - result: list = [] - - # Ether coin type - bip32_path="44'/60'/1'/0/0" - - transaction = Transaction( - txType=0xEB, - nonce=0, - gasPrice=0x0306dc4200, - gasLimit=0x5208, - to="0x5a321744667052affa8386ed49e00ef223cbffc3", - value=0x6f9c9e7bf61818, - chainID=1, - ) - - with pytest.raises(ethereum_client.exception.errors.DenyError) as error: - - with cmd.simple_sign_tx(bip32_path=bip32_path, transaction=transaction, result=result) as ex: - sleep(0.5) - - if cmd.model == "nanos": - # Review transaction - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/reject/00000.png") - cmd.client.press_and_release('right') - - # Amount 1/3, 2/3, 3/3 - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/reject/00001.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/reject/00002.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/reject/00003.png") - cmd.client.press_and_release('right') - - # Address 1/3, 2/3, 3/3 - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/reject/00004.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/reject/00005.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/reject/00006.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/reject/00007.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/reject/00008.png") - cmd.client.press_and_release('right') - - # Reject - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/reject/00009.png") - cmd.client.press_and_release('both') - - if cmd.model == "nanox" or cmd.model == "nanosp": - # Review transaction - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/reject/00000.png") - cmd.client.press_and_release('right') - - # Amount - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/reject/00001.png") - cmd.client.press_and_release('right') - - # Address - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/reject/00002.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/reject/00003.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/reject/00004.png") - cmd.client.press_and_release('right') - - # Reject - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/reject/00005.png") - cmd.client.press_and_release('both') - - assert error.args[0] == '0x6985' - - -def test_sign_limit_nonce(cmd): - result: list = [] - - # Ether coin type - bip32_path="44'/60'/1'/0/0" - - # EIP-2681: Limit account nonce to 2^64-1 - transaction = Transaction( - txType=0xEB, - nonce=2**64-1, - gasPrice=10, - gasLimit=50000, - to="0x5a321744667052affa8386ed49e00ef223cbffc3", - value=0x08762, - chainID=1, - ) - - with cmd.simple_sign_tx(bip32_path=bip32_path, transaction=transaction, result=result) as ex: - sleep(0.5) - - if cmd.model == "nanos": - # Review transaction - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/limit_nonce/00000.png") - cmd.client.press_and_release('right') - - # Amount 1/3, 2/3, 3/3 - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/limit_nonce/00001.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/limit_nonce/00002.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/limit_nonce/00003.png") - cmd.client.press_and_release('right') - - # Address 1/3, 2/3, 3/3 - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/limit_nonce/00004.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/limit_nonce/00005.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/limit_nonce/00006.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/limit_nonce/00007.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/limit_nonce/00008.png") - cmd.client.press_and_release('both') - - if cmd.model == "nanox" or cmd.model == "nanosp": - # Review transaction - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/limit_nonce/00000.png") - cmd.client.press_and_release('right') - - # Amount - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/limit_nonce/00001.png") - cmd.client.press_and_release('right') - - # Address - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/limit_nonce/00002.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/limit_nonce/00003.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/limit_nonce/00004.png") - cmd.client.press_and_release('both') - - v, r, s = result - - assert v == 0x26 # 38 - assert r.hex() == "7f17f9efa5a6065f885a44a5f5d68a62381c6b2b23047817b4569c61ccf571c6" - assert s.hex() == "4b67d37cfe473e0b2daf246fa82c7595bcff0c1515d69089037d0c061f14b3b3" - - -def test_sign_error_transaction_type(cmd): - result: list = [] - - # Ether coin type - bip32_path="44'/60'/1'/0/0" - - # the txType is between 0x00 and 0x7F - transaction = Transaction( - txType=0x00, - nonce=0, - gasPrice=10, - gasLimit=50000, - to="0x5a321744667052affa8386ed49e00ef223cbffc3", - value=0x19, - chainID=1, - ) - - with pytest.raises(ethereum_client.exception.errors.UnknownDeviceError) as error: - - with cmd.simple_sign_tx(bip32_path=bip32_path, transaction=transaction, result=result) as ex: - pass - - assert error.args[0] == '0x6501' - - transaction.txType = 0x7F - with pytest.raises(ethereum_client.exception.errors.UnknownDeviceError) as error: - with cmd.simple_sign_tx(bip32_path=bip32_path, transaction=transaction, result=result) as ex: - pass - - assert error.args[0] == '0x6501' - - -def test_sign_nonce_display(cmd): - # Activate nonce display - # Application is ready - cmd.client.press_and_release('left') - # Quit - cmd.client.press_and_release('left') - # Settings - cmd.client.press_and_release('both') - # Blind signing - cmd.client.press_and_release('right') - # Debug data - cmd.client.press_and_release('right') - # Nonce display - cmd.client.press_and_release('both') - cmd.client.press_and_release('right') - # Back - cmd.client.press_and_release('both') - - result: list = [] - - # Ether coin type - bip32_path="44'/60'/1'/0/0" - - transaction = Transaction( - txType=0xEB, - nonce=68, - gasPrice=0x0306dc4200, - gasLimit=0x5208, - to="0x5a321744667052affa8386ed49e00ef223cbffc3", - value=0x6f9c9e7bf61818, - chainID=1, - ) - - with cmd.simple_sign_tx(bip32_path=bip32_path, transaction=transaction, result=result) as ex: - sleep(0.5) - - if cmd.model == "nanos": - # Review transaction - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/nonce_display/00000.png") - cmd.client.press_and_release('right') - - # Amount 1/3, 2/3, 3/3 - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/nonce_display/00001.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/nonce_display/00002.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/nonce_display/00003.png") - cmd.client.press_and_release('right') - - # Address 1/3, 2/3, 3/3 - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/nonce_display/00004.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/nonce_display/00005.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/nonce_display/00006.png") - cmd.client.press_and_release('right') - - # Nonce - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/nonce_display/00007.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/nonce_display/00008.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/nonce_display/00009.png") - cmd.client.press_and_release('both') - - if cmd.model == "nanox" or cmd.model == "nanosp": - # Review transaction - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/nonce_display/00000.png") - cmd.client.press_and_release('right') - - # Amount - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/nonce_display/00001.png") - cmd.client.press_and_release('right') - - # Address - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/nonce_display/00002.png") - cmd.client.press_and_release('right') - - # Nonce - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/nonce_display/00003.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/nonce_display/00004.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/nonce_display/00005.png") - cmd.client.press_and_release('both') - - v, r, s = result - - assert v == 0x26 # 38 - assert r.hex() == "6f389d15320f0501383526ed03de917c14212716f09a262dbc98431086a5db49" - assert s.hex() == "0dc994b7b97230bb35fdf6fec2f4d8ff4cfb8bfeb2a652c364c738ff033c05dd" - - -def test_sign_blind_simple(cmd): - # Activate blind signing - # Application is ready - cmd.client.press_and_release('left') - # Quit - cmd.client.press_and_release('left') - # Settings - cmd.client.press_and_release('both') - # Blind signing - cmd.client.press_and_release('both') - cmd.client.press_and_release('right') - # Debug data - cmd.client.press_and_release('right') - # Nonce display - cmd.client.press_and_release('right') - # Back - cmd.client.press_and_release('both') - - result: list = [] - - # Ether coin type - bip32_path="44'/60'/1'/0/0" - - transaction = Transaction( - txType=0xEB, - nonce=68, - gasPrice=0x0306dc4200, - gasLimit=0x5208, - to="0x5a321744667052affa8386ed49e00ef223cbffc3", - value=0x6f9c9e7bf61818, - chainID=1, - data="ok", - ) - - with cmd.simple_sign_tx(bip32_path=bip32_path, transaction=transaction, result=result) as ex: - sleep(0.5) - - if cmd.model == "nanos": - # Review transaction - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_simple/00000.png") - cmd.client.press_and_release('right') - - # Blind Signing - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_simple/00001.png") - cmd.client.press_and_release('right') - - # Amount 1/3, 2/3, 3/3 - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_simple/00002.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_simple/00003.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_simple/00004.png") - cmd.client.press_and_release('right') - - # Address 1/3, 2/3, 3/3 - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_simple/00005.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_simple/00006.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_simple/00007.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_simple/00008.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_simple/00009.png") - cmd.client.press_and_release('both') - - if cmd.model == "nanox" or cmd.model == "nanosp": - # Review transaction - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_simple/00000.png") - cmd.client.press_and_release('right') - - # Blind Signing - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_simple/00001.png") - cmd.client.press_and_release('right') - - # Amount - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_simple/00002.png") - cmd.client.press_and_release('right') - - # Address - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_simple/00003.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_simple/00004.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_simple/00005.png") - cmd.client.press_and_release('both') - - v, r, s = result - - assert v == 0x26 # 38 - assert r.hex() == "98163696ad14f54e0e7207306b6f66665131cee601052facab8fd24250e15470" - assert s.hex() == "318e573fc809f7dcb8f9718c8bd2946b2c3c83cedf3720e66e06fb63ceea3174" - - -def test_sign_blind_error_disabled(cmd): - result: list = [] - - # Ether coin type - bip32_path="44'/60'/1'/0/0" - - transaction = Transaction( - txType=0xEB, - nonce=68, - gasPrice=0x0306dc4200, - gasLimit=0x5208, - to="0x5a321744667052affa8386ed49e00ef223cbffc3", - value=0x6f9c9e7bf61818, - chainID=1, - data="ok", - ) - - with pytest.raises(ethereum_client.exception.errors.UnknownDeviceError) as error: - - with cmd.simple_sign_tx(bip32_path=bip32_path, transaction=transaction, result=result) as ex: - sleep(0.5) - - if cmd.model == "nanos": - pass - if cmd.model == "nanox" or cmd.model == "nanosp": - pass - - assert error.args[0] == '0x6a80' - - -def test_sign_blind_and_nonce_display(cmd): - # Activate blind signing - # Application is ready - cmd.client.press_and_release('left') - # Quit - cmd.client.press_and_release('left') - # Settings - cmd.client.press_and_release('both') - # Blind signing - cmd.client.press_and_release('both') - cmd.client.press_and_release('right') - # Debug data - cmd.client.press_and_release('right') - # Nonce display - cmd.client.press_and_release('both') - cmd.client.press_and_release('right') - # Back - cmd.client.press_and_release('both') - - result: list = [] - - # Ether coin type - bip32_path="44'/60'/1'/0/0" - - transaction = Transaction( - txType=0xEB, - nonce=1844674, - gasPrice=0x0306dc4200, - gasLimit=0x5208, - to="0x5a321744667052affa8386ed49e00ef223cbffc3", - value=0x6f9c9e7bf61818, - chainID=1, - data="That's a little message :)", - ) - - with cmd.simple_sign_tx(bip32_path=bip32_path, transaction=transaction, result=result) as ex: - sleep(0.5) - - if cmd.model == "nanos": - # Review transaction - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00000.png") - cmd.client.press_and_release('right') - - # Blind Signing - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00001.png") - cmd.client.press_and_release('right') - - # Amount 1/3, 2/3, 3/3 - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00002.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00003.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00004.png") - cmd.client.press_and_release('right') - - # Address 1/3, 2/3, 3/3 - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00005.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00006.png") - cmd.client.press_and_release('right') - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00007.png") - cmd.client.press_and_release('right') - - # Nonce - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00008.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00009.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00010.png") - cmd.client.press_and_release('both') - - if cmd.model == "nanox" or cmd.model == "nanosp": - # Review transaction - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00000.png") - cmd.client.press_and_release('right') - - # Blind Signing - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00001.png") - cmd.client.press_and_release('right') - - # Amount - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00002.png") - cmd.client.press_and_release('right') - - # Address - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00003.png") - cmd.client.press_and_release('right') - - # Nonce - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00004.png") - cmd.client.press_and_release('right') - - # Max Fees - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00005.png") - cmd.client.press_and_release('right') - - # Accept and send - compare_screenshot(cmd, f"screenshots/sign/{PATH_IMG[cmd.model]}/blind_and_nonce_display/00006.png") - cmd.client.press_and_release('both') - - v, r, s = result - - assert v == 0x26 # 38 - assert r.hex() == "c8d7cd5c1711ea1af7da048d15d1a95fc9347d4622afa11f32320d73384984d1" - assert s.hex() == "3165ca0a27f565e1a87560ed3d3a144c4ac9732370428da5e6952e93659f6ac2" diff --git a/tests/unit/.gitignore b/tests/unit/.gitignore index 2cbee4e..c77e954 100644 --- a/tests/unit/.gitignore +++ b/tests/unit/.gitignore @@ -19,4 +19,4 @@ build/ # Coverage file coverage.info -coverage \ No newline at end of file +coverage diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt index 93605b2..305b13b 100644 --- a/tests/unit/CMakeLists.txt +++ b/tests/unit/CMakeLists.txt @@ -52,7 +52,6 @@ FetchContent_MakeAvailable(cmocka) add_compile_definitions(TEST DEBUG=0 SKIP_FOR_CMOCKA) include_directories(../../src/) -include_directories(../../src_common) # add cmocka tests add_executable(test_demo tests/demo.c) @@ -62,4 +61,4 @@ add_library(demo SHARED ./demo_tu.c) target_link_libraries(test_demo PUBLIC cmocka gcov demo) -add_test(test_demo test_demo) \ No newline at end of file +add_test(test_demo test_demo) diff --git a/tests/unit/Makefile b/tests/unit/Makefile index 71d8a14..73f39e4 100644 --- a/tests/unit/Makefile +++ b/tests/unit/Makefile @@ -27,7 +27,7 @@ coverage: all @lcov --directory . -b "${BUILD_DIRECTORY}" --capture --initial -o coverage.base @lcov --rc lcov_branch_coverage=1 --directory . -b "${BUILD_DIRECTORY}" --capture -o coverage.capture @lcov --directory . -b "${BUILD_DIRECTORY}" --add-tracefile coverage.base --add-tracefile coverage.capture -o coverage.info - @lcov --directory . -b "${BUILD_DIRECTORY}" --remove coverage.info '*/unit-tests/*' -o coverage.info --remove coverage.info '*/build/_deps/cmocka-src/src/*' + @lcov --directory . -b "${BUILD_DIRECTORY}" --remove coverage.info '*/tests/unit/*' -o coverage.info --remove coverage.info '*/build/_deps/cmocka-src/src/*' @$(ECHO) -e "${GREEN}[ OK ]${RESET} Generated 'coverage.info'." @genhtml coverage.info -o coverage @if [ -f coverage.base ]; then $(ECHO) -e "${RED}[ RM ]${RESET}" coverage.base && $(RM) -r coverage.base ; fi; @@ -39,4 +39,4 @@ clean: @if [ -d coverage ]; then $(ECHO) -e "${RED}[ RM ]${RESET}" coverage && $(RM) -r coverage ; fi; @if [ -f coverage.info ]; then $(ECHO) -e "${RED}[ RM ]${RESET}" coverage.info && $(RM) -r coverage.info ; fi; -.PHONY: all coverage clean \ No newline at end of file +.PHONY: all coverage clean diff --git a/tests/unit/README.md b/tests/unit/README.md index 68a98f2..bb2ab7f 100644 --- a/tests/unit/README.md +++ b/tests/unit/README.md @@ -1,7 +1,7 @@ # Unit tests -It is important to unit test your functions. -This also allows you to document how your functions work. +It is important to unit test your functions. +This also allows you to document how your functions work. We use the library [**cmocka**](https://cmocka.org/#features) ## Requirement @@ -9,11 +9,12 @@ We use the library [**cmocka**](https://cmocka.org/#features) - [CMake >= 3.10](https://cmake.org/download/) - [lcov >= 1.14](http://ltp.sourceforge.net/coverage/lcov.php) -Don't worry, you don't necessarily need to install the `cmocka library` because the **cmakelist automatically fetches** the library +Don't worry, you don't necessarily need to install the `cmocka library` +because the **cmakelist automatically fetches** the library ## Add new test -Create new file into `tests` folder and follow [this initiation](https://cmocka.org/talks/cmocka_unit_testing_and_mocking.pdf) +Create new file into `tests` folder and follow [this initiation](https://cmocka.org/talks/cmocka_unit_testing_and_mocking.pdf) Now go to the `CMakeLists.txt` file and add your test with the specific file you want to test. @@ -27,12 +28,15 @@ The `default rules` of makefile will compile the tests and run them. make ``` -The `coverage rule` will launch the default rules and generate the coverage and you will be **automatically redirected** to the generated .html +The `coverage rule` will launch the default rules and generate the coverage +and you will be **automatically redirected** to the generated .html + ```sh make coverage ``` The `clean rule` will delete the folders and files generated + ```sh make clean -``` \ No newline at end of file +``` diff --git a/tests/unit/demo_tu.c b/tests/unit/demo_tu.c index c4f450c..1287e7c 100644 --- a/tests/unit/demo_tu.c +++ b/tests/unit/demo_tu.c @@ -9,4 +9,4 @@ int local_strchr_demo(char *string, char ch) { } } return -1; -} \ No newline at end of file +} diff --git a/tests/unit/tests/demo.c b/tests/unit/tests/demo.c index 1da227d..cdc9d9a 100644 --- a/tests/unit/tests/demo.c +++ b/tests/unit/tests/demo.c @@ -15,4 +15,4 @@ int main(void) { cmocka_unit_test(null_test_success), }; return cmocka_run_group_tests(tests, NULL, NULL); -} \ No newline at end of file +} diff --git a/tests/zemu/.babelrc b/tests/zemu/.babelrc deleted file mode 100644 index 0f36fe6..0000000 --- a/tests/zemu/.babelrc +++ /dev/null @@ -1,18 +0,0 @@ -{ - "plugins": [ - [ - "@babel/plugin-proposal-class-properties" - ] - ], - "presets": [ - [ - "@babel/preset-env", - { - "targets": { - "node": "current" - } - } - ], - "@babel/preset-flow" - ], -} diff --git a/tests/zemu/.flowconfig b/tests/zemu/.flowconfig deleted file mode 100644 index 43c5d12..0000000 --- a/tests/zemu/.flowconfig +++ /dev/null @@ -1,13 +0,0 @@ -[ignore] -/lib - -[include] - -[libs] -flow-typed - -[lints] - -[options] - -[strict] diff --git a/tests/zemu/.gitignore b/tests/zemu/.gitignore deleted file mode 100644 index 826d3f0..0000000 --- a/tests/zemu/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/node_modules -/snapshots-tmp -/elfs -/lib \ No newline at end of file diff --git a/tests/zemu/Makefile b/tests/zemu/Makefile deleted file mode 100644 index 82d7706..0000000 --- a/tests/zemu/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -MAKEFLAGS += --no-print-directory - -all: - ./build_local_test_elfs.sh - yarn install - yarn test - -.PHONY: all \ No newline at end of file diff --git a/tests/zemu/build_local_test_elfs.sh b/tests/zemu/build_local_test_elfs.sh deleted file mode 100755 index c6b0d0e..0000000 --- a/tests/zemu/build_local_test_elfs.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env bash - -set -e - -TESTS_PATH=$(dirname "$(realpath "$0")") - -# FILL THESE WITH YOUR OWN SDKs PATHS -# NANOS_SDK= -# NANOX_SDK= - -# list of apps required by tests that we want to build here -APPS=("ethereum" "ethereum_classic") - -# list of SDKS -NANO_SDKS=("$NANOS_SDK" "$NANOX_SDK") -# list of target elf file name suffix -FILE_SUFFIXES=("nanos" "nanox") - -# move to the tests directory -cd "$TESTS_PATH" || exit 1 - -# Do it only now since before the cd command, we might not have been inside the repository -GIT_REPO_ROOT=$(git rev-parse --show-toplevel) - -# create elfs directory if it doesn't exist -mkdir -p elfs - -# move to repo's root to build apps -cd "$GIT_REPO_ROOT" || exit 1 - -for ((sdk_idx=0; sdk_idx < "${#NANO_SDKS[@]}"; sdk_idx++)) -do - nano_sdk="${NANO_SDKS[$sdk_idx]}" - elf_suffix="${FILE_SUFFIXES[$sdk_idx]}" - echo "* Building elfs for $(basename "$nano_sdk")..." - for appname in "${APPS[@]}" - do - echo "** Building app $appname..." - make clean BOLOS_SDK="$nano_sdk" - make -j DEBUG=1 NFT_TESTING_KEY=1 BOLOS_SDK="$nano_sdk" CHAIN="$appname" - cp bin/app.elf "$TESTS_PATH/elfs/${appname}_${elf_suffix}.elf" - done -done - -echo "done" diff --git a/tests/zemu/globalsetup.js b/tests/zemu/globalsetup.js deleted file mode 100644 index e835233..0000000 --- a/tests/zemu/globalsetup.js +++ /dev/null @@ -1,17 +0,0 @@ -import Zemu from "@zondax/zemu"; -import fsExtra from "fs-extra"; - -const catchExit = async () => { - process.on("SIGINT", () => { - Zemu.stopAllEmuContainers(function () { - process.exit(); - }); - }); -}; - -module.exports = async () => { - await catchExit(); - await Zemu.checkAndPullImage(); - await Zemu.stopAllEmuContainers(); - fsExtra.emptyDirSync("snapshots/tmp") -}; \ No newline at end of file diff --git a/tests/zemu/jest.config.js b/tests/zemu/jest.config.js deleted file mode 100644 index af09403..0000000 --- a/tests/zemu/jest.config.js +++ /dev/null @@ -1,39 +0,0 @@ -// For a detailed explanation regarding each configuration property, visit: -// https://jestjs.io/docs/en/configuration.html - -module.exports = { - modulePaths: ["/src", "/tests"], - - moduleNameMapper: { - "^jest$": "/jest.js", - }, - - // Automatically clear mock calls and instances between every test - clearMocks: true, - - // The directory where Jest should output its coverage files - coverageDirectory: "coverage", - - globalSetup: "/globalsetup.js", - - // A list of paths to directories that Jest should use to search for files in - roots: [""], - - runner: "jest-serial-runner", - - // The test environment that will be used for testing - testEnvironment: "node", - - // The glob patterns Jest uses to detect test files - testMatch: [ - "**/__tests__/**/*.[jt]s?(x)", - "**/?(*.)+(spec|test).[tj]s?(x)", - "**/?(*.)+(ispec|test).[tj]s?(x)", - ], - - // Path of the file where tests can be """decorated""" - setupFilesAfterEnv: ['/setupTests.js'], - - // Stop immediatly when a test fail - bail: true, -}; diff --git a/tests/zemu/jest.js b/tests/zemu/jest.js deleted file mode 100644 index 521ecbe..0000000 --- a/tests/zemu/jest.js +++ /dev/null @@ -1,22 +0,0 @@ -export default jest; -export const { expect, test } = global; - -export const sim_options_s = { - model: "nanos", - logging: true, - start_delay: 2000, - X11: true, - custom: "", -}; - -export const sim_options_x = { - model: "nanox", - logging: true, - start_delay: 2000, - X11: true, - custom: "", -}; - -export const Resolve = require("path").resolve; -export const NANOS_ELF_PATH = Resolve("elfs/ethereum_nanos.elf"); -export const NANOX_ELF_PATH = Resolve("elfs/ethereum_nanox.elf"); \ No newline at end of file diff --git a/tests/zemu/package.json b/tests/zemu/package.json deleted file mode 100644 index ff934a8..0000000 --- a/tests/zemu/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "swap-test", - "version": "1.0.0", - "description": "", - "main": "test.js", - "scripts": { - "build": "babel src/ -d lib/", - "prepublish": "yarn run build", - "test": "jest src --verbose --runInBand --detectOpenHandles" - }, - "author": "", - "license": "ISC", - "dependencies": { - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@ledgerhq/hw-app-eth": "^6.5.0", - "@ledgerhq/hw-transport-http": "^4.74.2", - "@ledgerhq/logs": "^5.50.0", - "@zondax/zemu": "^0.27.4", - "bignumber.js": "^9.0.0", - "bip32-path": "^0.4.2", - "core-js": "^3.7.0", - "ethereum-tx-decoder": "^3.0.0", - "ethers": "^5.5.1", - "fs-extra": "^10.0.0", - "google-protobuf": "^3.11.0", - "jest-serial-runner": "^1.1.0", - "js-sha256": "^0.9.0", - "regenerator-runtime": "^0.13.7", - "secp256k1": "^3.7.1" - }, - "devDependencies": { - "@babel/cli": "^7.7.0", - "@babel/core": "^7.7.2", - "@babel/preset-env": "^7.7.1", - "@babel/preset-flow": "^7.0.0", - "@babel/preset-stage-0": "^7.0.0", - "@babel/register": "^7.7.0", - "flow-bin": "^0.112.0", - "jest": "^26.6.3" - } -} diff --git a/tests/zemu/setupTests.js b/tests/zemu/setupTests.js deleted file mode 100644 index cbd0230..0000000 --- a/tests/zemu/setupTests.js +++ /dev/null @@ -1,19 +0,0 @@ -import expect from 'expect' - -expect.extend({ - toMatchSnapshot(received, original) { - - if(received.data.equals(original.data)){ - return { - message: () => `snapshots are equal`, - pass: true - } - } else { - console.log("snapshots are not equal") - return { - message: () => `snapshots are not equal`, - pass: false - } - } - }, - }); \ No newline at end of file diff --git a/tests/zemu/snapshots/nanos_approve_dai_tokens/00001.png b/tests/zemu/snapshots/nanos_approve_dai_tokens/00001.png deleted file mode 100644 index e48314b..0000000 Binary files a/tests/zemu/snapshots/nanos_approve_dai_tokens/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_approve_dai_tokens/00002.png b/tests/zemu/snapshots/nanos_approve_dai_tokens/00002.png deleted file mode 100644 index 8afcc01..0000000 Binary files a/tests/zemu/snapshots/nanos_approve_dai_tokens/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_approve_dai_tokens/00003.png b/tests/zemu/snapshots/nanos_approve_dai_tokens/00003.png deleted file mode 100644 index 95968f9..0000000 Binary files a/tests/zemu/snapshots/nanos_approve_dai_tokens/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_approve_dai_tokens/00004.png b/tests/zemu/snapshots/nanos_approve_dai_tokens/00004.png deleted file mode 100644 index f5c1c9b..0000000 Binary files a/tests/zemu/snapshots/nanos_approve_dai_tokens/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_approve_dai_tokens/00005.png b/tests/zemu/snapshots/nanos_approve_dai_tokens/00005.png deleted file mode 100644 index 839e83a..0000000 Binary files a/tests/zemu/snapshots/nanos_approve_dai_tokens/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_approve_dai_tokens/00006.png b/tests/zemu/snapshots/nanos_approve_dai_tokens/00006.png deleted file mode 100644 index aca9efb..0000000 Binary files a/tests/zemu/snapshots/nanos_approve_dai_tokens/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_approve_dai_tokens/00007.png b/tests/zemu/snapshots/nanos_approve_dai_tokens/00007.png deleted file mode 100644 index 1c9156c..0000000 Binary files a/tests/zemu/snapshots/nanos_approve_dai_tokens/00007.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_approve_dai_tokens/00008.png b/tests/zemu/snapshots/nanos_approve_dai_tokens/00008.png deleted file mode 100644 index 9c7e704..0000000 Binary files a/tests/zemu/snapshots/nanos_approve_dai_tokens/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_approve_dai_tokens/00009.png b/tests/zemu/snapshots/nanos_approve_dai_tokens/00009.png deleted file mode 120000 index 10266b3..0000000 --- a/tests/zemu/snapshots/nanos_approve_dai_tokens/00009.png +++ /dev/null @@ -1 +0,0 @@ -00007.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00001.png b/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00001.png deleted file mode 100644 index b2ab371..0000000 Binary files a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00002.png b/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00002.png deleted file mode 100644 index a4fd0e1..0000000 Binary files a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00003.png b/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00003.png deleted file mode 100644 index da34391..0000000 Binary files a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00004.png b/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00004.png deleted file mode 100644 index be3c17e..0000000 Binary files a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00005.png b/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00005.png deleted file mode 100644 index 08c6b00..0000000 Binary files a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00006.png b/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00006.png deleted file mode 100644 index 1d461c6..0000000 Binary files a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00007.png b/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00007.png deleted file mode 100644 index 1c9156c..0000000 Binary files a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00007.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00008.png b/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00008.png deleted file mode 100644 index 9c7e704..0000000 Binary files a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00009.png b/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00009.png deleted file mode 120000 index 10266b3..0000000 --- a/tests/zemu/snapshots/nanos_deposit_eth_compound_blind/00009.png +++ /dev/null @@ -1 +0,0 @@ -00007.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanos_disable_blind_signing/00000.png b/tests/zemu/snapshots/nanos_disable_blind_signing/00000.png deleted file mode 100644 index 0bef4f3..0000000 Binary files a/tests/zemu/snapshots/nanos_disable_blind_signing/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_disable_blind_signing/00001.png b/tests/zemu/snapshots/nanos_disable_blind_signing/00001.png deleted file mode 100644 index 29a6bd3..0000000 Binary files a/tests/zemu/snapshots/nanos_disable_blind_signing/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_disable_blind_signing/00002.png b/tests/zemu/snapshots/nanos_disable_blind_signing/00002.png deleted file mode 100644 index d4bd8ad..0000000 Binary files a/tests/zemu/snapshots/nanos_disable_blind_signing/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_disable_blind_signing/00003.png b/tests/zemu/snapshots/nanos_disable_blind_signing/00003.png deleted file mode 100644 index 7b3e0ea..0000000 Binary files a/tests/zemu/snapshots/nanos_disable_blind_signing/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_disable_blind_signing/00004.png b/tests/zemu/snapshots/nanos_disable_blind_signing/00004.png deleted file mode 100644 index e4ad84f..0000000 Binary files a/tests/zemu/snapshots/nanos_disable_blind_signing/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_disable_blind_signing/00005.png b/tests/zemu/snapshots/nanos_disable_blind_signing/00005.png deleted file mode 100644 index 28e70e8..0000000 Binary files a/tests/zemu/snapshots/nanos_disable_blind_signing/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_disable_blind_signing/00006.png b/tests/zemu/snapshots/nanos_disable_blind_signing/00006.png deleted file mode 100644 index c844a37..0000000 Binary files a/tests/zemu/snapshots/nanos_disable_blind_signing/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_disable_blind_signing/00007.png b/tests/zemu/snapshots/nanos_disable_blind_signing/00007.png deleted file mode 100644 index be02838..0000000 Binary files a/tests/zemu/snapshots/nanos_disable_blind_signing/00007.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_disable_blind_signing/00008.png b/tests/zemu/snapshots/nanos_disable_blind_signing/00008.png deleted file mode 100644 index 0bef4f3..0000000 Binary files a/tests/zemu/snapshots/nanos_disable_blind_signing/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_metamask/00000.png b/tests/zemu/snapshots/nanos_eip191_metamask/00000.png deleted file mode 100644 index ab16f62..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_metamask/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_metamask/00001.png b/tests/zemu/snapshots/nanos_eip191_metamask/00001.png deleted file mode 100644 index b90315c..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_metamask/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_metamask/00002.png b/tests/zemu/snapshots/nanos_eip191_metamask/00002.png deleted file mode 100644 index 3d90dfd..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_metamask/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_metamask/00003.png b/tests/zemu/snapshots/nanos_eip191_metamask/00003.png deleted file mode 100644 index f5c2d67..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_metamask/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_metamask/00004.png b/tests/zemu/snapshots/nanos_eip191_metamask/00004.png deleted file mode 100644 index d55782f..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_metamask/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_metamask/00005.png b/tests/zemu/snapshots/nanos_eip191_metamask/00005.png deleted file mode 100644 index f5c2d67..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_metamask/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_nonascii/00000.png b/tests/zemu/snapshots/nanos_eip191_nonascii/00000.png deleted file mode 100644 index ab16f62..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_nonascii/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_nonascii/00001.png b/tests/zemu/snapshots/nanos_eip191_nonascii/00001.png deleted file mode 100644 index 51efae0..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_nonascii/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_nonascii/00002.png b/tests/zemu/snapshots/nanos_eip191_nonascii/00002.png deleted file mode 100644 index b4e4df5..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_nonascii/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_nonascii/00003.png b/tests/zemu/snapshots/nanos_eip191_nonascii/00003.png deleted file mode 100644 index d95e831..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_nonascii/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_nonascii/00004.png b/tests/zemu/snapshots/nanos_eip191_nonascii/00004.png deleted file mode 100644 index e8c4c8e..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_nonascii/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_nonascii/00005.png b/tests/zemu/snapshots/nanos_eip191_nonascii/00005.png deleted file mode 100644 index a259c69..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_nonascii/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_nonascii/00006.png b/tests/zemu/snapshots/nanos_eip191_nonascii/00006.png deleted file mode 100644 index 4ce22f6..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_nonascii/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_nonascii/00007.png b/tests/zemu/snapshots/nanos_eip191_nonascii/00007.png deleted file mode 100644 index f5c2d67..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_nonascii/00007.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_nonascii/00008.png b/tests/zemu/snapshots/nanos_eip191_nonascii/00008.png deleted file mode 100644 index d55782f..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_nonascii/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_nonascii/00009.png b/tests/zemu/snapshots/nanos_eip191_nonascii/00009.png deleted file mode 100644 index f5c2d67..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_nonascii/00009.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00000.png b/tests/zemu/snapshots/nanos_eip191_opensea/00000.png deleted file mode 100644 index ab16f62..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_opensea/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00001.png b/tests/zemu/snapshots/nanos_eip191_opensea/00001.png deleted file mode 100644 index bdbb3a0..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_opensea/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00002.png b/tests/zemu/snapshots/nanos_eip191_opensea/00002.png deleted file mode 100644 index 1fd8170..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_opensea/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00003.png b/tests/zemu/snapshots/nanos_eip191_opensea/00003.png deleted file mode 100644 index 582648d..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_opensea/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00004.png b/tests/zemu/snapshots/nanos_eip191_opensea/00004.png deleted file mode 100644 index 53e1317..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_opensea/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00005.png b/tests/zemu/snapshots/nanos_eip191_opensea/00005.png deleted file mode 100644 index b1bddfe..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_opensea/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00006.png b/tests/zemu/snapshots/nanos_eip191_opensea/00006.png deleted file mode 100644 index f872acc..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_opensea/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00007.png b/tests/zemu/snapshots/nanos_eip191_opensea/00007.png deleted file mode 100644 index 56b7f7b..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_opensea/00007.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00008.png b/tests/zemu/snapshots/nanos_eip191_opensea/00008.png deleted file mode 100644 index d5c4fde..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_opensea/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00009.png b/tests/zemu/snapshots/nanos_eip191_opensea/00009.png deleted file mode 100644 index 407da90..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_opensea/00009.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00010.png b/tests/zemu/snapshots/nanos_eip191_opensea/00010.png deleted file mode 100644 index 481c8dc..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_opensea/00010.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00011.png b/tests/zemu/snapshots/nanos_eip191_opensea/00011.png deleted file mode 100644 index ff9dba9..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_opensea/00011.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00012.png b/tests/zemu/snapshots/nanos_eip191_opensea/00012.png deleted file mode 100644 index e179c29..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_opensea/00012.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00013.png b/tests/zemu/snapshots/nanos_eip191_opensea/00013.png deleted file mode 100644 index f872acc..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_opensea/00013.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00014.png b/tests/zemu/snapshots/nanos_eip191_opensea/00014.png deleted file mode 100644 index f5c2d67..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_opensea/00014.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00015.png b/tests/zemu/snapshots/nanos_eip191_opensea/00015.png deleted file mode 100644 index d55782f..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_opensea/00015.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_eip191_opensea/00016.png b/tests/zemu/snapshots/nanos_eip191_opensea/00016.png deleted file mode 100644 index f5c2d67..0000000 Binary files a/tests/zemu/snapshots/nanos_eip191_opensea/00016.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_enable_blind_signing/00001.png b/tests/zemu/snapshots/nanos_enable_blind_signing/00001.png deleted file mode 100644 index e227980..0000000 Binary files a/tests/zemu/snapshots/nanos_enable_blind_signing/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_enable_blind_signing/00002.png b/tests/zemu/snapshots/nanos_enable_blind_signing/00002.png deleted file mode 100644 index 04259b1..0000000 Binary files a/tests/zemu/snapshots/nanos_enable_blind_signing/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_enable_blind_signing/00003.png b/tests/zemu/snapshots/nanos_enable_blind_signing/00003.png deleted file mode 100644 index c828b7c..0000000 Binary files a/tests/zemu/snapshots/nanos_enable_blind_signing/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_enable_blind_signing/00004.png b/tests/zemu/snapshots/nanos_enable_blind_signing/00004.png deleted file mode 100644 index cabccc8..0000000 Binary files a/tests/zemu/snapshots/nanos_enable_blind_signing/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_enable_blind_signing/00005.png b/tests/zemu/snapshots/nanos_enable_blind_signing/00005.png deleted file mode 100644 index de843af..0000000 Binary files a/tests/zemu/snapshots/nanos_enable_blind_signing/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_enable_blind_signing/00006.png b/tests/zemu/snapshots/nanos_enable_blind_signing/00006.png deleted file mode 100644 index e615d31..0000000 Binary files a/tests/zemu/snapshots/nanos_enable_blind_signing/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_enable_blind_signing/00007.png b/tests/zemu/snapshots/nanos_enable_blind_signing/00007.png deleted file mode 100644 index 70c9092..0000000 Binary files a/tests/zemu/snapshots/nanos_enable_blind_signing/00007.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00000.png b/tests/zemu/snapshots/nanos_transfer_112233445566_network/00000.png deleted file mode 100644 index 8d84cc7..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00001.png b/tests/zemu/snapshots/nanos_transfer_112233445566_network/00001.png deleted file mode 100644 index 73ac9f6..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00002.png b/tests/zemu/snapshots/nanos_transfer_112233445566_network/00002.png deleted file mode 100644 index c2af54e..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00003.png b/tests/zemu/snapshots/nanos_transfer_112233445566_network/00003.png deleted file mode 100644 index a54fefd..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00004.png b/tests/zemu/snapshots/nanos_transfer_112233445566_network/00004.png deleted file mode 100644 index 8656b81..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00005.png b/tests/zemu/snapshots/nanos_transfer_112233445566_network/00005.png deleted file mode 100644 index fd3155c..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00006.png b/tests/zemu/snapshots/nanos_transfer_112233445566_network/00006.png deleted file mode 100644 index c63f25f..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_112233445566_network/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_bsc/00000.png b/tests/zemu/snapshots/nanos_transfer_bsc/00000.png deleted file mode 100644 index 8d84cc7..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_bsc/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_bsc/00001.png b/tests/zemu/snapshots/nanos_transfer_bsc/00001.png deleted file mode 100644 index 837fd64..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_bsc/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_bsc/00002.png b/tests/zemu/snapshots/nanos_transfer_bsc/00002.png deleted file mode 100644 index c2af54e..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_bsc/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_bsc/00003.png b/tests/zemu/snapshots/nanos_transfer_bsc/00003.png deleted file mode 100644 index a54fefd..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_bsc/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_bsc/00004.png b/tests/zemu/snapshots/nanos_transfer_bsc/00004.png deleted file mode 100644 index 8656b81..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_bsc/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_bsc/00005.png b/tests/zemu/snapshots/nanos_transfer_bsc/00005.png deleted file mode 100644 index fd3155c..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_bsc/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_bsc/00006.png b/tests/zemu/snapshots/nanos_transfer_bsc/00006.png deleted file mode 100644 index c63f25f..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_bsc/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_bsc/00010.png b/tests/zemu/snapshots/nanos_transfer_bsc/00010.png deleted file mode 100644 index 9c7e704..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_bsc/00010.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_bsc/00011.png b/tests/zemu/snapshots/nanos_transfer_bsc/00011.png deleted file mode 120000 index 489390a..0000000 --- a/tests/zemu/snapshots/nanos_transfer_bsc/00011.png +++ /dev/null @@ -1 +0,0 @@ -00009.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanos_transfer_eip1559/00000.png b/tests/zemu/snapshots/nanos_transfer_eip1559/00000.png deleted file mode 100644 index 8d84cc7..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_eip1559/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_eip1559/00002.png b/tests/zemu/snapshots/nanos_transfer_eip1559/00002.png deleted file mode 100644 index 701b26b..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_eip1559/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_eip1559/00003.png b/tests/zemu/snapshots/nanos_transfer_eip1559/00003.png deleted file mode 100644 index 32a2ee9..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_eip1559/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_eip1559/00004.png b/tests/zemu/snapshots/nanos_transfer_eip1559/00004.png deleted file mode 100644 index 1ed3d77..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_eip1559/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_eip1559/00005.png b/tests/zemu/snapshots/nanos_transfer_eip1559/00005.png deleted file mode 100644 index f19d91c..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_eip1559/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_eip1559/00006.png b/tests/zemu/snapshots/nanos_transfer_eip1559/00006.png deleted file mode 100644 index 1c9156c..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_eip1559/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_eip1559/00007.png b/tests/zemu/snapshots/nanos_transfer_eip1559/00007.png deleted file mode 100644 index 9c7e704..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_eip1559/00007.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_eip1559/00008.png b/tests/zemu/snapshots/nanos_transfer_eip1559/00008.png deleted file mode 120000 index e4abcae..0000000 --- a/tests/zemu/snapshots/nanos_transfer_eip1559/00008.png +++ /dev/null @@ -1 +0,0 @@ -00006.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum/00000.png b/tests/zemu/snapshots/nanos_transfer_ethereum/00000.png deleted file mode 100644 index 8d84cc7..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum/00001.png b/tests/zemu/snapshots/nanos_transfer_ethereum/00001.png deleted file mode 100644 index 7ebda4f..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum/00002.png b/tests/zemu/snapshots/nanos_transfer_ethereum/00002.png deleted file mode 100644 index c2af54e..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum/00003.png b/tests/zemu/snapshots/nanos_transfer_ethereum/00003.png deleted file mode 100644 index a54fefd..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum/00004.png b/tests/zemu/snapshots/nanos_transfer_ethereum/00004.png deleted file mode 100644 index 8656b81..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum/00005.png b/tests/zemu/snapshots/nanos_transfer_ethereum/00005.png deleted file mode 100644 index fd3155c..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum/00006.png b/tests/zemu/snapshots/nanos_transfer_ethereum/00006.png deleted file mode 100644 index c63f25f..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum/00007.png b/tests/zemu/snapshots/nanos_transfer_ethereum/00007.png deleted file mode 100644 index c84d3ec..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum/00007.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum/00008.png b/tests/zemu/snapshots/nanos_transfer_ethereum/00008.png deleted file mode 100644 index 1c9156c..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum/00009.png b/tests/zemu/snapshots/nanos_transfer_ethereum/00009.png deleted file mode 100644 index 9c7e704..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum/00009.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum/00010.png b/tests/zemu/snapshots/nanos_transfer_ethereum/00010.png deleted file mode 120000 index de12d01..0000000 --- a/tests/zemu/snapshots/nanos_transfer_ethereum/00010.png +++ /dev/null @@ -1 +0,0 @@ -00008.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00000.png b/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00000.png deleted file mode 100644 index 8d84cc7..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00001.png b/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00001.png deleted file mode 100644 index 77e79af..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00002.png b/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00002.png deleted file mode 100644 index c2af54e..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00003.png b/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00003.png deleted file mode 100644 index a54fefd..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00004.png b/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00004.png deleted file mode 100644 index 8656b81..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00005.png b/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00005.png deleted file mode 100644 index fd3155c..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00006.png b/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00006.png deleted file mode 100644 index c63f25f..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00007.png b/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00007.png deleted file mode 100644 index aa0f496..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00007.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00008.png b/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00008.png deleted file mode 100644 index 1c9156c..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00009.png b/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00009.png deleted file mode 100644 index 9c7e704..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00009.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00010.png b/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00010.png deleted file mode 120000 index de12d01..0000000 --- a/tests/zemu/snapshots/nanos_transfer_ethereum_clone/00010.png +++ /dev/null @@ -1 +0,0 @@ -00008.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanos_transfer_palm_network/00000.png b/tests/zemu/snapshots/nanos_transfer_palm_network/00000.png deleted file mode 100644 index 8d84cc7..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_palm_network/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_palm_network/00001.png b/tests/zemu/snapshots/nanos_transfer_palm_network/00001.png deleted file mode 100644 index b66c0ff..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_palm_network/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_palm_network/00002.png b/tests/zemu/snapshots/nanos_transfer_palm_network/00002.png deleted file mode 100644 index c2af54e..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_palm_network/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_palm_network/00003.png b/tests/zemu/snapshots/nanos_transfer_palm_network/00003.png deleted file mode 100644 index a54fefd..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_palm_network/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_palm_network/00004.png b/tests/zemu/snapshots/nanos_transfer_palm_network/00004.png deleted file mode 100644 index 8656b81..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_palm_network/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_palm_network/00005.png b/tests/zemu/snapshots/nanos_transfer_palm_network/00005.png deleted file mode 100644 index fd3155c..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_palm_network/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_palm_network/00006.png b/tests/zemu/snapshots/nanos_transfer_palm_network/00006.png deleted file mode 100644 index c63f25f..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_palm_network/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_palm_network/00007.png b/tests/zemu/snapshots/nanos_transfer_palm_network/00007.png deleted file mode 100644 index 2bac337..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_palm_network/00007.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_palm_network/00008.png b/tests/zemu/snapshots/nanos_transfer_palm_network/00008.png deleted file mode 100644 index 193f821..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_palm_network/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_palm_network/00009.png b/tests/zemu/snapshots/nanos_transfer_palm_network/00009.png deleted file mode 100644 index 1c9156c..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_palm_network/00009.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_palm_network/00010.png b/tests/zemu/snapshots/nanos_transfer_palm_network/00010.png deleted file mode 100644 index 9c7e704..0000000 Binary files a/tests/zemu/snapshots/nanos_transfer_palm_network/00010.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_transfer_palm_network/00011.png b/tests/zemu/snapshots/nanos_transfer_palm_network/00011.png deleted file mode 120000 index 489390a..0000000 --- a/tests/zemu/snapshots/nanos_transfer_palm_network/00011.png +++ /dev/null @@ -1 +0,0 @@ -00009.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanos_try_to_blind_sign_with_setting_disabled/00000.png b/tests/zemu/snapshots/nanos_try_to_blind_sign_with_setting_disabled/00000.png deleted file mode 100644 index c2420af..0000000 Binary files a/tests/zemu/snapshots/nanos_try_to_blind_sign_with_setting_disabled/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanos_try_to_blind_sign_with_setting_disabled/00001.png b/tests/zemu/snapshots/nanos_try_to_blind_sign_with_setting_disabled/00001.png deleted file mode 100644 index b31e455..0000000 Binary files a/tests/zemu/snapshots/nanos_try_to_blind_sign_with_setting_disabled/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_approve_dai_tokens/00001.png b/tests/zemu/snapshots/nanox_approve_dai_tokens/00001.png deleted file mode 100644 index 3add524..0000000 Binary files a/tests/zemu/snapshots/nanox_approve_dai_tokens/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_approve_dai_tokens/00002.png b/tests/zemu/snapshots/nanox_approve_dai_tokens/00002.png deleted file mode 100644 index 1bf7f2e..0000000 Binary files a/tests/zemu/snapshots/nanox_approve_dai_tokens/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_approve_dai_tokens/00003.png b/tests/zemu/snapshots/nanox_approve_dai_tokens/00003.png deleted file mode 100644 index d1a0cdc..0000000 Binary files a/tests/zemu/snapshots/nanox_approve_dai_tokens/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_approve_dai_tokens/00004.png b/tests/zemu/snapshots/nanox_approve_dai_tokens/00004.png deleted file mode 100644 index ae56f60..0000000 Binary files a/tests/zemu/snapshots/nanox_approve_dai_tokens/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_approve_dai_tokens/00006.png b/tests/zemu/snapshots/nanox_approve_dai_tokens/00006.png deleted file mode 100644 index c922246..0000000 Binary files a/tests/zemu/snapshots/nanox_approve_dai_tokens/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_approve_dai_tokens/00007.png b/tests/zemu/snapshots/nanox_approve_dai_tokens/00007.png deleted file mode 120000 index 7159a12..0000000 --- a/tests/zemu/snapshots/nanox_approve_dai_tokens/00007.png +++ /dev/null @@ -1 +0,0 @@ -00005.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_approve_dai_tokens/00008.png b/tests/zemu/snapshots/nanox_approve_dai_tokens/00008.png deleted file mode 100644 index a58590b..0000000 Binary files a/tests/zemu/snapshots/nanox_approve_dai_tokens/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00000.png b/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00000.png deleted file mode 100644 index 487ea10..0000000 Binary files a/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00001.png b/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00001.png deleted file mode 100644 index 9901736..0000000 Binary files a/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00002.png b/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00002.png deleted file mode 100644 index 043c123..0000000 Binary files a/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00003.png b/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00003.png deleted file mode 100644 index 4749ed1..0000000 Binary files a/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00004.png b/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00004.png deleted file mode 100644 index c0f77c9..0000000 Binary files a/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00006.png b/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00006.png deleted file mode 100644 index c922246..0000000 Binary files a/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00007.png b/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00007.png deleted file mode 120000 index 7159a12..0000000 --- a/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00007.png +++ /dev/null @@ -1 +0,0 @@ -00005.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00008.png b/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00008.png deleted file mode 100644 index a58590b..0000000 Binary files a/tests/zemu/snapshots/nanox_deposit_eth_compound_blind/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_disable_blind_signing/00000.png b/tests/zemu/snapshots/nanox_disable_blind_signing/00000.png deleted file mode 100644 index 7a77cb1..0000000 Binary files a/tests/zemu/snapshots/nanox_disable_blind_signing/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_disable_blind_signing/00001.png b/tests/zemu/snapshots/nanox_disable_blind_signing/00001.png deleted file mode 100644 index bf49b96..0000000 Binary files a/tests/zemu/snapshots/nanox_disable_blind_signing/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_disable_blind_signing/00002.png b/tests/zemu/snapshots/nanox_disable_blind_signing/00002.png deleted file mode 100644 index 9230349..0000000 Binary files a/tests/zemu/snapshots/nanox_disable_blind_signing/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_disable_blind_signing/00003.png b/tests/zemu/snapshots/nanox_disable_blind_signing/00003.png deleted file mode 100644 index 75f5f7c..0000000 Binary files a/tests/zemu/snapshots/nanox_disable_blind_signing/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_disable_blind_signing/00004.png b/tests/zemu/snapshots/nanox_disable_blind_signing/00004.png deleted file mode 100644 index ed04d70..0000000 Binary files a/tests/zemu/snapshots/nanox_disable_blind_signing/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_disable_blind_signing/00005.png b/tests/zemu/snapshots/nanox_disable_blind_signing/00005.png deleted file mode 100644 index ed01866..0000000 Binary files a/tests/zemu/snapshots/nanox_disable_blind_signing/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_disable_blind_signing/00006.png b/tests/zemu/snapshots/nanox_disable_blind_signing/00006.png deleted file mode 100644 index 9ce4343..0000000 Binary files a/tests/zemu/snapshots/nanox_disable_blind_signing/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_disable_blind_signing/00007.png b/tests/zemu/snapshots/nanox_disable_blind_signing/00007.png deleted file mode 100644 index bc8064a..0000000 Binary files a/tests/zemu/snapshots/nanox_disable_blind_signing/00007.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_disable_blind_signing/00008.png b/tests/zemu/snapshots/nanox_disable_blind_signing/00008.png deleted file mode 100644 index 7a77cb1..0000000 Binary files a/tests/zemu/snapshots/nanox_disable_blind_signing/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_metamask/00000.png b/tests/zemu/snapshots/nanox_eip191_metamask/00000.png deleted file mode 100644 index 1b27154..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_metamask/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_metamask/00001.png b/tests/zemu/snapshots/nanox_eip191_metamask/00001.png deleted file mode 100644 index 58f0606..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_metamask/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_metamask/00002.png b/tests/zemu/snapshots/nanox_eip191_metamask/00002.png deleted file mode 100644 index c9da92b..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_metamask/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_metamask/00003.png b/tests/zemu/snapshots/nanox_eip191_metamask/00003.png deleted file mode 100644 index 121cfd5..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_metamask/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_metamask/00004.png b/tests/zemu/snapshots/nanox_eip191_metamask/00004.png deleted file mode 100644 index c9da92b..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_metamask/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_metamask/00005.png b/tests/zemu/snapshots/nanox_eip191_metamask/00005.png deleted file mode 100644 index a58590b..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_metamask/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_nonascii/00000.png b/tests/zemu/snapshots/nanox_eip191_nonascii/00000.png deleted file mode 100644 index 1b27154..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_nonascii/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_nonascii/00001.png b/tests/zemu/snapshots/nanox_eip191_nonascii/00001.png deleted file mode 100644 index 6a5f8e8..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_nonascii/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_nonascii/00002.png b/tests/zemu/snapshots/nanox_eip191_nonascii/00002.png deleted file mode 100644 index 78d7d1d..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_nonascii/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_nonascii/00003.png b/tests/zemu/snapshots/nanox_eip191_nonascii/00003.png deleted file mode 100644 index c9da92b..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_nonascii/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_nonascii/00004.png b/tests/zemu/snapshots/nanox_eip191_nonascii/00004.png deleted file mode 100644 index 121cfd5..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_nonascii/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_nonascii/00005.png b/tests/zemu/snapshots/nanox_eip191_nonascii/00005.png deleted file mode 100644 index c9da92b..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_nonascii/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_nonascii/00006.png b/tests/zemu/snapshots/nanox_eip191_nonascii/00006.png deleted file mode 100644 index a58590b..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_nonascii/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00000.png b/tests/zemu/snapshots/nanox_eip191_opensea/00000.png deleted file mode 100644 index 1b27154..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_opensea/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00002.png b/tests/zemu/snapshots/nanox_eip191_opensea/00002.png deleted file mode 100644 index c094bc6..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_opensea/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00003.png b/tests/zemu/snapshots/nanox_eip191_opensea/00003.png deleted file mode 100644 index 9a3efb7..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_opensea/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00004.png b/tests/zemu/snapshots/nanox_eip191_opensea/00004.png deleted file mode 100644 index 657edb5..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_opensea/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00006.png b/tests/zemu/snapshots/nanox_eip191_opensea/00006.png deleted file mode 100644 index 952e5ca..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_opensea/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00009.png b/tests/zemu/snapshots/nanox_eip191_opensea/00009.png deleted file mode 100644 index c9da92b..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_opensea/00009.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00010.png b/tests/zemu/snapshots/nanox_eip191_opensea/00010.png deleted file mode 100644 index 121cfd5..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_opensea/00010.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00011.png b/tests/zemu/snapshots/nanox_eip191_opensea/00011.png deleted file mode 100644 index c9da92b..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_opensea/00011.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_eip191_opensea/00012.png b/tests/zemu/snapshots/nanox_eip191_opensea/00012.png deleted file mode 100644 index a58590b..0000000 Binary files a/tests/zemu/snapshots/nanox_eip191_opensea/00012.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_enable_blind_signing/00000.png b/tests/zemu/snapshots/nanox_enable_blind_signing/00000.png deleted file mode 100644 index a58590b..0000000 Binary files a/tests/zemu/snapshots/nanox_enable_blind_signing/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_enable_blind_signing/00001.png b/tests/zemu/snapshots/nanox_enable_blind_signing/00001.png deleted file mode 100644 index bcb20c6..0000000 Binary files a/tests/zemu/snapshots/nanox_enable_blind_signing/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_enable_blind_signing/00002.png b/tests/zemu/snapshots/nanox_enable_blind_signing/00002.png deleted file mode 100644 index 75b78e5..0000000 Binary files a/tests/zemu/snapshots/nanox_enable_blind_signing/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_enable_blind_signing/00003.png b/tests/zemu/snapshots/nanox_enable_blind_signing/00003.png deleted file mode 100644 index 9e21d4a..0000000 Binary files a/tests/zemu/snapshots/nanox_enable_blind_signing/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_enable_blind_signing/00004.png b/tests/zemu/snapshots/nanox_enable_blind_signing/00004.png deleted file mode 100644 index fb2843a..0000000 Binary files a/tests/zemu/snapshots/nanox_enable_blind_signing/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_enable_blind_signing/00005.png b/tests/zemu/snapshots/nanox_enable_blind_signing/00005.png deleted file mode 100644 index 1c5f8a2..0000000 Binary files a/tests/zemu/snapshots/nanox_enable_blind_signing/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_enable_blind_signing/00006.png b/tests/zemu/snapshots/nanox_enable_blind_signing/00006.png deleted file mode 100644 index 0b4f46e..0000000 Binary files a/tests/zemu/snapshots/nanox_enable_blind_signing/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_enable_blind_signing/00007.png b/tests/zemu/snapshots/nanox_enable_blind_signing/00007.png deleted file mode 100644 index 706ef7d..0000000 Binary files a/tests/zemu/snapshots/nanox_enable_blind_signing/00007.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_enable_blind_signing/00008.png b/tests/zemu/snapshots/nanox_enable_blind_signing/00008.png deleted file mode 100644 index 5b3eed9..0000000 Binary files a/tests/zemu/snapshots/nanox_enable_blind_signing/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_enable_blind_signing/00009.png b/tests/zemu/snapshots/nanox_enable_blind_signing/00009.png deleted file mode 100644 index 61861f2..0000000 Binary files a/tests/zemu/snapshots/nanox_enable_blind_signing/00009.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00000.png b/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00000.png deleted file mode 100644 index 487ea10..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00001.png b/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00001.png deleted file mode 100644 index ba1dfa0..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00002.png b/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00002.png deleted file mode 100644 index 7d01fe8..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00003.png b/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00003.png deleted file mode 100644 index 950fd72..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00004.png b/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00004.png deleted file mode 100644 index 5906d19..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00005.png b/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00005.png deleted file mode 100644 index 05c1afa..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00006.png b/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00006.png deleted file mode 100644 index 690bb3d..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00007.png b/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00007.png deleted file mode 100644 index 570ce28..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00007.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00008.png b/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00008.png deleted file mode 100644 index c922246..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00009.png b/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00009.png deleted file mode 120000 index 10266b3..0000000 --- a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00009.png +++ /dev/null @@ -1 +0,0 @@ -00007.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00010.png b/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00010.png deleted file mode 100644 index a58590b..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_batch_transfer/00010.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer/00000.png b/tests/zemu/snapshots/nanox_erc1155_transfer/00000.png deleted file mode 100644 index 487ea10..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_transfer/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer/00001.png b/tests/zemu/snapshots/nanox_erc1155_transfer/00001.png deleted file mode 100644 index 2b0fd14..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_transfer/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer/00002.png b/tests/zemu/snapshots/nanox_erc1155_transfer/00002.png deleted file mode 100644 index 7d01fe8..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_transfer/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer/00003.png b/tests/zemu/snapshots/nanox_erc1155_transfer/00003.png deleted file mode 100644 index a5790c1..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_transfer/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer/00004.png b/tests/zemu/snapshots/nanox_erc1155_transfer/00004.png deleted file mode 100644 index 5906d19..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_transfer/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer/00005.png b/tests/zemu/snapshots/nanox_erc1155_transfer/00005.png deleted file mode 100644 index d6257d3..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_transfer/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer/00006.png b/tests/zemu/snapshots/nanox_erc1155_transfer/00006.png deleted file mode 100644 index 061c754..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_transfer/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer/00007.png b/tests/zemu/snapshots/nanox_erc1155_transfer/00007.png deleted file mode 100644 index c748a75..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_transfer/00007.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer/00008.png b/tests/zemu/snapshots/nanox_erc1155_transfer/00008.png deleted file mode 100644 index cd509d9..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_transfer/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer/00009.png b/tests/zemu/snapshots/nanox_erc1155_transfer/00009.png deleted file mode 100644 index 570ce28..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_transfer/00009.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer/00010.png b/tests/zemu/snapshots/nanox_erc1155_transfer/00010.png deleted file mode 100644 index c922246..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_transfer/00010.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer/00011.png b/tests/zemu/snapshots/nanox_erc1155_transfer/00011.png deleted file mode 120000 index 489390a..0000000 --- a/tests/zemu/snapshots/nanox_erc1155_transfer/00011.png +++ /dev/null @@ -1 +0,0 @@ -00009.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer/00012.png b/tests/zemu/snapshots/nanox_erc1155_transfer/00012.png deleted file mode 100644 index a58590b..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_transfer/00012.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00000.png b/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00000.png deleted file mode 120000 index a808e25..0000000 --- a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00000.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc1155_transfer/00000.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00001.png b/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00001.png deleted file mode 120000 index 18b62b5..0000000 --- a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00001.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc1155_transfer/00001.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00002.png b/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00002.png deleted file mode 120000 index 3ba3b50..0000000 --- a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00002.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc1155_transfer/00002.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00003.png b/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00003.png deleted file mode 100644 index b34af53..0000000 Binary files a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00004.png b/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00004.png deleted file mode 120000 index d5f5958..0000000 --- a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00004.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc1155_transfer/00004.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00005.png b/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00005.png deleted file mode 120000 index 0d2033d..0000000 --- a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00005.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc1155_transfer/00005.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00006.png b/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00006.png deleted file mode 120000 index ce62159..0000000 --- a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00006.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc1155_transfer/00006.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00007.png b/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00007.png deleted file mode 120000 index e9c683a..0000000 --- a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00007.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc1155_transfer/00007.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00008.png b/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00008.png deleted file mode 120000 index 8dc9044..0000000 --- a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00008.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc1155_transfer/00008.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00009.png b/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00009.png deleted file mode 120000 index 8293fcb..0000000 --- a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00009.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc1155_transfer/00009.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00010.png b/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00010.png deleted file mode 120000 index 76c0110..0000000 --- a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00010.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc1155_transfer/00010.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00011.png b/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00011.png deleted file mode 120000 index e2f4374..0000000 --- a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00011.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc1155_transfer/00011.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00012.png b/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00012.png deleted file mode 120000 index 24a2c61..0000000 --- a/tests/zemu/snapshots/nanox_erc1155_transfer_wo_info/00012.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc1155_transfer/00012.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc721_transfer/00000.png b/tests/zemu/snapshots/nanox_erc721_transfer/00000.png deleted file mode 100644 index 487ea10..0000000 Binary files a/tests/zemu/snapshots/nanox_erc721_transfer/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc721_transfer/00001.png b/tests/zemu/snapshots/nanox_erc721_transfer/00001.png deleted file mode 100644 index 2b0fd14..0000000 Binary files a/tests/zemu/snapshots/nanox_erc721_transfer/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc721_transfer/00002.png b/tests/zemu/snapshots/nanox_erc721_transfer/00002.png deleted file mode 100644 index 7d01fe8..0000000 Binary files a/tests/zemu/snapshots/nanox_erc721_transfer/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc721_transfer/00003.png b/tests/zemu/snapshots/nanox_erc721_transfer/00003.png deleted file mode 100644 index 9e8c446..0000000 Binary files a/tests/zemu/snapshots/nanox_erc721_transfer/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc721_transfer/00004.png b/tests/zemu/snapshots/nanox_erc721_transfer/00004.png deleted file mode 100644 index 23f2a45..0000000 Binary files a/tests/zemu/snapshots/nanox_erc721_transfer/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc721_transfer/00005.png b/tests/zemu/snapshots/nanox_erc721_transfer/00005.png deleted file mode 100644 index e369a1b..0000000 Binary files a/tests/zemu/snapshots/nanox_erc721_transfer/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc721_transfer/00006.png b/tests/zemu/snapshots/nanox_erc721_transfer/00006.png deleted file mode 100644 index 6ce12ba..0000000 Binary files a/tests/zemu/snapshots/nanox_erc721_transfer/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc721_transfer/00007.png b/tests/zemu/snapshots/nanox_erc721_transfer/00007.png deleted file mode 100644 index 570ce28..0000000 Binary files a/tests/zemu/snapshots/nanox_erc721_transfer/00007.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc721_transfer/00008.png b/tests/zemu/snapshots/nanox_erc721_transfer/00008.png deleted file mode 100644 index c922246..0000000 Binary files a/tests/zemu/snapshots/nanox_erc721_transfer/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc721_transfer/00009.png b/tests/zemu/snapshots/nanox_erc721_transfer/00009.png deleted file mode 120000 index 10266b3..0000000 --- a/tests/zemu/snapshots/nanox_erc721_transfer/00009.png +++ /dev/null @@ -1 +0,0 @@ -00007.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc721_transfer/00010.png b/tests/zemu/snapshots/nanox_erc721_transfer/00010.png deleted file mode 100644 index a58590b..0000000 Binary files a/tests/zemu/snapshots/nanox_erc721_transfer/00010.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00000.png b/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00000.png deleted file mode 120000 index eaca370..0000000 --- a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00000.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc721_transfer/00000.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00001.png b/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00001.png deleted file mode 120000 index 3f02420..0000000 --- a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00001.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc721_transfer/00001.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00002.png b/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00002.png deleted file mode 120000 index 55b219f..0000000 --- a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00002.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc721_transfer/00002.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00003.png b/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00003.png deleted file mode 100644 index b34af53..0000000 Binary files a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00004.png b/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00004.png deleted file mode 120000 index 4e66c9a..0000000 --- a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00004.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc721_transfer/00004.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00005.png b/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00005.png deleted file mode 120000 index b538cb6..0000000 --- a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00005.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc721_transfer/00005.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00006.png b/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00006.png deleted file mode 120000 index 9d4b343..0000000 --- a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00006.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc721_transfer/00006.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00007.png b/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00007.png deleted file mode 120000 index 8851ec8..0000000 --- a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00007.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc721_transfer/00007.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00008.png b/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00008.png deleted file mode 120000 index 7faf831..0000000 --- a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00008.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc721_transfer/00008.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00009.png b/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00009.png deleted file mode 120000 index d3f938b..0000000 --- a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00009.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc721_transfer/00009.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00010.png b/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00010.png deleted file mode 120000 index 8e81364..0000000 --- a/tests/zemu/snapshots/nanox_erc721_transfer_wo_info/00010.png +++ /dev/null @@ -1 +0,0 @@ -../nanox_erc721_transfer/00010.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_transfer_112233445566_network/00000.png b/tests/zemu/snapshots/nanox_transfer_112233445566_network/00000.png deleted file mode 100644 index 487ea10..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_112233445566_network/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_112233445566_network/00001.png b/tests/zemu/snapshots/nanox_transfer_112233445566_network/00001.png deleted file mode 100644 index 0976a31..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_112233445566_network/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_112233445566_network/00002.png b/tests/zemu/snapshots/nanox_transfer_112233445566_network/00002.png deleted file mode 100644 index 0f18eee..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_112233445566_network/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_112233445566_network/00004.png b/tests/zemu/snapshots/nanox_transfer_112233445566_network/00004.png deleted file mode 100644 index 70c1b9a..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_112233445566_network/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_112233445566_network/00005.png b/tests/zemu/snapshots/nanox_transfer_112233445566_network/00005.png deleted file mode 100644 index 570ce28..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_112233445566_network/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_112233445566_network/00006.png b/tests/zemu/snapshots/nanox_transfer_112233445566_network/00006.png deleted file mode 100644 index c922246..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_112233445566_network/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_112233445566_network/00007.png b/tests/zemu/snapshots/nanox_transfer_112233445566_network/00007.png deleted file mode 120000 index 7159a12..0000000 --- a/tests/zemu/snapshots/nanox_transfer_112233445566_network/00007.png +++ /dev/null @@ -1 +0,0 @@ -00005.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_transfer_112233445566_network/00008.png b/tests/zemu/snapshots/nanox_transfer_112233445566_network/00008.png deleted file mode 100644 index a58590b..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_112233445566_network/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_bsc/00000.png b/tests/zemu/snapshots/nanox_transfer_bsc/00000.png deleted file mode 100644 index 487ea10..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_bsc/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_bsc/00001.png b/tests/zemu/snapshots/nanox_transfer_bsc/00001.png deleted file mode 100644 index 4f1699a..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_bsc/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_bsc/00002.png b/tests/zemu/snapshots/nanox_transfer_bsc/00002.png deleted file mode 100644 index 0f18eee..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_bsc/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_bsc/00004.png b/tests/zemu/snapshots/nanox_transfer_bsc/00004.png deleted file mode 100644 index 3448ce1..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_bsc/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_bsc/00005.png b/tests/zemu/snapshots/nanox_transfer_bsc/00005.png deleted file mode 100644 index 570ce28..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_bsc/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_bsc/00006.png b/tests/zemu/snapshots/nanox_transfer_bsc/00006.png deleted file mode 100644 index c922246..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_bsc/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_bsc/00007.png b/tests/zemu/snapshots/nanox_transfer_bsc/00007.png deleted file mode 120000 index 7159a12..0000000 --- a/tests/zemu/snapshots/nanox_transfer_bsc/00007.png +++ /dev/null @@ -1 +0,0 @@ -00005.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_transfer_bsc/00008.png b/tests/zemu/snapshots/nanox_transfer_bsc/00008.png deleted file mode 100644 index a58590b..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_bsc/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_eip1559/00000.png b/tests/zemu/snapshots/nanox_transfer_eip1559/00000.png deleted file mode 100644 index 487ea10..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_eip1559/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_eip1559/00002.png b/tests/zemu/snapshots/nanox_transfer_eip1559/00002.png deleted file mode 100644 index 5b65b54..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_eip1559/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_eip1559/00003.png b/tests/zemu/snapshots/nanox_transfer_eip1559/00003.png deleted file mode 100644 index 1a7a3f3..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_eip1559/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_eip1559/00004.png b/tests/zemu/snapshots/nanox_transfer_eip1559/00004.png deleted file mode 100644 index 570ce28..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_eip1559/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_eip1559/00005.png b/tests/zemu/snapshots/nanox_transfer_eip1559/00005.png deleted file mode 100644 index c922246..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_eip1559/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_eip1559/00006.png b/tests/zemu/snapshots/nanox_transfer_eip1559/00006.png deleted file mode 120000 index 917964c..0000000 --- a/tests/zemu/snapshots/nanox_transfer_eip1559/00006.png +++ /dev/null @@ -1 +0,0 @@ -00004.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_transfer_ethereum/00000.png b/tests/zemu/snapshots/nanox_transfer_ethereum/00000.png deleted file mode 100644 index 487ea10..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_ethereum/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_ethereum/00001.png b/tests/zemu/snapshots/nanox_transfer_ethereum/00001.png deleted file mode 100644 index 0976a31..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_ethereum/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_ethereum/00002.png b/tests/zemu/snapshots/nanox_transfer_ethereum/00002.png deleted file mode 100644 index 0f18eee..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_ethereum/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_ethereum/00003.png b/tests/zemu/snapshots/nanox_transfer_ethereum/00003.png deleted file mode 100644 index 70c1b9a..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_ethereum/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_ethereum/00004.png b/tests/zemu/snapshots/nanox_transfer_ethereum/00004.png deleted file mode 100644 index 570ce28..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_ethereum/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_ethereum/00005.png b/tests/zemu/snapshots/nanox_transfer_ethereum/00005.png deleted file mode 100644 index c922246..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_ethereum/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_ethereum/00006.png b/tests/zemu/snapshots/nanox_transfer_ethereum/00006.png deleted file mode 120000 index 917964c..0000000 --- a/tests/zemu/snapshots/nanox_transfer_ethereum/00006.png +++ /dev/null @@ -1 +0,0 @@ -00004.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_transfer_ethereum/00007.png b/tests/zemu/snapshots/nanox_transfer_ethereum/00007.png deleted file mode 100644 index a58590b..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_ethereum/00007.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00000.png b/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00000.png deleted file mode 100644 index 487ea10..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00001.png b/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00001.png deleted file mode 100644 index 43332d4..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00002.png b/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00002.png deleted file mode 100644 index 0f18eee..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00003.png b/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00003.png deleted file mode 100644 index c59d95a..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00004.png b/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00004.png deleted file mode 100644 index 570ce28..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00005.png b/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00005.png deleted file mode 100644 index c922246..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00006.png b/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00006.png deleted file mode 120000 index 917964c..0000000 --- a/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00006.png +++ /dev/null @@ -1 +0,0 @@ -00004.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00007.png b/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00007.png deleted file mode 100644 index a58590b..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_ethereum_clone/00007.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_palm_network/00000.png b/tests/zemu/snapshots/nanox_transfer_palm_network/00000.png deleted file mode 100644 index 487ea10..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_palm_network/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_palm_network/00001.png b/tests/zemu/snapshots/nanox_transfer_palm_network/00001.png deleted file mode 100644 index 224a9da..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_palm_network/00001.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_palm_network/00002.png b/tests/zemu/snapshots/nanox_transfer_palm_network/00002.png deleted file mode 100644 index 0f18eee..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_palm_network/00002.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_palm_network/00003.png b/tests/zemu/snapshots/nanox_transfer_palm_network/00003.png deleted file mode 100644 index def1ae2..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_palm_network/00003.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_palm_network/00004.png b/tests/zemu/snapshots/nanox_transfer_palm_network/00004.png deleted file mode 100644 index 0c1fa4c..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_palm_network/00004.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_palm_network/00005.png b/tests/zemu/snapshots/nanox_transfer_palm_network/00005.png deleted file mode 100644 index 570ce28..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_palm_network/00005.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_palm_network/00006.png b/tests/zemu/snapshots/nanox_transfer_palm_network/00006.png deleted file mode 100644 index c922246..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_palm_network/00006.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_transfer_palm_network/00007.png b/tests/zemu/snapshots/nanox_transfer_palm_network/00007.png deleted file mode 120000 index 7159a12..0000000 --- a/tests/zemu/snapshots/nanox_transfer_palm_network/00007.png +++ /dev/null @@ -1 +0,0 @@ -00005.png \ No newline at end of file diff --git a/tests/zemu/snapshots/nanox_transfer_palm_network/00008.png b/tests/zemu/snapshots/nanox_transfer_palm_network/00008.png deleted file mode 100644 index a58590b..0000000 Binary files a/tests/zemu/snapshots/nanox_transfer_palm_network/00008.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_try_to_blind_sign_with_setting_disabled/00000.png b/tests/zemu/snapshots/nanox_try_to_blind_sign_with_setting_disabled/00000.png deleted file mode 100644 index 0446ee7..0000000 Binary files a/tests/zemu/snapshots/nanox_try_to_blind_sign_with_setting_disabled/00000.png and /dev/null differ diff --git a/tests/zemu/snapshots/nanox_try_to_blind_sign_with_setting_disabled/00001.png b/tests/zemu/snapshots/nanox_try_to_blind_sign_with_setting_disabled/00001.png deleted file mode 100644 index a58590b..0000000 Binary files a/tests/zemu/snapshots/nanox_try_to_blind_sign_with_setting_disabled/00001.png and /dev/null differ diff --git a/tests/zemu/src/approve.test.js b/tests/zemu/src/approve.test.js deleted file mode 100644 index f6380d8..0000000 --- a/tests/zemu/src/approve.test.js +++ /dev/null @@ -1,25 +0,0 @@ -import "core-js/stable"; -import "regenerator-runtime/runtime"; -import { waitForAppScreen, zemu, nano_models } from './test.fixture'; - -nano_models.forEach(function(model) { - test('[Nano ' + model.letter + '] Approve DAI tokens', zemu(model, async (sim, eth) => { - - const tx = eth.signTransaction( - "44'/60'/1'/0/0", - 'F869468506A8B15E0082EBEB946B175474E89094C44DA98B954EEDEAC495271D0F80B844095EA7B30000000000000000000000007D2768DE32B0B80B7A3454C06BDAC94A69DDC7A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF018080', - ); - - let clicks; - if (model.letter === 'S') clicks = 8; - else clicks = 6; - await waitForAppScreen(sim); - await sim.navigateAndCompareSnapshots('.', model.name + '_approve_dai_tokens', [clicks, -1, 0]); - - await expect(tx).resolves.toEqual({ - "r": "92243511396b65a4faa735a5472ea99b3ce0f7f2338eab426206730bc0ddc57f", - "s": "161bc0f861064d840de4f4304cfd19a571017e62df7d8f70cf605c0f025593b6", - "v": "25", - }); - })); -}); diff --git a/tests/zemu/src/blind_compound_deposit.test.js b/tests/zemu/src/blind_compound_deposit.test.js deleted file mode 100644 index 670153a..0000000 --- a/tests/zemu/src/blind_compound_deposit.test.js +++ /dev/null @@ -1,30 +0,0 @@ -import "core-js/stable"; -import "regenerator-runtime/runtime"; -import { waitForAppScreen, zemu, nano_models } from './test.fixture'; - -nano_models.forEach(function(model) { - test('[Nano ' + model.letter + '] Deposit ETH on compound, blind sign', zemu(model, async (sim, eth) => { - let clicks; - // LNS does not have EIP712 & ENS settings - if (model.letter === 'S') clicks = 3; - else clicks = 5; - // Enable blind-signing - await sim.navigateAndCompareSnapshots('.', model.name + '_enable_blind_signing', [-2, 0, 0, clicks, 0]); - - const tx = eth.signTransaction( - "44'/60'/1'/0/0", - 'f8924685028fa6ae008306599594cc9a0b7c43dc2a5f023bb9b738e45b0ef6b06e0488016345785d8a0000b864474cf53d0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a900000000000000000000000070bc641723fad48be2df6cf63dc6270ee2f897430000000000000000000000000000000000000000000000000000000000000000018080', - ); - - await waitForAppScreen(sim); - if (model.letter === 'S') clicks = 8; - else clicks = 6; - await sim.navigateAndCompareSnapshots('.', model.name + '_deposit_eth_compound_blind', [clicks, -1, 0]); - - await expect(tx).resolves.toEqual({ - "r": "b5ae3a011eb50e7d1fe9f5e6f6d91ca9f4dfca5f73805fc4866d49e72ead2f5c", - "s": "3c6e55db5925586bb58e434b58b2c04756f662131597f98c1aa2418b16992b81", - "v": "26", - }); - })); -}); diff --git a/tests/zemu/src/chainid.test.js b/tests/zemu/src/chainid.test.js deleted file mode 100644 index 668b196..0000000 --- a/tests/zemu/src/chainid.test.js +++ /dev/null @@ -1,47 +0,0 @@ -import "core-js/stable"; -import "regenerator-runtime/runtime"; -import { waitForAppScreen, zemu, nano_models } from './test.fixture'; - -nano_models.forEach(function(model) { - test('[Nano ' + model.letter + '] Transfer on network 112233445566 on Ethereum', zemu(model, async (sim, eth) => { - - const tx = eth.signTransaction( - "44'/60'/1'/0/0", - 'f044850306dc4200825208945a321744667052affa8386ed49e00ef223cbffc3876f9c9e7bf6181880851a21a278be8080', - ); - - await waitForAppScreen(sim); - let clicks; - if (model.letter === 'S') clicks = 10; - else clicks = 6; - await sim.navigateAndCompareSnapshots('.', model.name + '_transfer_112233445566_network', [clicks, -1, 0]); - - await expect(tx).resolves.toEqual({ - "r": "509981d8dfb66757e25ff47c009b9b5bc5db0f169473e4735f5212b144f1c069", - "s": "5db989d81025de3c846e41a9ce01a3f9fd0982e2d827f1b88ffc95d73a48d04c", - "v": "344344f19f", - }); - })); -}); - -nano_models.forEach(function(model) { - test('[Nano ' + model.letter + '] Transfer on palm network on Ethereum', zemu(model, async (sim, eth) => { - - const tx = eth.signTransaction( - "44'/60'/1'/0/0", - 'f044850306dc4200825208945a321744667052affa8386ed49e00ef223cbffc3876f9c9e7bf61818808502a15c308d8080', - ); - - await waitForAppScreen(sim); - let clicks; - if (model.letter === 'S') clicks = 10; - else clicks = 6; - await sim.navigateAndCompareSnapshots('.', model.name + '_transfer_palm_network', [clicks, -1, 0]); - - await expect(tx).resolves.toEqual({ - "r": "946700c4972b3da24ddaa95e590ad25a8f905da62e2bd053285a4cc17f93f490", - "s": "3698e84564e58477a49f7a9cea572ef5d672a5538db08f3ee42df5eb75a1b907", - "v": "0542b8613d", - }); - })); -}); diff --git a/tests/zemu/src/contract_data_warning.test.js b/tests/zemu/src/contract_data_warning.test.js deleted file mode 100644 index c3b06e2..0000000 --- a/tests/zemu/src/contract_data_warning.test.js +++ /dev/null @@ -1,23 +0,0 @@ -import 'core-js/stable'; -import 'regenerator-runtime/runtime'; -import { TransportStatusError } from "@ledgerhq/errors"; -import { waitForAppScreen, zemu, nano_models } from './test.fixture'; -import Zemu from '@zondax/zemu'; - -nano_models.forEach(function(model) { - test('[Nano ' + model.letter + '] Try to blind sign with setting disabled', zemu(model, async (sim, eth) => { - // we can't use eth.signTransaction because it detects that contract data is disabled and fails early - let transport = await sim.getTransport(); - let buffer = Buffer.from("058000002c8000003c800000010000000000000000f849208506fc23ac008303dc3194f650c3d88d12db855b8bf7d11be6c55a4e07dcc980a4a1712d6800000000000000000000000000000000000000000000000000000000000acbc7018080", "hex"); - let tx = transport.send(0xe0, 0x04, 0x00, 0x00, buffer); - - await expect(tx).rejects.toEqual(new TransportStatusError(0x6a80)); - - await Zemu.sleep(1000); - await waitForAppScreen(sim); - let clicks; - if (model.letter === 'S') clicks = [1, 0]; - else clicks = [0]; - await sim.navigateAndCompareSnapshots('.', model.name + '_try_to_blind_sign_with_setting_disabled', clicks); - })); -}); diff --git a/tests/zemu/src/eip1559.test.js b/tests/zemu/src/eip1559.test.js deleted file mode 100644 index 41d12d4..0000000 --- a/tests/zemu/src/eip1559.test.js +++ /dev/null @@ -1,25 +0,0 @@ -import "core-js/stable"; -import "regenerator-runtime/runtime"; -import { waitForAppScreen, zemu, nano_models } from './test.fixture'; - -nano_models.forEach(function(model) { - test('[Nano ' + model.letter + '] Transfer eip1559', zemu(model, async (sim, eth) => { - - const tx = eth.signTransaction( - "44'/60'/0'/0/0", - '02f87001018502540be4008502540be40086246139ca800094cccccccccccccccccccccccccccccccccccccccc8000c001a0e07fb8a64ea3786c9a6649e54429e2786af3ea31c6d06165346678cf8ce44f9ba00e4a0526db1e905b7164a858fd5ebd2f1759e22e6955499448bd276a6aa62830', - ); - - await waitForAppScreen(sim); - let clicks; - if (model.letter === 'S') clicks = 7; - else clicks = 5; - await sim.navigateAndCompareSnapshots('.', model.name + '_transfer_eip1559', [clicks, -1, 0]); - - await expect(tx).resolves.toEqual({ - "r": "3d6dfabc6c52374bfa34cb2c433856a0bcd9484870dd1b50249f7164a5fce052", - "s": "0548a774dd0b63930d83cb2e1a836fe3ef24444e8b758b00585d9a076c0e98a8", - "v": "01" - }); - })); -}); diff --git a/tests/zemu/src/eip191.test.js b/tests/zemu/src/eip191.test.js deleted file mode 100644 index c54b013..0000000 --- a/tests/zemu/src/eip191.test.js +++ /dev/null @@ -1,72 +0,0 @@ -import "core-js/stable"; -import "regenerator-runtime/runtime"; -import { waitForAppScreen, zemu, nano_models, apdu_as_string, send_apdu } from './test.fixture'; - -const testgroup = "EIP-191"; - -nano_models.forEach(function(model) { - test("[Nano " + model.letter + "] "+ testgroup +" Metamask test", zemu(model, async (sim, eth) => { - - const tx = eth.signPersonalMessage( - "44'/60'/0'/0/0", - Buffer.from("Example `personal_sign` message").toString("hex") - ); - - await waitForAppScreen(sim); - - const rclicks = (model.letter == 'S') ? 4 : 3; - await sim.navigateAndCompareSnapshots('.', model.name + '_eip191_metamask', [rclicks, -1, 0]); - - await expect(tx).resolves.toEqual({ - "v": 28, - "r": "916099cf0d9c21911c85f0770a47a9696a8189e78c259cf099749748c507baae", - "s": "0d72234bc0ac2e94c5f7a5f4f9cd8610a52be4ea55515a85b9703f1bb158415c" - }); - })); - - - test("[Nano " + model.letter + "] "+ testgroup +" non-ASCII test", zemu(model, async (sim, eth) => { - - const tx = eth.signPersonalMessage( - "44'/60'/0'/0/0", - "9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658" - ); - - await waitForAppScreen(sim); - - const rclicks = (model.letter == 'S') ? 8 : 4; - await sim.navigateAndCompareSnapshots('.', model.name + '_eip191_nonascii', [rclicks, -1, 0]); - - await expect(tx).resolves.toEqual({ - "v": 28, - "r": "64bdbdb6959425445d00ff2536a7018d2dce904e1f7475938fe4221c3c72500c", - "s": "7c9208e99b6b9266a73aae17b73472d06499746edec34fd47a9dab42f06f2e42" - }); - })); - - - test("[Nano " + model.letter + "] "+ testgroup +" OpenSea test", zemu(model, async (sim, eth) => { - - const tx = eth.signPersonalMessage( - "44'/60'/0'/0/0", - Buffer.from("Welcome to OpenSea!\n\nClick to sign in and accept the OpenSea Terms of Service: https://opensea.io/tos\n\nThis request will not trigger a blockchain transaction or cost any gas fees.\n\nYour authentication status will reset after 24 hours.\n\nWallet address:\n0x9858effd232b4033e47d90003d41ec34ecaeda94\n\nNonce:\n2b02c8a0-f74f-4554-9821-a28054dc9121").toString("hex") - ); - - await waitForAppScreen(sim); - - if (model.letter == 'S') - { - await sim.navigateAndCompareSnapshots('.', model.name + '_eip191_opensea', [1, 5, 1, 6, 0, 1, -1, 0]); - } - else - { - await sim.navigateAndCompareSnapshots('.', model.name + '_eip191_opensea', [1, 5, 1, 2, 1, -1, 0]); - } - - await expect(tx).resolves.toEqual({ - "v": 28, - "r": "61a68c986f087730d2f6ecf89d6d1e48ab963ac461102bb02664bc05c3db75bb", - "s": "5714729ef441e097673a7b29a681e97f6963d875eeed2081f26b0b6686cd2bd2" - }); - })); -}); diff --git a/tests/zemu/src/erc1155.notest.js b/tests/zemu/src/erc1155.notest.js deleted file mode 100644 index 37d1a8d..0000000 --- a/tests/zemu/src/erc1155.notest.js +++ /dev/null @@ -1,67 +0,0 @@ -import "core-js/stable"; -import "regenerator-runtime/runtime"; -import Zemu from '@zondax/zemu'; -import { TransportStatusError } from "@ledgerhq/errors"; -import { waitForAppScreen, zemu, nano_models, apdu_as_string, send_apdu } from './test.fixture'; - -// Only LNX -const model = nano_models[1]; - -{ - const set_plugin = apdu_as_string('e01600007401010745524331313535495f947276749ce646f68ac8c248420045cb7b5ef242432a00000000000000010001473045022100ec4377d17e8d98d424bf16b29c691bc1a010825fb5b8a35de0268a9dc22eab2402206701b016fe6718bf519d18cc12e9838e9ef898cc4c143017839023c3260b2d74'); - const provide_nft_info = apdu_as_string('e01400007b0101124f70656e53656120436f6c6c656374696f6e495f947276749ce646f68ac8c248420045cb7b5e0000000000000001000147304502210083e357a828f13d574b1296214a3749c194ab1df1f8a243655c053b1c72f91e0c02201ed93cfac7e87759445c4da2e4bfd6e1cf0405ea37c7293bc965948f51bef5cc'); - const sign_first = apdu_as_string('e004000096058000002c8000003c800000000000000000000000f901090b8520b673dd0082bcb394495f947276749ce646f68ac8c248420045cb7b5e80b8e4f242432a0000000000000000000000006cbcd73cd8e8a42844662f0a0e76d7f79afd933d000000000000000000000000c2907efcce4011c491bbeda8a0fa63ba7aab596cabf06640f8ca8fc5e0ed471b10befcdf65a33e4300000000'); - const sign_more = apdu_as_string('e00480008b00006a0000000064000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000043078303000000000000000000000000000000000000000000000000000000000018080'); - - test('[Nano ' + model.letter + '] Transfer ERC-1155', zemu(model, async (sim, eth) => { - const current_screen = sim.getMainMenuSnapshot(); - await send_apdu(eth.transport, set_plugin); - await send_apdu(eth.transport, provide_nft_info); - await send_apdu(eth.transport, sign_first); - let sign_promise = send_apdu(eth.transport, sign_more); - - await waitForAppScreen(sim, current_screen); - await sim.navigateAndCompareSnapshots('.', model.name + '_erc1155_transfer', [10, -1, 0]); - - await sign_promise; - })); - - test('[Nano ' + model.letter + '] Transfer ERC-1155 w/o NFT metadata', zemu(model, async (sim, eth) => { - const current_screen = sim.getMainMenuSnapshot(); - await send_apdu(eth.transport, set_plugin); - let sign_tx = send_apdu(eth.transport, sign_first); - - await expect(sign_tx).rejects.toEqual(new TransportStatusError(0x6a80)); - })); - - test('[Nano ' + model.letter + '] Transfer ERC-1155 w/o plugin loaded', zemu(model, async (sim, eth) => { - const current_screen = sim.getMainMenuSnapshot(); - let nft_info = send_apdu(eth.transport, provide_nft_info); - - await expect(nft_info).rejects.toEqual(new TransportStatusError(0x6985)); - })); -} - -{ - const set_plugin = apdu_as_string('e01600007401010745524331313535495f947276749ce646f68ac8c248420045cb7b5e2eb2c2d60000000000000001000147304502210087b35cefc53fd94e25404933eb0d5ff08f20ba655d181de3b24ff0099dc3317f02204a216aa9e0b84bef6e20fcb036bd49647bf0cab66732b99b49ec277ffb682aa1'); - const provide_nft_info = apdu_as_string('e0140000820101194f70656e536561205368617265642053746f726566726f6e74495f947276749ce646f68ac8c248420045cb7b5e00000000000000010001473045022100c74cd613a27a9f4887210f5a3a0e12745e1ba0ab3a0d284cb6485d89c3cce4e602205a13e62a91164985cf58a838f8f531c0b91b980d206a5ba8df28270023ef93a3'); - const sign_first = apdu_as_string('e004000096058000002c8000003c800000000000000000000000f9020b0e850d8cfd86008301617d94495f947276749ce646f68ac8c248420045cb7b5e80b901e42eb2c2d60000000000000000000000006cbcd73cd8e8a42844662f0a0e76d7f79afd933d000000000000000000000000c2907efcce4011c491bbeda8a0fa63ba7aab596c00000000000000000000000000000000000000000000'); - const sign_more_1 = apdu_as_string('e004800096000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000003abf06640f8ca8fc5e0ed471b10befcdf65a33e430000000000006a0000000064def9d99ff495856496c028c0'); - const sign_more_2 = apdu_as_string('e00480009689732473fcd0bbbe000000000000a30000000001abf06640f8ca8fc5e0ed471b10befcdf65a33e430000000000006a00000000640000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000010000'); - const sign_more_3 = apdu_as_string('e00480006100000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043078303000000000000000000000000000000000000000000000000000000000018080'); - - test('[Nano ' + model.letter + '] Batch transfer ERC-1155', zemu(model, async (sim, eth) => { - const current_screen = sim.getMainMenuSnapshot(); - await send_apdu(eth.transport, set_plugin); - await send_apdu(eth.transport, provide_nft_info); - await send_apdu(eth.transport, sign_first); - await send_apdu(eth.transport, sign_more_1); - await send_apdu(eth.transport, sign_more_2); - let sign_promise = send_apdu(eth.transport, sign_more_3); - - await waitForAppScreen(sim, current_screen); - await sim.navigateAndCompareSnapshots('.', model.name + '_erc1155_batch_transfer', [8, -1, 0]); - - await sign_promise; - })); -} diff --git a/tests/zemu/src/erc721.notest.js b/tests/zemu/src/erc721.notest.js deleted file mode 100644 index 1d05853..0000000 --- a/tests/zemu/src/erc721.notest.js +++ /dev/null @@ -1,41 +0,0 @@ -import "core-js/stable"; -import "regenerator-runtime/runtime"; -import Zemu from '@zondax/zemu'; -import { TransportStatusError } from "@ledgerhq/errors"; -import { waitForAppScreen, zemu, nano_models, apdu_as_string, send_apdu } from './test.fixture'; - -// Only LNX -const model = nano_models[1]; - -const set_plugin = apdu_as_string('e01600007301010645524337323160f80121c31a0d46b5279700f9df786054aa5ee542842e0e0000000000000001000147304502202e2282d7d3ea714da283010f517af469e1d59654aaee0fc438f017aa557eaea50221008b369679381065bbe01135723a4f9adb229295017d37c4d30138b90a51cf6ab6'); -const provide_nft_info = apdu_as_string('e01400007001010752617269626c6560f80121c31a0d46b5279700f9df786054aa5ee500000000000000010001473045022025696986ef5f0ee2f72d9c6e41d7e2bf2e4f06373ab26d73ebe326c7fd4c7a6602210084f6b064d8750ae68ed5dd012296f37030390ec06ff534c5da6f0f4a4460af33'); -const sign_first = apdu_as_string('e004000096058000002c8000003c800000000000000000000000f88a0a852c3ce1ec008301f5679460f80121c31a0d46b5279700f9df786054aa5ee580b86442842e0e0000000000000000000000006cbcd73cd8e8a42844662f0a0e76d7f79afd933d000000000000000000000000c2907efcce4011c491bbeda8a0fa63ba7aab596c000000000000000000000000000000000000000000000000'); -const sign_more = apdu_as_string('e00480000b0000000000112999018080'); - -test('[Nano ' + model.letter + '] Transfer ERC-721', zemu(model, async (sim, eth) => { - const current_screen = sim.getMainMenuSnapshot(); - await send_apdu(eth.transport, set_plugin); - await send_apdu(eth.transport, provide_nft_info); - await send_apdu(eth.transport, sign_first); - let sign_promise = send_apdu(eth.transport, sign_more); - - await waitForAppScreen(sim, current_screen); - await sim.navigateAndCompareSnapshots('.', model.name + '_erc721_transfer', [8, -1, 0]); - - await sign_promise; -})); - -test('[Nano ' + model.letter + '] Transfer ERC-721 w/o NFT metadata', zemu(model, async(sim, eth) => { - const current_screen = sim.getMainMenuSnapshot(); - await send_apdu(eth.transport, set_plugin); - let sign_tx = send_apdu(eth.transport, sign_first); - - await expect(sign_tx).rejects.toEqual(new TransportStatusError(0x6a80)); -})); - -test('[Nano ' + model.letter + '] Transfer ERC-721 w/o plugin loaded', zemu(model, async (sim, eth) => { - const current_screen = sim.getMainMenuSnapshot(); - let nft_info = send_apdu(eth.transport, provide_nft_info); - - await expect(nft_info).rejects.toEqual(new TransportStatusError(0x6985)); -})); diff --git a/tests/zemu/src/send.test.js b/tests/zemu/src/send.test.js deleted file mode 100644 index 1634974..0000000 --- a/tests/zemu/src/send.test.js +++ /dev/null @@ -1,38 +0,0 @@ -import "core-js/stable"; -import "regenerator-runtime/runtime"; -import { waitForAppScreen, zemu, nano_models } from './test.fixture'; -import { TransportStatusError } from "@ledgerhq/errors"; - -nano_models.forEach(function(model) { - test('[Nano ' + model.letter + '] Transfer Ether on Ethereum app', zemu(model, async (sim, eth) => { - - const tx = eth.signTransaction( - "44'/60'/1'/0/0", - 'EB44850306DC4200825208945A321744667052AFFA8386ED49E00EF223CBFFC3876F9C9E7BF6181880018080', - ); - - await waitForAppScreen(sim); - let clicks; - if (model.letter === 'S') clicks = 9; - else clicks = 5; - await sim.navigateAndCompareSnapshots('.', model.name + '_transfer_ethereum', [clicks, -1, 0]); - - await expect(tx).resolves.toEqual({ - "r": "6f389d15320f0501383526ed03de917c14212716f09a262dbc98431086a5db49", - "s": "0dc994b7b97230bb35fdf6fec2f4d8ff4cfb8bfeb2a652c364c738ff033c05dd", - "v": "26", - }); - })); -}); - -nano_models.forEach(function(model) { - test('[Nano ' + model.letter + '] Transfer amount >= 2^87 Eth on Ethereum app should fail', zemu(model, async (sim, eth) => { - - const tx = eth.signTransaction( - "44'/60'/1'/0/0", - 'f83f268e02cc9be5c53ea44bd43c289dcddc82520894dac17f958d2ee523a2206206994597c13d831ec7928db8b0861b8f7fe5df83cd553a829878000080018080', - ); - - await expect(tx).rejects.toEqual(new TransportStatusError(0x6807)); - })); -}); diff --git a/tests/zemu/src/send_bsc.test.js b/tests/zemu/src/send_bsc.test.js deleted file mode 100644 index 5d9daba..0000000 --- a/tests/zemu/src/send_bsc.test.js +++ /dev/null @@ -1,25 +0,0 @@ -import "core-js/stable"; -import "regenerator-runtime/runtime"; -import { waitForAppScreen, zemu, nano_models } from './test.fixture'; - -nano_models.forEach(function(model) { - test('[Nano ' + model.letter + '] Transfer bsc', zemu(model, async (sim, eth) => { - - const tx = eth.signTransaction( - "44'/60'/1'/0/0", - 'EB0185012A05F200825208945A321744667052AFFA8386ED49E00EF223CBFFC3876F9C9E7BF6181880388080', - ); - - await waitForAppScreen(sim); - let clicks; - if (model.letter === 'S') clicks = 10; - else clicks = 6; - await sim.navigateAndCompareSnapshots('.', model.name + '_transfer_bsc', [clicks, -1, 0]); - - await expect(tx).resolves.toEqual({ - "r": "f667cc34e9815df4f052fb3463cdbe355fff5c1acf4e919b3539806521a059ad", - "s": "6b35492b7108d9d9e1cc7aede536ed6b3173197b56dd873cbc3b43e041d6f407", - "v": "93", - }); - })); -}); diff --git a/tests/zemu/src/send_etc.test.js b/tests/zemu/src/send_etc.test.js deleted file mode 100644 index 6b5e7d0..0000000 --- a/tests/zemu/src/send_etc.test.js +++ /dev/null @@ -1,38 +0,0 @@ -import "core-js/stable"; -import "regenerator-runtime/runtime"; -import { EthAppPleaseEnableContractData } from "@ledgerhq/errors"; -import { waitForAppScreen, zemu, nano_models } from './test.fixture'; - -nano_models.forEach(function(model) { - test("[Nano " + model.letter + "] Transfer on Ethereum clone app", zemu(model, async (sim, eth) => { - const tx = eth.signTransaction( - "44'/60'/0'/0/0", - 'EB44850306DC4200825208945A321744667052AFFA8386ED49E00EF223CBFFC3876F9C9E7BF61818803D8080', - ); - - await waitForAppScreen(sim); - let clicks; - if (model.letter === 'S') clicks = 9; - else clicks = 5; - await sim.navigateAndCompareSnapshots('.', model.name + '_transfer_ethereum_clone', [clicks, -1, 0]); - - await expect(tx).resolves.toEqual({ - "r": "60df850d297e355596f87dc313a742032de4b59c5579186b3d59bdf31402fec0", - "s": "23c3a2beacabc1943d487a2e1d545e4c46c718b1e70e9d1c11a98828c9338927", - "v": "9e", - }); - }, true)); -}); - -nano_models.forEach(function(model) { - test("[Nano " + model.letter + "] Transfer on network 5234 on Ethereum clone", zemu(model, async (sim, eth) => { - const tx = eth.signTransaction( - "44'/60'/0'/0/0", - 'ED44850306DC4200825208945A321744667052AFFA8386ED49E00EF223CBFFC3876F9C9E7BF61818808214728080', - ); - - await expect(tx).rejects.toEqual(new EthAppPleaseEnableContractData( - "Please enable Contract data on the Ethereum app Settings" - )); - }, true)); -}); diff --git a/tests/zemu/src/test.fixture.js b/tests/zemu/src/test.fixture.js deleted file mode 100644 index 1a2f898..0000000 --- a/tests/zemu/src/test.fixture.js +++ /dev/null @@ -1,121 +0,0 @@ -import Zemu, { DEFAULT_START_OPTIONS, DeviceModel } from '@zondax/zemu'; -import Eth from '@ledgerhq/hw-app-eth'; -import {RLP} from "ethers/lib/utils"; - -const transactionUploadDelay = 60000; - -async function waitForAppScreen(sim, current_screen = null) { - if (current_screen === null) current_screen = sim.getMainMenuSnapshot(); - - await sim.waitUntilScreenIsNot(current_screen, transactionUploadDelay); -} - -const sim_options_nano = { - ...DEFAULT_START_OPTIONS, - logging: true, - X11: true, - startText: 'is ready' -}; - -const Resolve = require('path').resolve; - -const NANOS_ELF_PATH = Resolve('elfs/ethereum_nanos.elf'); -const NANOX_ELF_PATH = Resolve('elfs/ethereum_nanox.elf'); - -const NANOS_CLONE_ELF_PATH = Resolve("elfs/ethereum_classic_nanos.elf"); -const NANOX_CLONE_ELF_PATH = Resolve("elfs/ethereum_classic_nanox.elf"); - -const nano_models: DeviceModel[] = [ - { name: 'nanos', letter: 'S', path: NANOS_ELF_PATH, clone_path: NANOS_CLONE_ELF_PATH }/*, - { name: 'nanox', letter: 'X', path: NANOX_ELF_PATH, clone_path: NANOX_CLONE_ELF_PATH }*/ -]; - -const TIMEOUT = 1000000; - -// useful to take an apdu as a hex string and convert its JS representation -function apdu_as_string(str) { - let buffer = []; - - for (let i = 0; i < str.length; i += 2) { - const str_extract = str.substring(i, i + 2); - buffer[i / 2] = parseInt(str_extract, 16); - } - return { - cla: buffer[0], - ins: buffer[1], - p1: buffer[2], - p2: buffer[3], - data: Buffer.from(buffer.slice(5)) - }; -} - -async function send_apdu(ts, apdu) { - return ts.send(apdu.cla, - apdu.ins, - apdu.p1, - apdu.p2, - apdu.data); -} - -// Generates a serializedTransaction from a rawHexTransaction copy pasted from etherscan. -function txFromEtherscan(rawTx) { - // Remove 0x prefix - rawTx = rawTx.slice(2); - - let txType = rawTx.slice(0, 2); - if (txType == "02" || txType == "01") { - // Remove "02" prefix - rawTx = rawTx.slice(2); - } else { - txType = ""; - } - - let decoded = RLP.decode("0x" + rawTx); - if (txType != "") { - decoded = decoded.slice(0, decoded.length - 3); // remove v, r, s - } else { - decoded[decoded.length - 1] = "0x"; // empty - decoded[decoded.length - 2] = "0x"; // empty - decoded[decoded.length - 3] = "0x01"; // chainID 1 - } - - // Encode back the data, drop the '0x' prefix - let encoded = RLP.encode(decoded).slice(2); - - // Don't forget to prepend the txtype - return txType + encoded; -} - -function zemu(device, func, start_clone = false) { - return async () => { - jest.setTimeout(TIMEOUT); - let elf_path; - let lib_elf; - if (start_clone) { - elf_path = device.clone_path; - lib_elf = { 'Ethereum': device.path }; - } - else { - elf_path = device.path; - } - const sim = new Zemu(elf_path, lib_elf); - try { - await sim.start({...sim_options_nano, model: device.name}); - const transport = await sim.getTransport(); - await func(sim, new Eth(transport)); - } finally { - await sim.close(); - } - }; -} - -module.exports = { - zemu, - waitForAppScreen, - sim_options_nano, - nano_models, - TIMEOUT, - txFromEtherscan, - apdu_as_string, - send_apdu -} diff --git a/tests/zemu/yarn.lock b/tests/zemu/yarn.lock deleted file mode 100644 index b4b5395..0000000 --- a/tests/zemu/yarn.lock +++ /dev/null @@ -1,7475 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/cli@^7.7.0": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.14.3.tgz#9f6c8aee12e8660df879610f19a8010958b26a6f" - integrity sha512-zU4JLvwk32ay1lhhyGfqiRUSPoltVDjhYkA3aQq8+Yby9z30s/EsFw1EPOHxWG9YZo2pAGfgdRNeHZQAYU5m9A== - dependencies: - commander "^4.0.1" - convert-source-map "^1.1.0" - fs-readdir-recursive "^1.1.0" - glob "^7.0.0" - make-dir "^2.1.0" - slash "^2.0.0" - source-map "^0.5.0" - optionalDependencies: - "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents" - chokidar "^3.4.0" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" - integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== - dependencies: - "@babel/highlight" "^7.12.13" - -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" - integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q== - -"@babel/core@^7.1.0", "@babel/core@^7.7.2", "@babel/core@^7.7.5": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" - integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.3" - "@babel/helper-compilation-targets" "^7.13.16" - "@babel/helper-module-transforms" "^7.14.2" - "@babel/helpers" "^7.14.0" - "@babel/parser" "^7.14.3" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.2" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/generator@^7.14.2", "@babel/generator@^7.14.3", "@babel/generator@^7.4.0": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" - integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== - dependencies: - "@babel/types" "^7.14.2" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" - integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" - integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" - integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== - dependencies: - "@babel/compat-data" "^7.13.15" - "@babel/helper-validator-option" "^7.12.17" - browserslist "^4.14.5" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.14.0", "@babel/helper-create-class-features-plugin@^7.14.3": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.3.tgz#832111bcf4f57ca57a4c5b1a000fc125abc6554a" - integrity sha512-BnEfi5+6J2Lte9LeiL6TxLWdIlEv9Woacc1qXzXBgbikcOzMRM2Oya5XGg/f/ngotv1ej2A/b+3iJH8wbS1+lQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.14.2" - "@babel/helper-member-expression-to-functions" "^7.13.12" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.14.3" - "@babel/helper-split-export-declaration" "^7.12.13" - -"@babel/helper-create-regexp-features-plugin@^7.12.13": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.3.tgz#149aa6d78c016e318c43e2409a0ae9c136a86688" - integrity sha512-JIB2+XJrb7v3zceV2XzDhGIB902CmKGSpSl4q2C6agU9SNLG/2V1RtFRGPG1Ajh9STj3+q6zJMOC+N/pp2P9DA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - regexpu-core "^4.7.1" - -"@babel/helper-define-polyfill-provider@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.1.tgz#e6f5f4a6edc3722152c21359190de67fc6cf664d" - integrity sha512-x3AUTVZNPunaw1opRTa5OwVA5N0YxGlIad9xQ5QflK1uIS7PnAGGU5O2Dj/G183fR//N8AzTq+Q8+oiu9m0VFg== - dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-explode-assignable-expression@^7.12.13": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" - integrity sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA== - dependencies: - "@babel/types" "^7.13.0" - -"@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" - integrity sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ== - dependencies: - "@babel/helper-get-function-arity" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/types" "^7.14.2" - -"@babel/helper-get-function-arity@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" - integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-hoist-variables@^7.13.0": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz#1b1651249e94b51f8f0d33439843e33e39775b30" - integrity sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg== - dependencies: - "@babel/traverse" "^7.13.15" - "@babel/types" "^7.13.16" - -"@babel/helper-member-expression-to-functions@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" - integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== - dependencies: - "@babel/types" "^7.13.12" - -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" - integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== - dependencies: - "@babel/types" "^7.13.12" - -"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.0", "@babel/helper-module-transforms@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" - integrity sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA== - dependencies: - "@babel/helper-module-imports" "^7.13.12" - "@babel/helper-replace-supers" "^7.13.12" - "@babel/helper-simple-access" "^7.13.12" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.14.0" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.2" - -"@babel/helper-optimise-call-expression@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" - integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" - integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== - -"@babel/helper-remap-async-to-generator@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" - integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-wrap-function" "^7.13.0" - "@babel/types" "^7.13.0" - -"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.12", "@babel/helper-replace-supers@^7.14.3": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz#ca17b318b859d107f0e9b722d58cf12d94436600" - integrity sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.13.12" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.2" - -"@babel/helper-simple-access@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" - integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== - dependencies: - "@babel/types" "^7.13.12" - -"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" - integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== - dependencies: - "@babel/types" "^7.12.1" - -"@babel/helper-split-export-declaration@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" - integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" - integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== - -"@babel/helper-validator-option@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" - integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== - -"@babel/helper-wrap-function@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" - integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA== - dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" - -"@babel/helpers@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" - integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== - dependencies: - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.14.0" - -"@babel/highlight@^7.12.13": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" - integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.0" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.4.3": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.3.tgz#9b530eecb071fd0c93519df25c5ff9f14759f298" - integrity sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ== - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" - integrity sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" - -"@babel/plugin-proposal-async-generator-functions@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz#3a2085abbf5d5f962d480dbc81347385ed62eb1e" - integrity sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-remap-async-to-generator" "^7.13.0" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" - integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - -"@babel/plugin-proposal-class-static-block@^7.13.11": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.3.tgz#5a527e2cae4a4753119c3a3e7f64ecae8ccf1360" - integrity sha512-HEjzp5q+lWSjAgJtSluFDrGGosmwTgKwCXdDQZvhKsRlwv3YdkUEqxNrrjesJd+B9E9zvr1PVPVBvhYZ9msjvQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.3" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-class-static-block" "^7.12.13" - -"@babel/plugin-proposal-dynamic-import@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.2.tgz#01ebabd7c381cff231fa43e302939a9de5be9d9f" - integrity sha512-oxVQZIWFh91vuNEMKltqNsKLFWkOIyJc95k2Gv9lWVyDfPUQGSSlbDEgWuJUU1afGE9WwlzpucMZ3yDRHIItkA== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.2.tgz#62542f94aa9ce8f6dba79eec698af22112253791" - integrity sha512-sRxW3z3Zp3pFfLAgVEvzTFutTXax837oOatUIvSG9o5gRj9mKwm3br1Se5f4QalTQs9x4AzlA/HrCWbQIHASUQ== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.2.tgz#830b4e2426a782e8b2878fbfe2cba85b70cbf98c" - integrity sha512-w2DtsfXBBJddJacXMBhElGEYqCZQqN99Se1qeYn8DVLB33owlrlLftIbMzn5nz1OITfDVknXF433tBrLEAOEjA== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz#222348c080a1678e0e74ea63fe76f275882d1fd7" - integrity sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz#425b11dc62fc26939a2ab42cbba680bdf5734546" - integrity sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.2.tgz#82b4cc06571143faf50626104b335dd71baa4f9e" - integrity sha512-DcTQY9syxu9BpU3Uo94fjCB3LN9/hgPS8oUL7KrSW3bA2ePrKZZPJcc5y0hoJAM9dft3pGfErtEUvxXQcfLxUg== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.2.tgz#e17d418f81cc103fedd4ce037e181c8056225abc" - integrity sha512-hBIQFxwZi8GIp934+nj5uV31mqclC1aYDhctDu5khTi9PCCUOczyy0b34W0oE9U/eJXiqQaKyVsmjeagOaSlbw== - dependencies: - "@babel/compat-data" "^7.14.0" - "@babel/helper-compilation-targets" "^7.13.16" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.14.2" - -"@babel/plugin-proposal-optional-catch-binding@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz#150d4e58e525b16a9a1431bd5326c4eed870d717" - integrity sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz#df8171a8b9c43ebf4c1dabe6311b432d83e1b34e" - integrity sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" - integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - -"@babel/plugin-proposal-private-property-in-object@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz#b1a1f2030586b9d3489cc26179d2eb5883277636" - integrity sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-create-class-features-plugin" "^7.14.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-private-property-in-object" "^7.14.0" - -"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" - integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz#8e3d674b0613e67975ceac2776c97b60cafc5c9c" - integrity sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-flow@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz#5df9962503c0a9c918381c929d51d4d6949e7e86" - integrity sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz#762a4babec61176fec6c88480dec40372b140c0b" - integrity sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - -"@babel/plugin-syntax-top-level-await@^7.12.13", "@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" - integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-arrow-functions@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" - integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - -"@babel/plugin-transform-async-to-generator@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" - integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg== - dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-remap-async-to-generator" "^7.13.0" - -"@babel/plugin-transform-block-scoped-functions@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" - integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-block-scoping@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.2.tgz#761cb12ab5a88d640ad4af4aa81f820e6b5fdf5c" - integrity sha512-neZZcP19NugZZqNwMTH+KoBjx5WyvESPSIOQb4JHpfd+zPfqcH65RMu5xJju5+6q/Y2VzYrleQTr+b6METyyxg== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - -"@babel/plugin-transform-classes@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.2.tgz#3f1196c5709f064c252ad056207d87b7aeb2d03d" - integrity sha512-7oafAVcucHquA/VZCsXv/gmuiHeYd64UJyyTYU+MPfNu0KeNlxw06IeENBO8bJjXVbolu+j1MM5aKQtH1OMCNg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.14.2" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-replace-supers" "^7.13.12" - "@babel/helper-split-export-declaration" "^7.12.13" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" - integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - -"@babel/plugin-transform-destructuring@^7.13.17": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz#678d96576638c19d5b36b332504d3fd6e06dea27" - integrity sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - -"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" - integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-duplicate-keys@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" - integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-exponentiation-operator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" - integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-flow-strip-types@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.13.0.tgz#58177a48c209971e8234e99906cb6bd1122addd3" - integrity sha512-EXAGFMJgSX8gxWD7PZtW/P6M+z74jpx3wm/+9pn+c2dOawPpBkUX7BrfyPvo6ZpXbgRIEuwgwDb/MGlKvu2pOg== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-flow" "^7.12.13" - -"@babel/plugin-transform-for-of@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" - integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - -"@babel/plugin-transform-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" - integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== - dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" - integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-member-expression-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" - integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-modules-amd@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz#6622806fe1a7c07a1388444222ef9535f2ca17b0" - integrity sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw== - dependencies: - "@babel/helper-module-transforms" "^7.14.2" - "@babel/helper-plugin-utils" "^7.13.0" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz#52bc199cb581e0992edba0f0f80356467587f161" - integrity sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ== - dependencies: - "@babel/helper-module-transforms" "^7.14.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-simple-access" "^7.13.12" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-systemjs@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" - integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A== - dependencies: - "@babel/helper-hoist-variables" "^7.13.0" - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-identifier" "^7.12.11" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-umd@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz#2f8179d1bbc9263665ce4a65f305526b2ea8ac34" - integrity sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw== - dependencies: - "@babel/helper-module-transforms" "^7.14.0" - "@babel/helper-plugin-utils" "^7.13.0" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" - integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - -"@babel/plugin-transform-new-target@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" - integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-object-super@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" - integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" - -"@babel/plugin-transform-parameters@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz#e4290f72e0e9e831000d066427c4667098decc31" - integrity sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - -"@babel/plugin-transform-property-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" - integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-regenerator@^7.13.15": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz#e5eb28945bf8b6563e7f818945f966a8d2997f39" - integrity sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ== - dependencies: - regenerator-transform "^0.14.2" - -"@babel/plugin-transform-reserved-words@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" - integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-shorthand-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" - integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-spread@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" - integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - -"@babel/plugin-transform-sticky-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" - integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-template-literals@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" - integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - -"@babel/plugin-transform-typeof-symbol@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" - integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-unicode-escapes@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" - integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-unicode-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" - integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/preset-env@^7.7.1": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.2.tgz#e80612965da73579c84ad2f963c2359c71524ed5" - integrity sha512-7dD7lVT8GMrE73v4lvDEb85cgcQhdES91BSD7jS/xjC6QY8PnRhux35ac+GCpbiRhp8crexBvZZqnaL6VrY8TQ== - dependencies: - "@babel/compat-data" "^7.14.0" - "@babel/helper-compilation-targets" "^7.13.16" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-option" "^7.12.17" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" - "@babel/plugin-proposal-async-generator-functions" "^7.14.2" - "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-class-static-block" "^7.13.11" - "@babel/plugin-proposal-dynamic-import" "^7.14.2" - "@babel/plugin-proposal-export-namespace-from" "^7.14.2" - "@babel/plugin-proposal-json-strings" "^7.14.2" - "@babel/plugin-proposal-logical-assignment-operators" "^7.14.2" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.2" - "@babel/plugin-proposal-numeric-separator" "^7.14.2" - "@babel/plugin-proposal-object-rest-spread" "^7.14.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.14.2" - "@babel/plugin-proposal-optional-chaining" "^7.14.2" - "@babel/plugin-proposal-private-methods" "^7.13.0" - "@babel/plugin-proposal-private-property-in-object" "^7.14.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.12.13" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.0" - "@babel/plugin-syntax-top-level-await" "^7.12.13" - "@babel/plugin-transform-arrow-functions" "^7.13.0" - "@babel/plugin-transform-async-to-generator" "^7.13.0" - "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.14.2" - "@babel/plugin-transform-classes" "^7.14.2" - "@babel/plugin-transform-computed-properties" "^7.13.0" - "@babel/plugin-transform-destructuring" "^7.13.17" - "@babel/plugin-transform-dotall-regex" "^7.12.13" - "@babel/plugin-transform-duplicate-keys" "^7.12.13" - "@babel/plugin-transform-exponentiation-operator" "^7.12.13" - "@babel/plugin-transform-for-of" "^7.13.0" - "@babel/plugin-transform-function-name" "^7.12.13" - "@babel/plugin-transform-literals" "^7.12.13" - "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.14.2" - "@babel/plugin-transform-modules-commonjs" "^7.14.0" - "@babel/plugin-transform-modules-systemjs" "^7.13.8" - "@babel/plugin-transform-modules-umd" "^7.14.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" - "@babel/plugin-transform-new-target" "^7.12.13" - "@babel/plugin-transform-object-super" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.14.2" - "@babel/plugin-transform-property-literals" "^7.12.13" - "@babel/plugin-transform-regenerator" "^7.13.15" - "@babel/plugin-transform-reserved-words" "^7.12.13" - "@babel/plugin-transform-shorthand-properties" "^7.12.13" - "@babel/plugin-transform-spread" "^7.13.0" - "@babel/plugin-transform-sticky-regex" "^7.12.13" - "@babel/plugin-transform-template-literals" "^7.13.0" - "@babel/plugin-transform-typeof-symbol" "^7.12.13" - "@babel/plugin-transform-unicode-escapes" "^7.12.13" - "@babel/plugin-transform-unicode-regex" "^7.12.13" - "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.14.2" - babel-plugin-polyfill-corejs2 "^0.2.0" - babel-plugin-polyfill-corejs3 "^0.2.0" - babel-plugin-polyfill-regenerator "^0.2.0" - core-js-compat "^3.9.0" - semver "^6.3.0" - -"@babel/preset-flow@^7.0.0": - version "7.13.13" - resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.13.13.tgz#a61a1c149b3f77589d795287744393444d5cdd9e" - integrity sha512-MDtwtamMifqq3R2mC7l3A3uFalUb3NH5TIBQWjN/epEPlZktcLq4se3J+ivckKrLMGsR7H9LW8+pYuIUN9tsKg== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-option" "^7.12.17" - "@babel/plugin-transform-flow-strip-types" "^7.13.0" - -"@babel/preset-modules@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" - integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-stage-0@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/preset-stage-0/-/preset-stage-0-7.8.3.tgz#b6a0eca1a3b72e07f9caf58f998e97568028f6f5" - integrity sha512-+l6FlG1j73t4wh78W41StbcCz0/9a1/y+vxfnjtHl060kSmcgMfGzK9MEkLvrCOXfhp9RCX+d88sm6rOqxEIEQ== - -"@babel/register@^7.7.0": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.13.16.tgz#ae3ab0b55c8ec28763877383c454f01521d9a53d" - integrity sha512-dh2t11ysujTwByQjXNgJ48QZ2zcXKQVdV8s0TbeMI0flmtGWCdTwK9tJiACHXPLmncm5+ktNn/diojA45JE4jg== - dependencies: - clone-deep "^4.0.1" - find-cache-dir "^2.0.0" - make-dir "^2.1.0" - pirates "^4.0.0" - source-map-support "^0.5.16" - -"@babel/runtime@^7.15.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" - integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.8.4": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" - integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.12.13", "@babel/template@^7.3.3", "@babel/template@^7.4.0": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" - integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/parser" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.15", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2", "@babel/traverse@^7.4.3": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" - integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.2" - "@babel/helper-function-name" "^7.14.2" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.14.2" - "@babel/types" "^7.14.2" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.16", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.2.tgz#4208ae003107ef8a057ea8333e56eb64d2f6a2c3" - integrity sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw== - dependencies: - "@babel/helper-validator-identifier" "^7.14.0" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@cnakazawa/watch@^1.0.3": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" - integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - -"@ethersproject/abi@5.4.0", "@ethersproject/abi@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.4.0.tgz#a6d63bdb3672f738398846d4279fa6b6c9818242" - integrity sha512-9gU2H+/yK1j2eVMdzm6xvHSnMxk8waIHQGYCZg5uvAyH0rsAzxkModzBSpbAkAuhKFEovC2S9hM4nPuLym8IZw== - dependencies: - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/abi@5.5.0", "@ethersproject/abi@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.5.0.tgz#fb52820e22e50b854ff15ce1647cc508d6660613" - integrity sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w== - dependencies: - "@ethersproject/address" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/constants" "^5.5.0" - "@ethersproject/hash" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - -"@ethersproject/abstract-provider@5.4.1", "@ethersproject/abstract-provider@^5.4.0": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz#e404309a29f771bd4d28dbafadcaa184668c2a6e" - integrity sha512-3EedfKI3LVpjSKgAxoUaI+gB27frKsxzm+r21w9G60Ugk+3wVLQwhi1LsEJAKNV7WoZc8CIpNrATlL1QFABjtQ== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/networks" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/web" "^5.4.0" - -"@ethersproject/abstract-provider@5.5.1", "@ethersproject/abstract-provider@^5.5.0": - version "5.5.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz#2f1f6e8a3ab7d378d8ad0b5718460f85649710c5" - integrity sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg== - dependencies: - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/networks" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - "@ethersproject/web" "^5.5.0" - -"@ethersproject/abstract-signer@5.4.1", "@ethersproject/abstract-signer@^5.4.0": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz#e4e9abcf4dd4f1ba0db7dff9746a5f78f355ea81" - integrity sha512-SkkFL5HVq1k4/25dM+NWP9MILgohJCgGv5xT5AcRruGz4ILpfHeBtO/y6j+Z3UN/PAjDeb4P7E51Yh8wcGNLGA== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - -"@ethersproject/abstract-signer@5.5.0", "@ethersproject/abstract-signer@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz#590ff6693370c60ae376bf1c7ada59eb2a8dd08d" - integrity sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA== - dependencies: - "@ethersproject/abstract-provider" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - -"@ethersproject/address@5.4.0", "@ethersproject/address@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3" - integrity sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" - -"@ethersproject/address@5.5.0", "@ethersproject/address@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.5.0.tgz#bcc6f576a553f21f3dd7ba17248f81b473c9c78f" - integrity sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw== - dependencies: - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/rlp" "^5.5.0" - -"@ethersproject/base64@5.4.0", "@ethersproject/base64@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a" - integrity sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ== - dependencies: - "@ethersproject/bytes" "^5.4.0" - -"@ethersproject/base64@5.5.0", "@ethersproject/base64@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.5.0.tgz#881e8544e47ed976930836986e5eb8fab259c090" - integrity sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA== - dependencies: - "@ethersproject/bytes" "^5.5.0" - -"@ethersproject/basex@5.4.0", "@ethersproject/basex@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.4.0.tgz#0a2da0f4e76c504a94f2b21d3161ed9438c7f8a6" - integrity sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - -"@ethersproject/basex@5.5.0", "@ethersproject/basex@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.5.0.tgz#e40a53ae6d6b09ab4d977bd037010d4bed21b4d3" - integrity sha512-ZIodwhHpVJ0Y3hUCfUucmxKsWQA5TMnavp5j/UOuDdzZWzJlRmuOjcTMIGgHCYuZmHt36BfiSyQPSRskPxbfaQ== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - -"@ethersproject/bignumber@5.4.1", "@ethersproject/bignumber@^5.4.0": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.1.tgz#64399d3b9ae80aa83d483e550ba57ea062c1042d" - integrity sha512-fJhdxqoQNuDOk6epfM7yD6J8Pol4NUCy1vkaGAkuujZm0+lNow//MKu1hLhRiYV4BsOHyBv5/lsTjF+7hWwhJg== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - bn.js "^4.11.9" - -"@ethersproject/bignumber@5.5.0", "@ethersproject/bignumber@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.5.0.tgz#875b143f04a216f4f8b96245bde942d42d279527" - integrity sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - bn.js "^4.11.9" - -"@ethersproject/bytes@5.4.0", "@ethersproject/bytes@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e" - integrity sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA== - dependencies: - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/bytes@5.5.0", "@ethersproject/bytes@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" - integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== - dependencies: - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/constants@5.4.0", "@ethersproject/constants@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a" - integrity sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - -"@ethersproject/constants@5.5.0", "@ethersproject/constants@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e" - integrity sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ== - dependencies: - "@ethersproject/bignumber" "^5.5.0" - -"@ethersproject/contracts@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.1.tgz#3eb4f35b7fe60a962a75804ada2746494df3e470" - integrity sha512-m+z2ZgPy4pyR15Je//dUaymRUZq5MtDajF6GwFbGAVmKz/RF+DNIPwF0k5qEcL3wPGVqUjFg2/krlCRVTU4T5w== - dependencies: - "@ethersproject/abi" "^5.4.0" - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - -"@ethersproject/contracts@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.5.0.tgz#b735260d4bd61283a670a82d5275e2a38892c197" - integrity sha512-2viY7NzyvJkh+Ug17v7g3/IJC8HqZBDcOjYARZLdzRxrfGlRgmYgl6xPRKVbEzy1dWKw/iv7chDcS83pg6cLxg== - dependencies: - "@ethersproject/abi" "^5.5.0" - "@ethersproject/abstract-provider" "^5.5.0" - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/address" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/constants" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - -"@ethersproject/hash@5.4.0", "@ethersproject/hash@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0" - integrity sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA== - dependencies: - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/hash@5.5.0", "@ethersproject/hash@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.5.0.tgz#7cee76d08f88d1873574c849e0207dcb32380cc9" - integrity sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg== - dependencies: - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/address" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - -"@ethersproject/hdnode@5.4.0", "@ethersproject/hdnode@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.4.0.tgz#4bc9999b9a12eb5ce80c5faa83114a57e4107cac" - integrity sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q== - dependencies: - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/basex" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/pbkdf2" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/signing-key" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/wordlists" "^5.4.0" - -"@ethersproject/hdnode@5.5.0", "@ethersproject/hdnode@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.5.0.tgz#4a04e28f41c546f7c978528ea1575206a200ddf6" - integrity sha512-mcSOo9zeUg1L0CoJH7zmxwUG5ggQHU1UrRf8jyTYy6HxdZV+r0PBoL1bxr+JHIPXRzS6u/UW4mEn43y0tmyF8Q== - dependencies: - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/basex" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/pbkdf2" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/sha2" "^5.5.0" - "@ethersproject/signing-key" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - "@ethersproject/wordlists" "^5.5.0" - -"@ethersproject/json-wallets@5.4.0", "@ethersproject/json-wallets@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz#2583341cfe313fc9856642e8ace3080154145e95" - integrity sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ== - dependencies: - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/hdnode" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/pbkdf2" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/random" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/json-wallets@5.5.0", "@ethersproject/json-wallets@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.5.0.tgz#dd522d4297e15bccc8e1427d247ec8376b60e325" - integrity sha512-9lA21XQnCdcS72xlBn1jfQdj2A1VUxZzOzi9UkNdnokNKke/9Ya2xA9aIK1SC3PQyBDLt4C+dfps7ULpkvKikQ== - dependencies: - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/address" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/hdnode" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/pbkdf2" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/random" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/keccak256@5.4.0", "@ethersproject/keccak256@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318" - integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A== - dependencies: - "@ethersproject/bytes" "^5.4.0" - js-sha3 "0.5.7" - -"@ethersproject/keccak256@5.5.0", "@ethersproject/keccak256@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.5.0.tgz#e4b1f9d7701da87c564ffe336f86dcee82983492" - integrity sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg== - dependencies: - "@ethersproject/bytes" "^5.5.0" - js-sha3 "0.8.0" - -"@ethersproject/logger@5.4.0", "@ethersproject/logger@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.0.tgz#f39adadf62ad610c420bcd156fd41270e91b3ca9" - integrity sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ== - -"@ethersproject/logger@5.5.0", "@ethersproject/logger@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" - integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== - -"@ethersproject/networks@5.4.2", "@ethersproject/networks@^5.4.0": - version "5.4.2" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.2.tgz#2247d977626e97e2c3b8ee73cd2457babde0ce35" - integrity sha512-eekOhvJyBnuibfJnhtK46b8HimBc5+4gqpvd1/H9LEl7Q7/qhsIhM81dI9Fcnjpk3jB1aTy6bj0hz3cifhNeYw== - dependencies: - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/networks@5.5.0", "@ethersproject/networks@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.5.0.tgz#babec47cab892c51f8dd652ce7f2e3e14283981a" - integrity sha512-KWfP3xOnJeF89Uf/FCJdV1a2aDJe5XTN2N52p4fcQ34QhDqQFkgQKZ39VGtiqUgHcLI8DfT0l9azC3KFTunqtA== - dependencies: - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/pbkdf2@5.4.0", "@ethersproject/pbkdf2@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz#ed88782a67fda1594c22d60d0ca911a9d669641c" - integrity sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - -"@ethersproject/pbkdf2@5.5.0", "@ethersproject/pbkdf2@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.5.0.tgz#e25032cdf02f31505d47afbf9c3e000d95c4a050" - integrity sha512-SaDvQFvXPnz1QGpzr6/HToLifftSXGoXrbpZ6BvoZhmx4bNLHrxDe8MZisuecyOziP1aVEwzC2Hasj+86TgWVg== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/sha2" "^5.5.0" - -"@ethersproject/properties@5.4.0", "@ethersproject/properties@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.0.tgz#38ba20539b44dcc5d5f80c45ad902017dcdbefe7" - integrity sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A== - dependencies: - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/properties@5.5.0", "@ethersproject/properties@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.5.0.tgz#61f00f2bb83376d2071baab02245f92070c59995" - integrity sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA== - dependencies: - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/providers@5.4.4": - version "5.4.4" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.4.tgz#6729120317942fc0ab0ecdb35e944ec6bbedb795" - integrity sha512-mQevyXj2X2D3l8p/JGDYFZbODhZjW6On15DnCK4Xc9y6b+P0vqorQC/j46omWSm4cyo7BQ/rgfhXNYmvAfyZoQ== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/basex" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/networks" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/random" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/web" "^5.4.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/providers@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.5.0.tgz#bc2876a8fe5e0053ed9828b1f3767ae46e43758b" - integrity sha512-xqMbDnS/FPy+J/9mBLKddzyLLAQFjrVff5g00efqxPzcAwXiR+SiCGVy6eJ5iAIirBOATjx7QLhDNPGV+AEQsw== - dependencies: - "@ethersproject/abstract-provider" "^5.5.0" - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/address" "^5.5.0" - "@ethersproject/basex" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/constants" "^5.5.0" - "@ethersproject/hash" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/networks" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/random" "^5.5.0" - "@ethersproject/rlp" "^5.5.0" - "@ethersproject/sha2" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - "@ethersproject/web" "^5.5.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/random@5.4.0", "@ethersproject/random@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.4.0.tgz#9cdde60e160d024be39cc16f8de3b9ce39191e16" - integrity sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/random@5.5.0", "@ethersproject/random@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.5.0.tgz#305ed9e033ca537735365ac12eed88580b0f81f9" - integrity sha512-egGYZwZ/YIFKMHcoBUo8t3a8Hb/TKYX8BCBoLjudVCZh892welR3jOxgOmb48xznc9bTcMm7Tpwc1gHC1PFNFQ== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/rlp@5.4.0", "@ethersproject/rlp@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931" - integrity sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/rlp@5.5.0", "@ethersproject/rlp@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.5.0.tgz#530f4f608f9ca9d4f89c24ab95db58ab56ab99a0" - integrity sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/sha2@5.4.0", "@ethersproject/sha2@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.4.0.tgz#c9a8db1037014cbc4e9482bd662f86c090440371" - integrity sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - hash.js "1.1.7" - -"@ethersproject/sha2@5.5.0", "@ethersproject/sha2@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" - integrity sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - hash.js "1.1.7" - -"@ethersproject/signing-key@5.4.0", "@ethersproject/signing-key@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec" - integrity sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/signing-key@5.5.0", "@ethersproject/signing-key@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.5.0.tgz#2aa37169ce7e01e3e80f2c14325f624c29cedbe0" - integrity sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/solidity@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.4.0.tgz#1305e058ea02dc4891df18b33232b11a14ece9ec" - integrity sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/solidity@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.5.0.tgz#2662eb3e5da471b85a20531e420054278362f93f" - integrity sha512-9NgZs9LhGMj6aCtHXhtmFQ4AN4sth5HuFXVvAQtzmm0jpSCNOTGtrHZJAeYTh7MBjRR8brylWZxBZR9zDStXbw== - dependencies: - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/sha2" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - -"@ethersproject/strings@5.4.0", "@ethersproject/strings@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a" - integrity sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/strings@5.5.0", "@ethersproject/strings@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.5.0.tgz#e6784d00ec6c57710755699003bc747e98c5d549" - integrity sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/constants" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/transactions@5.4.0", "@ethersproject/transactions@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0" - integrity sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ== - dependencies: - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" - "@ethersproject/signing-key" "^5.4.0" - -"@ethersproject/transactions@5.5.0", "@ethersproject/transactions@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.5.0.tgz#7e9bf72e97bcdf69db34fe0d59e2f4203c7a2908" - integrity sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA== - dependencies: - "@ethersproject/address" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/constants" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/rlp" "^5.5.0" - "@ethersproject/signing-key" "^5.5.0" - -"@ethersproject/units@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.4.0.tgz#d57477a4498b14b88b10396062c8cbbaf20c79fe" - integrity sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/units@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.5.0.tgz#104d02db5b5dc42cc672cc4587bafb87a95ee45e" - integrity sha512-7+DpjiZk4v6wrikj+TCyWWa9dXLNU73tSTa7n0TSJDxkYbV3Yf1eRh9ToMLlZtuctNYu9RDNNy2USq3AdqSbag== - dependencies: - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/constants" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/wallet@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.4.0.tgz#fa5b59830b42e9be56eadd45a16a2e0933ad9353" - integrity sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/hdnode" "^5.4.0" - "@ethersproject/json-wallets" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/random" "^5.4.0" - "@ethersproject/signing-key" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/wordlists" "^5.4.0" - -"@ethersproject/wallet@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.5.0.tgz#322a10527a440ece593980dca6182f17d54eae75" - integrity sha512-Mlu13hIctSYaZmUOo7r2PhNSd8eaMPVXe1wxrz4w4FCE4tDYBywDH+bAR1Xz2ADyXGwqYMwstzTrtUVIsKDO0Q== - dependencies: - "@ethersproject/abstract-provider" "^5.5.0" - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/address" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/hash" "^5.5.0" - "@ethersproject/hdnode" "^5.5.0" - "@ethersproject/json-wallets" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/random" "^5.5.0" - "@ethersproject/signing-key" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - "@ethersproject/wordlists" "^5.5.0" - -"@ethersproject/web@5.4.0", "@ethersproject/web@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f" - integrity sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og== - dependencies: - "@ethersproject/base64" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/web@5.5.0", "@ethersproject/web@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.5.0.tgz#0e5bb21a2b58fb4960a705bfc6522a6acf461e28" - integrity sha512-BEgY0eL5oH4mAo37TNYVrFeHsIXLRxggCRG/ksRIxI2X5uj5IsjGmcNiRN/VirQOlBxcUhCgHhaDLG4m6XAVoA== - dependencies: - "@ethersproject/base64" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - -"@ethersproject/wordlists@5.4.0", "@ethersproject/wordlists@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.4.0.tgz#f34205ec3bbc9e2c49cadaee774cf0b07e7573d7" - integrity sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/wordlists@5.5.0", "@ethersproject/wordlists@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.5.0.tgz#aac74963aa43e643638e5172353d931b347d584f" - integrity sha512-bL0UTReWDiaQJJYOC9sh/XcRu/9i2jMrzf8VLRmPKx58ckSlOJiohODkECCO50dtLZHcGU6MLXQ4OOrgBwP77Q== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/hash" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - -"@grpc/grpc-js@^1.5.5": - version "1.6.7" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.6.7.tgz#4c4fa998ff719fe859ac19fe977fdef097bb99aa" - integrity sha512-eBM03pu9hd3VqDQG+kHahiG1x80RGkkqqRb1Pchcwqej/KkAH95gAvKs6laqaHCycYaPK+TKuNQnOz9UXYA8qw== - dependencies: - "@grpc/proto-loader" "^0.6.4" - "@types/node" ">=12.12.47" - -"@grpc/proto-loader@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.4.tgz#5438c0d771e92274e77e631babdc14456441cbdc" - integrity sha512-7xvDvW/vJEcmLUltCUGOgWRPM8Oofv0eCFSVMuKqaqWJaXSzmB+m9hiyqe34QofAl4WAzIKUZZlinIF9FOHyTQ== - dependencies: - "@types/long" "^4.0.1" - lodash.camelcase "^4.3.0" - long "^4.0.0" - protobufjs "^6.10.0" - yargs "^16.1.1" - -"@grpc/proto-loader@^0.6.9": - version "0.6.12" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.12.tgz#459b619b8b9b67794bf0d1cb819653a38c63e164" - integrity sha512-filTVbETFnxb9CyRX98zN18ilChTuf/C5scZ2xyaOTp0EHGq0/ufX8rjqXUcSb1Gpv7eZq4M2jDvbh9BogKnrg== - dependencies: - "@types/long" "^4.0.1" - lodash.camelcase "^4.3.0" - long "^4.0.0" - protobufjs "^6.10.0" - yargs "^16.2.0" - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^24.7.1", "@jest/console@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" - integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== - dependencies: - "@jest/source-map" "^24.9.0" - chalk "^2.0.1" - slash "^2.0.0" - -"@jest/console@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" - integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^26.6.2" - jest-util "^26.6.2" - slash "^3.0.0" - -"@jest/core@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" - integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== - dependencies: - "@jest/console" "^26.6.2" - "@jest/reporters" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-changed-files "^26.6.2" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-resolve-dependencies "^26.6.3" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - jest-watcher "^26.6.2" - micromatch "^4.0.2" - p-each-series "^2.1.0" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" - integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== - dependencies: - "@jest/fake-timers" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - -"@jest/environment@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" - integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== - dependencies: - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - -"@jest/fake-timers@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" - integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== - dependencies: - "@jest/types" "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" - -"@jest/fake-timers@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" - integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== - dependencies: - "@jest/types" "^26.6.2" - "@sinonjs/fake-timers" "^6.0.1" - "@types/node" "*" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-util "^26.6.2" - -"@jest/globals@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" - integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/types" "^26.6.2" - expect "^26.6.2" - -"@jest/reporters@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" - integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.4" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^26.6.2" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^7.0.0" - optionalDependencies: - node-notifier "^8.0.0" - -"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" - integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.1.15" - source-map "^0.6.0" - -"@jest/source-map@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" - integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.4" - source-map "^0.6.0" - -"@jest/test-result@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" - integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== - dependencies: - "@jest/console" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/istanbul-lib-coverage" "^2.0.0" - -"@jest/test-result@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" - integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== - dependencies: - "@jest/console" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" - integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== - dependencies: - "@jest/test-result" "^24.9.0" - jest-haste-map "^24.9.0" - jest-runner "^24.9.0" - jest-runtime "^24.9.0" - -"@jest/test-sequencer@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" - integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== - dependencies: - "@jest/test-result" "^26.6.2" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - -"@jest/transform@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" - integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^24.9.0" - babel-plugin-istanbul "^5.1.0" - chalk "^2.0.1" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.1.15" - jest-haste-map "^24.9.0" - jest-regex-util "^24.9.0" - jest-util "^24.9.0" - micromatch "^3.1.10" - pirates "^4.0.1" - realpath-native "^1.1.0" - slash "^2.0.0" - source-map "^0.6.1" - write-file-atomic "2.4.1" - -"@jest/transform@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" - integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^26.6.2" - babel-plugin-istanbul "^6.0.0" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-regex-util "^26.0.0" - jest-util "^26.6.2" - micromatch "^4.0.2" - pirates "^4.0.1" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" - -"@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - -"@ledgerhq/cryptoassets@^6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/cryptoassets/-/cryptoassets-6.5.0.tgz#17250c928baa86603739ffcea19fc8de9f7fb860" - integrity sha512-HBmcfb9WTlcsqlzlHfd7nZr49on7ftpWmKXvxZu9DinLS7EZ5ZjgSvmxrx39YCS5yONILBJoA/BSpg1RcCbSjQ== - dependencies: - invariant "2" - -"@ledgerhq/devices@^4.78.0": - version "4.78.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-4.78.0.tgz#149b572f0616096e2bd5eb14ce14d0061c432be6" - integrity sha512-tWKS5WM/UU82czihnVjRwz9SXNTQzWjGJ/7+j/xZ70O86nlnGJ1aaFbs5/WTzfrVKpOKgj1ZoZkAswX67i/JTw== - dependencies: - "@ledgerhq/errors" "^4.78.0" - "@ledgerhq/logs" "^4.72.0" - rxjs "^6.5.3" - -"@ledgerhq/devices@^6.27.1": - version "6.27.1" - resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-6.27.1.tgz#3b13ab1d1ba8201e9e74a08f390560483978c962" - integrity sha512-jX++oy89jtv7Dp2X6gwt3MMkoajel80JFWcdc0HCouwDsV1mVJ3SQdwl/bQU0zd8HI6KebvUP95QTwbQLLK/RQ== - dependencies: - "@ledgerhq/errors" "^6.10.0" - "@ledgerhq/logs" "^6.10.0" - rxjs "6" - semver "^7.3.5" - -"@ledgerhq/devices@^6.3.0": - version "6.3.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-6.3.0.tgz#7ee59614198882311d1805912e368451527d05b2" - integrity sha512-DmVxqMAf3FhkpKjkbBCFVJ5DmesfplujeCLzFwO/zF5VGuwY7xxPqeSxlpusXJkqhEq+DbFzIDRWJYDf7rtXqg== - dependencies: - "@ledgerhq/errors" "^6.2.0" - "@ledgerhq/logs" "^6.2.0" - rxjs "6" - semver "^7.3.5" - -"@ledgerhq/errors@^4.78.0": - version "4.78.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-4.78.0.tgz#23daf3af54d03b1bda3e616002b555da1bdb705a" - integrity sha512-FX6zHZeiNtegBvXabK6M5dJ+8OV8kQGGaGtuXDeK/Ss5EmG4Ltxc6Lnhe8hiHpm9pCHtktOsnUVL7IFBdHhYUg== - -"@ledgerhq/errors@^6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.10.0.tgz#dda9127b65f653fbb2f74a55e8f0e550d69de6e4" - integrity sha512-fQFnl2VIXh9Yd41lGjReCeK+Q2hwxQJvLZfqHnKqWapTz68NHOv5QcI0OHuZVNEbv0xhgdLhi5b65kgYeQSUVg== - -"@ledgerhq/errors@^6.2.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.2.0.tgz#7dc2b3bf6bdedccdaa1b97dccacfa912c4fc22f8" - integrity sha512-eO03x8HJmG60WtlrMuahigW/rwywFdcGzCnihta/MjkM8BD9A660cKVkyIuheCcpaB7UV/r+QsRl9abHbjjaag== - -"@ledgerhq/hw-app-eth@^6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-6.5.0.tgz#7541d2455660532272d9c61b2e4e33add06255d9" - integrity sha512-2M43aXxVX3xPwmluG/7zXRljSWSMdifi19V2JR5ezjBhpNg+fgrg6cYOkl7nhyrelsCCaRhWmn3+KCNrkFYLOQ== - dependencies: - "@ledgerhq/cryptoassets" "^6.5.0" - "@ledgerhq/errors" "^6.2.0" - "@ledgerhq/hw-transport" "^6.3.0" - "@ledgerhq/logs" "^6.2.0" - axios "^0.21.1" - bignumber.js "^9.0.1" - ethers "^5.4.4" - -"@ledgerhq/hw-transport-http@^4.74.2": - version "4.78.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-http/-/hw-transport-http-4.78.0.tgz#7f69caf99c66bb5d5d13b4c83f105ceb51b4791e" - integrity sha512-fjrPCYdi8+h9YX+XpuSKE2IgWvjI0Sk+cYZKDKdch4lMMDefEXKYwE2Oi8p5aKmTMJgn0zGfJJuRrj9Du6NwIQ== - dependencies: - "@ledgerhq/errors" "^4.78.0" - "@ledgerhq/hw-transport" "^4.78.0" - "@ledgerhq/logs" "^4.72.0" - axios "^0.19.0" - ws "6" - -"@ledgerhq/hw-transport-http@^6.24.1": - version "6.27.1" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-http/-/hw-transport-http-6.27.1.tgz#25c6cf02c4b464fae416d163f9ab4fda7b6198ff" - integrity sha512-494Zk5jvHcasa5xjZW7l5g+QqJqLlZpuV/RvlIWnKHdVdrBWYvG/1VukQfJQPgbK3WHtt/9WhrnJoLI+xv2PrA== - dependencies: - "@ledgerhq/errors" "^6.10.0" - "@ledgerhq/hw-transport" "^6.27.1" - "@ledgerhq/logs" "^6.10.0" - axios "^0.26.1" - ws "8.5.0" - -"@ledgerhq/hw-transport@^4.78.0": - version "4.78.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-4.78.0.tgz#714786658e1f2fbc0569e06e2abf8d15d310d931" - integrity sha512-xQu16OMPQjFYLjqCysij+8sXtdWv2YLxPrB6FoLvEWGTlQ7yL1nUBRQyzyQtWIYqZd4THQowQmzm1VjxuN6SZw== - dependencies: - "@ledgerhq/devices" "^4.78.0" - "@ledgerhq/errors" "^4.78.0" - events "^3.0.0" - -"@ledgerhq/hw-transport@^6.24.1", "@ledgerhq/hw-transport@^6.27.1": - version "6.27.1" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.27.1.tgz#88072278f69c279cb6569352acd4ae2fec33ace3" - integrity sha512-hnE4/Fq1YzQI4PA1W0H8tCkI99R3UWDb3pJeZd6/Xs4Qw/q1uiQO+vNLC6KIPPhK0IajUfuI/P2jk0qWcMsuAQ== - dependencies: - "@ledgerhq/devices" "^6.27.1" - "@ledgerhq/errors" "^6.10.0" - events "^3.3.0" - -"@ledgerhq/hw-transport@^6.3.0": - version "6.3.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.3.0.tgz#4fc966b1a68c991c0a6b5384841f99c4f8304ce9" - integrity sha512-kdnVrgmxrFtKaRdkoaQBEa02RXgLzEBiooYbxA65BGSJig3PGWDS9LrqNpzLTZM1RQlivd9NLBmfwU2ze4chWA== - dependencies: - "@ledgerhq/devices" "^6.3.0" - "@ledgerhq/errors" "^6.2.0" - events "^3.3.0" - -"@ledgerhq/logs@^4.72.0": - version "4.72.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-4.72.0.tgz#43df23af013ad1135407e5cf33ca6e4c4c7708d5" - integrity sha512-o+TYF8vBcyySRsb2kqBDv/KMeme8a2nwWoG+lAWzbDmWfb2/MrVWYCVYDYvjXdSoI/Cujqy1i0gIDrkdxa9chA== - -"@ledgerhq/logs@^5.50.0": - version "5.50.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.50.0.tgz#29c6419e8379d496ab6d0426eadf3c4d100cd186" - integrity sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA== - -"@ledgerhq/logs@^6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.10.0.tgz#c012c1ecc1a0e53d50e6af381618dca5268461c1" - integrity sha512-lLseUPEhSFUXYTKj6q7s2O3s2vW2ebgA11vMAlKodXGf5AFw4zUoEbTz9CoFOC9jS6xY4Qr8BmRnxP/odT4Uuw== - -"@ledgerhq/logs@^6.2.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.2.0.tgz#9fb2d6f1811316697f7b3cc14607f6c608912419" - integrity sha512-SLyFyD7ElMhgKWPYedFGCT/ilcbGPgL5hXXYHxOM79Fs5fWi0zaUpt5oGqGMsOAAFaMa9/rbun0pokzPhEFz8A== - -"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents": - version "2.1.8-no-fsevents" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz#da7c3996b8e6e19ebd14d82eaced2313e7769f9b" - integrity sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.0", "@types/babel__core@^7.1.7": - version "7.1.14" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" - integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" - integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.0.tgz#0c888dd70b3ee9eebb6e4f200e809da0076262be" - integrity sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.11.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.1.tgz#654f6c4f67568e24c23b367e947098c6206fa639" - integrity sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw== - dependencies: - "@babel/types" "^7.3.0" - -"@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" - integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" - integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/long@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== - -"@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "18.0.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a" - integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA== - -"@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== - -"@types/prettier@^2.0.0": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0" - integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA== - -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== - -"@types/stack-utils@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" - integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== - -"@types/yargs-parser@*": - version "20.2.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" - integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== - -"@types/yargs@^13.0.0": - version "13.0.11" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.11.tgz#def2f0c93e4bdf2c61d7e34899b17e34be28d3b1" - integrity sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ== - dependencies: - "@types/yargs-parser" "*" - -"@types/yargs@^15.0.0": - version "15.0.13" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc" - integrity sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ== - dependencies: - "@types/yargs-parser" "*" - -"@zondax/zemu@^0.27.4": - version "0.27.4" - resolved "https://registry.yarnpkg.com/@zondax/zemu/-/zemu-0.27.4.tgz#4e306ba76f5c718d901c7948516668e944a6aa1e" - integrity sha512-bbYAW9JJUx+hVBdwkTonu+0q9WkeFQpcGMRUrzS/Gfc6rvhAQ+X9KrGhwGrnxmBuzajt0oXZ50QvoEJHBR9PDA== - dependencies: - "@grpc/grpc-js" "^1.5.5" - "@grpc/proto-loader" "^0.6.9" - "@ledgerhq/hw-transport" "^6.24.1" - "@ledgerhq/hw-transport-http" "^6.24.1" - axios "^0.26.0" - axios-retry "^3.2.0" - dockerode "^3.3.1" - elfy "^1.0.0" - fs-extra "^10.0.0" - get-port "^5.1.1" - path "^0.12.7" - pngjs "^6.0.0" - randomstring "^1.2.1" - rfb2 "^0.2.2" - sleep "^6.3.0" - -abab@^2.0.0, abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== - -acorn-globals@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" - integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== - dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-walk@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" - integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^5.5.3: - version "5.7.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" - integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== - -acorn@^6.0.1: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.2.4: - version "8.2.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.2.4.tgz#caba24b08185c3b56e3168e97d15ed17f4d31fd0" - integrity sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg== - -aes-js@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -ajv@^6.12.3: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^4.0.0, ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@^3.0.3, anymatch@~3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= - -array-uniq@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.2.tgz#5fcc373920775723cfd64d65c64bef53bf9eba6d" - integrity sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -asn1@~0.2.0, asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - -axios-retry@^3.2.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/axios-retry/-/axios-retry-3.2.4.tgz#f447a53c3456f5bfeca18f20c3a3272207d082ae" - integrity sha512-Co3UXiv4npi6lM963mfnuH90/YFLKWWDmoBYfxkHT5xtkSSWNqK9zdG3fw5/CP/dsoKB5aMMJCsgab+tp1OxLQ== - dependencies: - "@babel/runtime" "^7.15.4" - is-retry-allowed "^2.2.0" - -axios@^0.19.0: - version "0.19.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" - integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== - dependencies: - follow-redirects "1.5.10" - -axios@^0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" - integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== - dependencies: - follow-redirects "^1.10.0" - -axios@^0.26.0, axios@^0.26.1: - version "0.26.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" - integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== - dependencies: - follow-redirects "^1.14.8" - -babel-jest@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" - integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== - dependencies: - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/babel__core" "^7.1.0" - babel-plugin-istanbul "^5.1.0" - babel-preset-jest "^24.9.0" - chalk "^2.4.2" - slash "^2.0.0" - -babel-jest@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" - integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== - dependencies: - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/babel__core" "^7.1.7" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^26.6.2" - chalk "^4.0.0" - graceful-fs "^4.2.4" - slash "^3.0.0" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-istanbul@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" - integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - find-up "^3.0.0" - istanbul-lib-instrument "^3.3.0" - test-exclude "^5.2.3" - -babel-plugin-istanbul@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" - integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^4.0.0" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" - integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== - dependencies: - "@types/babel__traverse" "^7.0.6" - -babel-plugin-jest-hoist@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" - integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-polyfill-corejs2@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.1.tgz#ae2cf6d6f1aa7c0edcf04a25180e8856a6d1184f" - integrity sha512-hXGSPbr6IbjeMyGew+3uGIAkRjBFSOJ9FLDZNOfHuyJZCcoia4nd/72J0bSgvfytcVfUcP/dxEVcUhVJuQRtSw== - dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.1" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.1.tgz#786f40218040030f0edecfd48e6e59f1ee9bef53" - integrity sha512-WZCqF3DLUhdTD/P381MDJfuP18hdCZ+iqJ+wHtzhWENpsiof284JJ1tMQg1CE+hfCWyG48F7e5gDMk2c3Laz7w== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.1" - core-js-compat "^3.9.1" - -babel-plugin-polyfill-regenerator@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.1.tgz#ca9595d7d5f3afefec2d83126148b90db751a091" - integrity sha512-T3bYyL3Sll2EtC94v3f+fA8M28q7YPTOZdB++SRHjvYZTvtd+WorMUq3tDTD4Q7Kjk1LG0gGromslKjcO5p2TA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.1" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" - integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== - dependencies: - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^24.9.0" - -babel-preset-jest@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" - integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== - dependencies: - babel-plugin-jest-hoist "^26.6.2" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bcrypt-pbkdf@^1.0.0, bcrypt-pbkdf@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -bech32@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - -bignumber.js@^9.0.0, bignumber.js@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5" - integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA== - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bip32-path@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/bip32-path/-/bip32-path-0.4.2.tgz#5db0416ad6822712f077836e2557b8697c0c7c99" - integrity sha1-XbBBataCJxLwd4NuJVe4aXwMfJk= - -bip66@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" - integrity sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI= - dependencies: - safe-buffer "^5.0.1" - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.1, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browser-resolve@^1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== - dependencies: - resolve "1.1.7" - -browserify-aes@^1.0.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserslist@^4.14.5, browserslist@^4.16.6: - version "4.16.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" - integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== - dependencies: - caniuse-lite "^1.0.30001219" - colorette "^1.2.2" - electron-to-chromium "^1.3.723" - escalade "^3.1.1" - node-releases "^1.1.71" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== - -caniuse-lite@^1.0.30001219: - version "1.0.30001312" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz" - integrity sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ== - -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" - integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chokidar@^3.4.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" - optionalDependencies: - fsevents "~2.3.1" - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -cjs-module-lexer@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" - integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== - -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-js-compat@^3.9.0, core-js-compat@^3.9.1: - version "3.13.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.13.0.tgz#a88f5fa81d8e9b15d7f98abc4447a4dfca2a358f" - integrity sha512-jhbI2zpVskgfDC9mGRaDo1gagd0E0i/kYW0+WvibL/rafEHKAHO653hEXIxJHqRlRLITluXtRH3AGTL5qJmifQ== - dependencies: - browserslist "^4.16.6" - semver "7.0.0" - -core-js@^3.7.0: - version "3.13.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.13.0.tgz#58ca436bf01d6903aee3d364089868d0d89fe58d" - integrity sha512-iWDbiyha1M5vFwPFmQnvRv+tJzGbFAm6XimJUT0NgHYW3xZEs1SkCAcasWSVFxpI2Xb/V1DDJckq3v90+bQnog== - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.4: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.0: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssstyle@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" - integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== - dependencies: - cssom "0.3.x" - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -data-urls@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== - dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - -debug@=3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decimal.js@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" - integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -detect-newline@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" - integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== - -diff-sequences@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" - integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== - -docker-modem@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/docker-modem/-/docker-modem-3.0.0.tgz#cb912ad8daed42f858269fb3be6944df281ec12d" - integrity sha512-WwFajJ8I5geZ/dDZ5FDMDA6TBkWa76xWwGIGw8uzUjNUGCN0to83wJ8Oi1AxrJTC0JBn+7fvIxUctnawtlwXeg== - dependencies: - debug "^4.1.1" - readable-stream "^3.5.0" - split-ca "^1.0.1" - ssh2 "^0.8.7" - -dockerode@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/dockerode/-/dockerode-3.3.1.tgz#74f66e239e092e7910e2beae6322d35c44b08cdc" - integrity sha512-AS2mr8Lp122aa5n6d99HkuTNdRV1wkkhHwBdcnY6V0+28D3DSYwhxAk85/mM9XwD3RMliTxyr63iuvn5ZblFYQ== - dependencies: - docker-modem "^3.0.0" - tar-fs "~2.0.1" - -domexception@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== - dependencies: - webidl-conversions "^4.0.2" - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -drbg.js@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" - integrity sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs= - dependencies: - browserify-aes "^1.0.6" - create-hash "^1.1.2" - create-hmac "^1.1.4" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -electron-to-chromium@^1.3.723: - version "1.3.739" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz#f07756aa92cabd5a6eec6f491525a64fe62f98b9" - integrity sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A== - -elfy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/elfy/-/elfy-1.0.0.tgz#7a1c86af7d41e0a568cbb4a3fa5b685648d9efcd" - integrity sha512-4Kp3AA94jC085IJox+qnvrZ3PudqTi4gQNvIoTZfJJ9IqkRuCoqP60vCVYlIg00c5aYusi5Wjh2bf0cHYt+6gQ== - dependencies: - endian-reader "^0.3.0" - -elliptic@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" - integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -elliptic@6.5.4, elliptic@^6.5.2: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emittery@^0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" - integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -endian-reader@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/endian-reader/-/endian-reader-0.3.0.tgz#84eca436b80aed0d0639c47291338b932efe50a0" - integrity sha1-hOykNrgK7Q0GOcRykTOLky7+UKA= - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.18.0-next.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.2.tgz#6eb518b640262e8ddcbd48e0bc8549f82efd48a7" - integrity sha512-byRiNIQXE6HWNySaU6JohoNXzYgbBjztwFnBLUTiJmWXjaU9bSq3urQLUlNLQ292tc+gc07zYZXNZjaOoAX3sw== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.2" - is-callable "^1.2.3" - is-negative-zero "^2.0.1" - is-regex "^1.1.3" - is-string "^1.0.6" - object-inspect "^1.10.3" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escodegen@^1.9.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -ethereum-tx-decoder@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ethereum-tx-decoder/-/ethereum-tx-decoder-3.0.0.tgz#7ef704c1b7e228128cdb81d6a3d2ab57a378b90f" - integrity sha512-l+/K/CNAobJjfGs6lO4RrR17KQrwESrGH2GrkASn7MH2FAJRkItFP21Iy2fCOUjy1Y1nBVoTO6w1GPCgVQH2hg== - dependencies: - ethers "^4.0.37" - -ethers@^4.0.37: - version "4.0.48" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.48.tgz#330c65b8133e112b0613156e57e92d9009d8fbbe" - integrity sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g== - dependencies: - aes-js "3.0.0" - bn.js "^4.4.0" - elliptic "6.5.3" - hash.js "1.1.3" - js-sha3 "0.5.7" - scrypt-js "2.0.4" - setimmediate "1.0.4" - uuid "2.0.1" - xmlhttprequest "1.8.0" - -ethers@^5.4.4: - version "5.4.5" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.4.5.tgz#cec133b9f5b514dc55e2561ee7aa7218c33affd7" - integrity sha512-PPZ6flOAj230sXEWf/r/It6ZZ5c7EOVWx+PU87Glkbg79OtT7pLE1WgL4MRdwx6iF7HzSOvUUI+8cAmcdzo12w== - dependencies: - "@ethersproject/abi" "5.4.0" - "@ethersproject/abstract-provider" "5.4.1" - "@ethersproject/abstract-signer" "5.4.1" - "@ethersproject/address" "5.4.0" - "@ethersproject/base64" "5.4.0" - "@ethersproject/basex" "5.4.0" - "@ethersproject/bignumber" "5.4.1" - "@ethersproject/bytes" "5.4.0" - "@ethersproject/constants" "5.4.0" - "@ethersproject/contracts" "5.4.1" - "@ethersproject/hash" "5.4.0" - "@ethersproject/hdnode" "5.4.0" - "@ethersproject/json-wallets" "5.4.0" - "@ethersproject/keccak256" "5.4.0" - "@ethersproject/logger" "5.4.0" - "@ethersproject/networks" "5.4.2" - "@ethersproject/pbkdf2" "5.4.0" - "@ethersproject/properties" "5.4.0" - "@ethersproject/providers" "5.4.4" - "@ethersproject/random" "5.4.0" - "@ethersproject/rlp" "5.4.0" - "@ethersproject/sha2" "5.4.0" - "@ethersproject/signing-key" "5.4.0" - "@ethersproject/solidity" "5.4.0" - "@ethersproject/strings" "5.4.0" - "@ethersproject/transactions" "5.4.0" - "@ethersproject/units" "5.4.0" - "@ethersproject/wallet" "5.4.0" - "@ethersproject/web" "5.4.0" - "@ethersproject/wordlists" "5.4.0" - -ethers@^5.5.1: - version "5.5.1" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.5.1.tgz#d3259a95a42557844aa543906c537106c0406fbf" - integrity sha512-RodEvUFZI+EmFcE6bwkuJqpCYHazdzeR1nMzg+YWQSmQEsNtfl1KHGfp/FWZYl48bI/g7cgBeP2IlPthjiVngw== - dependencies: - "@ethersproject/abi" "5.5.0" - "@ethersproject/abstract-provider" "5.5.1" - "@ethersproject/abstract-signer" "5.5.0" - "@ethersproject/address" "5.5.0" - "@ethersproject/base64" "5.5.0" - "@ethersproject/basex" "5.5.0" - "@ethersproject/bignumber" "5.5.0" - "@ethersproject/bytes" "5.5.0" - "@ethersproject/constants" "5.5.0" - "@ethersproject/contracts" "5.5.0" - "@ethersproject/hash" "5.5.0" - "@ethersproject/hdnode" "5.5.0" - "@ethersproject/json-wallets" "5.5.0" - "@ethersproject/keccak256" "5.5.0" - "@ethersproject/logger" "5.5.0" - "@ethersproject/networks" "5.5.0" - "@ethersproject/pbkdf2" "5.5.0" - "@ethersproject/properties" "5.5.0" - "@ethersproject/providers" "5.5.0" - "@ethersproject/random" "5.5.0" - "@ethersproject/rlp" "5.5.0" - "@ethersproject/sha2" "5.5.0" - "@ethersproject/signing-key" "5.5.0" - "@ethersproject/solidity" "5.5.0" - "@ethersproject/strings" "5.5.0" - "@ethersproject/transactions" "5.5.0" - "@ethersproject/units" "5.5.0" - "@ethersproject/wallet" "5.5.0" - "@ethersproject/web" "5.5.0" - "@ethersproject/wordlists" "5.5.0" - -events@^3.0.0, events@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -exec-sh@^0.3.2: - version "0.3.6" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" - integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expect@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" - integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== - dependencies: - "@jest/types" "^24.9.0" - ansi-styles "^3.2.0" - jest-get-type "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-regex-util "^24.9.0" - -expect@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" - integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== - dependencies: - "@jest/types" "^26.6.2" - ansi-styles "^4.0.0" - jest-get-type "^26.3.0" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== - dependencies: - bser "2.1.1" - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-cache-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flow-bin@^0.112.0: - version "0.112.0" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.112.0.tgz#6a21c31937c4a2f23a750056a364c598a95ea216" - integrity sha512-vdcuKv0UU55vjv0e2EVh1ZxlU+TSNT19SkE+6gT1vYzTKtzYE6dLuAmBIiS3Rg2N9D9HOI6TKSyl53zPtqZLrA== - -follow-redirects@1.5.10: - version "1.5.10" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" - integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== - dependencies: - debug "=3.1.0" - -follow-redirects@^1.10.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" - integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== - -follow-redirects@^1.14.8: - version "1.15.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.0.tgz#06441868281c86d0dda4ad8bdaead2d02dca89d4" - integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" - integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-readdir-recursive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -fsevents@^2.1.2, fsevents@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.1, get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-port@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" - integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@~5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -google-protobuf@^3.11.0: - version "3.17.1" - resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.17.1.tgz#d5224fe7dc931f1a69cbdc5cb6e3d69ae74da651" - integrity sha512-CHisE5cwd66w6y/K4K7x2N+SSZ0HgPBQwky7lKsj2vr4nXPuXQ2uUZgMF/ctXnd4xHL747Lh8LUgby2nA8gViA== - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" - integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.0" - -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hmac-drbg@^1.0.0, hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== - dependencies: - whatwg-encoding "^1.0.1" - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -import-local@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" - integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -invariant@2, invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-bigint@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" - integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" - integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== - dependencies: - call-bind "^1.0.2" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" - integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.2.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" - integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" - integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== - -is-number-object@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" - integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-regex@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" - integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== - dependencies: - call-bind "^1.0.2" - has-symbols "^1.0.2" - -is-retry-allowed@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz#88f34cbd236e043e71b6932d09b0c65fb7b4d71d" - integrity sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg== - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== - -is-string@^1.0.5, is-string@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" - integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typedarray@^1.0.0, is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -istanbul-lib-coverage@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" - integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== - -istanbul-lib-coverage@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== - -istanbul-lib-instrument@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" - integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== - dependencies: - "@babel/generator" "^7.4.0" - "@babel/parser" "^7.4.3" - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" - istanbul-lib-coverage "^2.0.5" - semver "^6.0.0" - -istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-changed-files@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" - integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== - dependencies: - "@jest/types" "^26.6.2" - execa "^4.0.0" - throat "^5.0.0" - -jest-cli@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" - integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== - dependencies: - "@jest/core" "^26.6.3" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - import-local "^3.0.2" - is-ci "^2.0.0" - jest-config "^26.6.3" - jest-util "^26.6.2" - jest-validate "^26.6.2" - prompts "^2.0.1" - yargs "^15.4.1" - -jest-config@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" - integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== - dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^24.9.0" - "@jest/types" "^24.9.0" - babel-jest "^24.9.0" - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "^24.9.0" - jest-environment-node "^24.9.0" - jest-get-type "^24.9.0" - jest-jasmine2 "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - micromatch "^3.1.10" - pretty-format "^24.9.0" - realpath-native "^1.1.0" - -jest-config@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" - integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== - dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^26.6.3" - "@jest/types" "^26.6.2" - babel-jest "^26.6.3" - chalk "^4.0.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.4" - jest-environment-jsdom "^26.6.2" - jest-environment-node "^26.6.2" - jest-get-type "^26.3.0" - jest-jasmine2 "^26.6.3" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - micromatch "^4.0.2" - pretty-format "^26.6.2" - -jest-diff@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" - integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== - dependencies: - chalk "^2.0.1" - diff-sequences "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-diff@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" - integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== - dependencies: - chalk "^4.0.0" - diff-sequences "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-docblock@^24.3.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" - integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== - dependencies: - detect-newline "^2.1.0" - -jest-docblock@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" - integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== - dependencies: - detect-newline "^3.0.0" - -jest-each@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" - integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== - dependencies: - "@jest/types" "^24.9.0" - chalk "^2.0.1" - jest-get-type "^24.9.0" - jest-util "^24.9.0" - pretty-format "^24.9.0" - -jest-each@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" - integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== - dependencies: - "@jest/types" "^26.6.2" - chalk "^4.0.0" - jest-get-type "^26.3.0" - jest-util "^26.6.2" - pretty-format "^26.6.2" - -jest-environment-jsdom@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" - integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== - dependencies: - "@jest/environment" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - jest-util "^24.9.0" - jsdom "^11.5.1" - -jest-environment-jsdom@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" - integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - jsdom "^16.4.0" - -jest-environment-node@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" - integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== - dependencies: - "@jest/environment" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - jest-util "^24.9.0" - -jest-environment-node@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" - integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - -jest-get-type@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== - -jest-get-type@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" - integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== - -jest-haste-map@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" - integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== - dependencies: - "@jest/types" "^24.9.0" - anymatch "^2.0.0" - fb-watchman "^2.0.0" - graceful-fs "^4.1.15" - invariant "^2.2.4" - jest-serializer "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.9.0" - micromatch "^3.1.10" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^1.2.7" - -jest-haste-map@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" - integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== - dependencies: - "@jest/types" "^26.6.2" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-regex-util "^26.0.0" - jest-serializer "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - micromatch "^4.0.2" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.1.2" - -jest-jasmine2@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" - integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - co "^4.6.0" - expect "^24.9.0" - is-generator-fn "^2.0.0" - jest-each "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-runtime "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - pretty-format "^24.9.0" - throat "^4.0.0" - -jest-jasmine2@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" - integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^26.6.2" - is-generator-fn "^2.0.0" - jest-each "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - pretty-format "^26.6.2" - throat "^5.0.0" - -jest-leak-detector@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" - integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== - dependencies: - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-leak-detector@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" - integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== - dependencies: - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-matcher-utils@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" - integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== - dependencies: - chalk "^2.0.1" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-matcher-utils@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" - integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== - dependencies: - chalk "^4.0.0" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-message-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" - integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/stack-utils" "^1.0.1" - chalk "^2.0.1" - micromatch "^3.1.10" - slash "^2.0.0" - stack-utils "^1.0.1" - -jest-message-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" - integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/types" "^26.6.2" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.4" - micromatch "^4.0.2" - pretty-format "^26.6.2" - slash "^3.0.0" - stack-utils "^2.0.2" - -jest-mock@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" - integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== - dependencies: - "@jest/types" "^24.9.0" - -jest-mock@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" - integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - -jest-pnp-resolver@^1.2.1, jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== - -jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" - integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== - -jest-regex-util@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" - integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== - -jest-resolve-dependencies@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" - integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== - dependencies: - "@jest/types" "^26.6.2" - jest-regex-util "^26.0.0" - jest-snapshot "^26.6.2" - -jest-resolve@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" - integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== - dependencies: - "@jest/types" "^24.9.0" - browser-resolve "^1.11.3" - chalk "^2.0.1" - jest-pnp-resolver "^1.2.1" - realpath-native "^1.1.0" - -jest-resolve@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" - integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== - dependencies: - "@jest/types" "^26.6.2" - chalk "^4.0.0" - graceful-fs "^4.2.4" - jest-pnp-resolver "^1.2.2" - jest-util "^26.6.2" - read-pkg-up "^7.0.1" - resolve "^1.18.1" - slash "^3.0.0" - -jest-runner@^24.8.0, jest-runner@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" - integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.4.2" - exit "^0.1.2" - graceful-fs "^4.1.15" - jest-config "^24.9.0" - jest-docblock "^24.3.0" - jest-haste-map "^24.9.0" - jest-jasmine2 "^24.9.0" - jest-leak-detector "^24.9.0" - jest-message-util "^24.9.0" - jest-resolve "^24.9.0" - jest-runtime "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.6.0" - source-map-support "^0.5.6" - throat "^4.0.0" - -jest-runner@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" - integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== - dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.7.1" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-docblock "^26.0.0" - jest-haste-map "^26.6.2" - jest-leak-detector "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" - jest-runtime "^26.6.3" - jest-util "^26.6.2" - jest-worker "^26.6.2" - source-map-support "^0.5.6" - throat "^5.0.0" - -jest-runtime@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" - integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.9.0" - "@jest/source-map" "^24.3.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/yargs" "^13.0.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.1.15" - jest-config "^24.9.0" - jest-haste-map "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - realpath-native "^1.1.0" - slash "^2.0.0" - strip-bom "^3.0.0" - yargs "^13.3.0" - -jest-runtime@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" - integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== - dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/globals" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - cjs-module-lexer "^0.6.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - slash "^3.0.0" - strip-bom "^4.0.0" - yargs "^15.4.1" - -jest-serial-runner@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/jest-serial-runner/-/jest-serial-runner-1.1.0.tgz#867fcd3ce0284afdf742a7306a9cbfd998631aaf" - integrity sha512-QSCMVZMYPAB8ALys43sxgVt4R6slizz7wj2rbCQPvczMh/AOImKeRil6T0dqaXQUTT9UXYzq00zb1bdK5uGEVQ== - dependencies: - jest-runner "^24.8.0" - -jest-serializer@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" - integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== - -jest-serializer@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" - integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.4" - -jest-snapshot@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" - integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== - dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - expect "^24.9.0" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-resolve "^24.9.0" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - pretty-format "^24.9.0" - semver "^6.2.0" - -jest-snapshot@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" - integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== - dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^26.6.2" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.0.0" - chalk "^4.0.0" - expect "^26.6.2" - graceful-fs "^4.2.4" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - jest-haste-map "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" - natural-compare "^1.4.0" - pretty-format "^26.6.2" - semver "^7.3.2" - -jest-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" - integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== - dependencies: - "@jest/console" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/source-map" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - callsites "^3.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.15" - is-ci "^2.0.0" - mkdirp "^0.5.1" - slash "^2.0.0" - source-map "^0.6.0" - -jest-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" - integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^2.0.0" - micromatch "^4.0.2" - -jest-validate@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" - integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== - dependencies: - "@jest/types" "^24.9.0" - camelcase "^5.3.1" - chalk "^2.0.1" - jest-get-type "^24.9.0" - leven "^3.1.0" - pretty-format "^24.9.0" - -jest-validate@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" - integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== - dependencies: - "@jest/types" "^26.6.2" - camelcase "^6.0.0" - chalk "^4.0.0" - jest-get-type "^26.3.0" - leven "^3.1.0" - pretty-format "^26.6.2" - -jest-watcher@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" - integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== - dependencies: - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^26.6.2" - string-length "^4.0.1" - -jest-worker@^24.6.0, jest-worker@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" - integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== - dependencies: - merge-stream "^2.0.0" - supports-color "^6.1.0" - -jest-worker@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef" - integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q== - dependencies: - "@jest/core" "^26.6.3" - import-local "^3.0.2" - jest-cli "^26.6.3" - -js-sha256@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" - integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== - -js-sha3@0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" - integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= - -js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsdom@^11.5.1: - version "11.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" - integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== - dependencies: - abab "^2.0.0" - acorn "^5.5.3" - acorn-globals "^4.1.0" - array-equal "^1.0.0" - cssom ">= 0.3.2 < 0.4.0" - cssstyle "^1.0.0" - data-urls "^1.0.0" - domexception "^1.0.1" - escodegen "^1.9.1" - html-encoding-sniffer "^1.0.2" - left-pad "^1.3.0" - nwsapi "^2.0.7" - parse5 "4.0.0" - pn "^1.1.0" - request "^2.87.0" - request-promise-native "^1.0.5" - sax "^1.2.4" - symbol-tree "^3.2.2" - tough-cookie "^2.3.4" - w3c-hr-time "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.3" - whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.1" - ws "^5.2.0" - xml-name-validator "^3.0.0" - -jsdom@^16.4.0: - version "16.6.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" - integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.5" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -left-pad@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - -lodash@^4.17.19, lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^2.0.0, make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.2: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -mime-db@1.47.0: - version "1.47.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" - integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== - -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.30" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" - integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== - dependencies: - mime-db "1.47.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp-classic@^0.5.2: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - -mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nan@^2.12.1, nan@^2.14.0, nan@^2.14.1: - version "2.14.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" - integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - -node-notifier@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5" - integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== - dependencies: - growly "^1.3.0" - is-wsl "^2.2.0" - semver "^7.3.2" - shellwords "^0.1.1" - uuid "^8.3.0" - which "^2.0.2" - -node-releases@^1.1.71: - version "1.1.72" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" - integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== - -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -npm-run-path@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nwsapi@^2.0.7, nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.10.3: - version "1.10.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" - integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== - -object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.getownpropertydescriptors@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" - integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -p-each-series@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" - integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse5@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -path@^0.12.7: - version "0.12.7" - resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" - integrity sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8= - dependencies: - process "^0.11.1" - util "^0.10.3" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pirates@^4.0.0, pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== - -pngjs@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-6.0.0.tgz#ca9e5d2aa48db0228a52c419c3308e87720da821" - integrity sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg== - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -pretty-format@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== - dependencies: - "@jest/types" "^24.9.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - -pretty-format@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" - integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== - dependencies: - "@jest/types" "^26.6.2" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^17.0.1" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.1: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -prompts@^2.0.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" - integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -protobufjs@^6.10.0: - version "6.11.3" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.3.tgz#637a527205a35caa4f3e2a9a4a13ddffe0e7af74" - integrity sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" ">=13.7.0" - long "^4.0.0" - -psl@^1.1.28, psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -randombytes@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349cc09ec" - integrity sha1-Z0yZdgkBw8QRJ3GjHlIdw0nMCew= - -randomstring@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/randomstring/-/randomstring-1.2.1.tgz#71cd3cda24ad1b7e0b65286b3aa5c10853019349" - integrity sha512-eMnfell9XuU3jfCx3f4xCaFAt0YMFPZhx9R3PSStmLarDKg5j5vivqKhf/8pvG+VX/YkxsckHK/VPUrKa5V07A== - dependencies: - array-uniq "1.0.2" - randombytes "2.0.3" - -react-is@^16.8.4: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -read-pkg-up@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" - integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== - dependencies: - find-up "^3.0.0" - read-pkg "^3.0.0" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@^2.0.2: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== - dependencies: - picomatch "^2.2.1" - -realpath-native@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" - integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== - dependencies: - util.promisify "^1.0.0" - -regenerate-unicode-properties@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" - integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== - dependencies: - regenerate "^1.4.0" - -regenerate@^1.4.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== - -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== - dependencies: - "@babel/runtime" "^7.8.4" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpu-core@^4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" - integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.2.0" - regjsgen "^0.5.1" - regjsparser "^0.6.4" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.2.0" - -regjsgen@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" - integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== - -regjsparser@^0.6.4: - version "0.6.9" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" - integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ== - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.5: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.87.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= - -resolve@^1.10.0, resolve@^1.14.2, resolve@^1.18.1: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -rfb2@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/rfb2/-/rfb2-0.2.2.tgz#f9444b8803e6a31848e57911ace562ce0fee5598" - integrity sha512-+Aw0oED0zsoNQYFE3FUsD+a/lm9y8YwdQaERlWHm7G5hey3tiSQGq7tfe5sFAw5fbN7Zms38bVEDxIUAOq3mRw== - -rimraf@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== - -rxjs@6, rxjs@^6.5.3: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -scrypt-js@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" - integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== - -scrypt-js@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -secp256k1@^3.7.1: - version "3.8.0" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d" - integrity sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw== - dependencies: - bindings "^1.5.0" - bip66 "^1.1.5" - bn.js "^4.11.8" - create-hash "^1.2.0" - drbg.js "^1.0.1" - elliptic "^6.5.2" - nan "^2.14.0" - safe-buffer "^5.1.2" - -"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.2, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" - integrity sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48= - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -sleep@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/sleep/-/sleep-6.3.0.tgz#c524e0e6d8d2e45d3f14e0ba5650fbe45f2ae876" - integrity sha512-+WgYl951qdUlb1iS97UvQ01pkauoBK9ML9I/CMPg41v0Ze4EyMlTgFTDDo32iYj98IYqxIjDMRd+L71lawFfpQ== - dependencies: - nan "^2.14.1" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.16, source-map-support@^0.5.6: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f" - integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ== - -split-ca@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split-ca/-/split-ca-1.0.1.tgz#6c83aff3692fa61256e0cd197e05e9de157691a6" - integrity sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY= - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -ssh2-streams@~0.4.10: - version "0.4.10" - resolved "https://registry.yarnpkg.com/ssh2-streams/-/ssh2-streams-0.4.10.tgz#48ef7e8a0e39d8f2921c30521d56dacb31d23a34" - integrity sha512-8pnlMjvnIZJvmTzUIIA5nT4jr2ZWNNVHwyXfMGdRJbug9TpI3kd99ffglgfSWqujVv/0gxwMsDn9j9RVst8yhQ== - dependencies: - asn1 "~0.2.0" - bcrypt-pbkdf "^1.0.2" - streamsearch "~0.1.2" - -ssh2@^0.8.7: - version "0.8.9" - resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-0.8.9.tgz#54da3a6c4ba3daf0d8477a538a481326091815f3" - integrity sha512-GmoNPxWDMkVpMFa9LVVzQZHF6EW3WKmBwL+4/GeILf2hFmix5Isxm7Amamo8o7bHiU0tC+wXsGcUXOxp8ChPaw== - dependencies: - ssh2-streams "~0.4.10" - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -stack-utils@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" - integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== - dependencies: - escape-string-regexp "^2.0.0" - -stack-utils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" - integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== - dependencies: - escape-string-regexp "^2.0.0" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - -streamsearch@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" - integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -symbol-tree@^3.2.2, symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -tar-fs@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.1.tgz#e44086c1c60d31a4f0cf893b1c4e155dabfae9e2" - integrity sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.0.0" - -tar-stream@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -test-exclude@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" - integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== - dependencies: - glob "^7.1.3" - minimatch "^3.0.4" - read-pkg-up "^4.0.0" - require-main-filename "^2.0.0" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -throat@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= - -throat@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" - integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== - -tmpl@1.0.x: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.1.2" - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" - -tr46@^2.0.2: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - which-boxed-primitive "^1.0.2" - -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== - -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== - dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" - -unicode-match-property-value-ecmascript@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" - integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== - -unicode-property-aliases-ecmascript@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" - integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util.promisify@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" - integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - for-each "^0.3.3" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.1" - -util@^0.10.3: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" - integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== - dependencies: - inherits "2.0.3" - -uuid@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" - integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -uuid@^8.3.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-to-istanbul@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" - integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -w3c-hr-time@^1.0.1, w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7, walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= - dependencies: - makeerror "1.0.x" - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^6.4.1: - version "6.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" - integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3" - integrity sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg== - dependencies: - lodash "^4.7.0" - tr46 "^2.0.2" - webidl-conversions "^6.1.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1, which@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" - integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@6: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" - integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== - dependencies: - async-limiter "~1.0.0" - -ws@7.4.6, ws@^7.4.5: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -ws@8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== - -ws@^5.2.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" - integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== - dependencies: - async-limiter "~1.0.0" - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -xmlhttprequest@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" - integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^20.2.2: - version "20.2.7" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" - integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== - -yargs@^13.3.0: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - -yargs@^15.4.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^16.1.1, yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" diff --git a/tools/build_sdk.sh b/tools/build_sdk.sh deleted file mode 100755 index f4ec6a3..0000000 --- a/tools/build_sdk.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -# Clean the sdk -find ./ethereum-plugin-sdk/ -mindepth 1 -maxdepth 1 ! -name .git -exec rm -r {} \; - -# Copy exclusive files -cp -r src_plugin_sdk/* ./ethereum-plugin-sdk/ - -# Copy common sources -cp -r src_common/* ./ethereum-plugin-sdk/src/ diff --git a/tools/copy_clones.sh b/tools/copy_clones.sh new file mode 100755 index 0000000..6fcf062 --- /dev/null +++ b/tools/copy_clones.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +DEVICES=(nanos nanos2 nanox stax flex) + +for dev in "${DEVICES[@]}"; do + elf_file="build/${dev}/bin/app.elf" + if [[ -f ${elf_file} ]]; then + cp "${elf_file}" "tests/ragger/.test_dependencies/clone/build/${dev}/bin/" + else + echo "Ignoring unknown file/dev: ${elf_file}" + fi +done diff --git a/tools/gen_networks.py b/tools/gen_networks.py index 7c91b17..08b3da0 100755 --- a/tools/gen_networks.py +++ b/tools/gen_networks.py @@ -19,7 +19,7 @@ class Network: def get_network_glyph_name(net: Network) -> str: - return "stax_chain_%u_64px" % (net.chain_id) + return "chain_%u_64px" % (net.chain_id) def get_header() -> str: