Browse Source

update: tokens native, formatter, trigger action on project changes (#81)

Ayush 1 year ago
parent
commit
a3b87a4948
100 changed files with 6539 additions and 2605 deletions
  1. 36 0
      .github/.ghaignore
  2. 13 4
      .github/CONTRIBUTING.md
  3. 125 78
      .github/workflows/anchor.yml
  4. 21 0
      .github/workflows/biome.yml
  5. 3 3
      .github/workflows/rust.yml
  6. 13 36
      .github/workflows/solana-native.yml
  7. 1 0
      .gitignore
  8. 4 0
      .husky/pre-commit
  9. 838 47
      Cargo.lock
  10. 8 0
      Cargo.toml
  11. 27 35
      basics/account-data/anchor/tests/test.ts
  12. 193 588
      basics/account-data/native/pnpm-lock.yaml
  13. 8 16
      basics/account-data/native/tests/test.ts
  14. 20 29
      basics/checking-accounts/anchor/tests/test.ts
  15. 4 13
      basics/checking-accounts/native/tests/test.ts
  16. 2 2
      basics/close-account/anchor/migrations/deploy.ts
  17. 24 32
      basics/close-account/anchor/tests/close-account.ts
  18. 6 21
      basics/close-account/native/tests/close-account.test.ts
  19. 41 51
      basics/close-account/native/ts/instructions/close.ts
  20. 3 12
      basics/close-account/native/ts/instructions/create.ts
  21. 3 3
      basics/close-account/native/ts/instructions/index.ts
  22. 25 26
      basics/close-account/native/ts/state/index.ts
  23. 2 2
      basics/counter/anchor/migrations/deploy.ts
  24. 27 42
      basics/counter/anchor/tests/counter_anchor.ts
  25. 9 9
      basics/counter/mpl-stack/.solitarc.js
  26. 1 1
      basics/counter/mpl-stack/idl/counter_mpl_stack.json
  27. 1 1
      basics/counter/mpl-stack/idl/counter_solana_native.json
  28. 5 5
      basics/counter/mpl-stack/jest.config.js
  29. 96 110
      basics/counter/mpl-stack/tests/counter.test.ts
  30. 29 47
      basics/counter/mpl-stack/ts/generated/accounts/Counter.ts
  31. 3 3
      basics/counter/mpl-stack/ts/generated/accounts/index.ts
  32. 5 5
      basics/counter/mpl-stack/ts/generated/index.ts
  33. 12 12
      basics/counter/mpl-stack/ts/generated/instructions/Increment.ts
  34. 1 1
      basics/counter/mpl-stack/ts/generated/instructions/index.ts
  35. 1 1
      basics/counter/mpl-stack/ts/index.ts
  36. 12 23
      basics/counter/native/tests/counter.test.ts
  37. 8 8
      basics/counter/native/ts/accounts/counter.ts
  38. 1 1
      basics/counter/native/ts/accounts/index.ts
  39. 1 1
      basics/counter/native/ts/index.ts
  40. 17 21
      basics/counter/native/ts/instructions/createIncrementInstruction.ts
  41. 1 1
      basics/counter/native/ts/instructions/index.ts
  42. 2 2
      basics/counter/seahorse/migrations/deploy.ts
  43. 10 15
      basics/counter/seahorse/tests/counter_seahorse.ts
  44. 19 20
      basics/create-account/anchor/tests/test.ts
  45. 4 11
      basics/create-account/native/tests/test.ts
  46. 2 2
      basics/cross-program-invocation/anchor/migrations/deploy.ts
  47. 10 10
      basics/cross-program-invocation/anchor/tests/cpi.ts
  48. 63 90
      basics/cross-program-invocation/native/tests/test.ts
  49. 4 4
      basics/hello-solana/anchor/tests/test.ts
  50. 13 17
      basics/hello-solana/native/tests/test.ts
  51. 2 2
      basics/hello-solana/seahorse/hello_solana/migrations/deploy.ts
  52. 4 4
      basics/hello-solana/seahorse/hello_solana/tests/hello_solana.ts
  53. 26 31
      basics/pda-rent-payer/anchor/tests/test.ts
  54. 95 88
      basics/pda-rent-payer/native/tests/test.ts
  55. 7 8
      basics/processing-instructions/anchor/tests/test.ts
  56. 54 59
      basics/processing-instructions/native/tests/test.ts
  57. 23 27
      basics/program-derived-addresses/anchor/tests/test.ts
  58. 135 131
      basics/program-derived-addresses/native/tests/test.ts
  59. 2 2
      basics/realloc/anchor/migrations/deploy.ts
  60. 17 17
      basics/realloc/anchor/package.json
  61. 34 34
      basics/realloc/anchor/tests/anchor-realloc.ts
  62. 9 10
      basics/realloc/anchor/tsconfig.json
  63. 12 38
      basics/realloc/native/tests/realloc.test.ts
  64. 1 2
      basics/realloc/native/ts/index.ts
  65. 61 65
      basics/realloc/native/ts/instructions/create.ts
  66. 1 1
      basics/realloc/native/ts/instructions/index.ts
  67. 4 4
      basics/realloc/native/ts/instructions/instruction.ts
  68. 112 119
      basics/realloc/native/ts/instructions/reallocate.ts
  69. 36 35
      basics/realloc/native/ts/state/address-info.ts
  70. 42 41
      basics/realloc/native/ts/state/enhanced-address-info.ts
  71. 1 1
      basics/realloc/native/ts/state/index.ts
  72. 36 35
      basics/realloc/native/ts/state/work-info.ts
  73. 1 1
      basics/realloc/native/ts/util/index.ts
  74. 2 6
      basics/realloc/native/ts/util/util.ts
  75. 9 11
      basics/rent/anchor/tests/test.ts
  76. 6 12
      basics/rent/native/tests/test.ts
  77. 22 34
      basics/repository-layout/anchor/tests/test.ts
  78. 9 15
      basics/repository-layout/native/tests/test.ts
  79. 33 55
      basics/transfer-sol/anchor/tests/test.ts
  80. 49 54
      basics/transfer-sol/native/tests/instruction.ts
  81. 14 40
      basics/transfer-sol/native/tests/test.ts
  82. 2 2
      basics/transfer-sol/seahorse/migrations/deploy.ts
  83. 17 17
      basics/transfer-sol/seahorse/package.json
  84. 8 11
      basics/transfer-sol/seahorse/tests/seahorse.ts
  85. 9 10
      basics/transfer-sol/seahorse/tsconfig.json
  86. 56 0
      biome.json
  87. 0 0
      compression/cnft-burn/anchor/.gitignore
  88. 0 0
      compression/cnft-burn/anchor/.prettierignore
  89. 0 0
      compression/cnft-burn/anchor/Anchor.toml
  90. 0 0
      compression/cnft-burn/anchor/Cargo.toml
  91. 0 0
      compression/cnft-burn/anchor/README.md
  92. 2 2
      compression/cnft-burn/anchor/migrations/deploy.ts
  93. 0 0
      compression/cnft-burn/anchor/package.json
  94. 3731 0
      compression/cnft-burn/anchor/pnpm-lock.yaml
  95. 0 0
      compression/cnft-burn/anchor/programs/cnft-burn/Cargo.toml
  96. 0 0
      compression/cnft-burn/anchor/programs/cnft-burn/Xargo.toml
  97. 0 0
      compression/cnft-burn/anchor/programs/cnft-burn/src/lib.rs
  98. 40 70
      compression/cnft-burn/anchor/tests/ReadApi/WrapperConnection.ts
  99. 18 18
      compression/cnft-burn/anchor/tests/ReadApi/types.ts
  100. 20 32
      compression/cnft-burn/anchor/tests/cnft-burn.ts

+ 36 - 0
.github/.ghaignore

@@ -0,0 +1,36 @@
+# build and test error
+basics/realloc/native
+basics/cross-program-invocation/native
+
+# uses generated client from shank, can't rewrite to solana-bankrun
+tools/shank-and-solita/native
+
+# can't test on localnet
+tokens/pda-mint-authority/native
+tokens/nft-minter/native
+tokens/transfer-tokens/native
+tokens/spl-token-minter/native
+tokens/create-token/native
+tokens/create-token/anchor
+tokens/nft-minter/anchor
+tokens/pda-mint-authority/anchor
+tokens/spl-token-minter/anchor
+tokens/token-swap/anchor
+tokens/transfer-tokens/anchor
+
+# not building with stable solana
+tokens/token-2022/mint-close-authority/native
+tokens/token-2022/non-transferable/native
+tokens/token-2022/default-account-state/native
+tokens/token-2022/transfer-fee/native
+tokens/token-2022/multiple-extensions/native
+
+# not building
+oracles/pyth/anchor
+
+# not building
+compression/cutils/anchor
+compression/cnft-vault/anchor
+# builds but need to test on localhost
+compression/cnft-burn/anchor
+tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor

+ 13 - 4
.github/CONTRIBUTING.md

@@ -17,11 +17,13 @@ When contributing code examples, please follow these guidelines to ensure progra
 
 1. Use pnpm as the default package manager for the project. You can install pnpm by following the instructions [here](https://pnpm.io/installation). Commit pnpm-lock.yaml to the repository.
 
-2. Tests for Solana native and Anchor programs should be written with [ts-mocha](https://github.com/piotrwitek/ts-mocha).
+2. Programs written for Solana Native should be in directory `native` and Anchor programs should be in directory `anchor`.
 
-3. Tests for solana native programs should be written with [solana-bankrun](https://kevinheavey.github.io/solana-bankrun)
+3. Tests for Solana native and Anchor programs should be written with [ts-mocha](https://github.com/piotrwitek/ts-mocha).
 
-4. here are some helpful scripts to add to your `package.json` file:
+4. Tests for solana native programs should be written with [solana-bankrun](https://kevinheavey.github.io/solana-bankrun)
+
+5. For Solana native programs ensure adding these mandatory pnpm run scripts to your `package.json`. file for successful ci/cd builds:
 
 ```json
 "scripts": {
@@ -32,7 +34,14 @@ When contributing code examples, please follow these guidelines to ensure progra
 },
 ```
 
-5. Test command for anchor should execute `pnpm test` instead of `yarn run test` for anchor programs. Replace `yarn` with `pnpm` in `[script]` table inside [Anchor.toml file.](https://www.anchor-lang.com/docs/manifest#scripts-required-for-testing)
+6. Test command for anchor should execute `pnpm test` instead of `yarn run test` for anchor programs. Replace `yarn` with `pnpm` in `[script]` table inside [Anchor.toml file.](https://www.anchor-lang.com/docs/manifest#scripts-required-for-testing)
+
+7. TypeScript, JavaScript and JSON files are formatted and linted using
+[Biome](https://biomejs.dev/). Execute the following command to format and lint your code at the root of this project before submitting a pull request:
+
+```bash
+pnpm check:fix
+```
 
 ## Code of Conduct
 We are committed to providing a friendly, safe, and welcoming environment for all contributors, regardless of their background, experience level, or personal characteristics. As a contributor, you are expected to:

+ 125 - 78
.github/workflows/anchor.yml

@@ -14,6 +14,8 @@ on:
 jobs:
   build:
     runs-on: ubuntu-latest
+    permissions:
+        pull-requests: read
     strategy:
       matrix:
         node-version: [20.x]
@@ -21,57 +23,83 @@ jobs:
         anchor-version: [0.30.0]
     steps:
       - uses: actions/checkout@v4
-      - name: Use Node.js ${{ matrix.node-version }}
-        uses: actions/setup-node@v4
-        with:
-          node-version: ${{ matrix.node-version }}
-          check-latest: true
-      - uses: heyAyushh/setup-solana@v5.1
+      - name: Setup Anchor
+        uses: heyAyushh/setup-anchor@v3.10
         with:
+          anchor-version: ${{ matrix.anchor-version }}
           solana-cli-version: ${{ matrix.solana-version }}
-      - run: solana block
-        shell: bash
-      - name: Install Anchor
+          node-version: ${{ matrix.node-version }}
+      - name: Display versions
         run: |
           solana -V
+          solana-keygen new --no-bip39-passphrase
           rustc -V
-          cargo install --git https://github.com/coral-xyz/anchor avm --locked --force
-          avm install ${{ matrix.anchor-version }}
-          avm use ${{ matrix.anchor-version }}
-          npm install --global pnpm
-      - name: Build Anchor programs
+          anchor -V
+          npm i -g pnpm
+      # Run only if it's triggered by PR to main,
+      # Build the changed programs
+      - uses: dorny/paths-filter@v3
+        if: github.event_name == 'pull_request'
+        id: changes
+        with:
+          list-files: shell
+          filters: |
+            anchor:
+              - added|modified: '**/anchor/**'
+      - name: Build Changed Anchor programs
+        if: ${{ steps.changes.outputs.anchor == 'true' }}
+        run: |
+            changed_files=(${{ steps.changes.outputs.anchor_files }})
+
+            # Read ignored projects from .github/.ghaignore, ignoring empty lines and comments
+            ignored_projects=($(grep . .github/.ghaignore | grep -v '^$'))
+
+            # Find anchor projects and remove ignored projects
+            ProjectDirs=($(for file in "${changed_files[@]}"; do
+              anchor_path=$(dirname "${file}" | grep anchor | sed 's#/anchor/.*#/anchor#g')
+              if [[ ! " ${ignored_projects[*]} " =~ " ${anchor_path} " ]]; then
+                echo "$anchor_path"
+              fi
+            done | sort -u))
+
+            # Build anchor projects
+            echo "Projects to Build:"
+            printf "%s\n" "${ProjectDirs[@]}"
+            for projectDir in "${ProjectDirs[@]}"; do
+              echo "
+              ********
+              Building $projectDir
+              ********"
+              cd $projectDir
+              if anchor build; then
+                echo "Build succeeded for $projectDir."
+                rm -rf target
+              else
+                failed=true
+                failed_builds+=($projectDir)
+                echo "Build failed for $projectDir. Continuing with the next program."
+              fi
+              cd - > /dev/null
+            done
+            if [ "$failed" = true ]; then
+              echo "Programs that failed building:"
+              printf "%s\n" "${failed_builds[@]}"
+              exit 1
+            else
+              echo "All programs built successfully."
+            fi
+        shell: bash
+      # Skip Building all Programs if it's a PR to main branch
+      - name: Build All Anchor programs
+        if: github.event_name != 'pull_request'
         run: |
-          declare -a ProjectDirs=(
-          "basics/account-data/anchor"
-          "basics/checking-accounts/anchor"
-          "basics/close-account/anchor"
-          "basics/counter/anchor"
-          "basics/create-account/anchor"
-          "basics/hello-solana/anchor"
-          "basics/pda-rent-payer/anchor"
-          "basics/processing-instructions/anchor"
-          "basics/program-derived-addresses/anchor"
-          "basics/realloc/anchor"
-          "basics/rent/anchor"
-          "basics/repository-layout/anchor"
-          "basics/transfer-sol/anchor"
-          "tokens/token-2022/basics/anchor"
-          "tokens/token-2022/cpi-guard/anchor"
-          "tokens/token-2022/default-account-state/anchor"
-          "tokens/token-2022/group/anchor"
-          "tokens/token-2022/immutable-owner/anchor"
-          "tokens/token-2022/interest-bearing/anchor"
-          "tokens/token-2022/memo-transfer/anchor"
-          "tokens/token-2022/metadata/anchor"
-          "tokens/token-2022/mint-close-authority/anchor"
-          "tokens/token-2022/non-transferable/anchor"
-          "tokens/token-2022/permanent-delegate/anchor"
-          "tokens/token-2022/transfer-fee/anchor"
-          "tokens/token-2022/transfer-hook/anchor/TransferHookCounter"
-          "tokens/token-2022/transfer-hook/anchor/TransferHookHelloWorld"
-          "tokens/token-2022/transfer-hook/anchor/TransferHookTransferCost"
-          "tokens/token-2022/transfer-hook/anchor/TransferHookWhitelist"
-          )
+          # Find all anchor projects and remove ignored projects
+          declare -a ProjectDirs=($(find . -type d -name 'anchor' | sed 's|^\./||'| grep -v -f <(grep . .github/.ghaignore | grep -v '^$')))
+
+          echo "Projects to Build:"
+          printf "%s\n" "${ProjectDirs[@]}"
+
+          # Build anchor projects
           for projectDir in "${ProjectDirs[@]}"; do
             echo "
             ********
@@ -99,6 +127,8 @@ jobs:
 
   test:
     runs-on: ubuntu-latest
+    permissions:
+          pull-requests: read
     strategy:
       matrix:
         node-version: [20.x]
@@ -107,7 +137,7 @@ jobs:
     steps:
       - uses: actions/checkout@v4
       - name: Setup Anchor
-        uses: heyAyushh/setup-anchor@v2.2
+        uses: heyAyushh/setup-anchor@v3.10
         with:
           anchor-version: ${{ matrix.anchor-version }}
           solana-cli-version: ${{ matrix.solana-version }}
@@ -119,39 +149,56 @@ jobs:
           rustc -V
           anchor -V
           npm i -g pnpm
-      - name: Test anchor programs
+      # Run only if it's triggered by PR to main,
+      # Test the changed programs (if any)
+      - uses: dorny/paths-filter@v3
+        if: github.event_name == 'pull_request'
+        id: changes
+        with:
+          list-files: shell
+          filters: |
+            anchor:
+              - added|modified: '**/anchor/**'
+      - name: Test Changed Anchor Programs
+        if: ${{ steps.changes.outputs.anchor == 'true' }}
+        run: |
+          changed_files=(${{ steps.changes.outputs.anchor_files }})
+          ProjectDirs=($(for file in "${changed_files[@]}"; do dirname "${file}" | grep anchor | sed 's#/anchor/.*#/anchor#g'; done | grep -v -f <(grep . .github/.ghaignore | grep -v '^$') | sort -u))
+          echo "Projects to Test:"
+          printf "%s\n" "${ProjectDirs[@]}"
+          for projectDir in "${ProjectDirs[@]}"; do
+            echo "
+            ********
+            Testing $projectDir
+            ********"
+            cd $projectDir
+            pnpm install --frozen-lockfile
+            if anchor test; then
+              echo "Tests succeeded for $projectDir."
+              rm -rf target node_modules
+            else
+              failed=true
+              failed_tests+=($projectDir)
+              echo "Tests failed for $val. Continuing with the next program."
+            fi
+          cd - > /dev/null
+          done
+          if [ "$failed" = true ]; then
+            echo "*****************************"
+            echo "Programs that failed testing:"
+            printf "%s\n" "${failed_tests[@]}"
+            exit 1
+          else
+            echo "All tests passed."
+          fi
+        shell: bash
+      # Skip Testing all Programs if it's a PR to main branch
+      - name: Test All Anchor Programs
+        if: github.event_name != 'pull_request'
         run: |
-          declare -a ProjectDirs=(
-          "basics/account-data/anchor"
-          "basics/checking-accounts/anchor"
-          "basics/close-account/anchor"
-          "basics/counter/anchor"
-          "basics/create-account/anchor"
-          "basics/hello-solana/anchor"
-          "basics/pda-rent-payer/anchor"
-          "basics/processing-instructions/anchor"
-          "basics/program-derived-addresses/anchor"
-          "basics/realloc/anchor"
-          "basics/rent/anchor"
-          "basics/repository-layout/anchor"
-          "basics/transfer-sol/anchor"
-          "tokens/token-2022/basics/anchor"
-          "tokens/token-2022/cpi-guard/anchor"
-          "tokens/token-2022/default-account-state/anchor"
-          "tokens/token-2022/group/anchor"
-          "tokens/token-2022/immutable-owner/anchor"
-          "tokens/token-2022/interest-bearing/anchor"
-          "tokens/token-2022/memo-transfer/anchor"
-          "tokens/token-2022/metadata/anchor"
-          "tokens/token-2022/mint-close-authority/anchor"
-          "tokens/token-2022/non-transferable/anchor"
-          "tokens/token-2022/permanent-delegate/anchor"
-          "tokens/token-2022/transfer-fee/anchor"
-          "tokens/token-2022/transfer-hook/anchor/TransferHookCounter"
-          "tokens/token-2022/transfer-hook/anchor/TransferHookHelloWorld"
-          "tokens/token-2022/transfer-hook/anchor/TransferHookTransferCost"
-          "tokens/token-2022/transfer-hook/anchor/TransferHookWhitelist"
-          )
+          declare -a ProjectDirs=($(find . -type d -name "anchor"| grep -v -f <(grep . .github/.ghaignore | grep -v '^$')))
+          echo "Projects to Test:"
+          printf "%s\n" "${ProjectDirs[@]}"
           for projectDir in "${ProjectDirs[@]}"; do
             echo "
             ********

+ 21 - 0
.github/workflows/biome.yml

@@ -0,0 +1,21 @@
+name: Typescript Code quality
+
+on:
+  push:
+    branches:
+      - main
+  pull_request:
+    types: [ opened, synchronize, reopened ]
+    branches:
+      - main
+jobs:
+  quality:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+      - name: Setup Biome
+        uses: biomejs/setup-biome@v2
+      - name: Run Biome
+        run: |
+          biome ci ./ --config-path biome.json

+ 3 - 3
.github/workflows/rust.yml

@@ -29,7 +29,7 @@ jobs:
         # The uses keyword specifies that this step will run v3 of the actions/checkout action.
         # This is an action that checks out your repository onto the runner, allowing you to run scripts or other actions against your code (such as build and test tools).
         # You should use the checkout action any time your workflow will run against the repository's code.
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
        # This GitHub Action installs a Rust toolchain using rustup. It is designed for one-line concise usage and good defaults.
       - name: Install the Rust toolchain
@@ -43,7 +43,7 @@ jobs:
     name: Rustfmt
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
       - uses: dtolnay/rust-toolchain@stable
         with:
           # Specific to dtolnay/rust-toolchain: Comma-separated string of additional components to install
@@ -56,7 +56,7 @@ jobs:
     name: Clippy
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
       - uses: dtolnay/rust-toolchain@stable
         with:
           components: clippy

+ 13 - 36
.github/workflows/solana-native.yml

@@ -17,15 +17,15 @@ jobs:
     strategy:
       matrix:
         node-version: [20.x]
-        solana-version: [1.17.25, stable, beta]
+        solana-version: [stable, beta]
     steps:
       - uses: actions/checkout@v4
       - name: Use Node.js ${{ matrix.node-version }}
-        uses: actions/setup-node@v3
+        uses: actions/setup-node@v4
         with:
           node-version: ${{ matrix.node-version }}
           check-latest: true
-      - uses: heyAyushh/setup-solana@v5.1
+      - uses: heyAyushh/setup-solana@v5.2
         with:
           solana-cli-version: ${{ matrix.solana-version }}
       - run: solana block
@@ -35,28 +35,16 @@ jobs:
           npm install --global pnpm
       - name: Build Native programs
         run: |
-          declare -a ProjectDirs=(
-            "basics/account-data/native/program"
-            "basics/checking-accounts/native/program"
-            "basics/close-account/native/program"
-            "basics/counter/native/program"
-            "basics/create-account/native/program"
-            "basics/hello-solana/native/program"
-            "basics/pda-rent-payer/native/program"
-            "basics/processing-instructions/native/program"
-            "basics/program-derived-addresses/native/program"
-            "basics/realloc/native/program"
-            "basics/rent/native/program"
-            "basics/repository-layout/native/program"
-            "basics/transfer-sol/native/program"
-          )
+          declare -a ProjectDirs=($(find . -type d -name "native"| grep -v -f <(grep . .github/.ghaignore | grep -v '^$')))
+          echo "Projects to Build:"
+          printf "%s\n" "${ProjectDirs[@]}"
           for projectDir in "${ProjectDirs[@]}"; do
             echo "
             ********
             Building $projectDir
             ********"
             cd $projectDir
-            if cargo-build-sbf --verbose; then
+            if pnpm build; then
               echo "Build succeeded for $projectDir."
             else
               failed=true
@@ -83,11 +71,11 @@ jobs:
     steps:
       - uses: actions/checkout@v4
       - name: Use Node.js ${{ matrix.node-version }}
-        uses: actions/setup-node@v3
+        uses: actions/setup-node@v4
         with:
           node-version: ${{ matrix.node-version }}
           check-latest: true
-      - uses: heyAyushh/setup-solana@v5.1
+      - uses: heyAyushh/setup-solana@v5.2
         with:
           solana-cli-version: ${{ matrix.solana-version }}
       - run: solana block
@@ -99,20 +87,9 @@ jobs:
         run: |
           solana -V
           rustc -V
-          declare -a ProjectDirs=(
-            "basics/account-data/native/"
-            "basics/checking-accounts/native/"
-            "basics/close-account/native/"
-            "basics/counter/native/"
-            "basics/create-account/native/"
-            "basics/hello-solana/native/"
-            "basics/pda-rent-payer/native/"
-            "basics/processing-instructions/native/"
-            "basics/program-derived-addresses/native/"
-            "basics/rent/native/"
-            "basics/repository-layout/native/"
-            "basics/transfer-sol/native/"
-          )
+          declare -a ProjectDirs=($(find . -type d -name "native"| grep -v -f <(grep . .github/.ghaignore | grep -v '^$')))
+          echo "Projects to Test:"
+          printf "%s\n" "${ProjectDirs[@]}"
           for projectDir in "${ProjectDirs[@]}"; do
             echo "
             ********
@@ -120,7 +97,7 @@ jobs:
             ********"
             cd $projectDir
             pnpm install --frozen-lockfile
-            if (cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test); then
+            if pnpm build-and-test; then
               echo "Tests succeeded for $projectDir."
             else
               failed=true

+ 1 - 0
.gitignore

@@ -3,6 +3,7 @@
 .DS_Store
 
 test-ledger/
+node_modules/
 
 **/*/node_modules
 **/*/package-lock.json

+ 4 - 0
.husky/pre-commit

@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+. "$(dirname "$0")/_/husky.sh"
+
+npx lint-staged

File diff suppressed because it is too large
+ 838 - 47
Cargo.lock


+ 8 - 0
Cargo.toml

@@ -30,5 +30,13 @@ members = [
     "basics/repository-layout/anchor/programs/*",
     "basics/transfer-sol/native/program",
     "basics/transfer-sol/anchor/programs/*",
+    "tokens/token-2022/mint-close-authority/native/program",
+    "tokens/token-2022/non-transferable/native/program",
+    "tokens/token-2022/default-account-state/native/program",
+    "tokens/token-2022/transfer-fee/native/program",
+    "tokens/token-2022/multiple-extensions/native/program"
 ]
 resolver = "2"
+
+[profile.release]
+overflow-checks = true

+ 27 - 35
basics/account-data/anchor/tests/test.ts

@@ -1,51 +1,43 @@
-import * as anchor from "@coral-xyz/anchor"
-import { AnchorProgramExample } from "../target/types/anchor_program_example"
-import { Keypair } from "@solana/web3.js"
+import * as anchor from '@coral-xyz/anchor';
+import { Keypair } from '@solana/web3.js';
+import type { AnchorProgramExample } from '../target/types/anchor_program_example';
 
-describe("Account Data!", () => {
-  const provider = anchor.AnchorProvider.env()
-  anchor.setProvider(provider)
-  const payer = provider.wallet as anchor.Wallet
-  const program = anchor.workspace
-    .AnchorProgramExample as anchor.Program<AnchorProgramExample>
+describe('Account Data!', () => {
+  const provider = anchor.AnchorProvider.env();
+  anchor.setProvider(provider);
+  const payer = provider.wallet as anchor.Wallet;
+  const program = anchor.workspace.AnchorProgramExample as anchor.Program<AnchorProgramExample>;
 
   // Generate a new keypair for the addressInfo account
-  const addressInfoAccount = new Keypair()
+  const addressInfoAccount = new Keypair();
 
-  it("Create the address info account", async () => {
-    console.log(`Payer Address      : ${payer.publicKey}`)
-    console.log(`Address Info Acct  : ${addressInfoAccount.publicKey}`)
+  it('Create the address info account', async () => {
+    console.log(`Payer Address      : ${payer.publicKey}`);
+    console.log(`Address Info Acct  : ${addressInfoAccount.publicKey}`);
 
-    // Instruction data
+    // Instruction Ix data
     const addressInfo = {
-      name: "Joe C",
+      name: 'Joe C',
       houseNumber: 136,
-      street: "Mile High Dr.",
-      city: "Solana Beach",
-    }
+      street: 'Mile High Dr.',
+      city: 'Solana Beach',
+    };
 
     await program.methods
-      .createAddressInfo(
-        addressInfo.name,
-        addressInfo.houseNumber,
-        addressInfo.street,
-        addressInfo.city
-      )
+      .createAddressInfo(addressInfo.name, addressInfo.houseNumber, addressInfo.street, addressInfo.city)
       .accounts({
         addressInfo: addressInfoAccount.publicKey,
         payer: payer.publicKey,
       })
       .signers([addressInfoAccount])
-      .rpc()
-  })
+      .rpc();
+  });
 
   it("Read the new account's data", async () => {
-    const addressInfo = await program.account.addressInfo.fetch(
-      addressInfoAccount.publicKey
-    )
-    console.log(`Name     : ${addressInfo.name}`)
-    console.log(`House Num: ${addressInfo.houseNumber}`)
-    console.log(`Street   : ${addressInfo.street}`)
-    console.log(`City     : ${addressInfo.city}`)
-  })
-})
+    const addressInfo = await program.account.addressInfo.fetch(addressInfoAccount.publicKey);
+    console.log(`Name     : ${addressInfo.name}`);
+    console.log(`House Num: ${addressInfo.houseNumber}`);
+    console.log(`Street   : ${addressInfo.street}`);
+    console.log(`City     : ${addressInfo.city}`);
+  });
+});

File diff suppressed because it is too large
+ 193 - 588
basics/account-data/native/pnpm-lock.yaml


+ 8 - 16
basics/account-data/native/tests/test.ts

@@ -1,18 +1,12 @@
-import { start } from 'solana-bankrun';
-import {
-  Keypair,
-  PublicKey,
-  SystemProgram,
-  Transaction,
-  TransactionInstruction,
-} from '@solana/web3.js';
-import * as borsh from 'borsh';
-import { Buffer } from 'buffer';
+import { Buffer } from 'node:buffer';
 import { describe, test } from 'node:test';
+import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js';
+import * as borsh from 'borsh';
+import { start } from 'solana-bankrun';
 
 class Assignable {
   constructor(properties) {
-    Object.keys(properties).map(key => {
+    Object.keys(properties).map((key) => {
       return (this[key] = properties[key]);
     });
   }
@@ -49,7 +43,7 @@ const AddressInfoSchema = new Map([
 describe('Account Data!', async () => {
   const addressInfoAccount = Keypair.generate();
   const PROGRAM_ID = PublicKey.unique();
-  const context = await start([{ name: 'account_data_program', programId: PROGRAM_ID }],[]);
+  const context = await start([{ name: 'account_data_program', programId: PROGRAM_ID }], []);
   const client = context.banksClient;
 
   test('Create the address info account', async () => {
@@ -59,7 +53,7 @@ describe('Account Data!', async () => {
     console.log(`Payer Address      : ${payer.publicKey}`);
     console.log(`Address Info Acct  : ${addressInfoAccount.publicKey}`);
 
-    let ix = new TransactionInstruction({
+    const ix = new TransactionInstruction({
       keys: [
         {
           pubkey: addressInfoAccount.publicKey,
@@ -89,9 +83,7 @@ describe('Account Data!', async () => {
   test("Read the new account's data", async () => {
     const accountInfo = await client.getAccount(addressInfoAccount.publicKey);
 
-    const readAddressInfo = AddressInfo.fromBuffer(
-      Buffer.from(accountInfo.data)
-    );
+    const readAddressInfo = AddressInfo.fromBuffer(Buffer.from(accountInfo.data));
     console.log(`Name     : ${readAddressInfo.name}`);
     console.log(`House Num: ${readAddressInfo.house_number}`);
     console.log(`Street   : ${readAddressInfo.street}`);

+ 20 - 29
basics/checking-accounts/anchor/tests/test.ts

@@ -1,43 +1,34 @@
-import * as anchor from "@coral-xyz/anchor"
-import { AnchorProgramExample } from "../target/types/anchor_program_example"
-import {
-  Keypair,
-  SystemProgram,
-  Transaction,
-  sendAndConfirmTransaction,
-} from "@solana/web3.js"
+import * as anchor from '@coral-xyz/anchor';
+import { Keypair, SystemProgram, Transaction, sendAndConfirmTransaction } from '@solana/web3.js';
+import type { AnchorProgramExample } from '../target/types/anchor_program_example';
 
-describe("Anchor example", () => {
-  const provider = anchor.AnchorProvider.env()
-  anchor.setProvider(provider)
-  const program = anchor.workspace
-    .AnchorProgramExample as anchor.Program<AnchorProgramExample>
-  const wallet = provider.wallet as anchor.Wallet
+describe('Anchor example', () => {
+  const provider = anchor.AnchorProvider.env();
+  anchor.setProvider(provider);
+  const program = anchor.workspace.AnchorProgramExample as anchor.Program<AnchorProgramExample>;
+  const wallet = provider.wallet as anchor.Wallet;
 
   // We'll create this ahead of time.
   // Our program will try to modify it.
-  const accountToChange = new Keypair()
+  const accountToChange = new Keypair();
   // Our program will create this.
-  const accountToCreate = new Keypair()
+  const accountToCreate = new Keypair();
 
-  it("Create an account owned by our program", async () => {
-    let instruction = SystemProgram.createAccount({
+  it('Create an account owned by our program', async () => {
+    const instruction = SystemProgram.createAccount({
       fromPubkey: provider.wallet.publicKey,
       newAccountPubkey: accountToChange.publicKey,
       lamports: await provider.connection.getMinimumBalanceForRentExemption(0),
       space: 0,
       programId: program.programId, // Our program
-    })
+    });
 
-    const transaction = new Transaction().add(instruction)
+    const transaction = new Transaction().add(instruction);
 
-    await sendAndConfirmTransaction(provider.connection, transaction, [
-      wallet.payer,
-      accountToChange,
-    ])
-  })
+    await sendAndConfirmTransaction(provider.connection, transaction, [wallet.payer, accountToChange]);
+  });
 
-  it("Check accounts", async () => {
+  it('Check accounts', async () => {
     await program.methods
       .checkAccounts()
       .accounts({
@@ -45,6 +36,6 @@ describe("Anchor example", () => {
         accountToCreate: accountToCreate.publicKey,
         accountToChange: accountToChange.publicKey,
       })
-      .rpc()
-  })
-})
+      .rpc();
+  });
+});

+ 4 - 13
basics/checking-accounts/native/tests/test.ts

@@ -1,19 +1,10 @@
-import {
-  Keypair,
-  PublicKey,
-  SystemProgram,
-  Transaction,
-  TransactionInstruction,
-} from '@solana/web3.js';
 import { describe, test } from 'node:test';
+import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js';
 import { start } from 'solana-bankrun';
 
 describe('Checking accounts', async () => {
   const PROGRAM_ID = PublicKey.unique();
-  const context = await start(
-    [{ name: 'checking_accounts_program', programId: PROGRAM_ID }],
-    []
-  );
+  const context = await start([{ name: 'checking_accounts_program', programId: PROGRAM_ID }], []);
   const client = context.banksClient;
   const payer = context.payer;
   const rent = await client.getRent();
@@ -26,7 +17,7 @@ describe('Checking accounts', async () => {
 
   test('Create an account owned by our program', async () => {
     const blockhash = context.lastBlockhash;
-    let ix = SystemProgram.createAccount({
+    const ix = SystemProgram.createAccount({
       fromPubkey: payer.publicKey,
       newAccountPubkey: accountToChange.publicKey,
       lamports: Number(rent.minimumBalance(BigInt(0))),
@@ -43,7 +34,7 @@ describe('Checking accounts', async () => {
 
   test('Check accounts', async () => {
     const blockhash = context.lastBlockhash;
-    let ix = new TransactionInstruction({
+    const ix = new TransactionInstruction({
       keys: [
         { pubkey: payer.publicKey, isSigner: true, isWritable: true },
         { pubkey: accountToCreate.publicKey, isSigner: true, isWritable: true },

+ 2 - 2
basics/close-account/anchor/migrations/deploy.ts

@@ -2,9 +2,9 @@
 // single deploy script that's invoked from the CLI, injecting a provider
 // configured from the workspace's Anchor.toml.
 
-const anchor = require("@coral-xyz/anchor");
+const anchor = require('@coral-xyz/anchor');
 
-module.exports = async function (provider) {
+module.exports = async (provider) => {
   // Configure client to use the provider.
   anchor.setProvider(provider);
 

+ 24 - 32
basics/close-account/anchor/tests/close-account.ts

@@ -1,54 +1,46 @@
-import * as anchor from "@coral-xyz/anchor"
-import { Program } from "@coral-xyz/anchor"
-import { CloseAccountProgram } from "../target/types/close_account_program"
-import { PublicKey } from "@solana/web3.js"
-import assert from "assert"
+import assert from 'node:assert';
+import * as anchor from '@coral-xyz/anchor';
+import type { Program } from '@coral-xyz/anchor';
+import { PublicKey } from '@solana/web3.js';
+import type { CloseAccountProgram } from '../target/types/close_account_program';
 
-describe("close-an-account", () => {
+describe('close-an-account', () => {
   // Configure the client to use the local cluster.
-  const provider = anchor.AnchorProvider.env()
-  anchor.setProvider(provider)
+  const provider = anchor.AnchorProvider.env();
+  anchor.setProvider(provider);
 
-  const program = anchor.workspace
-    .CloseAccountProgram as Program<CloseAccountProgram>
-  const payer = provider.wallet as anchor.Wallet
+  const program = anchor.workspace.CloseAccountProgram as Program<CloseAccountProgram>;
+  const payer = provider.wallet as anchor.Wallet;
 
   // Derive the PDA for the user's account.
-  const [userAccountAddress] = PublicKey.findProgramAddressSync(
-    [Buffer.from("USER"), payer.publicKey.toBuffer()],
-    program.programId
-  )
+  const [userAccountAddress] = PublicKey.findProgramAddressSync([Buffer.from('USER'), payer.publicKey.toBuffer()], program.programId);
 
-  it("Create Account", async () => {
+  it('Create Account', async () => {
     await program.methods
-      .createUser("John Doe")
+      .createUser('John Doe')
       .accounts({
         user: payer.publicKey,
         userAccount: userAccountAddress,
       })
-      .rpc()
+      .rpc();
 
     // Fetch the account data
-    const userAccount = await program.account.userState.fetch(
-      userAccountAddress
-    )
-    assert.equal(userAccount.name, "John Doe")
-    assert.equal(userAccount.user.toBase58(), payer.publicKey.toBase58())
-  })
+    const userAccount = await program.account.userState.fetch(userAccountAddress);
+    assert.equal(userAccount.name, 'John Doe');
+    assert.equal(userAccount.user.toBase58(), payer.publicKey.toBase58());
+  });
 
-  it("Close Account", async () => {
+  it('Close Account', async () => {
     await program.methods
       .closeUser()
       .accounts({
         user: payer.publicKey,
         userAccount: userAccountAddress,
       })
-      .rpc()
+      .rpc();
 
     // The account should no longer exist, returning null.
-    const userAccount = await program.account.userState.fetchNullable(
-      userAccountAddress
-    )
-    assert.equal(userAccount, null)
-  })
-})
+    const userAccount = await program.account.userState.fetchNullable(userAccountAddress);
+    assert.equal(userAccount, null);
+  });
+});

+ 6 - 21
basics/close-account/native/tests/close-account.test.ts

@@ -1,30 +1,19 @@
-import { PublicKey, Transaction } from '@solana/web3.js';
 import { describe, test } from 'node:test';
-import { createCreateUserInstruction, createCloseUserInstruction } from '../ts';
+import { PublicKey, Transaction } from '@solana/web3.js';
 import { start } from 'solana-bankrun';
+import { createCloseUserInstruction, createCreateUserInstruction } from '../ts';
 
 describe('Close Account!', async () => {
   const PROGRAM_ID = PublicKey.unique();
-  const context = await start(
-    [{ name: 'close_account_native_program', programId: PROGRAM_ID }],
-    []
-  );
+  const context = await start([{ name: 'close_account_native_program', programId: PROGRAM_ID }], []);
   const client = context.banksClient;
   const payer = context.payer;
 
-  const testAccountPublicKey = PublicKey.findProgramAddressSync(
-    [Buffer.from('USER'), payer.publicKey.toBuffer()],
-    PROGRAM_ID
-  )[0];
+  const testAccountPublicKey = PublicKey.findProgramAddressSync([Buffer.from('USER'), payer.publicKey.toBuffer()], PROGRAM_ID)[0];
 
   test('Create the account', async () => {
     const blockhash = context.lastBlockhash;
-    const ix = createCreateUserInstruction(
-      testAccountPublicKey,
-      payer.publicKey,
-      PROGRAM_ID,
-      'Jacob'
-    );
+    const ix = createCreateUserInstruction(testAccountPublicKey, payer.publicKey, PROGRAM_ID, 'Jacob');
 
     const tx = new Transaction();
     tx.recentBlockhash = blockhash;
@@ -36,11 +25,7 @@ describe('Close Account!', async () => {
   test('Close the account', async () => {
     const blockhash = context.lastBlockhash;
 
-    const ix = createCloseUserInstruction(
-      testAccountPublicKey,
-      payer.publicKey,
-      PROGRAM_ID
-    );
+    const ix = createCloseUserInstruction(testAccountPublicKey, payer.publicKey, PROGRAM_ID);
     const tx = new Transaction();
     tx.recentBlockhash = blockhash;
     tx.add(ix).sign(payer);

+ 41 - 51
basics/close-account/native/ts/instructions/close.ts

@@ -1,60 +1,50 @@
-import * as borsh from "borsh";
-import { Buffer } from "buffer";
-import { 
-    PublicKey, 
-    SystemProgram,
-    TransactionInstruction 
-} from '@solana/web3.js';
-import { MyInstruction } from ".";
-
+import { Buffer } from 'node:buffer';
+import { type PublicKey, SystemProgram, TransactionInstruction } from '@solana/web3.js';
+import * as borsh from 'borsh';
+import { MyInstruction } from '.';
 
 export class Close {
+  instruction: MyInstruction;
 
+  constructor(props: {
     instruction: MyInstruction;
+  }) {
+    this.instruction = props.instruction;
+  }
+
+  toBuffer() {
+    return Buffer.from(borsh.serialize(CloseSchema, this));
+  }
 
-    constructor(props: {
-        instruction: MyInstruction,
-    }) {
-        this.instruction = props.instruction;
-    }
-
-    toBuffer() { 
-        return Buffer.from(borsh.serialize(CloseSchema, this)) 
-    };
-    
-    static fromBuffer(buffer: Buffer) {
-        return borsh.deserialize(CloseSchema, Close, buffer);
-    };
-};
+  static fromBuffer(buffer: Buffer) {
+    return borsh.deserialize(CloseSchema, Close, buffer);
+  }
+}
 
 export const CloseSchema = new Map([
-    [ Close, { 
-        kind: 'struct', 
-        fields: [ 
-            ['instruction', 'u8'],
-        ],
-    }]
+  [
+    Close,
+    {
+      kind: 'struct',
+      fields: [['instruction', 'u8']],
+    },
+  ],
 ]);
 
-export function createCloseUserInstruction(
-    target: PublicKey,
-    payer: PublicKey,
-    programId: PublicKey,
-): TransactionInstruction {
-
-    const instructionObject = new Close({
-        instruction: MyInstruction.CloseUser,
-    });
-
-    const ix = new TransactionInstruction({
-        keys: [
-            {pubkey: target, isSigner: false, isWritable: true},
-            {pubkey: payer, isSigner: true, isWritable: true},
-            {pubkey: SystemProgram.programId, isSigner: false, isWritable: false}
-        ],
-        programId: programId,
-        data: instructionObject.toBuffer(),
-    });
-
-    return ix;
-}
+export function createCloseUserInstruction(target: PublicKey, payer: PublicKey, programId: PublicKey): TransactionInstruction {
+  const instructionObject = new Close({
+    instruction: MyInstruction.CloseUser,
+  });
+
+  const ix = new TransactionInstruction({
+    keys: [
+      { pubkey: target, isSigner: false, isWritable: true },
+      { pubkey: payer, isSigner: true, isWritable: true },
+      { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
+    ],
+    programId: programId,
+    data: instructionObject.toBuffer(),
+  });
+
+  return ix;
+}

+ 3 - 12
basics/close-account/native/ts/instructions/create.ts

@@ -1,10 +1,6 @@
+import { Buffer } from 'node:buffer';
+import { type PublicKey, SystemProgram, TransactionInstruction } from '@solana/web3.js';
 import * as borsh from 'borsh';
-import { Buffer } from 'buffer';
-import {
-  PublicKey,
-  SystemProgram,
-  TransactionInstruction,
-} from '@solana/web3.js';
 import { MyInstruction } from '.';
 
 export class Create {
@@ -38,12 +34,7 @@ export const CreateSchema = new Map([
   ],
 ]);
 
-export function createCreateUserInstruction(
-  target: PublicKey,
-  payer: PublicKey,
-  programId: PublicKey,
-  name: string
-): TransactionInstruction {
+export function createCreateUserInstruction(target: PublicKey, payer: PublicKey, programId: PublicKey, name: string): TransactionInstruction {
   const instructionObject = new Create({
     instruction: MyInstruction.CreateUser,
     name,

+ 3 - 3
basics/close-account/native/ts/instructions/index.ts

@@ -2,6 +2,6 @@ export * from './create';
 export * from './close';
 
 export enum MyInstruction {
-    CreateUser,
-    CloseUser,
-}
+  CreateUser = 0,
+  CloseUser = 1,
+}

+ 25 - 26
basics/close-account/native/ts/state/index.ts

@@ -1,35 +1,34 @@
-import * as borsh from "borsh";
-import { Buffer } from "buffer";
-
+import { Buffer } from 'node:buffer';
+import * as borsh from 'borsh';
 
 export class User {
+  name: string;
 
+  constructor(props: {
     name: string;
+  }) {
+    this.name = props.name;
+  }
 
-    constructor(props: {
-        name: string,
-    }) {
-        this.name = props.name;
-    }
+  toBase58() {
+    return borsh.serialize(UserSchema, this).toString();
+  }
 
-    toBase58() {
-        return borsh.serialize(UserSchema, this).toString()
-    };
+  toBuffer() {
+    return Buffer.from(borsh.serialize(UserSchema, this));
+  }
 
-    toBuffer() { 
-        return Buffer.from(borsh.serialize(UserSchema, this)) 
-    };
-    
-    static fromBuffer(buffer: Buffer) {
-        return borsh.deserialize(UserSchema, User, buffer);
-    };
-};
+  static fromBuffer(buffer: Buffer) {
+    return borsh.deserialize(UserSchema, User, buffer);
+  }
+}
 
 export const UserSchema = new Map([
-    [ User, { 
-        kind: 'struct', 
-        fields: [ 
-            ['name', 'string'],
-        ],
-    }]
-]);
+  [
+    User,
+    {
+      kind: 'struct',
+      fields: [['name', 'string']],
+    },
+  ],
+]);

+ 2 - 2
basics/counter/anchor/migrations/deploy.ts

@@ -2,9 +2,9 @@
 // single deploy script that's invoked from the CLI, injecting a provider
 // configured from the workspace's Anchor.toml.
 
-const anchor = require("@coral-xyz/anchor");
+const anchor = require('@coral-xyz/anchor');
 
-module.exports = async function (provider) {
+module.exports = async (provider) => {
   // Configure client to use the provider.
   anchor.setProvider(provider);
 

+ 27 - 42
basics/counter/anchor/tests/counter_anchor.ts

@@ -1,21 +1,21 @@
-import * as anchor from "@coral-xyz/anchor"
-import { Program } from "@coral-xyz/anchor"
-import { Keypair } from "@solana/web3.js"
-import { assert } from "chai"
-import { CounterAnchor } from "../target/types/counter_anchor"
+import * as anchor from '@coral-xyz/anchor';
+import type { Program } from '@coral-xyz/anchor';
+import { Keypair } from '@solana/web3.js';
+import { assert } from 'chai';
+import type { CounterAnchor } from '../target/types/counter_anchor';
 
-describe("counter_anchor", () => {
+describe('counter_anchor', () => {
   // Configure the client to use the local cluster.
-  const provider = anchor.AnchorProvider.env()
-  anchor.setProvider(provider)
-  const payer = provider.wallet as anchor.Wallet
+  const provider = anchor.AnchorProvider.env();
+  anchor.setProvider(provider);
+  const payer = provider.wallet as anchor.Wallet;
 
-  const program = anchor.workspace.CounterAnchor as Program<CounterAnchor>
+  const program = anchor.workspace.CounterAnchor as Program<CounterAnchor>;
 
   // Generate a new keypair for the counter account
-  const counterKeypair = new Keypair()
+  const counterKeypair = new Keypair();
 
-  it("Initialize Counter", async () => {
+  it('Initialize Counter', async () => {
     await program.methods
       .initializeCounter()
       .accounts({
@@ -23,41 +23,26 @@ describe("counter_anchor", () => {
         payer: payer.publicKey,
       })
       .signers([counterKeypair])
-      .rpc()
+      .rpc();
 
-    const currentCount = await program.account.counter.fetch(
-      counterKeypair.publicKey
-    )
+    const currentCount = await program.account.counter.fetch(counterKeypair.publicKey);
 
-    assert(
-      currentCount.count.toNumber() === 0,
-      "Expected initialized count to be 0"
-    )
-  })
+    assert(currentCount.count.toNumber() === 0, 'Expected initialized count to be 0');
+  });
 
-  it("Increment Counter", async () => {
-    await program.methods
-      .increment()
-      .accounts({ counter: counterKeypair.publicKey })
-      .rpc()
+  it('Increment Counter', async () => {
+    await program.methods.increment().accounts({ counter: counterKeypair.publicKey }).rpc();
 
-    const currentCount = await program.account.counter.fetch(
-      counterKeypair.publicKey
-    )
+    const currentCount = await program.account.counter.fetch(counterKeypair.publicKey);
 
-    assert(currentCount.count.toNumber() === 1, "Expected  count to be 1")
-  })
+    assert(currentCount.count.toNumber() === 1, 'Expected  count to be 1');
+  });
 
-  it("Increment Counter Again", async () => {
-    await program.methods
-      .increment()
-      .accounts({ counter: counterKeypair.publicKey })
-      .rpc()
+  it('Increment Counter Again', async () => {
+    await program.methods.increment().accounts({ counter: counterKeypair.publicKey }).rpc();
 
-    const currentCount = await program.account.counter.fetch(
-      counterKeypair.publicKey
-    )
+    const currentCount = await program.account.counter.fetch(counterKeypair.publicKey);
 
-    assert(currentCount.count.toNumber() === 2, "Expected  count to be 2")
-  })
-})
+    assert(currentCount.count.toNumber() === 2, 'Expected  count to be 2');
+  });
+});

+ 9 - 9
basics/counter/mpl-stack/.solitarc.js

@@ -1,16 +1,16 @@
 // @ts-check
-const path = require('path');
+const path = require('node:path');
 const programDir = path.join(__dirname);
 const idlDir = path.join(__dirname, 'idl');
 const sdkDir = path.join(__dirname, 'ts', 'generated');
 const binaryInstallDir = path.join(__dirname, 'target', 'solita');
 
 module.exports = {
-    idlGenerator: 'shank',
-    programName: 'counter_mpl_stack',
-    programId: 'Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS',
-    idlDir,
-    sdkDir,
-    binaryInstallDir,
-    programDir,
-};
+  idlGenerator: 'shank',
+  programName: 'counter_mpl_stack',
+  programId: 'Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS',
+  idlDir,
+  sdkDir,
+  binaryInstallDir,
+  programDir,
+};

+ 1 - 1
basics/counter/mpl-stack/idl/counter_mpl_stack.json

@@ -39,4 +39,4 @@
     "binaryVersion": "0.0.8",
     "libVersion": "0.0.8"
   }
-}
+}

+ 1 - 1
basics/counter/mpl-stack/idl/counter_solana_native.json

@@ -30,4 +30,4 @@
     "origin": "shank",
     "address": "Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"
   }
-}
+}

+ 5 - 5
basics/counter/mpl-stack/jest.config.js

@@ -1,6 +1,6 @@
 module.exports = {
-    preset: 'ts-jest/presets/default',
-    testEnvironment: 'node',
-    testTimeout: 100000,
-    resolver: "ts-jest-resolver",
-};
+  preset: 'ts-jest/presets/default',
+  testEnvironment: 'node',
+  testTimeout: 100000,
+  resolver: 'ts-jest-resolver',
+};

+ 96 - 110
basics/counter/mpl-stack/tests/counter.test.ts

@@ -1,119 +1,105 @@
+import type { bignum } from '@metaplex-foundation/beet';
 import {
-    Connection,
-    Keypair,
-    LAMPORTS_PER_SOL,
-    Transaction,
-    TransactionInstruction,
-    sendAndConfirmTransaction,
-    SystemProgram
+  Connection,
+  Keypair,
+  LAMPORTS_PER_SOL,
+  SystemProgram,
+  Transaction,
+  type TransactionInstruction,
+  sendAndConfirmTransaction,
 } from '@solana/web3.js';
-import {
-    bignum
-} from '@metaplex-foundation/beet';
-import { assert } from 'chai';
 import { BN } from 'bn.js';
+import { assert } from 'chai';
 
-import {
-    createIncrementInstruction,
-    Counter,
-    PROGRAM_ID,
-} from '../ts';
+import { Counter, PROGRAM_ID, createIncrementInstruction } from '../ts';
 
 function convertBignumToNumber(bignum: bignum): number {
-    return new BN(bignum).toNumber();
+  return new BN(bignum).toNumber();
 }
 
-describe("Counter Solana Native", () => {
-    const connection = new Connection("http://localhost:8899");
-
-    it("Test allocate counter + increment tx", async () => {
-        // Randomly generate our wallet
-        const payerKeypair = Keypair.generate();
-        const payer = payerKeypair.publicKey;
-
-        // Randomly generate the account key 
-        // to sign for setting up the Counter state
-        const counterKeypair = Keypair.generate();
-        const counter = counterKeypair.publicKey;
-
-        // Airdrop our wallet 1 Sol
-        await connection.requestAirdrop(payer, LAMPORTS_PER_SOL);
-
-        // Create a TransactionInstruction to interact with our counter program
-        const allocIx: TransactionInstruction = SystemProgram.createAccount({
-            fromPubkey: payer,
-            newAccountPubkey: counter,
-            lamports: await connection.getMinimumBalanceForRentExemption(Counter.byteSize),
-            space: Counter.byteSize,
-            programId: PROGRAM_ID
-        })
-        const incrementIx: TransactionInstruction = createIncrementInstruction({ counter });
-        let tx = new Transaction().add(allocIx).add(incrementIx);
-
-        // Explicitly set the feePayer to be our wallet (this is set to first signer by default)
-        tx.feePayer = payer;
-
-        // Fetch a "timestamp" so validators know this is a recent transaction
-        tx.recentBlockhash = (await connection.getLatestBlockhash('confirmed')).blockhash;
-
-        // Send transaction to network (local network)
-        await sendAndConfirmTransaction(
-            connection,
-            tx,
-            [payerKeypair, counterKeypair],
-            { skipPreflight: true, commitment: 'confirmed' }
-        );
-
-        // Get the counter account info from network
-        let count = (await Counter.fromAccountAddress(connection, counter)).count;
-        assert((new BN(count)).toNumber() === 1, "Expected count to have been 1");
-        console.log(`[alloc+increment] count is: ${count}`);
+describe('Counter Solana Native', () => {
+  const connection = new Connection('http://localhost:8899');
+
+  it('Test allocate counter + increment tx', async () => {
+    // Randomly generate our wallet
+    const payerKeypair = Keypair.generate();
+    const payer = payerKeypair.publicKey;
+
+    // Randomly generate the account key
+    // to sign for setting up the Counter state
+    const counterKeypair = Keypair.generate();
+    const counter = counterKeypair.publicKey;
+
+    // Airdrop our wallet 1 Sol
+    await connection.requestAirdrop(payer, LAMPORTS_PER_SOL);
+
+    // Create a TransactionInstruction to interact with our counter program
+    const allocIx: TransactionInstruction = SystemProgram.createAccount({
+      fromPubkey: payer,
+      newAccountPubkey: counter,
+      lamports: await connection.getMinimumBalanceForRentExemption(Counter.byteSize),
+      space: Counter.byteSize,
+      programId: PROGRAM_ID,
+    });
+    const incrementIx: TransactionInstruction = createIncrementInstruction({
+      counter,
     });
-    it("Test allocate tx and increment tx", async () => {
-        const payerKeypair = Keypair.generate();
-        const payer = payerKeypair.publicKey;
-
-        const counterKeypair = Keypair.generate();
-        const counter = counterKeypair.publicKey;
-
-        await connection.requestAirdrop(payer, LAMPORTS_PER_SOL);
-
-        // Check allocate tx
-        const allocIx: TransactionInstruction = SystemProgram.createAccount({
-            fromPubkey: payer,
-            newAccountPubkey: counter,
-            lamports: await connection.getMinimumBalanceForRentExemption(Counter.byteSize),
-            space: Counter.byteSize,
-            programId: PROGRAM_ID
-        })
-        let tx = new Transaction().add(allocIx);
-        tx.feePayer = payer;
-        tx.recentBlockhash = (await connection.getLatestBlockhash('confirmed')).blockhash;
-        await sendAndConfirmTransaction(
-            connection,
-            tx,
-            [payerKeypair, counterKeypair],
-            { skipPreflight: true, commitment: 'confirmed' }
-        );
-
-        let count = (await Counter.fromAccountAddress(connection, counter)).count;
-        assert(convertBignumToNumber(count) === 0, "Expected count to have been 0");
-        console.log(`[allocate] count is: ${count}`);
-
-        // Check increment tx
-        const incrementIx: TransactionInstruction = createIncrementInstruction({ counter });
-        tx = new Transaction().add(incrementIx);
-        tx.feePayer = payer;
-        tx.recentBlockhash = (await connection.getLatestBlockhash('confirmed')).blockhash;
-        await sendAndConfirmTransaction(
-            connection,
-            tx,
-            [payerKeypair],
-            { skipPreflight: true, commitment: 'confirmed' }
-        );
-
-        count = (await Counter.fromAccountAddress(connection, counter)).count;
-        assert(convertBignumToNumber(count) === 1, "Expected count to have been 1");
-        console.log(`[increment] count is: ${count}`);
-    })
-})
+    const tx = new Transaction().add(allocIx).add(incrementIx);
+
+    // Explicitly set the feePayer to be our wallet (this is set to first signer by default)
+    tx.feePayer = payer;
+
+    // Fetch a "timestamp" so validators know this is a recent transaction
+    tx.recentBlockhash = (await connection.getLatestBlockhash('confirmed')).blockhash;
+
+    // Send transaction to network (local network)
+    await sendAndConfirmTransaction(connection, tx, [payerKeypair, counterKeypair], { skipPreflight: true, commitment: 'confirmed' });
+
+    // Get the counter account info from network
+    const count = (await Counter.fromAccountAddress(connection, counter)).count;
+    assert(new BN(count).toNumber() === 1, 'Expected count to have been 1');
+    console.log(`[alloc+increment] count is: ${count}`);
+  });
+  it('Test allocate tx and increment tx', async () => {
+    const payerKeypair = Keypair.generate();
+    const payer = payerKeypair.publicKey;
+
+    const counterKeypair = Keypair.generate();
+    const counter = counterKeypair.publicKey;
+
+    await connection.requestAirdrop(payer, LAMPORTS_PER_SOL);
+
+    // Check allocate tx
+    const allocIx: TransactionInstruction = SystemProgram.createAccount({
+      fromPubkey: payer,
+      newAccountPubkey: counter,
+      lamports: await connection.getMinimumBalanceForRentExemption(Counter.byteSize),
+      space: Counter.byteSize,
+      programId: PROGRAM_ID,
+    });
+    let tx = new Transaction().add(allocIx);
+    tx.feePayer = payer;
+    tx.recentBlockhash = (await connection.getLatestBlockhash('confirmed')).blockhash;
+    await sendAndConfirmTransaction(connection, tx, [payerKeypair, counterKeypair], { skipPreflight: true, commitment: 'confirmed' });
+
+    let count = (await Counter.fromAccountAddress(connection, counter)).count;
+    assert(convertBignumToNumber(count) === 0, 'Expected count to have been 0');
+    console.log(`[allocate] count is: ${count}`);
+
+    // Check increment tx
+    const incrementIx: TransactionInstruction = createIncrementInstruction({
+      counter,
+    });
+    tx = new Transaction().add(incrementIx);
+    tx.feePayer = payer;
+    tx.recentBlockhash = (await connection.getLatestBlockhash('confirmed')).blockhash;
+    await sendAndConfirmTransaction(connection, tx, [payerKeypair], {
+      skipPreflight: true,
+      commitment: 'confirmed',
+    });
+
+    count = (await Counter.fromAccountAddress(connection, counter)).count;
+    assert(convertBignumToNumber(count) === 1, 'Expected count to have been 1');
+    console.log(`[increment] count is: ${count}`);
+  });
+});

+ 29 - 47
basics/counter/mpl-stack/ts/generated/accounts/Counter.ts

@@ -5,9 +5,9 @@
  * See: https://github.com/metaplex-foundation/solita
  */
 
-import * as beet from '@metaplex-foundation/beet'
-import * as web3 from '@solana/web3.js'
-import * as beetSolana from '@metaplex-foundation/beet-solana'
+import * as beet from '@metaplex-foundation/beet';
+import * as beetSolana from '@metaplex-foundation/beet-solana';
+import * as web3 from '@solana/web3.js';
 
 /**
  * Arguments used to create {@link Counter}
@@ -15,8 +15,8 @@ import * as beetSolana from '@metaplex-foundation/beet-solana'
  * @category generated
  */
 export type CounterArgs = {
-  count: beet.bignum
-}
+  count: beet.bignum;
+};
 /**
  * Holds the data for the {@link Counter} Account and provides de/serialization
  * functionality for that data
@@ -25,24 +25,21 @@ export type CounterArgs = {
  * @category generated
  */
 export class Counter implements CounterArgs {
-  private constructor(readonly count: beet.bignum) { }
+  private constructor(readonly count: beet.bignum) {}
 
   /**
    * Creates a {@link Counter} instance from the provided args.
    */
   static fromArgs(args: CounterArgs) {
-    return new Counter(args.count)
+    return new Counter(args.count);
   }
 
   /**
    * Deserializes the {@link Counter} from the data of the provided {@link web3.AccountInfo}.
    * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it.
    */
-  static fromAccountInfo(
-    accountInfo: web3.AccountInfo<Buffer>,
-    offset = 0
-  ): [Counter, number] {
-    return Counter.deserialize(accountInfo.data, offset)
+  static fromAccountInfo(accountInfo: web3.AccountInfo<Buffer>, offset = 0): [Counter, number] {
+    return Counter.deserialize(accountInfo.data, offset);
   }
 
   /**
@@ -51,15 +48,14 @@ export class Counter implements CounterArgs {
    *
    * @throws Error if no account info is found at the address or if deserialization fails
    */
-  static async fromAccountAddress(
-    connection: web3.Connection,
-    address: web3.PublicKey
-  ): Promise<Counter> {
-    const accountInfo = await connection.getAccountInfo(address, { commitment: "confirmed" });
+  static async fromAccountAddress(connection: web3.Connection, address: web3.PublicKey): Promise<Counter> {
+    const accountInfo = await connection.getAccountInfo(address, {
+      commitment: 'confirmed',
+    });
     if (accountInfo == null) {
-      throw new Error(`Unable to find Counter account at ${address}`)
+      throw new Error(`Unable to find Counter account at ${address}`);
     }
-    return Counter.fromAccountInfo(accountInfo, 0)[0]
+    return Counter.fromAccountInfo(accountInfo, 0)[0];
   }
 
   /**
@@ -68,12 +64,8 @@ export class Counter implements CounterArgs {
    *
    * @param programId - the program that owns the accounts we are filtering
    */
-  static gpaBuilder(
-    programId: web3.PublicKey = new web3.PublicKey(
-      'Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS'
-    )
-  ) {
-    return beetSolana.GpaBuilder.fromStruct(programId, counterBeet)
+  static gpaBuilder(programId: web3.PublicKey = new web3.PublicKey('Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS')) {
+    return beetSolana.GpaBuilder.fromStruct(programId, counterBeet);
   }
 
   /**
@@ -81,7 +73,7 @@ export class Counter implements CounterArgs {
    * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it.
    */
   static deserialize(buf: Buffer, offset = 0): [Counter, number] {
-    return counterBeet.deserialize(buf, offset)
+    return counterBeet.deserialize(buf, offset);
   }
 
   /**
@@ -89,7 +81,7 @@ export class Counter implements CounterArgs {
    * @returns a tuple of the created Buffer and the offset up to which the buffer was written to store it.
    */
   serialize(): [Buffer, number] {
-    return counterBeet.serialize(this)
+    return counterBeet.serialize(this);
   }
 
   /**
@@ -97,7 +89,7 @@ export class Counter implements CounterArgs {
    * {@link Counter}
    */
   static get byteSize() {
-    return counterBeet.byteSize
+    return counterBeet.byteSize;
   }
 
   /**
@@ -106,14 +98,8 @@ export class Counter implements CounterArgs {
    *
    * @param connection used to retrieve the rent exemption information
    */
-  static async getMinimumBalanceForRentExemption(
-    connection: web3.Connection,
-    commitment?: web3.Commitment
-  ): Promise<number> {
-    return connection.getMinimumBalanceForRentExemption(
-      Counter.byteSize,
-      commitment
-    )
+  static async getMinimumBalanceForRentExemption(connection: web3.Connection, commitment?: web3.Commitment): Promise<number> {
+    return connection.getMinimumBalanceForRentExemption(Counter.byteSize, commitment);
   }
 
   /**
@@ -121,7 +107,7 @@ export class Counter implements CounterArgs {
    * hold {@link Counter} data.
    */
   static hasCorrectByteSize(buf: Buffer, offset = 0) {
-    return buf.byteLength - offset === Counter.byteSize
+    return buf.byteLength - offset === Counter.byteSize;
   }
 
   /**
@@ -131,17 +117,17 @@ export class Counter implements CounterArgs {
   pretty() {
     return {
       count: (() => {
-        const x = <{ toNumber: () => number }>this.count
+        const x = <{ toNumber: () => number }>this.count;
         if (typeof x.toNumber === 'function') {
           try {
-            return x.toNumber()
+            return x.toNumber();
           } catch (_) {
-            return x
+            return x;
           }
         }
-        return x
+        return x;
       })(),
-    }
+    };
   }
 }
 
@@ -149,8 +135,4 @@ export class Counter implements CounterArgs {
  * @category Accounts
  * @category generated
  */
-export const counterBeet = new beet.BeetStruct<Counter, CounterArgs>(
-  [['count', beet.u64]],
-  Counter.fromArgs,
-  'Counter'
-)
+export const counterBeet = new beet.BeetStruct<Counter, CounterArgs>([['count', beet.u64]], Counter.fromArgs, 'Counter');

+ 3 - 3
basics/counter/mpl-stack/ts/generated/accounts/index.ts

@@ -1,5 +1,5 @@
-export * from './Counter'
+export * from './Counter';
 
-import { Counter } from './Counter'
+import { Counter } from './Counter';
 
-export const accountProviders = { Counter }
+export const accountProviders = { Counter };

+ 5 - 5
basics/counter/mpl-stack/ts/generated/index.ts

@@ -1,6 +1,6 @@
-import { PublicKey } from '@solana/web3.js'
-export * from './accounts'
-export * from './instructions'
+import { PublicKey } from '@solana/web3.js';
+export * from './accounts';
+export * from './instructions';
 
 /**
  * Program address
@@ -8,7 +8,7 @@ export * from './instructions'
  * @category constants
  * @category generated
  */
-export const PROGRAM_ADDRESS = 'Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS'
+export const PROGRAM_ADDRESS = 'Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS';
 
 /**
  * Program public key
@@ -16,4 +16,4 @@ export const PROGRAM_ADDRESS = 'Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS'
  * @category constants
  * @category generated
  */
-export const PROGRAM_ID = new PublicKey(PROGRAM_ADDRESS)
+export const PROGRAM_ID = new PublicKey(PROGRAM_ADDRESS);

+ 12 - 12
basics/counter/mpl-stack/ts/generated/instructions/Increment.ts

@@ -5,8 +5,8 @@
  * See: https://github.com/metaplex-foundation/solita
  */
 
-import * as beet from '@metaplex-foundation/beet'
-import * as web3 from '@solana/web3.js'
+import * as beet from '@metaplex-foundation/beet';
+import * as web3 from '@solana/web3.js';
 
 /**
  * @category Instructions
@@ -14,8 +14,8 @@ import * as web3 from '@solana/web3.js'
  * @category generated
  */
 export const IncrementStruct = new beet.BeetArgsStruct<{
-  instructionDiscriminator: number
-}>([['instructionDiscriminator', beet.u8]], 'IncrementInstructionArgs')
+  instructionDiscriminator: number;
+}>([['instructionDiscriminator', beet.u8]], 'IncrementInstructionArgs');
 /**
  * Accounts required by the _Increment_ instruction
  *
@@ -25,10 +25,10 @@ export const IncrementStruct = new beet.BeetArgsStruct<{
  * @category generated
  */
 export type IncrementInstructionAccounts = {
-  counter: web3.PublicKey
-}
+  counter: web3.PublicKey;
+};
 
-export const incrementInstructionDiscriminator = 0
+export const incrementInstructionDiscriminator = 0;
 
 /**
  * Creates a _Increment_ instruction.
@@ -40,23 +40,23 @@ export const incrementInstructionDiscriminator = 0
  */
 export function createIncrementInstruction(
   accounts: IncrementInstructionAccounts,
-  programId = new web3.PublicKey('Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS')
+  programId = new web3.PublicKey('Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS'),
 ) {
   const [data] = IncrementStruct.serialize({
     instructionDiscriminator: incrementInstructionDiscriminator,
-  })
+  });
   const keys: web3.AccountMeta[] = [
     {
       pubkey: accounts.counter,
       isWritable: true,
       isSigner: false,
     },
-  ]
+  ];
 
   const ix = new web3.TransactionInstruction({
     programId,
     keys,
     data,
-  })
-  return ix
+  });
+  return ix;
 }

+ 1 - 1
basics/counter/mpl-stack/ts/generated/instructions/index.ts

@@ -1 +1 @@
-export * from './Increment'
+export * from './Increment';

+ 1 - 1
basics/counter/mpl-stack/ts/index.ts

@@ -1 +1 @@
-export * from './generated';
+export * from './generated';

+ 12 - 23
basics/counter/native/tests/counter.test.ts

@@ -1,23 +1,12 @@
-import {
-    Keypair,
-    PublicKey,
-    SystemProgram,
-    Transaction,
-    TransactionInstruction
-} from '@solana/web3.js';
-import { assert } from 'chai';
 import { describe, test } from 'node:test';
-import {  start } from 'solana-bankrun';
-import {
-    COUNTER_ACCOUNT_SIZE,
-    createIncrementInstruction,
-    deserializeCounterAccount,
-    PROGRAM_ID
-} from '../ts';
+import { Keypair, PublicKey, SystemProgram, Transaction, type TransactionInstruction } from '@solana/web3.js';
+import { assert } from 'chai';
+import { start } from 'solana-bankrun';
+import { COUNTER_ACCOUNT_SIZE, PROGRAM_ID, createIncrementInstruction, deserializeCounterAccount } from '../ts';
 
 describe('Counter Solana Native', async () => {
   // Randomly generate the program keypair and load the program to solana-bankrun
-  const context = await start([{ name: 'counter_solana_native', programId: PROGRAM_ID }],[]);
+  const context = await start([{ name: 'counter_solana_native', programId: PROGRAM_ID }], []);
   const client = context.banksClient;
   // Get the payer keypair from the context, this will be used to sign transactions with enough lamports
   const payer = context.payer;
@@ -38,8 +27,8 @@ describe('Counter Solana Native', async () => {
       space: COUNTER_ACCOUNT_SIZE,
       programId: PROGRAM_ID,
     });
-    const incrementIx: TransactionInstruction = createIncrementInstruction({ counter },{});
-    let tx = new Transaction().add(allocIx).add(incrementIx);
+    const incrementIx: TransactionInstruction = createIncrementInstruction({ counter }, {});
+    const tx = new Transaction().add(allocIx).add(incrementIx);
 
     // Explicitly set the feePayer to be our wallet (this is set to first signer by default)
     tx.feePayer = payer.publicKey;
@@ -60,7 +49,7 @@ describe('Counter Solana Native', async () => {
 
     // Deserialize the counter & check count has been incremented
     const counterAccount = deserializeCounterAccount(Buffer.from(counterAccountInfo.data));
-    assert(counterAccount.count.toNumber() === 1,'Expected count to have been 1');
+    assert(counterAccount.count.toNumber() === 1, 'Expected count to have been 1');
     console.log(`[alloc+increment] count is: ${counterAccount.count.toNumber()}`);
   });
 
@@ -72,7 +61,7 @@ describe('Counter Solana Native', async () => {
     const allocIx: TransactionInstruction = SystemProgram.createAccount({
       fromPubkey: payer.publicKey,
       newAccountPubkey: counter,
-      lamports:Number(rent.minimumBalance(BigInt(COUNTER_ACCOUNT_SIZE))),
+      lamports: Number(rent.minimumBalance(BigInt(COUNTER_ACCOUNT_SIZE))),
       space: COUNTER_ACCOUNT_SIZE,
       programId: PROGRAM_ID,
     });
@@ -88,11 +77,11 @@ describe('Counter Solana Native', async () => {
     assert(counterAccountInfo, 'Expected counter account to have been created');
 
     let counterAccount = deserializeCounterAccount(Buffer.from(counterAccountInfo.data));
-    assert(counterAccount.count.toNumber() === 0,'Expected count to have been 0');
+    assert(counterAccount.count.toNumber() === 0, 'Expected count to have been 0');
     console.log(`[allocate] count is: ${counterAccount.count.toNumber()}`);
 
     // Check increment tx
-    const incrementIx: TransactionInstruction = createIncrementInstruction({ counter },{});
+    const incrementIx: TransactionInstruction = createIncrementInstruction({ counter }, {});
     tx = new Transaction().add(incrementIx);
     tx.feePayer = payer.publicKey;
     tx.recentBlockhash = blockhash;
@@ -104,7 +93,7 @@ describe('Counter Solana Native', async () => {
     assert(counterAccountInfo, 'Expected counter account to have been created');
 
     counterAccount = deserializeCounterAccount(Buffer.from(counterAccountInfo.data));
-    assert(counterAccount.count.toNumber() === 1,'Expected count to have been 1');
+    assert(counterAccount.count.toNumber() === 1, 'Expected count to have been 1');
     console.log(`[increment] count is: ${counterAccount.count.toNumber()}`);
   });
 });

+ 8 - 8
basics/counter/native/ts/accounts/counter.ts

@@ -1,17 +1,17 @@
 import BN from 'bn.js';
 
 export type Counter = {
-    count: BN
-}
+  count: BN;
+};
 
 export const COUNTER_ACCOUNT_SIZE = 8;
 
 export function deserializeCounterAccount(data: Buffer): Counter {
-    if (data.byteLength !== 8) {
-        throw Error("Need exactly 8 bytes to deserialize counter")
-    }
+  if (data.byteLength !== 8) {
+    throw Error('Need exactly 8 bytes to deserialize counter');
+  }
 
-    return {
-        count: new BN(data, 'le')
-    }
+  return {
+    count: new BN(data, 'le'),
+  };
 }

+ 1 - 1
basics/counter/native/ts/accounts/index.ts

@@ -1 +1 @@
-export * from './counter';
+export * from './counter';

+ 1 - 1
basics/counter/native/ts/index.ts

@@ -2,4 +2,4 @@ import { PublicKey } from '@solana/web3.js';
 export * from './instructions';
 export * from './accounts';
 
-export const PROGRAM_ID = new PublicKey("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
+export const PROGRAM_ID = new PublicKey('Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS');

+ 17 - 21
basics/counter/native/ts/instructions/createIncrementInstruction.ts

@@ -1,25 +1,21 @@
-import { PublicKey, TransactionInstruction } from '@solana/web3.js';
+import { type PublicKey, TransactionInstruction } from '@solana/web3.js';
 import { PROGRAM_ID } from '../';
 
 export type IncrementInstructionAccounts = {
-    counter: PublicKey,
-}
-export type IncrementInstructionArgs = {
-}
+  counter: PublicKey;
+};
+export type IncrementInstructionArgs = {};
 
-export function createIncrementInstruction(
-    accounts: IncrementInstructionAccounts,
-    args: IncrementInstructionArgs
-): TransactionInstruction {
-    return new TransactionInstruction({
-        programId: PROGRAM_ID,
-        keys: [
-            {
-                pubkey: accounts.counter,
-                isSigner: false,
-                isWritable: true
-            }
-        ],
-        data: Buffer.from([0x0])
-    })
-}
+export function createIncrementInstruction(accounts: IncrementInstructionAccounts, args: IncrementInstructionArgs): TransactionInstruction {
+  return new TransactionInstruction({
+    programId: PROGRAM_ID,
+    keys: [
+      {
+        pubkey: accounts.counter,
+        isSigner: false,
+        isWritable: true,
+      },
+    ],
+    data: Buffer.from([0x0]),
+  });
+}

+ 1 - 1
basics/counter/native/ts/instructions/index.ts

@@ -1 +1 @@
-export * from './createIncrementInstruction';
+export * from './createIncrementInstruction';

+ 2 - 2
basics/counter/seahorse/migrations/deploy.ts

@@ -2,9 +2,9 @@
 // single deploy script that's invoked from the CLI, injecting a provider
 // configured from the workspace's Anchor.toml.
 
-const anchor = require("@coral-xyz/anchor");
+const anchor = require('@coral-xyz/anchor');
 
-module.exports = async function (provider) {
+module.exports = async (provider) => {
   // Configure client to use the provider.
   anchor.setProvider(provider);
 

+ 10 - 15
basics/counter/seahorse/tests/counter_seahorse.ts

@@ -1,21 +1,18 @@
-import * as anchor from "@coral-xyz/anchor";
-import { Program } from "@coral-xyz/anchor";
-import { Keypair, PublicKey, SystemProgram } from "@solana/web3.js";
-import { assert } from "chai";
-import { CounterSeahorse } from "../target/types/counter_seahorse";
+import * as anchor from '@coral-xyz/anchor';
+import type { Program } from '@coral-xyz/anchor';
+import { Keypair, PublicKey, SystemProgram } from '@solana/web3.js';
+import { assert } from 'chai';
+import type { CounterSeahorse } from '../target/types/counter_seahorse';
 
-describe("counter_seahorse", () => {
+describe('counter_seahorse', () => {
   // Configure the client to use the local cluster.
   anchor.setProvider(anchor.AnchorProvider.env());
 
   const program = anchor.workspace.CounterSeahorse as Program<CounterSeahorse>;
 
-  it("Increment counter", async () => {
+  it('Increment counter', async () => {
     const seed = 69;
-    const counter = PublicKey.findProgramAddressSync(
-      [Buffer.from([0x45])],
-      program.programId
-    )[0];
+    const counter = PublicKey.findProgramAddressSync([Buffer.from([0x45])], program.programId)[0];
 
     // Initialize counter
     await program.methods
@@ -33,9 +30,7 @@ describe("counter_seahorse", () => {
       })
       .rpc();
 
-    const count = (
-      await program.account.counter.fetch(counter)
-    ).count.toNumber();
-    assert(count === 1, "Expected count to be 1");
+    const count = (await program.account.counter.fetch(counter)).count.toNumber();
+    assert(count === 1, 'Expected count to be 1');
   });
 });

+ 19 - 20
basics/create-account/anchor/tests/test.ts

@@ -1,19 +1,18 @@
-import * as anchor from "@coral-xyz/anchor"
-import { CreateSystemAccount } from "../target/types/create_system_account"
-import { Keypair, SystemProgram } from "@solana/web3.js"
-import { assert } from "chai"
+import * as anchor from '@coral-xyz/anchor';
+import { Keypair, SystemProgram } from '@solana/web3.js';
+import { assert } from 'chai';
+import type { CreateSystemAccount } from '../target/types/create_system_account';
 
-describe("Create a system account", () => {
-  const provider = anchor.AnchorProvider.env()
-  anchor.setProvider(provider)
-  const wallet = provider.wallet as anchor.Wallet
-  const connection = provider.connection
-  const program = anchor.workspace
-    .CreateSystemAccount as anchor.Program<CreateSystemAccount>
+describe('Create a system account', () => {
+  const provider = anchor.AnchorProvider.env();
+  anchor.setProvider(provider);
+  const wallet = provider.wallet as anchor.Wallet;
+  const connection = provider.connection;
+  const program = anchor.workspace.CreateSystemAccount as anchor.Program<CreateSystemAccount>;
 
-  it("Create the account", async () => {
+  it('Create the account', async () => {
     // Generate a new keypair for the new account
-    const newKeypair = new Keypair()
+    const newKeypair = new Keypair();
 
     await program.methods
       .createSystemAccount()
@@ -22,14 +21,14 @@ describe("Create a system account", () => {
         newAccount: newKeypair.publicKey,
       })
       .signers([newKeypair])
-      .rpc()
+      .rpc();
 
     // Minimum balance for rent exemption for new account
-    const lamports = await connection.getMinimumBalanceForRentExemption(0)
+    const lamports = await connection.getMinimumBalanceForRentExemption(0);
 
     // Check that the account was created
-    const accountInfo = await connection.getAccountInfo(newKeypair.publicKey)
-    assert((accountInfo.owner = SystemProgram.programId))
-    assert(accountInfo.lamports === lamports)
-  })
-})
+    const accountInfo = await connection.getAccountInfo(newKeypair.publicKey);
+    assert((accountInfo.owner = SystemProgram.programId));
+    assert(accountInfo.lamports === lamports);
+  });
+});

+ 4 - 11
basics/create-account/native/tests/test.ts

@@ -1,17 +1,10 @@
-import {
-  Keypair,
-  LAMPORTS_PER_SOL,
-  PublicKey,
-  SystemProgram,
-  Transaction,
-  TransactionInstruction,
-} from '@solana/web3.js';
-import { start } from 'solana-bankrun';
 import { describe, test } from 'node:test';
+import { Keypair, LAMPORTS_PER_SOL, PublicKey, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js';
+import { start } from 'solana-bankrun';
 
 describe('Create a system account', async () => {
   const PROGRAM_ID = PublicKey.unique();
-  const context = await start([{ name: 'create_account_program', programId: PROGRAM_ID }],[]);
+  const context = await start([{ name: 'create_account_program', programId: PROGRAM_ID }], []);
   const client = context.banksClient;
   const payer = context.payer;
 
@@ -19,7 +12,7 @@ describe('Create a system account', async () => {
     const newKeypair = Keypair.generate();
     const blockhash = context.lastBlockhash;
 
-    let ix = new TransactionInstruction({
+    const ix = new TransactionInstruction({
       keys: [
         { pubkey: payer.publicKey, isSigner: true, isWritable: true },
         { pubkey: newKeypair.publicKey, isSigner: true, isWritable: true },

+ 2 - 2
basics/cross-program-invocation/anchor/migrations/deploy.ts

@@ -2,9 +2,9 @@
 // single deploy script that's invoked from the CLI, injecting a provider
 // configured from the workspace's Anchor.toml.
 
-const anchor = require("@coral-xyz/anchor");
+const anchor = require('@coral-xyz/anchor');
 
-module.exports = async function (provider) {
+module.exports = async (provider) => {
   // Configure client to use the provider.
   anchor.setProvider(provider);
 

+ 10 - 10
basics/cross-program-invocation/anchor/tests/cpi.ts

@@ -1,9 +1,9 @@
-import * as anchor from "@coral-xyz/anchor";
-import { Program } from "@coral-xyz/anchor";
-import { Hand } from "../target/types/hand";
-import { Lever } from "../target/types/lever";
+import * as anchor from '@coral-xyz/anchor';
+import type { Program } from '@coral-xyz/anchor';
+import type { Hand } from '../target/types/hand';
+import type { Lever } from '../target/types/lever';
 
-describe("cpi", () => {
+describe('cpi', () => {
   const provider = anchor.AnchorProvider.env();
   anchor.setProvider(provider);
 
@@ -13,7 +13,7 @@ describe("cpi", () => {
   // Generate a new keypair for the power account
   const powerAccount = new anchor.web3.Keypair();
 
-  it("Initialize the lever!", async () => {
+  it('Initialize the lever!', async () => {
     await lever.methods
       .initialize()
       .accounts({
@@ -24,18 +24,18 @@ describe("cpi", () => {
       .rpc();
   });
 
-  it("Pull the lever!", async () => {
+  it('Pull the lever!', async () => {
     await hand.methods
-      .pullLever("Chris")
+      .pullLever('Chris')
       .accounts({
         power: powerAccount.publicKey,
       })
       .rpc();
   });
 
-  it("Pull it again!", async () => {
+  it('Pull it again!', async () => {
     await hand.methods
-      .pullLever("Ashley")
+      .pullLever('Ashley')
       .accounts({
         power: powerAccount.publicKey,
       })

+ 63 - 90
basics/cross-program-invocation/native/tests/test.ts

@@ -1,105 +1,78 @@
-import {
-    Connection,
-    Keypair,
-    sendAndConfirmTransaction,
-    SystemProgram,
-    Transaction,
-    TransactionInstruction,
-} from '@solana/web3.js';
-import * as borsh from "borsh";
-import { Buffer } from "buffer";
+import { Buffer } from 'node:buffer';
+import { Connection, Keypair, SystemProgram, Transaction, TransactionInstruction, sendAndConfirmTransaction } from '@solana/web3.js';
+import * as borsh from 'borsh';
 
 function createKeypairFromFile(path: string): Keypair {
-    return Keypair.fromSecretKey(
-        Buffer.from(JSON.parse(require('fs').readFileSync(path, "utf-8")))
-    )
-};
+  return Keypair.fromSecretKey(Buffer.from(JSON.parse(require('node:fs').readFileSync(path, 'utf-8'))));
+}
 
+describe('CPI Example', () => {
+  const connection = new Connection('http://localhost:8899', 'confirmed');
+  const payer = createKeypairFromFile(`${require('node:os').homedir()}/.config/solana/id.json`);
+  const hand = createKeypairFromFile('./target/so/hand-keypair.json');
+  const lever = createKeypairFromFile('./target/so/lever-keypair.json');
 
-describe("CPI Example", () => {
-  
-    const connection = new Connection(`http://localhost:8899`, 'confirmed');
-    const payer = createKeypairFromFile(require('os').homedir() + '/.config/solana/id.json');
-    const hand = createKeypairFromFile('./target/so/hand-keypair.json');
-    const lever = createKeypairFromFile('./target/so/lever-keypair.json');
+  class Assignable {
+    constructor(properties) {
+      Object.keys(properties).map((key) => {
+        return (this[key] = properties[key]);
+      });
+    }
+  }
 
-    class Assignable {
-        constructor(properties) {
-            Object.keys(properties).map((key) => {
-                return (this[key] = properties[key]);
-            });
-        };
-    };
+  class PowerStatus extends Assignable {
+    toBuffer() {
+      return Buffer.from(borsh.serialize(PowerStatusSchema, this));
+    }
+  }
+  const PowerStatusSchema = new Map([[PowerStatus, { kind: 'struct', fields: [['is_on', 'u8']] }]]);
 
-    class PowerStatus extends Assignable {
-        toBuffer() { return Buffer.from(borsh.serialize(PowerStatusSchema, this)) }
-    };
-    const PowerStatusSchema = new Map([[ PowerStatus, { kind: 'struct', fields: [ ['is_on', 'u8'] ]} ]]);
-    
-    class SetPowerStatus extends Assignable {
-        toBuffer() { return Buffer.from(borsh.serialize(SetPowerStatusSchema, this)) }
-    };
-    const SetPowerStatusSchema = new Map([[ SetPowerStatus, { kind: 'struct', fields: [ ['name', 'string'] ]} ]]);
-  
-    const powerAccount = Keypair.generate();
-  
-    it("Initialize the lever!", async () => {
+  class SetPowerStatus extends Assignable {
+    toBuffer() {
+      return Buffer.from(borsh.serialize(SetPowerStatusSchema, this));
+    }
+  }
+  const SetPowerStatusSchema = new Map([[SetPowerStatus, { kind: 'struct', fields: [['name', 'string']] }]]);
 
-        let ix = new TransactionInstruction({
-            keys: [
-                {pubkey: powerAccount.publicKey, isSigner: true, isWritable: true},
-                {pubkey: payer.publicKey, isSigner: true, isWritable: true},
-                {pubkey: SystemProgram.programId, isSigner: false, isWritable: false}
-            ],
-            programId: lever.publicKey,
-            data: (new PowerStatus({is_on: true})).toBuffer(),
-        });
+  const powerAccount = Keypair.generate();
 
-        await sendAndConfirmTransaction(
-            connection, 
-            new Transaction().add(ix),
-            [payer, powerAccount]
-        );
-  
+  it('Initialize the lever!', async () => {
+    const ix = new TransactionInstruction({
+      keys: [
+        { pubkey: powerAccount.publicKey, isSigner: true, isWritable: true },
+        { pubkey: payer.publicKey, isSigner: true, isWritable: true },
+        { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
+      ],
+      programId: lever.publicKey,
+      data: new PowerStatus({ is_on: true }).toBuffer(),
     });
-  
-    it("Pull the lever!", async () => {
 
-        let ix = new TransactionInstruction({
-            keys: [
-                {pubkey: powerAccount.publicKey, isSigner: false, isWritable: true},
-                {pubkey: lever.publicKey, isSigner: false, isWritable: false},
-            ],
-            programId: hand.publicKey,
-            data: new SetPowerStatus({name: "Chris"}).toBuffer(),
-        });
+    await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, powerAccount]);
+  });
 
-        await sendAndConfirmTransaction(
-            connection, 
-            new Transaction().add(ix),
-            [payer]
-        );
-  
+  it('Pull the lever!', async () => {
+    const ix = new TransactionInstruction({
+      keys: [
+        { pubkey: powerAccount.publicKey, isSigner: false, isWritable: true },
+        { pubkey: lever.publicKey, isSigner: false, isWritable: false },
+      ],
+      programId: hand.publicKey,
+      data: new SetPowerStatus({ name: 'Chris' }).toBuffer(),
     });
-  
-    it("Pull it again!", async () => {
-  
-        let ix = new TransactionInstruction({
-            keys: [
-                {pubkey: powerAccount.publicKey, isSigner: false, isWritable: true},
-                {pubkey: lever.publicKey, isSigner: false, isWritable: false},
-            ],
-            programId: hand.publicKey,
-            data: new SetPowerStatus({name: "Ashley"}).toBuffer(),
-        });
 
-        await sendAndConfirmTransaction(
-            connection, 
-            new Transaction().add(ix),
-            [payer]
-        );
-  
+    await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]);
+  });
+
+  it('Pull it again!', async () => {
+    const ix = new TransactionInstruction({
+      keys: [
+        { pubkey: powerAccount.publicKey, isSigner: false, isWritable: true },
+        { pubkey: lever.publicKey, isSigner: false, isWritable: false },
+      ],
+      programId: hand.publicKey,
+      data: new SetPowerStatus({ name: 'Ashley' }).toBuffer(),
     });
+
+    await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]);
+  });
 });
-  
-  

+ 4 - 4
basics/hello-solana/anchor/tests/test.ts

@@ -1,7 +1,7 @@
-import * as anchor from "@coral-xyz/anchor";
-import { HelloSolana } from "../target/types/hello_solana";
+import * as anchor from '@coral-xyz/anchor';
+import type { HelloSolana } from '../target/types/hello_solana';
 
-describe("hello-solana", () => {
+describe('hello-solana', () => {
   // Configure the Anchor provider & load the program IDL
   // The IDL gives you a typescript module
   //
@@ -9,7 +9,7 @@ describe("hello-solana", () => {
   anchor.setProvider(provider);
   const program = anchor.workspace.HelloSolana as anchor.Program<HelloSolana>;
 
-  it("Say hello!", async () => {
+  it('Say hello!', async () => {
     // Just run Anchor's IDL method to build a transaction!
     //
     await program.methods.hello().accounts({}).rpc();

+ 13 - 17
basics/hello-solana/native/tests/test.ts

@@ -1,23 +1,19 @@
-import {
-  PublicKey,
-  Transaction,
-  TransactionInstruction,
-} from '@solana/web3.js';
-import { start } from 'solana-bankrun';
 import { describe, test } from 'node:test';
-import { assert } from "chai";
+import { PublicKey, Transaction, TransactionInstruction } from '@solana/web3.js';
+import { assert } from 'chai';
+import { start } from 'solana-bankrun';
 
 describe('hello-solana', async () => {
   // load program in solana-bankrun
   const PROGRAM_ID = PublicKey.unique();
-  const context = await start([{ name: 'hello_solana_program', programId: PROGRAM_ID }],[]);
+  const context = await start([{ name: 'hello_solana_program', programId: PROGRAM_ID }], []);
   const client = context.banksClient;
   const payer = context.payer;
 
   test('Say hello!', async () => {
     const blockhash = context.lastBlockhash;
     // We set up our instruction first.
-    let ix = new TransactionInstruction({
+    const ix = new TransactionInstruction({
       keys: [{ pubkey: payer.publicKey, isSigner: true, isWritable: true }],
       programId: PROGRAM_ID,
       data: Buffer.alloc(0), // No data
@@ -28,13 +24,13 @@ describe('hello-solana', async () => {
     tx.add(ix).sign(payer);
 
     // Now we process the transaction
-    let transaction = await client.processTransaction(tx);
+    const transaction = await client.processTransaction(tx);
 
-    assert(transaction.logMessages[0].startsWith("Program " + PROGRAM_ID));
-    assert(transaction.logMessages[1] === "Program log: Hello, Solana!");
-    assert(transaction.logMessages[2] === "Program log: Our program's Program ID: " + PROGRAM_ID);
-    assert(transaction.logMessages[3].startsWith("Program " + PROGRAM_ID + " consumed"));
-    assert(transaction.logMessages[4] === "Program " + PROGRAM_ID + " success");
-    assert(transaction.logMessages.length == 5);
-});
+    assert(transaction.logMessages[0].startsWith(`Program ${PROGRAM_ID}`));
+    assert(transaction.logMessages[1] === 'Program log: Hello, Solana!');
+    assert(transaction.logMessages[2] === `Program log: Our program's Program ID: ${PROGRAM_ID}`);
+    assert(transaction.logMessages[3].startsWith(`Program ${PROGRAM_ID} consumed`));
+    assert(transaction.logMessages[4] === `Program ${PROGRAM_ID} success`);
+    assert(transaction.logMessages.length === 5);
+  });
 });

+ 2 - 2
basics/hello-solana/seahorse/hello_solana/migrations/deploy.ts

@@ -2,9 +2,9 @@
 // single deploy script that's invoked from the CLI, injecting a provider
 // configured from the workspace's Anchor.toml.
 
-const anchor = require("@coral-xyz/anchor");
+const anchor = require('@coral-xyz/anchor');
 
-module.exports = async function (provider) {
+module.exports = async (provider) => {
   // Configure client to use the provider.
   anchor.setProvider(provider);
 

+ 4 - 4
basics/hello-solana/seahorse/hello_solana/tests/hello_solana.ts

@@ -1,14 +1,14 @@
-import * as anchor from "@coral-xyz/anchor";
-import { HelloSolana } from "../target/types/hello_solana";
+import * as anchor from '@coral-xyz/anchor';
+import type { HelloSolana } from '../target/types/hello_solana';
 
-describe("hello_solana", () => {
+describe('hello_solana', () => {
   // Configure the client to use the local cluster.
   const provider = anchor.AnchorProvider.env();
   anchor.setProvider(provider);
   const program = anchor.workspace.HelloSolana as anchor.Program<HelloSolana>;
   const payer = provider.wallet as anchor.Wallet;
 
-  it("Say hello!", async () => {
+  it('Say hello!', async () => {
     // Just run Anchor's IDL method to build a transaction
     // and sign it via a signer.
     await program.methods

+ 26 - 31
basics/pda-rent-payer/anchor/tests/test.ts

@@ -1,24 +1,21 @@
-import * as anchor from "@coral-xyz/anchor"
-import { PdaRentPayer } from "../target/types/pda_rent_payer"
-import { LAMPORTS_PER_SOL, PublicKey, Keypair } from "@solana/web3.js"
-import { assert } from "chai"
-
-describe("PDA Rent-Payer", () => {
-  const provider = anchor.AnchorProvider.env()
-  anchor.setProvider(provider)
-  const wallet = provider.wallet as anchor.Wallet
-  const connection = provider.connection
-  const program = anchor.workspace.PdaRentPayer as anchor.Program<PdaRentPayer>
+import * as anchor from '@coral-xyz/anchor';
+import { Keypair, LAMPORTS_PER_SOL, PublicKey } from '@solana/web3.js';
+import { assert } from 'chai';
+import type { PdaRentPayer } from '../target/types/pda_rent_payer';
+
+describe('PDA Rent-Payer', () => {
+  const provider = anchor.AnchorProvider.env();
+  anchor.setProvider(provider);
+  const wallet = provider.wallet as anchor.Wallet;
+  const connection = provider.connection;
+  const program = anchor.workspace.PdaRentPayer as anchor.Program<PdaRentPayer>;
 
   // PDA for the Rent Vault
-  const [rentVaultPDA] = PublicKey.findProgramAddressSync(
-    [Buffer.from("rent_vault")],
-    program.programId
-  )
+  const [rentVaultPDA] = PublicKey.findProgramAddressSync([Buffer.from('rent_vault')], program.programId);
 
-  it("Initialize the Rent Vault", async () => {
+  it('Initialize the Rent Vault', async () => {
     // 1 SOL
-    const fundAmount = new anchor.BN(LAMPORTS_PER_SOL)
+    const fundAmount = new anchor.BN(LAMPORTS_PER_SOL);
 
     await program.methods
       .initRentVault(fundAmount)
@@ -26,18 +23,16 @@ describe("PDA Rent-Payer", () => {
         payer: wallet.publicKey,
         rentVault: rentVaultPDA,
       })
-      .rpc()
+      .rpc();
 
     // Check rent vault balance
-    const accountInfo = await program.provider.connection.getAccountInfo(
-      rentVaultPDA
-    )
-    assert(accountInfo.lamports === fundAmount.toNumber())
-  })
+    const accountInfo = await program.provider.connection.getAccountInfo(rentVaultPDA);
+    assert(accountInfo.lamports === fundAmount.toNumber());
+  });
 
-  it("Create a new account using the Rent Vault", async () => {
+  it('Create a new account using the Rent Vault', async () => {
     // Generate a new keypair for the new account
-    const newAccount = new Keypair()
+    const newAccount = new Keypair();
 
     await program.methods
       .createNewAccount()
@@ -46,13 +41,13 @@ describe("PDA Rent-Payer", () => {
         newAccount: newAccount.publicKey,
       })
       .signers([newAccount])
-      .rpc()
+      .rpc();
 
     // Minimum balance for rent exemption for new account
-    const lamports = await connection.getMinimumBalanceForRentExemption(0)
+    const lamports = await connection.getMinimumBalanceForRentExemption(0);
 
     // Check that the account was created
-    const accountInfo = await connection.getAccountInfo(newAccount.publicKey)
-    assert(accountInfo.lamports === lamports)
-  })
-})
+    const accountInfo = await connection.getAccountInfo(newAccount.publicKey);
+    assert(accountInfo.lamports === lamports);
+  });
+});

+ 95 - 88
basics/pda-rent-payer/native/tests/test.ts

@@ -1,104 +1,111 @@
-import {
-    Connection,
-    Keypair,
-    PublicKey,
-    sendAndConfirmTransaction,
-    SystemProgram,
-    Transaction,
-    TransactionInstruction,
-} from '@solana/web3.js';
-import * as borsh from "borsh";
-import { Buffer } from "buffer";
-import { start } from 'solana-bankrun';
+import { Buffer } from 'node:buffer';
 import { describe, test } from 'node:test';
+import { Connection, Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction, sendAndConfirmTransaction } from '@solana/web3.js';
+import * as borsh from 'borsh';
+import { start } from 'solana-bankrun';
 
-describe("PDA Rent-Payer", async () => {
-    const PROGRAM_ID = PublicKey.unique();
-    const context = await start([{ name: 'pda_rent_payer_program', programId: PROGRAM_ID }],[]);
-    const client = context.banksClient;
-    const payer = context.payer;
-
-    class Assignable {
-        constructor(properties) {
-            Object.keys(properties).map((key) => {
-                return (this[key] = properties[key]);
-            });
-        };
-    };
+describe('PDA Rent-Payer', async () => {
+  const PROGRAM_ID = PublicKey.unique();
+  const context = await start([{ name: 'pda_rent_payer_program', programId: PROGRAM_ID }], []);
+  const client = context.banksClient;
+  const payer = context.payer;
 
-    enum MyInstruction {
-        InitRentVault,
-        CreateNewAccount,
+  class Assignable {
+    constructor(properties) {
+      Object.keys(properties).map((key) => {
+        return (this[key] = properties[key]);
+      });
     }
+  }
 
-    class InitRentVault extends Assignable {
-        toBuffer() { return Buffer.from(borsh.serialize(InitRentVaultSchema, this)) }
-    };
-    const InitRentVaultSchema = new Map([
-        [InitRentVault, {
-            kind: 'struct',
-            fields: [ ['instruction', 'u8'], ['fund_lamports', 'u64'] ],
-        }]
-    ]);
-
-    class CreateNewAccount extends Assignable {
-        toBuffer() { return Buffer.from(borsh.serialize(CreateNewAccountSchema, this)) }
-    };
-    const CreateNewAccountSchema = new Map([
-        [ CreateNewAccount, {
-            kind: 'struct',
-            fields: [ ['instruction', 'u8'] ],
-        }]
-    ]);
+  enum MyInstruction {
+    InitRentVault = 0,
+    CreateNewAccount = 1,
+  }
 
-    function deriveRentVaultPda() {
-        const pda = PublicKey.findProgramAddressSync(
-            [Buffer.from("rent_vault")],
-            PROGRAM_ID,
-        )
-        console.log(`PDA: ${pda[0].toBase58()}`)
-        return pda
+  class InitRentVault extends Assignable {
+    toBuffer() {
+      return Buffer.from(borsh.serialize(InitRentVaultSchema, this));
     }
+  }
+  const InitRentVaultSchema = new Map([
+    [
+      InitRentVault,
+      {
+        kind: 'struct',
+        fields: [
+          ['instruction', 'u8'],
+          ['fund_lamports', 'u64'],
+        ],
+      },
+    ],
+  ]);
 
-    test("Initialize the Rent Vault", async () => {
-        const blockhash = context.lastBlockhash;
-        const [rentVaultPda, _] = deriveRentVaultPda();
-        let ix = new TransactionInstruction({
-            keys: [
-                {pubkey: rentVaultPda, isSigner: false, isWritable: true},
-                {pubkey: payer.publicKey, isSigner: true, isWritable: true},
-                {pubkey: SystemProgram.programId, isSigner: false, isWritable: false}
-            ],
-            programId: PROGRAM_ID,
-            data: (new InitRentVault({ instruction: MyInstruction.InitRentVault, fund_lamports: 1000000000 })).toBuffer(),
-        });
+  class CreateNewAccount extends Assignable {
+    toBuffer() {
+      return Buffer.from(borsh.serialize(CreateNewAccountSchema, this));
+    }
+  }
+  const CreateNewAccountSchema = new Map([
+    [
+      CreateNewAccount,
+      {
+        kind: 'struct',
+        fields: [['instruction', 'u8']],
+      },
+    ],
+  ]);
 
-        const tx = new Transaction();
-        tx.recentBlockhash = blockhash;
-        tx.add(ix).sign(payer);
+  function deriveRentVaultPda() {
+    const pda = PublicKey.findProgramAddressSync([Buffer.from('rent_vault')], PROGRAM_ID);
+    console.log(`PDA: ${pda[0].toBase58()}`);
+    return pda;
+  }
 
-        await client.processTransaction(tx);
+  test('Initialize the Rent Vault', async () => {
+    const blockhash = context.lastBlockhash;
+    const [rentVaultPda, _] = deriveRentVaultPda();
+    const ix = new TransactionInstruction({
+      keys: [
+        { pubkey: rentVaultPda, isSigner: false, isWritable: true },
+        { pubkey: payer.publicKey, isSigner: true, isWritable: true },
+        { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
+      ],
+      programId: PROGRAM_ID,
+      data: new InitRentVault({
+        instruction: MyInstruction.InitRentVault,
+        fund_lamports: 1000000000,
+      }).toBuffer(),
     });
 
-    test("Create a new account using the Rent Vault", async () => {
-        const blockhash = context.lastBlockhash;
-        const newAccount = Keypair.generate();
-        const [rentVaultPda, _] = deriveRentVaultPda();
-        let ix = new TransactionInstruction({
-            keys: [
-                {pubkey: newAccount.publicKey, isSigner: true, isWritable: true},
-                {pubkey: rentVaultPda, isSigner: false, isWritable: true},
-                {pubkey: SystemProgram.programId, isSigner: false, isWritable: false}
-            ],
-            programId: PROGRAM_ID,
-            data: new CreateNewAccount({ instruction: MyInstruction.CreateNewAccount }).toBuffer(),
-        });
+    const tx = new Transaction();
+    tx.recentBlockhash = blockhash;
+    tx.add(ix).sign(payer);
 
-        const tx = new Transaction();
-        tx.recentBlockhash = blockhash;
-        tx.add(ix).sign(payer, newAccount); // Add instruction and Sign the transaction
+    await client.processTransaction(tx);
+  });
 
-        // Now we process the transaction
-        await client.processTransaction(tx);
+  test('Create a new account using the Rent Vault', async () => {
+    const blockhash = context.lastBlockhash;
+    const newAccount = Keypair.generate();
+    const [rentVaultPda, _] = deriveRentVaultPda();
+    const ix = new TransactionInstruction({
+      keys: [
+        { pubkey: newAccount.publicKey, isSigner: true, isWritable: true },
+        { pubkey: rentVaultPda, isSigner: false, isWritable: true },
+        { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
+      ],
+      programId: PROGRAM_ID,
+      data: new CreateNewAccount({
+        instruction: MyInstruction.CreateNewAccount,
+      }).toBuffer(),
     });
+
+    const tx = new Transaction();
+    tx.recentBlockhash = blockhash;
+    tx.add(ix).sign(payer, newAccount); // Add instruction and Sign the transaction
+
+    // Now we process the transaction
+    await client.processTransaction(tx);
+  });
 });

+ 7 - 8
basics/processing-instructions/anchor/tests/test.ts

@@ -1,16 +1,15 @@
-import * as anchor from "@coral-xyz/anchor";
-import { ProcessingInstructions } from "../target/types/processing_instructions";
+import * as anchor from '@coral-xyz/anchor';
+import type { ProcessingInstructions } from '../target/types/processing_instructions';
 
-describe("custom-instruction-data", () => {
+describe('custom-instruction-data', () => {
   const provider = anchor.AnchorProvider.env();
   anchor.setProvider(provider);
-  const program = anchor.workspace
-    .ProcessingInstructions as anchor.Program<ProcessingInstructions>;
+  const program = anchor.workspace.ProcessingInstructions as anchor.Program<ProcessingInstructions>;
 
-  it("Go to the park!", async () => {
+  it('Go to the park!', async () => {
     // Again, Anchor makes it super simple.
     //
-    await program.methods.goToPark("Jimmy", 3).accounts({}).rpc();
-    await program.methods.goToPark("Mary", 10).accounts({}).rpc();
+    await program.methods.goToPark('Jimmy', 3).accounts({}).rpc();
+    await program.methods.goToPark('Mary', 10).accounts({}).rpc();
   });
 });

+ 54 - 59
basics/processing-instructions/native/tests/test.ts

@@ -1,75 +1,70 @@
-import {
-    PublicKey,
-    Transaction,
-    TransactionInstruction,
-} from '@solana/web3.js';
-import * as borsh from "borsh";
-import { Buffer } from "buffer";
-import { start } from 'solana-bankrun';
+import { Buffer } from 'node:buffer';
 import { describe, test } from 'node:test';
+import { PublicKey, Transaction, TransactionInstruction } from '@solana/web3.js';
+import * as borsh from 'borsh';
+import { start } from 'solana-bankrun';
 
-describe("custom-instruction-data", async () => {
+describe('custom-instruction-data', async () => {
   const PROGRAM_ID = PublicKey.unique();
-  const context = await start([{ name: 'processing_instructions_program', programId: PROGRAM_ID }],[]);
+  const context = await start([{ name: 'processing_instructions_program', programId: PROGRAM_ID }], []);
   const client = context.banksClient;
   const payer = context.payer;
 
-    class Assignable {
-        constructor(properties) {
-            Object.keys(properties).map((key) => {
-                return (this[key] = properties[key]);
-            });
-        };
-    };
+  class Assignable {
+    constructor(properties) {
+      Object.keys(properties).map((key) => {
+        return (this[key] = properties[key]);
+      });
+    }
+  }
 
-    class InstructionData extends Assignable {
-        toBuffer() {
-            return Buffer.from(borsh.serialize(InstructionDataSchema, this));
-        }
-    };
+  class InstructionData extends Assignable {
+    toBuffer() {
+      return Buffer.from(borsh.serialize(InstructionDataSchema, this));
+    }
+  }
 
-    const InstructionDataSchema = new Map([
-        [
-            InstructionData, {
-                kind: 'struct',
-                fields: [
-                    ['name', 'string'],
-                    ['height', 'u32'],
-                ]
-            }
-        ]
-    ]);
+  const InstructionDataSchema = new Map([
+    [
+      InstructionData,
+      {
+        kind: 'struct',
+        fields: [
+          ['name', 'string'],
+          ['height', 'u32'],
+        ],
+      },
+    ],
+  ]);
 
-    test("Go to the park!", async () => {
-        const blockhash = context.lastBlockhash;
+  test('Go to the park!', async () => {
+    const blockhash = context.lastBlockhash;
 
-        const jimmy = new InstructionData({
-            name: "Jimmy",
-            height: 3
-        });
+    const jimmy = new InstructionData({
+      name: 'Jimmy',
+      height: 3,
+    });
 
-        const mary = new InstructionData({
-            name: "Mary",
-            height: 10
-        });
+    const mary = new InstructionData({
+      name: 'Mary',
+      height: 10,
+    });
 
-        let ix1 = new TransactionInstruction({
-            keys: [
-                {pubkey: payer.publicKey, isSigner: true, isWritable: true}
-            ],
-            programId: PROGRAM_ID,
-            data: jimmy.toBuffer(),
-        });
+    const ix1 = new TransactionInstruction({
+      keys: [{ pubkey: payer.publicKey, isSigner: true, isWritable: true }],
+      programId: PROGRAM_ID,
+      data: jimmy.toBuffer(),
+    });
 
-        let ix2 = new TransactionInstruction({
-            ...ix1,
-            data: mary.toBuffer(),
-        });
+    const ix2 = new TransactionInstruction({
+      ...ix1,
+      data: mary.toBuffer(),
+    });
 
-        const tx = new Transaction();
-        tx.recentBlockhash = blockhash;
-        tx.add(ix1).add(ix2).sign(payer);
+    const tx = new Transaction();
+    tx.recentBlockhash = blockhash;
+    tx.add(ix1).add(ix2).sign(payer);
 
-        await client.processTransaction(tx);
-    });
+    await client.processTransaction(tx);
   });
+});

+ 23 - 27
basics/program-derived-addresses/anchor/tests/test.ts

@@ -1,52 +1,48 @@
-import * as anchor from "@coral-xyz/anchor"
-import { AnchorProgramExample } from "../target/types/anchor_program_example"
-import { PublicKey } from "@solana/web3.js"
+import * as anchor from '@coral-xyz/anchor';
+import { PublicKey } from '@solana/web3.js';
+import type { AnchorProgramExample } from '../target/types/anchor_program_example';
 
-describe("PDAs", () => {
-  const provider = anchor.AnchorProvider.env()
-  anchor.setProvider(provider)
-  const payer = provider.wallet as anchor.Wallet
-  const program = anchor.workspace
-    .AnchorProgramExample as anchor.Program<AnchorProgramExample>
+describe('PDAs', () => {
+  const provider = anchor.AnchorProvider.env();
+  anchor.setProvider(provider);
+  const payer = provider.wallet as anchor.Wallet;
+  const program = anchor.workspace.AnchorProgramExample as anchor.Program<AnchorProgramExample>;
 
   // PDA for the page visits account
-  const [pageVisitPDA] = PublicKey.findProgramAddressSync(
-    [Buffer.from("page_visits"), payer.publicKey.toBuffer()],
-    program.programId
-  )
+  const [pageVisitPDA] = PublicKey.findProgramAddressSync([Buffer.from('page_visits'), payer.publicKey.toBuffer()], program.programId);
 
-  it("Create the page visits tracking PDA", async () => {
+  it('Create the page visits tracking PDA', async () => {
     await program.methods
       .createPageVisits()
       .accounts({
         payer: payer.publicKey,
         pageVisits: pageVisitPDA,
       })
-      .rpc()
-  })
+      .rpc();
+  });
 
-  it("Visit the page!", async () => {
+  it('Visit the page!', async () => {
     await program.methods
       .incrementPageVisits()
       .accounts({
         user: payer.publicKey,
         pageVisits: pageVisitPDA,
       })
-      .rpc()
-  })
+      .rpc();
+  });
 
-  it("Visit the page!", async () => {
+  it('Visit the page!', async () => {
     await program.methods
       .incrementPageVisits()
       .accounts({
         user: payer.publicKey,
         pageVisits: pageVisitPDA,
       })
-      .rpc()
-  })
+      .rpc();
+  });
 
-  it("View page visits", async () => {
-    const pageVisits = await program.account.pageVisits.fetch(pageVisitPDA)
-    console.log(`Number of page visits: ${pageVisits.pageVisits}`)
-  })
-})
+  it('View page visits', async () => {
+    const pageVisits = await program.account.pageVisits.fetch(pageVisitPDA);
+    console.log(`Number of page visits: ${pageVisits.pageVisits}`);
+  });
+});

+ 135 - 131
basics/program-derived-addresses/native/tests/test.ts

@@ -1,143 +1,147 @@
-import {
-    Keypair,
-    PublicKey,
-    SystemProgram,
-    Transaction,
-    TransactionInstruction,
-} from '@solana/web3.js';
-import * as borsh from "borsh";
-import { Buffer } from "buffer";
+import { Buffer } from 'node:buffer';
 import { describe, test } from 'node:test';
+import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js';
+import * as borsh from 'borsh';
 import { start } from 'solana-bankrun';
 
-describe("PDAs", async () => {
-    const PROGRAM_ID = PublicKey.unique();
-    const context = await start([{ name: 'program_derived_addresses_program', programId: PROGRAM_ID }],[]);
-    const client = context.banksClient;
-    const payer = context.payer;
-    const rent = await client.getRent();
-
-    class Assignable {
-        constructor(properties) {
-            Object.keys(properties).map((key) => {
-                return (this[key] = properties[key]);
-            });
-        };
-    };
-
-    class PageVisits extends Assignable {
-        toBuffer() { return Buffer.from(borsh.serialize(PageVisitsSchema, this)) }
-
-        static fromBuffer(buffer: Buffer) {
-            return borsh.deserialize(PageVisitsSchema, PageVisits, buffer);
-        };
-    };
-    const PageVisitsSchema = new Map([
-        [ PageVisits, {
-            kind: 'struct',
-            fields: [ ['page_visits', 'u32'], ['bump', 'u8'] ],
-        }]
-    ]);
-
-    class IncrementPageVisits extends Assignable {
-        toBuffer() { return Buffer.from(borsh.serialize(IncrementPageVisitsSchema, this)) }
-    };
-    const IncrementPageVisitsSchema = new Map([
-        [ IncrementPageVisits, {
-            kind: 'struct',
-            fields: [],
-        }]
-    ]);
-
-    const testUser = Keypair.generate();
-
-    test("Create a test user", async () => {
-        let ix = SystemProgram.createAccount({
-            fromPubkey: payer.publicKey,
-            lamports: Number(rent.minimumBalance(BigInt(0))),
-            newAccountPubkey: testUser.publicKey,
-            programId: SystemProgram.programId,
-            space: 0,
-        });
-
-        const tx = new Transaction();
-        const blockhash = context.lastBlockhash;
-        tx.recentBlockhash = blockhash;
-        tx.add(ix).sign(payer, testUser); // Add instruction and Sign the transaction
-
-        await client.processTransaction(tx);
-        console.log(`Local Wallet: ${payer.publicKey}`);
-        console.log(`Created User: ${testUser.publicKey}`);
-    });
+describe('PDAs', async () => {
+  const PROGRAM_ID = PublicKey.unique();
+  const context = await start([{ name: 'program_derived_addresses_program', programId: PROGRAM_ID }], []);
+  const client = context.banksClient;
+  const payer = context.payer;
+  const rent = await client.getRent();
+
+  class Assignable {
+    constructor(properties) {
+      Object.keys(properties).map((key) => {
+        return (this[key] = properties[key]);
+      });
+    }
+  }
 
-    function derivePageVisitsPda(userPubkey: PublicKey) {
-        return PublicKey.findProgramAddressSync(
-            [Buffer.from("page_visits"), userPubkey.toBuffer()],
-            PROGRAM_ID,
-        )
+  class PageVisits extends Assignable {
+    toBuffer() {
+      return Buffer.from(borsh.serialize(PageVisitsSchema, this));
     }
 
-    test("Create the page visits tracking PDA", async () => {
-        const [pageVisitsPda, pageVisitsBump] = derivePageVisitsPda(testUser.publicKey);
-        let ix = new TransactionInstruction({
-            keys: [
-                {pubkey: pageVisitsPda, isSigner: false, isWritable: true},
-                {pubkey: testUser.publicKey, isSigner: false, isWritable: false},
-                {pubkey: payer.publicKey, isSigner: true, isWritable: true},
-                {pubkey: SystemProgram.programId, isSigner: false, isWritable: false}
-            ],
-            programId: PROGRAM_ID,
-            data: (new PageVisits({page_visits: 0, bump: pageVisitsBump})).toBuffer(),
-        });
-        const tx = new Transaction();
-        const blockhash = context.lastBlockhash;
-        tx.recentBlockhash = blockhash;
-        tx.add(ix).sign(payer);
-
-        await client.processTransaction(tx);
+    static fromBuffer(buffer: Buffer) {
+      return borsh.deserialize(PageVisitsSchema, PageVisits, buffer);
+    }
+  }
+  const PageVisitsSchema = new Map([
+    [
+      PageVisits,
+      {
+        kind: 'struct',
+        fields: [
+          ['page_visits', 'u32'],
+          ['bump', 'u8'],
+        ],
+      },
+    ],
+  ]);
+
+  class IncrementPageVisits extends Assignable {
+    toBuffer() {
+      return Buffer.from(borsh.serialize(IncrementPageVisitsSchema, this));
+    }
+  }
+  const IncrementPageVisitsSchema = new Map([
+    [
+      IncrementPageVisits,
+      {
+        kind: 'struct',
+        fields: [],
+      },
+    ],
+  ]);
+
+  const testUser = Keypair.generate();
+
+  test('Create a test user', async () => {
+    const ix = SystemProgram.createAccount({
+      fromPubkey: payer.publicKey,
+      lamports: Number(rent.minimumBalance(BigInt(0))),
+      newAccountPubkey: testUser.publicKey,
+      programId: SystemProgram.programId,
+      space: 0,
     });
 
-    test("Visit the page!", async () => {
-        const [pageVisitsPda, _] = derivePageVisitsPda(testUser.publicKey);
-        let ix = new TransactionInstruction({
-            keys: [
-                {pubkey: pageVisitsPda, isSigner: false, isWritable: true},
-                {pubkey: payer.publicKey, isSigner: true, isWritable: true},
-            ],
-            programId: PROGRAM_ID,
-            data: new IncrementPageVisits({}).toBuffer(),
-        });
-        const tx = new Transaction();
-        const blockhash = context.lastBlockhash;
-        tx.recentBlockhash = blockhash;
-        tx.add(ix).sign(payer);
-
-        await client.processTransaction(tx);
+    const tx = new Transaction();
+    const blockhash = context.lastBlockhash;
+    tx.recentBlockhash = blockhash;
+    tx.add(ix).sign(payer, testUser); // Add instruction and Sign the transaction
+
+    await client.processTransaction(tx);
+    console.log(`Local Wallet: ${payer.publicKey}`);
+    console.log(`Created User: ${testUser.publicKey}`);
+  });
+
+  function derivePageVisitsPda(userPubkey: PublicKey) {
+    return PublicKey.findProgramAddressSync([Buffer.from('page_visits'), userPubkey.toBuffer()], PROGRAM_ID);
+  }
+
+  test('Create the page visits tracking PDA', async () => {
+    const [pageVisitsPda, pageVisitsBump] = derivePageVisitsPda(testUser.publicKey);
+    const ix = new TransactionInstruction({
+      keys: [
+        { pubkey: pageVisitsPda, isSigner: false, isWritable: true },
+        { pubkey: testUser.publicKey, isSigner: false, isWritable: false },
+        { pubkey: payer.publicKey, isSigner: true, isWritable: true },
+        { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
+      ],
+      programId: PROGRAM_ID,
+      data: new PageVisits({ page_visits: 0, bump: pageVisitsBump }).toBuffer(),
     });
-
-    // commented because couldn't get different blockhash
-    test("Visit the page!", async () => {
-        const [pageVisitsPda, _] = derivePageVisitsPda(testUser.publicKey);
-        let ix = new TransactionInstruction({
-            keys: [
-                {pubkey: pageVisitsPda, isSigner: false, isWritable: true},
-                {pubkey: payer.publicKey, isSigner: true, isWritable: true},
-            ],
-            programId: PROGRAM_ID,
-            data: new IncrementPageVisits({}).toBuffer(),
-        });
-        const tx = new Transaction();
-        const [blockhash, _block_height] = await client.getLatestBlockhash();
-        tx.recentBlockhash = blockhash;
-        tx.add(ix).sign(payer);
-
-        await client.processTransaction(tx);
+    const tx = new Transaction();
+    const blockhash = context.lastBlockhash;
+    tx.recentBlockhash = blockhash;
+    tx.add(ix).sign(payer);
+
+    await client.processTransaction(tx);
+  });
+
+  test('Visit the page!', async () => {
+    const [pageVisitsPda, _] = derivePageVisitsPda(testUser.publicKey);
+    const ix = new TransactionInstruction({
+      keys: [
+        { pubkey: pageVisitsPda, isSigner: false, isWritable: true },
+        { pubkey: payer.publicKey, isSigner: true, isWritable: true },
+      ],
+      programId: PROGRAM_ID,
+      data: new IncrementPageVisits({}).toBuffer(),
     });
-
-    test("Read page visits", async () => {
-        const [pageVisitsPda, _] = derivePageVisitsPda(testUser.publicKey);
-        const accountInfo = await client.getAccount(pageVisitsPda);
-        const readPageVisits = PageVisits.fromBuffer(Buffer.from(accountInfo.data));
-        console.log(`Number of page visits: ${readPageVisits.page_visits}`);
+    const tx = new Transaction();
+    const blockhash = context.lastBlockhash;
+    tx.recentBlockhash = blockhash;
+    tx.add(ix).sign(payer);
+
+    await client.processTransaction(tx);
+  });
+
+  // commented because couldn't get different blockhash
+  test('Visit the page!', async () => {
+    const [pageVisitsPda, _] = derivePageVisitsPda(testUser.publicKey);
+    const ix = new TransactionInstruction({
+      keys: [
+        { pubkey: pageVisitsPda, isSigner: false, isWritable: true },
+        { pubkey: payer.publicKey, isSigner: true, isWritable: true },
+      ],
+      programId: PROGRAM_ID,
+      data: new IncrementPageVisits({}).toBuffer(),
     });
+    const tx = new Transaction();
+    const [blockhash, _block_height] = await client.getLatestBlockhash();
+    tx.recentBlockhash = blockhash;
+    tx.add(ix).sign(payer);
+
+    await client.processTransaction(tx);
+  });
+
+  test('Read page visits', async () => {
+    const [pageVisitsPda, _] = derivePageVisitsPda(testUser.publicKey);
+    const accountInfo = await client.getAccount(pageVisitsPda);
+    const readPageVisits = PageVisits.fromBuffer(Buffer.from(accountInfo.data));
+    console.log(`Number of page visits: ${readPageVisits.page_visits}`);
+  });
 });

+ 2 - 2
basics/realloc/anchor/migrations/deploy.ts

@@ -2,9 +2,9 @@
 // single deploy script that's invoked from the CLI, injecting a provider
 // configured from the workspace's Anchor.toml.
 
-const anchor = require("@coral-xyz/anchor");
+const anchor = require('@coral-xyz/anchor');
 
-module.exports = async function (provider) {
+module.exports = async (provider) => {
   // Configure client to use the provider.
   anchor.setProvider(provider);
 

+ 17 - 17
basics/realloc/anchor/package.json

@@ -1,19 +1,19 @@
 {
-    "scripts": {
-        "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w",
-        "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check"
-    },
-    "dependencies": {
-        "@coral-xyz/anchor": "^0.30.0"
-    },
-    "devDependencies": {
-        "chai": "^4.3.4",
-        "mocha": "^9.0.3",
-        "ts-mocha": "^10.0.0",
-        "@types/bn.js": "^5.1.0",
-        "@types/chai": "^4.3.0",
-        "@types/mocha": "^9.0.0",
-        "typescript": "^4.3.5",
-        "prettier": "^2.6.2"
-    }
+  "scripts": {
+    "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w",
+    "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check"
+  },
+  "dependencies": {
+    "@coral-xyz/anchor": "^0.30.0"
+  },
+  "devDependencies": {
+    "chai": "^4.3.4",
+    "mocha": "^9.0.3",
+    "ts-mocha": "^10.0.0",
+    "@types/bn.js": "^5.1.0",
+    "@types/chai": "^4.3.0",
+    "@types/mocha": "^9.0.0",
+    "typescript": "^4.3.5",
+    "prettier": "^2.6.2"
+  }
 }

+ 34 - 34
basics/realloc/anchor/tests/anchor-realloc.ts

@@ -1,37 +1,37 @@
-import * as anchor from "@coral-xyz/anchor"
-import { Program } from "@coral-xyz/anchor"
-import { AnchorRealloc } from "../target/types/anchor_realloc"
-import { Keypair } from "@solana/web3.js"
-import { assert } from "chai"
+import * as anchor from '@coral-xyz/anchor';
+import type { Program } from '@coral-xyz/anchor';
+import { Keypair } from '@solana/web3.js';
+import { assert } from 'chai';
+import type { AnchorRealloc } from '../target/types/anchor_realloc';
 
-describe("anchor-realloc", () => {
+describe('anchor-realloc', () => {
   // Configure the client to use the local cluster.
-  const provider = anchor.AnchorProvider.env()
-  anchor.setProvider(provider)
-  const payer = provider.wallet as anchor.Wallet
-  const connection = provider.connection
+  const provider = anchor.AnchorProvider.env();
+  anchor.setProvider(provider);
+  const payer = provider.wallet as anchor.Wallet;
+  const connection = provider.connection;
 
-  const program = anchor.workspace.AnchorRealloc as Program<AnchorRealloc>
+  const program = anchor.workspace.AnchorRealloc as Program<AnchorRealloc>;
 
-  const messageAccount = new Keypair()
+  const messageAccount = new Keypair();
 
   // helper function to check the account data and message
   async function checkAccount(publicKey, expectedMessage) {
-    const accountInfo = await connection.getAccountInfo(publicKey)
-    const accountData = await program.account.message.fetch(publicKey)
+    const accountInfo = await connection.getAccountInfo(publicKey);
+    const accountData = await program.account.message.fetch(publicKey);
 
     // 8 bytes for the discriminator,
     // 4 bytes for the length of the message,
     // and the length of the message
-    assert.equal(accountInfo.data.length, 8 + 4 + expectedMessage.length)
-    assert.equal(accountData.message, expectedMessage)
+    assert.equal(accountInfo.data.length, 8 + 4 + expectedMessage.length);
+    assert.equal(accountData.message, expectedMessage);
 
-    console.log(`Account Data Length: ${accountInfo.data.length}`)
-    console.log(`Message: ${accountData.message}`)
+    console.log(`Account Data Length: ${accountInfo.data.length}`);
+    console.log(`Message: ${accountData.message}`);
   }
 
-  it("Is initialized!", async () => {
-    const input = "hello"
+  it('Is initialized!', async () => {
+    const input = 'hello';
 
     await program.methods
       .initialize(input)
@@ -40,13 +40,13 @@ describe("anchor-realloc", () => {
         messageAccount: messageAccount.publicKey,
       })
       .signers([messageAccount])
-      .rpc()
+      .rpc();
 
-    await checkAccount(messageAccount.publicKey, input)
-  })
+    await checkAccount(messageAccount.publicKey, input);
+  });
 
-  it("Update", async () => {
-    const input = "hello world"
+  it('Update', async () => {
+    const input = 'hello world';
 
     await program.methods
       .update(input)
@@ -54,13 +54,13 @@ describe("anchor-realloc", () => {
         payer: payer.publicKey,
         messageAccount: messageAccount.publicKey,
       })
-      .rpc()
+      .rpc();
 
-    await checkAccount(messageAccount.publicKey, input)
-  })
+    await checkAccount(messageAccount.publicKey, input);
+  });
 
-  it("Update", async () => {
-    const input = "hi"
+  it('Update', async () => {
+    const input = 'hi';
 
     await program.methods
       .update(input)
@@ -68,8 +68,8 @@ describe("anchor-realloc", () => {
         payer: payer.publicKey,
         messageAccount: messageAccount.publicKey,
       })
-      .rpc()
+      .rpc();
 
-    await checkAccount(messageAccount.publicKey, input)
-  })
-})
+    await checkAccount(messageAccount.publicKey, input);
+  });
+});

+ 9 - 10
basics/realloc/anchor/tsconfig.json

@@ -1,11 +1,10 @@
 {
-            "compilerOptions": {
-              "types": ["mocha", "chai"],
-              "typeRoots": ["./node_modules/@types"],
-              "lib": ["es2015"],
-              "module": "commonjs",
-              "target": "es6",
-              "esModuleInterop": true
-            }
-          }
-          
+  "compilerOptions": {
+    "types": ["mocha", "chai"],
+    "typeRoots": ["./node_modules/@types"],
+    "lib": ["es2015"],
+    "module": "commonjs",
+    "target": "es6",
+    "esModuleInterop": true
+  }
+}

+ 12 - 38
basics/realloc/native/tests/realloc.test.ts

@@ -1,22 +1,18 @@
+import { describe, test } from 'node:test';
+import { Keypair, PublicKey, Transaction } from '@solana/web3.js';
+import { start } from 'solana-bankrun';
 import {
-  Keypair,
-  PublicKey,
-  Transaction,
-} from '@solana/web3.js';
-import {
-  createCreateInstruction,
-  createReallocateWithoutZeroInitInstruction,
-  createReallocateZeroInitInstruction,
   AddressInfo,
   EnhancedAddressInfo,
   WorkInfo,
+  createCreateInstruction,
+  createReallocateWithoutZeroInitInstruction,
+  createReallocateZeroInitInstruction,
 } from '../ts';
-import { start } from 'solana-bankrun';
-import { describe, test } from 'node:test';
 
 describe('Realloc!', async () => {
   const PROGRAM_ID = PublicKey.unique();
-  const context = await start([{ name: 'realloc_program', programId: PROGRAM_ID }],[]);
+  const context = await start([{ name: 'realloc_program', programId: PROGRAM_ID }], []);
   const client = context.banksClient;
   const payer = context.payer;
 
@@ -24,15 +20,7 @@ describe('Realloc!', async () => {
 
   test('Create the account with data', async () => {
     console.log(`${testAccount.publicKey}`);
-    const ix = createCreateInstruction(
-      testAccount.publicKey,
-      payer.publicKey,
-      PROGRAM_ID,
-      'Jacob',
-      123,
-      'Main St.',
-      'Chicago'
-    );
+    const ix = createCreateInstruction(testAccount.publicKey, payer.publicKey, PROGRAM_ID, 'Jacob', 123, 'Main St.', 'Chicago');
 
     const tx = new Transaction();
     tx.recentBlockhash = context.lastBlockhash;
@@ -43,13 +31,7 @@ describe('Realloc!', async () => {
   });
 
   test('Reallocate WITHOUT zero init', async () => {
-    const ix = createReallocateWithoutZeroInitInstruction(
-      testAccount.publicKey,
-      payer.publicKey,
-      PROGRAM_ID,
-      'Illinois',
-      12345
-    );
+    const ix = createReallocateWithoutZeroInitInstruction(testAccount.publicKey, payer.publicKey, PROGRAM_ID, 'Illinois', 12345);
     const tx = new Transaction();
     const [blockHash, _blockHeight] = await client.getLatestBlockhash();
     tx.recentBlockhash = blockHash;
@@ -60,15 +42,7 @@ describe('Realloc!', async () => {
   });
 
   test('Reallocate WITH zero init', async () => {
-    const ix = createReallocateZeroInitInstruction(
-      testAccount.publicKey,
-      payer.publicKey,
-      PROGRAM_ID,
-      'Pete',
-      'Engineer',
-      'Solana Labs',
-      2
-    );
+    const ix = createReallocateZeroInitInstruction(testAccount.publicKey, payer.publicKey, PROGRAM_ID, 'Pete', 'Engineer', 'Solana Labs', 2);
     const tx = new Transaction();
     const [blockHash, _blockHeight] = await client.getLatestBlockhash();
     tx.recentBlockhash = blockHash;
@@ -121,7 +95,7 @@ describe('Realloc!', async () => {
   }
 
   function sleep(s: number) {
-    const SECONDS = 1000
-    return new Promise(resolve => setTimeout(resolve, s * SECONDS));
+    const SECONDS = 1000;
+    return new Promise((resolve) => setTimeout(resolve, s * SECONDS));
   }
 });

+ 1 - 2
basics/realloc/native/ts/index.ts

@@ -1,8 +1,7 @@
-
 export * from './instructions/create';
 export * from './instructions/instruction';
 export * from './instructions/reallocate';
 export * from './state/address-info';
 export * from './state/enhanced-address-info';
 export * from './state/work-info';
-export * from './util/util';
+export * from './util/util';

+ 61 - 65
basics/realloc/native/ts/instructions/create.ts

@@ -1,84 +1,80 @@
-import * as borsh from "borsh";
-import { Buffer } from "buffer";
-import { 
-    PublicKey, 
-    SystemProgram,
-    TransactionInstruction 
-} from '@solana/web3.js';
+import { Buffer } from 'node:buffer';
+import { type PublicKey, SystemProgram, TransactionInstruction } from '@solana/web3.js';
+import * as borsh from 'borsh';
 import { ReallocInstruction } from './instruction';
 
-
 export class Create {
+  instruction: ReallocInstruction;
+  name: string;
+  house_number: number;
+  street: string;
+  city: string;
 
+  constructor(props: {
     instruction: ReallocInstruction;
     name: string;
     house_number: number;
     street: string;
     city: string;
+  }) {
+    this.instruction = props.instruction;
+    this.name = props.name;
+    this.house_number = props.house_number;
+    this.street = props.street;
+    this.city = props.city;
+  }
 
-    constructor(props: {
-        instruction: ReallocInstruction,
-        name: string,
-        house_number: number,
-        street: string,
-        city: string,
-    }) {
-        this.instruction = props.instruction;
-        this.name = props.name;
-        this.house_number = props.house_number;
-        this.street = props.street;
-        this.city = props.city;
-    }
+  toBuffer() {
+    return Buffer.from(borsh.serialize(CreateSchema, this));
+  }
 
-    toBuffer() { 
-        return Buffer.from(borsh.serialize(CreateSchema, this)) 
-    };
-    
-    static fromBuffer(buffer: Buffer) {
-        return borsh.deserialize(CreateSchema, Create, buffer);
-    };
-};
+  static fromBuffer(buffer: Buffer) {
+    return borsh.deserialize(CreateSchema, Create, buffer);
+  }
+}
 
 export const CreateSchema = new Map([
-    [ Create, { 
-        kind: 'struct', 
-        fields: [ 
-            ['instruction', 'u8'],
-            ['name', 'string'], 
-            ['house_number', 'u8'], 
-            ['street', 'string'], 
-            ['city', 'string'], 
-        ],
-    }]
+  [
+    Create,
+    {
+      kind: 'struct',
+      fields: [
+        ['instruction', 'u8'],
+        ['name', 'string'],
+        ['house_number', 'u8'],
+        ['street', 'string'],
+        ['city', 'string'],
+      ],
+    },
+  ],
 ]);
 
 export function createCreateInstruction(
-    target: PublicKey,
-    payer: PublicKey,
-    programId: PublicKey,
-    name: string,
-    house_number: number,
-    street: string,
-    city: string,
+  target: PublicKey,
+  payer: PublicKey,
+  programId: PublicKey,
+  name: string,
+  house_number: number,
+  street: string,
+  city: string,
 ): TransactionInstruction {
+  const instructionObject = new Create({
+    instruction: ReallocInstruction.Create,
+    name,
+    house_number,
+    street,
+    city,
+  });
 
-    const instructionObject = new Create({
-        instruction: ReallocInstruction.Create,
-        name,
-        house_number,
-        street,
-        city,
-    });
-
-    const ix = new TransactionInstruction({
-        keys: [
-            {pubkey: target, isSigner: false, isWritable: true},
-            {pubkey: payer, isSigner: true, isWritable: true},
-            {pubkey: SystemProgram.programId, isSigner: false, isWritable: false}
-        ],
-        programId: programId,
-        data: instructionObject.toBuffer(),
-    });
+  const ix = new TransactionInstruction({
+    keys: [
+      { pubkey: target, isSigner: false, isWritable: true },
+      { pubkey: payer, isSigner: true, isWritable: true },
+      { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
+    ],
+    programId: programId,
+    data: instructionObject.toBuffer(),
+  });
 
-    return ix;
-}
+  return ix;
+}

+ 1 - 1
basics/realloc/native/ts/instructions/index.ts

@@ -1,3 +1,3 @@
 export * from './create';
 export * from './instruction';
-export * from './reallocate';
+export * from './reallocate';

+ 4 - 4
basics/realloc/native/ts/instructions/instruction.ts

@@ -1,5 +1,5 @@
 export enum ReallocInstruction {
-    Create,
-    ReallocateWithoutZeroInit,
-    ReallocateZeroInit,
-}
+  Create = 0,
+  ReallocateWithoutZeroInit = 1,
+  ReallocateZeroInit = 2,
+}

+ 112 - 119
basics/realloc/native/ts/instructions/reallocate.ts

@@ -1,147 +1,140 @@
-import * as borsh from "borsh";
-import { Buffer } from "buffer";
-import { 
-    PublicKey, 
-    SystemProgram,
-    TransactionInstruction 
-} from '@solana/web3.js';
+import { Buffer } from 'node:buffer';
+import { type PublicKey, SystemProgram, TransactionInstruction } from '@solana/web3.js';
+import * as borsh from 'borsh';
 import { ReallocInstruction } from './instruction';
 
-
 export class ReallocateWithoutZeroInit {
+  instruction: ReallocInstruction;
+  state: string;
+  zip: number;
 
+  constructor(props: {
     instruction: ReallocInstruction;
     state: string;
     zip: number;
-
-    constructor(props: {
-        instruction: ReallocInstruction,
-        state: string,
-        zip: number,
-    }) {
-        this.instruction = props.instruction;
-        this.state = props.state;
-        this.zip = props.zip;
-    }
-
-    toBuffer() { 
-        return Buffer.from(borsh.serialize(ReallocateWithoutZeroInitSchema, this)) 
-    };
-    
-    static fromBuffer(buffer: Buffer) {
-        return borsh.deserialize(ReallocateWithoutZeroInitSchema, ReallocateWithoutZeroInit, buffer);
-    };
-};
+  }) {
+    this.instruction = props.instruction;
+    this.state = props.state;
+    this.zip = props.zip;
+  }
+
+  toBuffer() {
+    return Buffer.from(borsh.serialize(ReallocateWithoutZeroInitSchema, this));
+  }
+
+  static fromBuffer(buffer: Buffer) {
+    return borsh.deserialize(ReallocateWithoutZeroInitSchema, ReallocateWithoutZeroInit, buffer);
+  }
+}
 
 export const ReallocateWithoutZeroInitSchema = new Map([
-    [ ReallocateWithoutZeroInit, { 
-        kind: 'struct', 
-        fields: [ 
-            ['instruction', 'u8'],
-            ['state', 'string'], 
-            ['zip', 'u32'], 
-        ],
-    }]
+  [
+    ReallocateWithoutZeroInit,
+    {
+      kind: 'struct',
+      fields: [
+        ['instruction', 'u8'],
+        ['state', 'string'],
+        ['zip', 'u32'],
+      ],
+    },
+  ],
 ]);
 
 export function createReallocateWithoutZeroInitInstruction(
-    target: PublicKey,
-    payer: PublicKey,
-    programId: PublicKey,
-    state: string,
-    zip: number,
+  target: PublicKey,
+  payer: PublicKey,
+  programId: PublicKey,
+  state: string,
+  zip: number,
 ): TransactionInstruction {
-
-    const instructionObject = new ReallocateWithoutZeroInit({
-        instruction: ReallocInstruction.ReallocateWithoutZeroInit,
-        state,
-        zip,
-    });
-
-    const ix = new TransactionInstruction({
-        keys: [
-            {pubkey: target, isSigner: false, isWritable: true},
-            {pubkey: payer, isSigner: true, isWritable: true},
-            {pubkey: SystemProgram.programId, isSigner: false, isWritable: false}
-        ],
-        programId: programId,
-        data: instructionObject.toBuffer(),
-    });
-
-    return ix;
+  const instructionObject = new ReallocateWithoutZeroInit({
+    instruction: ReallocInstruction.ReallocateWithoutZeroInit,
+    state,
+    zip,
+  });
+
+  const ix = new TransactionInstruction({
+    keys: [
+      { pubkey: target, isSigner: false, isWritable: true },
+      { pubkey: payer, isSigner: true, isWritable: true },
+      { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
+    ],
+    programId: programId,
+    data: instructionObject.toBuffer(),
+  });
+
+  return ix;
 }
 
-
-
 export class ReallocateZeroInit {
+  instruction: ReallocInstruction;
+  name: string;
+  position: string;
+  company: string;
+  years_employed: number;
 
+  constructor(props: {
     instruction: ReallocInstruction;
     name: string;
     position: string;
     company: string;
     years_employed: number;
-
-    constructor(props: {
-        instruction: ReallocInstruction,
-        name: string,
-        position: string,
-        company: string,
-        years_employed: number,
-    }) {
-        this.instruction = props.instruction;
-        this.name = props.name;
-        this.position = props.position;
-        this.company = props.company;
-        this.years_employed = props.years_employed;
-    }
-
-    toBuffer() { 
-        return Buffer.from(borsh.serialize(ReallocateZeroInitSchema, this)) 
-    };
-    
-    static fromBuffer(buffer: Buffer) {
-        return borsh.deserialize(ReallocateZeroInitSchema, ReallocateZeroInit, buffer);
-    };
-};
+  }) {
+    this.instruction = props.instruction;
+    this.name = props.name;
+    this.position = props.position;
+    this.company = props.company;
+    this.years_employed = props.years_employed;
+  }
+
+  toBuffer() {
+    return Buffer.from(borsh.serialize(ReallocateZeroInitSchema, this));
+  }
+
+  static fromBuffer(buffer: Buffer) {
+    return borsh.deserialize(ReallocateZeroInitSchema, ReallocateZeroInit, buffer);
+  }
+}
 
 export const ReallocateZeroInitSchema = new Map([
-    [ ReallocateZeroInit, { 
-        kind: 'struct', 
-        fields: [ 
-            ['instruction', 'u8'],
-            ['name', 'string'], 
-            ['position', 'string'], 
-            ['company', 'string'], 
-            ['years_employed', 'u8'], 
-        ],
-    }]
+  [
+    ReallocateZeroInit,
+    {
+      kind: 'struct',
+      fields: [
+        ['instruction', 'u8'],
+        ['name', 'string'],
+        ['position', 'string'],
+        ['company', 'string'],
+        ['years_employed', 'u8'],
+      ],
+    },
+  ],
 ]);
 
 export function createReallocateZeroInitInstruction(
-    target: PublicKey,
-    payer: PublicKey,
-    programId: PublicKey,
-    name: string,
-    position: string,
-    company: string,
-    years_employed: number,
+  target: PublicKey,
+  payer: PublicKey,
+  programId: PublicKey,
+  name: string,
+  position: string,
+  company: string,
+  years_employed: number,
 ): TransactionInstruction {
-
-    const instructionObject = new ReallocateZeroInit({
-        instruction: ReallocInstruction.ReallocateZeroInit,
-        name,
-        position,
-        company,
-        years_employed,
-    });
-
-    const ix = new TransactionInstruction({
-        keys: [
-            {pubkey: target, isSigner: false, isWritable: true},
-        ],
-        programId: programId,
-        data: instructionObject.toBuffer(),
-    });
-
-    return ix;
-}
+  const instructionObject = new ReallocateZeroInit({
+    instruction: ReallocInstruction.ReallocateZeroInit,
+    name,
+    position,
+    company,
+    years_employed,
+  });
+
+  const ix = new TransactionInstruction({
+    keys: [{ pubkey: target, isSigner: false, isWritable: true }],
+    programId: programId,
+    data: instructionObject.toBuffer(),
+  });
+
+  return ix;
+}

+ 36 - 35
basics/realloc/native/ts/state/address-info.ts

@@ -1,47 +1,48 @@
-import * as borsh from "borsh";
-import { Buffer } from "buffer";
-
+import { Buffer } from 'node:buffer';
+import * as borsh from 'borsh';
 
 export class AddressInfo {
+  name: string;
+  house_number: number;
+  street: string;
+  city: string;
 
+  constructor(props: {
     name: string;
     house_number: number;
     street: string;
     city: string;
+  }) {
+    this.name = props.name;
+    this.house_number = props.house_number;
+    this.street = props.street;
+    this.city = props.city;
+  }
 
-    constructor(props: {
-        name: string,
-        house_number: number,
-        street: string,
-        city: string,
-    }) {
-        this.name = props.name;
-        this.house_number = props.house_number;
-        this.street = props.street;
-        this.city = props.city;
-    }
+  toBase58() {
+    return borsh.serialize(AddressInfoSchema, this).toString();
+  }
 
-    toBase58() {
-        return borsh.serialize(AddressInfoSchema, this).toString()
-    };
+  toBuffer() {
+    return Buffer.from(borsh.serialize(AddressInfoSchema, this));
+  }
 
-    toBuffer() { 
-        return Buffer.from(borsh.serialize(AddressInfoSchema, this)) 
-    };
-    
-    static fromBuffer(buffer: Buffer) {
-        return borsh.deserialize(AddressInfoSchema, AddressInfo, buffer);
-    };
-};
+  static fromBuffer(buffer: Buffer) {
+    return borsh.deserialize(AddressInfoSchema, AddressInfo, buffer);
+  }
+}
 
 export const AddressInfoSchema = new Map([
-    [ AddressInfo, { 
-        kind: 'struct', 
-        fields: [ 
-            ['name', 'string'],
-            ['house_number', 'u8'],
-            ['street', 'string'],
-            ['city', 'string'],
-        ],
-    }]
-]);
+  [
+    AddressInfo,
+    {
+      kind: 'struct',
+      fields: [
+        ['name', 'string'],
+        ['house_number', 'u8'],
+        ['street', 'string'],
+        ['city', 'string'],
+      ],
+    },
+  ],
+]);

+ 42 - 41
basics/realloc/native/ts/state/enhanced-address-info.ts

@@ -1,55 +1,56 @@
-import * as borsh from "borsh";
-import { Buffer } from "buffer";
-
+import { Buffer } from 'node:buffer';
+import * as borsh from 'borsh';
 
 export class EnhancedAddressInfo {
+  name: string;
+  house_number: number;
+  street: string;
+  city: string;
+  state: string;
+  zip: number;
 
+  constructor(props: {
     name: string;
     house_number: number;
     street: string;
     city: string;
     state: string;
     zip: number;
+  }) {
+    this.name = props.name;
+    this.house_number = props.house_number;
+    this.street = props.street;
+    this.city = props.city;
+    this.state = props.state;
+    this.zip = props.zip;
+  }
 
-    constructor(props: {
-        name: string,
-        house_number: number,
-        street: string,
-        city: string,
-        state: string,
-        zip: number,
-    }) {
-        this.name = props.name;
-        this.house_number = props.house_number;
-        this.street = props.street;
-        this.city = props.city;
-        this.state = props.state;
-        this.zip = props.zip;
-    }
+  toBase58() {
+    return borsh.serialize(EnhancedAddressInfoSchema, this).toString();
+  }
 
-    toBase58() {
-        return borsh.serialize(EnhancedAddressInfoSchema, this).toString()
-    };
+  toBuffer() {
+    return Buffer.from(borsh.serialize(EnhancedAddressInfoSchema, this));
+  }
 
-    toBuffer() { 
-        return Buffer.from(borsh.serialize(EnhancedAddressInfoSchema, this)) 
-    };
-    
-    static fromBuffer(buffer: Buffer) {
-        return borsh.deserialize(EnhancedAddressInfoSchema, EnhancedAddressInfo, buffer);
-    };
-};
+  static fromBuffer(buffer: Buffer) {
+    return borsh.deserialize(EnhancedAddressInfoSchema, EnhancedAddressInfo, buffer);
+  }
+}
 
 export const EnhancedAddressInfoSchema = new Map([
-    [ EnhancedAddressInfo, { 
-        kind: 'struct', 
-        fields: [ 
-            ['name', 'string'],
-            ['house_number', 'u8'],
-            ['street', 'string'],
-            ['city', 'string'],
-            ['state', 'string'],
-            ['zip', 'u32'],
-        ],
-    }]
-]);
+  [
+    EnhancedAddressInfo,
+    {
+      kind: 'struct',
+      fields: [
+        ['name', 'string'],
+        ['house_number', 'u8'],
+        ['street', 'string'],
+        ['city', 'string'],
+        ['state', 'string'],
+        ['zip', 'u32'],
+      ],
+    },
+  ],
+]);

+ 1 - 1
basics/realloc/native/ts/state/index.ts

@@ -1,3 +1,3 @@
 export * from './address-info';
 export * from './enhanced-address-info';
-export * from './work-info';
+export * from './work-info';

+ 36 - 35
basics/realloc/native/ts/state/work-info.ts

@@ -1,47 +1,48 @@
-import * as borsh from "borsh";
-import { Buffer } from "buffer";
-
+import { Buffer } from 'node:buffer';
+import * as borsh from 'borsh';
 
 export class WorkInfo {
+  name: string;
+  position: string;
+  company: string;
+  years_employed: number;
 
+  constructor(props: {
     name: string;
     position: string;
     company: string;
     years_employed: number;
+  }) {
+    this.name = props.name;
+    this.position = props.position;
+    this.company = props.company;
+    this.years_employed = props.years_employed;
+  }
 
-    constructor(props: {
-        name: string,
-        position: string,
-        company: string,
-        years_employed: number,
-    }) {
-        this.name = props.name;
-        this.position = props.position;
-        this.company = props.company;
-        this.years_employed = props.years_employed;
-    }
+  toBase58() {
+    return borsh.serialize(WorkInfoSchema, this).toString();
+  }
 
-    toBase58() {
-        return borsh.serialize(WorkInfoSchema, this).toString()
-    };
+  toBuffer() {
+    return Buffer.from(borsh.serialize(WorkInfoSchema, this));
+  }
 
-    toBuffer() { 
-        return Buffer.from(borsh.serialize(WorkInfoSchema, this)) 
-    };
-    
-    static fromBuffer(buffer: Buffer) {
-        return borsh.deserialize(WorkInfoSchema, WorkInfo, buffer);
-    };
-};
+  static fromBuffer(buffer: Buffer) {
+    return borsh.deserialize(WorkInfoSchema, WorkInfo, buffer);
+  }
+}
 
 export const WorkInfoSchema = new Map([
-    [ WorkInfo, { 
-        kind: 'struct', 
-        fields: [ 
-            ['name', 'string'],
-            ['position', 'string'],
-            ['company', 'string'],
-            ['years_employed', 'u8'],
-        ],
-    }]
-]);
+  [
+    WorkInfo,
+    {
+      kind: 'struct',
+      fields: [
+        ['name', 'string'],
+        ['position', 'string'],
+        ['company', 'string'],
+        ['years_employed', 'u8'],
+      ],
+    },
+  ],
+]);

+ 1 - 1
basics/realloc/native/ts/util/index.ts

@@ -1 +1 @@
-export * from './util';
+export * from './util';

+ 2 - 6
basics/realloc/native/ts/util/util.ts

@@ -1,9 +1,5 @@
 import { Keypair } from '@solana/web3.js';
 
-
 export function createKeypairFromFile(path: string): Keypair {
-    return Keypair.fromSecretKey(
-        Buffer.from(JSON.parse(require('fs').readFileSync(path, "utf-8")))
-    )
-};
-
+  return Keypair.fromSecretKey(Buffer.from(JSON.parse(require('node:fs').readFileSync(path, 'utf-8'))));
+}

+ 9 - 11
basics/rent/anchor/tests/test.ts

@@ -1,27 +1,25 @@
-import * as anchor from "@coral-xyz/anchor";
-import { RentExample } from "../target/types/rent_example";
-import Idl from "../target/idl/rent_example.json";
+import * as anchor from '@coral-xyz/anchor';
+import Idl from '../target/idl/rent_example.json';
+import type { RentExample } from '../target/types/rent_example';
 
-describe("Create a system account", () => {
+describe('Create a system account', () => {
   const provider = anchor.AnchorProvider.env();
   anchor.setProvider(provider);
   const wallet = provider.wallet as anchor.Wallet;
   const program = anchor.workspace.RentExample as anchor.Program<RentExample>;
 
-  it("Create the account", async () => {
+  it('Create the account', async () => {
     const newKeypair = anchor.web3.Keypair.generate();
 
-    const addressData: anchor.IdlTypes<RentExample>["addressData"] = {
-      name: "Marcus",
-      address: "123 Main St. San Francisco, CA",
+    const addressData: anchor.IdlTypes<RentExample>['addressData'] = {
+      name: 'Marcus',
+      address: '123 Main St. San Francisco, CA',
     };
 
     // We're just going to serialize our object here so we can check
     //  the size on the client side against the program logs
     //
-    const addressDataBuffer = new anchor.BorshCoder(
-      Idl as anchor.Idl
-    ).types.encode("AddressData", addressData);
+    const addressDataBuffer = new anchor.BorshCoder(Idl as anchor.Idl).types.encode('AddressData', addressData);
     console.log(`Address data buffer length: ${addressDataBuffer.length}`);
 
     await program.methods

+ 6 - 12
basics/rent/native/tests/test.ts

@@ -1,24 +1,18 @@
-import {
-  Keypair,
-  PublicKey,
-  SystemProgram,
-  Transaction,
-  TransactionInstruction,
-} from '@solana/web3.js';
+import { Buffer } from 'node:buffer';
+import { describe, test } from 'node:test';
+import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js';
 import * as borsh from 'borsh';
-import { Buffer } from 'buffer';
 import { start } from 'solana-bankrun';
-import { describe, test } from 'node:test';
 
 describe('Create a system account', async () => {
   const PROGRAM_ID = PublicKey.unique();
-  const context = await start([{ name: 'program', programId: PROGRAM_ID }],[]);
+  const context = await start([{ name: 'program', programId: PROGRAM_ID }], []);
   const client = context.banksClient;
   const payer = context.payer;
 
   class Assignable {
     constructor(properties) {
-      Object.keys(properties).map(key => {
+      Object.keys(properties).map((key) => {
         return (this[key] = properties[key]);
       });
     }
@@ -56,7 +50,7 @@ describe('Create a system account', async () => {
     const addressDataBuffer = addressData.toBuffer();
     console.log(`Address data buffer length: ${addressDataBuffer.length}`);
 
-    let ix = new TransactionInstruction({
+    const ix = new TransactionInstruction({
       keys: [
         { pubkey: payer.publicKey, isSigner: true, isWritable: true },
         { pubkey: newKeypair.publicKey, isSigner: true, isWritable: true },

+ 22 - 34
basics/repository-layout/anchor/tests/test.ts

@@ -1,56 +1,44 @@
-import * as anchor from "@coral-xyz/anchor";
-import { Carnival } from "../target/types/carnival";
+import * as anchor from '@coral-xyz/anchor';
+import type { Carnival } from '../target/types/carnival';
 
-describe("Carnival", () => {
+describe('Carnival', () => {
   const provider = anchor.AnchorProvider.env();
   anchor.setProvider(provider);
   const wallet = provider.wallet as anchor.Wallet;
   const program = anchor.workspace.Carnival as anchor.Program<Carnival>;
 
-  async function sendCarnivalInstructions(
-    instructionsList: anchor.web3.TransactionInstruction[]
-  ) {
-    let tx = new anchor.web3.Transaction();
-    for (var ix of instructionsList) {
+  async function sendCarnivalInstructions(instructionsList: anchor.web3.TransactionInstruction[]) {
+    const tx = new anchor.web3.Transaction();
+    for (const ix of instructionsList) {
       tx.add(ix);
     }
-    await anchor.web3.sendAndConfirmTransaction(provider.connection, tx, [
-      wallet.payer,
-    ]);
+    await anchor.web3.sendAndConfirmTransaction(provider.connection, tx, [wallet.payer]);
   }
 
-  it("Go on some rides!", async () => {
+  it('Go on some rides!', async () => {
     await sendCarnivalInstructions([
-      await program.methods
-        .goOnRide("Jimmy", 36, 15, "Scrambler")
-        .instruction(),
-      await program.methods
-        .goOnRide("Mary", 52, 1, "Ferris Wheel")
-        .instruction(),
-      await program.methods
-        .goOnRide("Alice", 56, 15, "Scrambler")
-        .instruction(),
-      await program.methods
-        .goOnRide("Bob", 49, 6, "Tilt-a-Whirl")
-        .instruction(),
+      await program.methods.goOnRide('Jimmy', 36, 15, 'Scrambler').instruction(),
+      await program.methods.goOnRide('Mary', 52, 1, 'Ferris Wheel').instruction(),
+      await program.methods.goOnRide('Alice', 56, 15, 'Scrambler').instruction(),
+      await program.methods.goOnRide('Bob', 49, 6, 'Tilt-a-Whirl').instruction(),
     ]);
   });
 
-  it("Play some games!", async () => {
+  it('Play some games!', async () => {
     await sendCarnivalInstructions([
-      await program.methods.playGame("Jimmy", 15, "I Got It!").instruction(),
-      await program.methods.playGame("Mary", 1, "Ring Toss").instruction(),
-      await program.methods.playGame("Alice", 15, "Ladder Climb").instruction(),
-      await program.methods.playGame("Bob", 6, "Ring Toss").instruction(),
+      await program.methods.playGame('Jimmy', 15, 'I Got It!').instruction(),
+      await program.methods.playGame('Mary', 1, 'Ring Toss').instruction(),
+      await program.methods.playGame('Alice', 15, 'Ladder Climb').instruction(),
+      await program.methods.playGame('Bob', 6, 'Ring Toss').instruction(),
     ]);
   });
 
-  it("Eat some food!", async () => {
+  it('Eat some food!', async () => {
     await sendCarnivalInstructions([
-      await program.methods.eatFood("Jimmy", 15, "Taco Shack").instruction(),
-      await program.methods.eatFood("Mary", 1, "Larry's Pizza").instruction(),
-      await program.methods.eatFood("Alice", 15, "Dough Boy's").instruction(),
-      await program.methods.eatFood("Bob", 6, "Dough Boy's").instruction(),
+      await program.methods.eatFood('Jimmy', 15, 'Taco Shack').instruction(),
+      await program.methods.eatFood('Mary', 1, "Larry's Pizza").instruction(),
+      await program.methods.eatFood('Alice', 15, "Dough Boy's").instruction(),
+      await program.methods.eatFood('Bob', 6, "Dough Boy's").instruction(),
     ]);
   });
 });

+ 9 - 15
basics/repository-layout/native/tests/test.ts

@@ -1,22 +1,18 @@
-import {
-  PublicKey,
-  Transaction,
-  TransactionInstruction,
-} from '@solana/web3.js';
+import { Buffer } from 'node:buffer';
+import { describe, test } from 'node:test';
+import { PublicKey, Transaction, TransactionInstruction } from '@solana/web3.js';
 import * as borsh from 'borsh';
-import { Buffer } from 'buffer';
 import { start } from 'solana-bankrun';
-import { describe, test } from 'node:test';
 
 describe('Carnival', async () => {
   const PROGRAM_ID = PublicKey.unique();
-  const context = await start([{ name: 'repository_layout_program', programId: PROGRAM_ID }],[]);
+  const context = await start([{ name: 'repository_layout_program', programId: PROGRAM_ID }], []);
   const client = context.banksClient;
   const payer = context.payer;
 
   class Assignable {
     constructor(properties) {
-      Object.keys(properties).map(key => {
+      Object.keys(properties).map((key) => {
         return (this[key] = properties[key]);
       });
     }
@@ -44,18 +40,16 @@ describe('Carnival', async () => {
     ],
   ]);
 
-  async function sendCarnivalInstructions(
-    instructionsList: CarnivalInstruction[]
-  ) {
-    let tx = new Transaction();
-    for (var ix of instructionsList) {
+  async function sendCarnivalInstructions(instructionsList: CarnivalInstruction[]) {
+    const tx = new Transaction();
+    for (const ix of instructionsList) {
       tx.recentBlockhash = context.lastBlockhash;
       tx.add(
         new TransactionInstruction({
           keys: [{ pubkey: payer.publicKey, isSigner: true, isWritable: true }],
           programId: PROGRAM_ID,
           data: ix.toBuffer(),
-        })
+        }),
       ).sign(payer);
     }
     await client.processTransaction(tx);

+ 33 - 55
basics/transfer-sol/anchor/tests/test.ts

@@ -1,30 +1,23 @@
-import * as anchor from "@coral-xyz/anchor"
-import { TransferSol } from "../target/types/transfer_sol"
-import {
-  Keypair,
-  PublicKey,
-  LAMPORTS_PER_SOL,
-  SystemProgram,
-  Transaction,
-  sendAndConfirmTransaction,
-} from "@solana/web3.js"
-describe("transfer-sol", () => {
-  const provider = anchor.AnchorProvider.env()
-  anchor.setProvider(provider)
-  const payer = provider.wallet as anchor.Wallet
-  const program = anchor.workspace.TransferSol as anchor.Program<TransferSol>
+import * as anchor from '@coral-xyz/anchor';
+import { Keypair, LAMPORTS_PER_SOL, type PublicKey, SystemProgram, Transaction, sendAndConfirmTransaction } from '@solana/web3.js';
+import type { TransferSol } from '../target/types/transfer_sol';
+describe('transfer-sol', () => {
+  const provider = anchor.AnchorProvider.env();
+  anchor.setProvider(provider);
+  const payer = provider.wallet as anchor.Wallet;
+  const program = anchor.workspace.TransferSol as anchor.Program<TransferSol>;
 
   // 1 SOL
-  const transferAmount = 1 * LAMPORTS_PER_SOL
+  const transferAmount = 1 * LAMPORTS_PER_SOL;
 
   // Generate a new keypair for the recipient
-  const recipient = new Keypair()
+  const recipient = new Keypair();
 
   // Generate a new keypair to create an account owned by our program
-  const programOwnedAccount = new Keypair()
+  const programOwnedAccount = new Keypair();
 
-  it("Transfer SOL with CPI", async () => {
-    await getBalances(payer.publicKey, recipient.publicKey, "Beginning")
+  it('Transfer SOL with CPI', async () => {
+    await getBalances(payer.publicKey, recipient.publicKey, 'Beginning');
 
     await program.methods
       .transferSolWithCpi(new anchor.BN(transferAmount))
@@ -32,34 +25,27 @@ describe("transfer-sol", () => {
         payer: payer.publicKey,
         recipient: recipient.publicKey,
       })
-      .rpc()
+      .rpc();
 
-    await getBalances(payer.publicKey, recipient.publicKey, "Resulting")
-  })
+    await getBalances(payer.publicKey, recipient.publicKey, 'Resulting');
+  });
 
-  it("Create and fund account owned by our program", async () => {
+  it('Create and fund account owned by our program', async () => {
     const instruction = SystemProgram.createAccount({
       fromPubkey: payer.publicKey,
       newAccountPubkey: programOwnedAccount.publicKey,
       space: 0,
       lamports: 1 * LAMPORTS_PER_SOL, // 1 SOL
       programId: program.programId, // Program Owner, our program's address
-    })
+    });
 
-    const transaction = new Transaction().add(instruction)
+    const transaction = new Transaction().add(instruction);
 
-    await sendAndConfirmTransaction(provider.connection, transaction, [
-      payer.payer,
-      programOwnedAccount,
-    ])
-  })
+    await sendAndConfirmTransaction(provider.connection, transaction, [payer.payer, programOwnedAccount]);
+  });
 
-  it("Transfer SOL with Program", async () => {
-    await getBalances(
-      programOwnedAccount.publicKey,
-      payer.publicKey,
-      "Beginning"
-    )
+  it('Transfer SOL with Program', async () => {
+    await getBalances(programOwnedAccount.publicKey, payer.publicKey, 'Beginning');
 
     await program.methods
       .transferSolWithProgram(new anchor.BN(transferAmount))
@@ -67,24 +53,16 @@ describe("transfer-sol", () => {
         payer: programOwnedAccount.publicKey,
         recipient: payer.publicKey,
       })
-      .rpc()
+      .rpc();
 
-    await getBalances(
-      programOwnedAccount.publicKey,
-      payer.publicKey,
-      "Resulting"
-    )
-  })
+    await getBalances(programOwnedAccount.publicKey, payer.publicKey, 'Resulting');
+  });
 
-  async function getBalances(
-    payerPubkey: PublicKey,
-    recipientPubkey: PublicKey,
-    timeframe: string
-  ) {
-    let payerBalance = await provider.connection.getBalance(payerPubkey)
-    let recipientBalance = await provider.connection.getBalance(recipientPubkey)
-    console.log(`${timeframe} balances:`)
-    console.log(`   Payer: ${payerBalance / LAMPORTS_PER_SOL}`)
-    console.log(`   Recipient: ${recipientBalance / LAMPORTS_PER_SOL}`)
+  async function getBalances(payerPubkey: PublicKey, recipientPubkey: PublicKey, timeframe: string) {
+    const payerBalance = await provider.connection.getBalance(payerPubkey);
+    const recipientBalance = await provider.connection.getBalance(recipientPubkey);
+    console.log(`${timeframe} balances:`);
+    console.log(`   Payer: ${payerBalance / LAMPORTS_PER_SOL}`);
+    console.log(`   Recipient: ${recipientBalance / LAMPORTS_PER_SOL}`);
   }
-})
+});

+ 49 - 54
basics/transfer-sol/native/tests/instruction.ts

@@ -1,72 +1,67 @@
-import * as borsh from "borsh";
-import { Buffer } from "buffer";
-import { 
-    PublicKey, 
-    SystemProgram,
-    TransactionInstruction 
-} from '@solana/web3.js';
-
+import { Buffer } from 'node:buffer';
+import { type PublicKey, SystemProgram, TransactionInstruction } from '@solana/web3.js';
+import * as borsh from 'borsh';
 
 export enum InstructionType {
-    CpiTransfer,
-    ProgramTransfer,
+  CpiTransfer = 0,
+  ProgramTransfer = 1,
 }
 
-
 export class TransferInstruction {
+  instruction: InstructionType;
+  amount: number;
 
+  constructor(props: {
     instruction: InstructionType;
     amount: number;
+  }) {
+    this.instruction = props.instruction;
+    this.amount = props.amount;
+  }
 
-    constructor(props: {
-        instruction: InstructionType,
-        amount: number,
-    }) {
-        this.instruction = props.instruction;
-        this.amount = props.amount;
-    }
+  toBuffer() {
+    return Buffer.from(borsh.serialize(TransferInstructionSchema, this));
+  }
 
-    toBuffer() { 
-        return Buffer.from(borsh.serialize(TransferInstructionSchema, this)) 
-    };
-    
-    static fromBuffer(buffer: Buffer) {
-        return borsh.deserialize(TransferInstructionSchema, TransferInstruction, buffer);
-    };
-};
+  static fromBuffer(buffer: Buffer) {
+    return borsh.deserialize(TransferInstructionSchema, TransferInstruction, buffer);
+  }
+}
 
 export const TransferInstructionSchema = new Map([
-    [ TransferInstruction, { 
-        kind: 'struct', 
-        fields: [ 
-            ['instruction', 'u8'],
-            ['amount', 'u64'],
-        ],
-    }]
+  [
+    TransferInstruction,
+    {
+      kind: 'struct',
+      fields: [
+        ['instruction', 'u8'],
+        ['amount', 'u64'],
+      ],
+    },
+  ],
 ]);
 
 export function createTransferInstruction(
-    payerPubkey: PublicKey,
-    recipientPubkey: PublicKey,
-    programId: PublicKey,
-    instruction: InstructionType,
-    amount: number,
+  payerPubkey: PublicKey,
+  recipientPubkey: PublicKey,
+  programId: PublicKey,
+  instruction: InstructionType,
+  amount: number,
 ): TransactionInstruction {
+  const instructionObject = new TransferInstruction({
+    instruction,
+    amount,
+  });
 
-    const instructionObject = new TransferInstruction({
-        instruction,
-        amount,
-    });
+  const ix = new TransactionInstruction({
+    keys: [
+      { pubkey: payerPubkey, isSigner: true, isWritable: true },
+      { pubkey: recipientPubkey, isSigner: false, isWritable: true },
+      { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
+    ],
+    programId,
+    data: instructionObject.toBuffer(),
+  });
 
-    const ix = new TransactionInstruction({
-        keys: [
-            {pubkey: payerPubkey, isSigner: true, isWritable: true},
-            {pubkey: recipientPubkey, isSigner: false, isWritable: true},
-            {pubkey: SystemProgram.programId, isSigner: false, isWritable: false}
-        ],
-        programId,
-        data: instructionObject.toBuffer(),
-    });
-
-    return ix;
-}
+  return ix;
+}

+ 14 - 40
basics/transfer-sol/native/tests/test.ts

@@ -1,17 +1,11 @@
-import {
-  Keypair,
-  LAMPORTS_PER_SOL,
-  PublicKey,
-  SystemProgram,
-  Transaction,
-} from '@solana/web3.js';
-import { createTransferInstruction, InstructionType } from './instruction';
-import { start } from 'solana-bankrun';
 import { describe, test } from 'node:test';
+import { Keypair, LAMPORTS_PER_SOL, PublicKey, SystemProgram, Transaction } from '@solana/web3.js';
+import { start } from 'solana-bankrun';
+import { InstructionType, createTransferInstruction } from './instruction';
 
 describe('transfer-sol', async () => {
   const PROGRAM_ID = PublicKey.unique();
-  const context = await start([{ name: 'transfer_sol_program', programId: PROGRAM_ID }],[]);
+  const context = await start([{ name: 'transfer_sol_program', programId: PROGRAM_ID }], []);
   const client = context.banksClient;
   const payer = context.payer;
 
@@ -23,16 +17,10 @@ describe('transfer-sol', async () => {
   test('Transfer between accounts using the system program', async () => {
     await getBalances(payer.publicKey, test1Recipient.publicKey, 'Beginning');
 
-    let ix = createTransferInstruction(
-      payer.publicKey,
-      test1Recipient.publicKey,
-      PROGRAM_ID,
-      InstructionType.CpiTransfer,
-      transferAmount
-    );
+    const ix = createTransferInstruction(payer.publicKey, test1Recipient.publicKey, PROGRAM_ID, InstructionType.CpiTransfer, transferAmount);
 
     const tx = new Transaction();
-    const [blockhash,_] = await client.getLatestBlockhash();
+    const [blockhash, _] = await client.getLatestBlockhash();
     tx.recentBlockhash = blockhash;
     tx.add(ix).sign(payer);
 
@@ -55,26 +43,20 @@ describe('transfer-sol', async () => {
     const tx = new Transaction();
     const [blockhash, _] = await client.getLatestBlockhash();
     tx.recentBlockhash = blockhash;
-    tx.add(ix(test2Recipient1.publicKey))
-      .add(ix(test2Recipient2.publicKey))
-      .sign(payer, test2Recipient1, test2Recipient2);
+    tx.add(ix(test2Recipient1.publicKey)).add(ix(test2Recipient2.publicKey)).sign(payer, test2Recipient1, test2Recipient2);
 
     await client.processTransaction(tx);
   });
 
   test('Transfer between accounts using our program', async () => {
-    await getBalances(
-      test2Recipient1.publicKey,
-      test2Recipient2.publicKey,
-      'Beginning'
-    );
+    await getBalances(test2Recipient1.publicKey, test2Recipient2.publicKey, 'Beginning');
 
-    let ix = createTransferInstruction(
+    const ix = createTransferInstruction(
       test2Recipient1.publicKey,
       test2Recipient2.publicKey,
       PROGRAM_ID,
       InstructionType.ProgramTransfer,
-      transferAmount
+      transferAmount,
     );
 
     const tx = new Transaction();
@@ -84,20 +66,12 @@ describe('transfer-sol', async () => {
 
     await client.processTransaction(tx);
 
-    await getBalances(
-      test2Recipient1.publicKey,
-      test2Recipient2.publicKey,
-      'Resulting'
-    );
+    await getBalances(test2Recipient1.publicKey, test2Recipient2.publicKey, 'Resulting');
   });
 
-  async function getBalances(
-    payerPubkey: PublicKey,
-    recipientPubkey: PublicKey,
-    timeframe: string
-  ) {
-    let payerBalance = await client.getBalance(payerPubkey);
-    let recipientBalance = await client.getBalance(recipientPubkey);
+  async function getBalances(payerPubkey: PublicKey, recipientPubkey: PublicKey, timeframe: string) {
+    const payerBalance = await client.getBalance(payerPubkey);
+    const recipientBalance = await client.getBalance(recipientPubkey);
 
     console.log(`${timeframe} balances:`);
     console.log(`   Payer: ${payerBalance}`);

+ 2 - 2
basics/transfer-sol/seahorse/migrations/deploy.ts

@@ -2,9 +2,9 @@
 // single deploy script that's invoked from the CLI, injecting a provider
 // configured from the workspace's Anchor.toml.
 
-const anchor = require("@coral-xyz/anchor");
+const anchor = require('@coral-xyz/anchor');
 
-module.exports = async function (provider) {
+module.exports = async (provider) => {
   // Configure client to use the provider.
   anchor.setProvider(provider);
 

+ 17 - 17
basics/transfer-sol/seahorse/package.json

@@ -1,19 +1,19 @@
 {
-    "scripts": {
-        "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w",
-        "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check"
-    },
-    "dependencies": {
-        "@coral-xyz/anchor": "^0.27.0"
-    },
-    "devDependencies": {
-        "chai": "^4.3.4",
-        "mocha": "^9.0.3",
-        "ts-mocha": "^10.0.0",
-        "@types/bn.js": "^5.1.0",
-        "@types/chai": "^4.3.0",
-        "@types/mocha": "^9.0.0",
-        "typescript": "^4.3.5",
-        "prettier": "^2.6.2"
-    }
+  "scripts": {
+    "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w",
+    "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check"
+  },
+  "dependencies": {
+    "@coral-xyz/anchor": "^0.27.0"
+  },
+  "devDependencies": {
+    "chai": "^4.3.4",
+    "mocha": "^9.0.3",
+    "ts-mocha": "^10.0.0",
+    "@types/bn.js": "^5.1.0",
+    "@types/chai": "^4.3.0",
+    "@types/mocha": "^9.0.0",
+    "typescript": "^4.3.5",
+    "prettier": "^2.6.2"
+  }
 }

+ 8 - 11
basics/transfer-sol/seahorse/tests/seahorse.ts

@@ -1,19 +1,16 @@
-import * as anchor from "@coral-xyz/anchor";
-import { Program } from "@coral-xyz/anchor";
-import { Seahorse } from "../target/types/seahorse";
+import * as anchor from '@coral-xyz/anchor';
+import type { Program } from '@coral-xyz/anchor';
+import type { Seahorse } from '../target/types/seahorse';
 
-describe("seahorse", () => {
+describe('seahorse', () => {
   // Configure the client to use the local cluster.
   anchor.setProvider(anchor.AnchorProvider.env());
 
   const program = anchor.workspace.Seahorse as Program<Seahorse>;
 
-  const mockReceiverAccount = anchor.web3.PublicKey.findProgramAddressSync(
-    [Buffer.from("mock_account")],
-    program.programId
-  );
+  const mockReceiverAccount = anchor.web3.PublicKey.findProgramAddressSync([Buffer.from('mock_account')], program.programId);
 
-  it("Initialize the Mock account to send our SOL to", async () => {
+  it('Initialize the Mock account to send our SOL to', async () => {
     const tx = await program.methods
       .initMockAccount()
       .accounts({
@@ -22,7 +19,7 @@ describe("seahorse", () => {
       })
       .rpc();
   });
-  it("Send SOL To Mock account", async () => {
+  it('Send SOL To Mock account', async () => {
     const transferAmount = 1;
     // Convert to lamport.
     const lamports: number = anchor.web3.LAMPORTS_PER_SOL * transferAmount;
@@ -33,6 +30,6 @@ describe("seahorse", () => {
         sender: program.provider.publicKey,
       })
       .rpc();
-    console.log("Your transaction signature: ", tx);
+    console.log('Your transaction signature: ', tx);
   });
 });

+ 9 - 10
basics/transfer-sol/seahorse/tsconfig.json

@@ -1,11 +1,10 @@
 {
-            "compilerOptions": {
-              "types": ["mocha", "chai"],
-              "typeRoots": ["./node_modules/@types"],
-              "lib": ["es2015"],
-              "module": "commonjs",
-              "target": "es6",
-              "esModuleInterop": true
-            }
-          }
-          
+  "compilerOptions": {
+    "types": ["mocha", "chai"],
+    "typeRoots": ["./node_modules/@types"],
+    "lib": ["es2015"],
+    "module": "commonjs",
+    "target": "es6",
+    "esModuleInterop": true
+  }
+}

+ 56 - 0
biome.json

@@ -0,0 +1,56 @@
+{
+  "$schema": "https://biomejs.dev/schemas/1.7.3/schema.json",
+  "organizeImports": {
+    "enabled": true
+  },
+  "linter": {
+    "enabled": true,
+    "rules": {
+      "recommended": true,
+      "suspicious": {
+        "noExplicitAny": "off",
+        "noAssignInExpressions": "warn",
+        "noExportsInTest": "warn"
+      },
+      "style": {
+        "noParameterAssign": "warn"
+      },
+      "complexity": {
+        "noForEach": "warn",
+        "noUselessCatch": "warn",
+        "noBannedTypes": "warn"
+      }
+    }
+  },
+  "formatter": {
+    "enabled": true,
+    "formatWithErrors": false,
+    "indentStyle": "space",
+    "indentWidth": 2,
+    "lineEnding": "lf",
+    "lineWidth": 150,
+    "attributePosition": "auto"
+  },
+  "javascript": {
+    "formatter": {
+      "jsxQuoteStyle": "double",
+      "quoteProperties": "asNeeded",
+      "trailingComma": "all",
+      "semicolons": "always",
+      "arrowParentheses": "always",
+      "bracketSpacing": true,
+      "bracketSameLine": false,
+      "quoteStyle": "single",
+      "attributePosition": "auto"
+    }
+  },
+  "json": {
+    "formatter": {
+      "trailingCommas": "none"
+    }
+  },
+  "files": {
+    "ignore": ["node_modules"],
+    "include": ["**/*.ts", "**/*.js", "**/*.json"]
+  }
+}

+ 0 - 0
compression/cnft-burn/.gitignore → compression/cnft-burn/anchor/.gitignore


+ 0 - 0
compression/cnft-burn/.prettierignore → compression/cnft-burn/anchor/.prettierignore


+ 0 - 0
compression/cnft-burn/Anchor.toml → compression/cnft-burn/anchor/Anchor.toml


+ 0 - 0
compression/cnft-burn/Cargo.toml → compression/cnft-burn/anchor/Cargo.toml


+ 0 - 0
compression/cnft-burn/README.md → compression/cnft-burn/anchor/README.md


+ 2 - 2
compression/cnft-burn/migrations/deploy.ts → compression/cnft-burn/anchor/migrations/deploy.ts

@@ -2,9 +2,9 @@
 // single deploy script that's invoked from the CLI, injecting a provider
 // configured from the workspace's Anchor.toml.
 
-const anchor = require("@coral-xyz/anchor");
+const anchor = require('@coral-xyz/anchor');
 
-module.exports = async function (provider) {
+module.exports = async (provider) => {
   // Configure client to use the provider.
   anchor.setProvider(provider);
 

+ 0 - 0
compression/cnft-burn/package.json → compression/cnft-burn/anchor/package.json


+ 3731 - 0
compression/cnft-burn/anchor/pnpm-lock.yaml

@@ -0,0 +1,3731 @@
+lockfileVersion: '9.0'
+
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
+
+importers:
+
+  .:
+    dependencies:
+      '@coral-xyz/anchor':
+        specifier: ^0.30.0
+        version: 0.30.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@metaplex-foundation/js':
+        specifier: ^0.19.4
+        version: 0.19.5(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)
+      '@metaplex-foundation/mpl-bubblegum':
+        specifier: ^0.7.0
+        version: 0.7.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)
+      '@metaplex-foundation/mpl-token-metadata':
+        specifier: ^2.12.0
+        version: 2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)
+      '@metaplex-foundation/umi':
+        specifier: ^0.9.0
+        version: 0.9.1
+      '@solana/spl-account-compression':
+        specifier: ^0.2.0
+        version: 0.2.1(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@solana/web3.js':
+        specifier: ^1.89.0
+        version: 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      axios:
+        specifier: ^1.6.5
+        version: 1.7.2
+    devDependencies:
+      '@types/bn.js':
+        specifier: ^5.1.0
+        version: 5.1.5
+      '@types/chai':
+        specifier: ^4.3.0
+        version: 4.3.16
+      '@types/mocha':
+        specifier: ^9.0.0
+        version: 9.1.1
+      chai:
+        specifier: ^4.3.4
+        version: 4.4.1
+      mocha:
+        specifier: ^9.0.3
+        version: 9.2.2
+      prettier:
+        specifier: ^2.6.2
+        version: 2.8.8
+      ts-mocha:
+        specifier: ^10.0.0
+        version: 10.0.0(mocha@9.2.2)
+      typescript:
+        specifier: ^4.3.5
+        version: 4.9.5
+
+packages:
+
+  '@babel/runtime@7.24.6':
+    resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==}
+    engines: {node: '>=6.9.0'}
+
+  '@bundlr-network/client@0.8.9':
+    resolution: {integrity: sha512-SJ7BAt/KhONeFQ0+nbqrw2DUWrsev6y6cmlXt+3x7fPCkw7OJwudtxV/h2nBteZd65NXjqw8yzkmLiLfZ7CCRA==}
+    deprecated: Bundlr is now Irys - please switch to @irys/sdk - this package will remain compatible with Irys for the foreseeable future.
+    hasBin: true
+
+  '@coral-xyz/anchor@0.30.0':
+    resolution: {integrity: sha512-qreDh5ztiRHVnCbJ+RS70NJ6aSTPBYDAgFeQ7Z5QvaT5DcDIhNyt4onOciVz2ieIE1XWePOJDDu9SbNvPGBkvQ==}
+    engines: {node: '>=11'}
+
+  '@coral-xyz/borsh@0.30.0':
+    resolution: {integrity: sha512-OrcV+7N10cChhgDRUxM4iEIuwxUHHs52XD85R8cFCUqE0vbLYrcoPPPs+VF6kZ9DhdJGVW2I6DHJOp5TykyZog==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      '@solana/web3.js': ^1.68.0
+
+  '@ethereumjs/rlp@4.0.1':
+    resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==}
+    engines: {node: '>=14'}
+    hasBin: true
+
+  '@ethereumjs/util@8.1.0':
+    resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==}
+    engines: {node: '>=14'}
+
+  '@ethersproject/abi@5.7.0':
+    resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==}
+
+  '@ethersproject/abstract-provider@5.7.0':
+    resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==}
+
+  '@ethersproject/abstract-signer@5.7.0':
+    resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==}
+
+  '@ethersproject/address@5.7.0':
+    resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==}
+
+  '@ethersproject/base64@5.7.0':
+    resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==}
+
+  '@ethersproject/basex@5.7.0':
+    resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==}
+
+  '@ethersproject/bignumber@5.7.0':
+    resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==}
+
+  '@ethersproject/bytes@5.7.0':
+    resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==}
+
+  '@ethersproject/constants@5.7.0':
+    resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==}
+
+  '@ethersproject/contracts@5.7.0':
+    resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==}
+
+  '@ethersproject/hash@5.7.0':
+    resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==}
+
+  '@ethersproject/hdnode@5.7.0':
+    resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==}
+
+  '@ethersproject/json-wallets@5.7.0':
+    resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==}
+
+  '@ethersproject/keccak256@5.7.0':
+    resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==}
+
+  '@ethersproject/logger@5.7.0':
+    resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==}
+
+  '@ethersproject/networks@5.7.1':
+    resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==}
+
+  '@ethersproject/pbkdf2@5.7.0':
+    resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==}
+
+  '@ethersproject/properties@5.7.0':
+    resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==}
+
+  '@ethersproject/providers@5.7.2':
+    resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==}
+
+  '@ethersproject/random@5.7.0':
+    resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==}
+
+  '@ethersproject/rlp@5.7.0':
+    resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==}
+
+  '@ethersproject/sha2@5.7.0':
+    resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==}
+
+  '@ethersproject/signing-key@5.7.0':
+    resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==}
+
+  '@ethersproject/solidity@5.7.0':
+    resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==}
+
+  '@ethersproject/strings@5.7.0':
+    resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==}
+
+  '@ethersproject/transactions@5.7.0':
+    resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==}
+
+  '@ethersproject/units@5.7.0':
+    resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==}
+
+  '@ethersproject/wallet@5.7.0':
+    resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==}
+
+  '@ethersproject/web@5.7.1':
+    resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==}
+
+  '@ethersproject/wordlists@5.7.0':
+    resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==}
+
+  '@metaplex-foundation/beet-solana@0.3.1':
+    resolution: {integrity: sha512-tgyEl6dvtLln8XX81JyBvWjIiEcjTkUwZbrM5dIobTmoqMuGewSyk9CClno8qsMsFdB5T3jC91Rjeqmu/6xk2g==}
+
+  '@metaplex-foundation/beet-solana@0.4.0':
+    resolution: {integrity: sha512-B1L94N3ZGMo53b0uOSoznbuM5GBNJ8LwSeznxBxJ+OThvfHQ4B5oMUqb+0zdLRfkKGS7Q6tpHK9P+QK0j3w2cQ==}
+
+  '@metaplex-foundation/beet-solana@0.4.1':
+    resolution: {integrity: sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==}
+
+  '@metaplex-foundation/beet@0.4.0':
+    resolution: {integrity: sha512-2OAKJnLatCc3mBXNL0QmWVQKAWK2C7XDfepgL0p/9+8oSx4bmRAFHFqptl1A/C0U5O3dxGwKfmKluW161OVGcA==}
+
+  '@metaplex-foundation/beet@0.6.1':
+    resolution: {integrity: sha512-OYgnijLFzw0cdUlRKH5POp0unQECPOW9muJ2X3QIVyak5G6I6l/rKo72sICgPLIFKdmsi2jmnkuLY7wp14iXdw==}
+
+  '@metaplex-foundation/beet@0.7.1':
+    resolution: {integrity: sha512-hNCEnS2WyCiYyko82rwuISsBY3KYpe828ubsd2ckeqZr7tl0WVLivGkoyA/qdiaaHEBGdGl71OpfWa2rqL3DiA==}
+
+  '@metaplex-foundation/beet@0.7.2':
+    resolution: {integrity: sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg==}
+
+  '@metaplex-foundation/cusper@0.0.2':
+    resolution: {integrity: sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==}
+
+  '@metaplex-foundation/js@0.19.5':
+    resolution: {integrity: sha512-OXGX0zr4rpr4vpFt6+tO+bEQ7yN5fqyKpAWYzxPb0yGM0Rj6JKlvj0Eaiymvwmm5XtLPK+98M8y9jxZiQEtsEA==}
+
+  '@metaplex-foundation/mpl-auction-house@2.5.1':
+    resolution: {integrity: sha512-O+IAdYVaoOvgACB8pm+1lF5BNEjl0COkqny2Ho8KQZwka6aC/vHbZ239yRwAMtJhf5992BPFdT4oifjyE0O+Mw==}
+
+  '@metaplex-foundation/mpl-bubblegum@0.6.2':
+    resolution: {integrity: sha512-4tF7/FFSNtpozuIGD7gMKcqK2D49eVXZ144xiowC5H1iBeu009/oj2m8Tj6n4DpYFKWJ2JQhhhk0a2q7x0Begw==}
+
+  '@metaplex-foundation/mpl-bubblegum@0.7.0':
+    resolution: {integrity: sha512-HCo6q+nh8M3KRv9/aUaZcJo5/vPJEeZwPGRDWkqN7lUXoMIvhd83fZi7MB1rIg1gwpVHfHqim0A02LCYKisWFg==}
+
+  '@metaplex-foundation/mpl-candy-guard@0.3.2':
+    resolution: {integrity: sha512-QWXzPDz+6OR3957LtfW6/rcGvFWS/0AeHJa/BUO2VEVQxN769dupsKGtrsS8o5RzXCeap3wrCtDSNxN3dnWu4Q==}
+
+  '@metaplex-foundation/mpl-candy-machine-core@0.1.2':
+    resolution: {integrity: sha512-jjDkRvMR+iykt7guQ7qVnOHTZedql0lq3xqWDMaenAUCH3Xrf2zKATThhJppIVNX1/YtgBOO3lGqhaFbaI4pCw==}
+
+  '@metaplex-foundation/mpl-candy-machine@5.1.0':
+    resolution: {integrity: sha512-pjHpUpWVOCDxK3l6dXxfmJKNQmbjBqnm5ElOl1mJAygnzO8NIPQvrP89y6xSNyo8qZsJyt4ZMYUyD0TdbtKZXQ==}
+
+  '@metaplex-foundation/mpl-token-metadata@2.13.0':
+    resolution: {integrity: sha512-Fl/8I0L9rv4bKTV/RAl5YIbJe9SnQPInKvLz+xR1fEc4/VQkuCn3RPgypfUMEKWmCznzaw4sApDxy6CFS4qmJw==}
+
+  '@metaplex-foundation/umi-options@0.8.9':
+    resolution: {integrity: sha512-jSQ61sZMPSAk/TXn8v8fPqtz3x8d0/blVZXLLbpVbo2/T5XobiI6/MfmlUosAjAUaQl6bHRF8aIIqZEFkJiy4A==}
+
+  '@metaplex-foundation/umi-public-keys@0.8.9':
+    resolution: {integrity: sha512-CxMzN7dgVGOq9OcNCJe2casKUpJ3RmTVoOvDFyeoTQuK+vkZ1YSSahbqC1iGuHEtKTLSjtWjKvUU6O7zWFTw3Q==}
+
+  '@metaplex-foundation/umi-serializers-core@0.8.9':
+    resolution: {integrity: sha512-WT82tkiYJ0Qmscp7uTj1Hz6aWQPETwaKLAENAUN5DeWghkuBKtuxyBKVvEOuoXerJSdhiAk0e8DWA4cxcTTQ/w==}
+
+  '@metaplex-foundation/umi-serializers-encodings@0.8.9':
+    resolution: {integrity: sha512-N3VWLDTJ0bzzMKcJDL08U3FaqRmwlN79FyE4BHj6bbAaJ9LEHjDQ9RJijZyWqTm0jE7I750fU7Ow5EZL38Xi6Q==}
+
+  '@metaplex-foundation/umi-serializers-numbers@0.8.9':
+    resolution: {integrity: sha512-NtBf1fnVNQJHFQjLFzRu2i9GGnigb9hOm/Gfrk628d0q0tRJB7BOM3bs5C61VAs7kJs4yd+pDNVAERJkknQ7Lg==}
+
+  '@metaplex-foundation/umi-serializers@0.9.0':
+    resolution: {integrity: sha512-hAOW9Djl4w4ioKeR4erDZl5IG4iJdP0xA19ZomdaCbMhYAAmG/FEs5khh0uT2mq53/MnzWcXSUPoO8WBN4Q+Vg==}
+
+  '@metaplex-foundation/umi@0.9.1':
+    resolution: {integrity: sha512-IhHoOvp4vfO/++YL+78+iVuLM53+FDwUOZDYgH6lx0jYXyQ27BeaieeR5i+q3A9dz4KxQo5Nzc5aCA1109QGCQ==}
+
+  '@noble/curves@1.3.0':
+    resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==}
+
+  '@noble/curves@1.4.0':
+    resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==}
+
+  '@noble/ed25519@1.7.3':
+    resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==}
+
+  '@noble/hashes@1.3.3':
+    resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==}
+    engines: {node: '>= 16'}
+
+  '@noble/hashes@1.4.0':
+    resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==}
+    engines: {node: '>= 16'}
+
+  '@randlabs/communication-bridge@1.0.1':
+    resolution: {integrity: sha512-CzS0U8IFfXNK7QaJFE4pjbxDGfPjbXBEsEaCn9FN15F+ouSAEUQkva3Gl66hrkBZOGexKFEWMwUHIDKpZ2hfVg==}
+
+  '@randlabs/myalgo-connect@1.4.2':
+    resolution: {integrity: sha512-K9hEyUi7G8tqOp7kWIALJLVbGCByhilcy6123WfcorxWwiE1sbQupPyIU5f3YdQK6wMjBsyTWiLW52ZBMp7sXA==}
+
+  '@scure/base@1.1.6':
+    resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==}
+
+  '@scure/bip32@1.3.3':
+    resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==}
+
+  '@scure/bip39@1.2.2':
+    resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==}
+
+  '@solana/buffer-layout-utils@0.2.0':
+    resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==}
+    engines: {node: '>= 10'}
+
+  '@solana/buffer-layout@4.0.1':
+    resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==}
+    engines: {node: '>=5.10'}
+
+  '@solana/codecs-core@2.0.0-preview.2':
+    resolution: {integrity: sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==}
+
+  '@solana/codecs-data-structures@2.0.0-preview.2':
+    resolution: {integrity: sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==}
+
+  '@solana/codecs-numbers@2.0.0-preview.2':
+    resolution: {integrity: sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==}
+
+  '@solana/codecs-strings@2.0.0-preview.2':
+    resolution: {integrity: sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==}
+    peerDependencies:
+      fastestsmallesttextencoderdecoder: ^1.0.22
+
+  '@solana/codecs@2.0.0-preview.2':
+    resolution: {integrity: sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==}
+
+  '@solana/errors@2.0.0-preview.2':
+    resolution: {integrity: sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==}
+    hasBin: true
+
+  '@solana/options@2.0.0-preview.2':
+    resolution: {integrity: sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==}
+
+  '@solana/spl-account-compression@0.1.10':
+    resolution: {integrity: sha512-IQAOJrVOUo6LCgeWW9lHuXo6JDbi4g3/RkQtvY0SyalvSWk9BIkHHe4IkAzaQw8q/BxEVBIjz8e9bNYWIAESNw==}
+    engines: {node: '>=16'}
+    peerDependencies:
+      '@solana/web3.js': ^1.50.1
+
+  '@solana/spl-account-compression@0.2.1':
+    resolution: {integrity: sha512-GIf/euXN/ZJMfiH3DNiIcolNBZ5pga+usGVxEAyt6Iucv0EXsbxefHCePqRr3ryldFpFm4mjJPz5sm+FzZuDnw==}
+    engines: {node: '>=16'}
+    peerDependencies:
+      '@solana/web3.js': ^1.91.6
+
+  '@solana/spl-token-metadata@0.1.4':
+    resolution: {integrity: sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ==}
+    engines: {node: '>=16'}
+    peerDependencies:
+      '@solana/web3.js': ^1.91.6
+
+  '@solana/spl-token@0.1.8':
+    resolution: {integrity: sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ==}
+    engines: {node: '>= 10'}
+
+  '@solana/spl-token@0.3.11':
+    resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==}
+    engines: {node: '>=16'}
+    peerDependencies:
+      '@solana/web3.js': ^1.88.0
+
+  '@solana/spl-type-length-value@0.1.0':
+    resolution: {integrity: sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==}
+    engines: {node: '>=16'}
+
+  '@solana/wallet-adapter-base@0.9.23':
+    resolution: {integrity: sha512-apqMuYwFp1jFi55NxDfvXUX2x1T0Zh07MxhZ/nCCTGys5raSfYUh82zen2BLv8BSDj/JxZ2P/s7jrQZGrX8uAw==}
+    engines: {node: '>=16'}
+    peerDependencies:
+      '@solana/web3.js': ^1.77.3
+
+  '@solana/wallet-standard-features@1.2.0':
+    resolution: {integrity: sha512-tUd9srDLkRpe1BYg7we+c4UhRQkq+XQWswsr/L1xfGmoRDF47BPSXf4zE7ZU2GRBGvxtGt7lwJVAufQyQYhxTQ==}
+    engines: {node: '>=16'}
+
+  '@solana/web3.js@1.91.8':
+    resolution: {integrity: sha512-USa6OS1jbh8zOapRJ/CBZImZ8Xb7AJjROZl5adql9TpOoBN9BUzyyouS5oPuZHft7S7eB8uJPuXWYjMi6BHgOw==}
+
+  '@supercharge/promise-pool@2.4.0':
+    resolution: {integrity: sha512-O9CMipBlq5OObdt1uKJGIzm9cdjpPWfj+a+Zw9EgWKxaMNHKC7EU7X9taj3H0EGQNLOSq2jAcOa3EzxlfHsD6w==}
+    engines: {node: '>=8'}
+
+  '@types/bn.js@5.1.5':
+    resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==}
+
+  '@types/chai@4.3.16':
+    resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==}
+
+  '@types/connect@3.4.38':
+    resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+
+  '@types/json5@0.0.29':
+    resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+
+  '@types/mocha@9.1.1':
+    resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==}
+
+  '@types/node@11.11.6':
+    resolution: {integrity: sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==}
+
+  '@types/node@12.20.55':
+    resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
+
+  '@types/node@20.12.12':
+    resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==}
+
+  '@types/ws@7.4.7':
+    resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==}
+
+  '@ungap/promise-all-settled@1.1.2':
+    resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==}
+
+  '@wallet-standard/base@1.0.1':
+    resolution: {integrity: sha512-1To3ekMfzhYxe0Yhkpri+Fedq0SYcfrOfJi3vbLjMwF2qiKPjTGLwZkf2C9ftdQmxES+hmxhBzTwF4KgcOwf8w==}
+    engines: {node: '>=16'}
+
+  '@wallet-standard/features@1.0.3':
+    resolution: {integrity: sha512-m8475I6W5LTatTZuUz5JJNK42wFRgkJTB0I9tkruMwfqBF2UN2eomkYNVf9RbrsROelCRzSFmugqjKZBFaubsA==}
+    engines: {node: '>=16'}
+
+  JSONStream@1.3.5:
+    resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
+    hasBin: true
+
+  aes-js@3.0.0:
+    resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==}
+
+  agentkeepalive@4.5.0:
+    resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==}
+    engines: {node: '>= 8.0.0'}
+
+  algo-msgpack-with-bigint@2.1.1:
+    resolution: {integrity: sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==}
+    engines: {node: '>= 10'}
+
+  algosdk@1.24.1:
+    resolution: {integrity: sha512-9moZxdqeJ6GdE4N6fA/GlUP4LrbLZMYcYkt141J4Ss68OfEgH9qW0wBuZ3ZOKEx/xjc5bg7mLP2Gjg7nwrkmww==}
+    engines: {node: '>=14.0.0'}
+
+  ansi-colors@4.1.1:
+    resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==}
+    engines: {node: '>=6'}
+
+  ansi-escapes@4.3.2:
+    resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+    engines: {node: '>=8'}
+
+  ansi-regex@5.0.1:
+    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+    engines: {node: '>=8'}
+
+  ansi-styles@4.3.0:
+    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+    engines: {node: '>=8'}
+
+  ansicolors@0.3.2:
+    resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==}
+
+  anymatch@3.1.3:
+    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+    engines: {node: '>= 8'}
+
+  arbundles@0.6.23:
+    resolution: {integrity: sha512-+gr93F3fivN+6dhiImT6BQNaXz4oECPn2GYjCZjS2yEoq7hM78FRvVp6kQyjEdhnuBFQr/q4oS/nkjnQlHdj9Q==}
+
+  arconnect@0.4.2:
+    resolution: {integrity: sha512-Jkpd4QL3TVqnd3U683gzXmZUVqBUy17DdJDuL/3D9rkysLgX6ymJ2e+sR+xyZF5Rh42CBqDXWNMmCjBXeP7Gbw==}
+
+  argparse@2.0.1:
+    resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+  arrify@1.0.1:
+    resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==}
+    engines: {node: '>=0.10.0'}
+
+  arweave-stream-tx@1.2.2:
+    resolution: {integrity: sha512-bNt9rj0hbAEzoUZEF2s6WJbIz8nasZlZpxIw03Xm8fzb9gRiiZlZGW3lxQLjfc9Z0VRUWDzwtqoYeEoB/JDToQ==}
+    peerDependencies:
+      arweave: ^1.10.0
+
+  arweave@1.15.1:
+    resolution: {integrity: sha512-rT7FOwqdudd5npqp4xOYdDT2035LtpcqePjwirh4wjRiEtVsz1FZkRiM2Yj+fOAwYzOm/hNG0GDOipDSaiEGGQ==}
+    engines: {node: '>=18'}
+
+  asn1.js@5.4.1:
+    resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==}
+
+  assert@2.1.0:
+    resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==}
+
+  assertion-error@1.1.0:
+    resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
+
+  async-retry@1.3.3:
+    resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==}
+
+  asynckit@0.4.0:
+    resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+  available-typed-arrays@1.0.7:
+    resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+    engines: {node: '>= 0.4'}
+
+  avsc@https://codeload.github.com/Irys-xyz/avsc/tar.gz/a730cc8018b79e114b6a3381bbb57760a24c6cef:
+    resolution: {tarball: https://codeload.github.com/Irys-xyz/avsc/tar.gz/a730cc8018b79e114b6a3381bbb57760a24c6cef}
+    version: 5.4.7
+    engines: {node: '>=0.11'}
+
+  axios@0.21.4:
+    resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==}
+
+  axios@0.25.0:
+    resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==}
+
+  axios@1.7.2:
+    resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==}
+
+  balanced-match@1.0.2:
+    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+  base-x@3.0.9:
+    resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==}
+
+  base-x@4.0.0:
+    resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==}
+
+  base64-js@1.5.1:
+    resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+  base64url@3.0.1:
+    resolution: {integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==}
+    engines: {node: '>=6.0.0'}
+
+  bech32@1.1.4:
+    resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==}
+
+  bigint-buffer@1.1.5:
+    resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==}
+    engines: {node: '>= 10.0.0'}
+
+  bignumber.js@9.1.2:
+    resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==}
+
+  binary-extensions@2.3.0:
+    resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+    engines: {node: '>=8'}
+
+  bindings@1.5.0:
+    resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
+
+  bip39-light@1.0.7:
+    resolution: {integrity: sha512-WDTmLRQUsiioBdTs9BmSEmkJza+8xfJmptsNJjxnoq3EydSa/ZBXT6rm66KoT3PJIRYMnhSKNR7S9YL1l7R40Q==}
+
+  bip39@3.0.2:
+    resolution: {integrity: sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==}
+
+  bl@4.1.0:
+    resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+
+  bn.js@4.11.6:
+    resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==}
+
+  bn.js@4.12.0:
+    resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==}
+
+  bn.js@5.2.0:
+    resolution: {integrity: sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==}
+
+  bn.js@5.2.1:
+    resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==}
+
+  borsh@0.6.0:
+    resolution: {integrity: sha512-sl5k89ViqsThXQpYa9XDtz1sBl3l1lI313cFUY1HKr+wvMILnb+58xpkqTNrYbelh99dY7K8usxoCusQmqix9Q==}
+
+  borsh@0.7.0:
+    resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==}
+
+  brace-expansion@1.1.11:
+    resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+
+  braces@3.0.3:
+    resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+    engines: {node: '>=8'}
+
+  brorand@1.1.0:
+    resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==}
+
+  browser-stdout@1.3.1:
+    resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==}
+
+  bs58@4.0.1:
+    resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==}
+
+  bs58@5.0.0:
+    resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==}
+
+  buffer-from@1.1.2:
+    resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+  buffer-layout@1.2.2:
+    resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==}
+    engines: {node: '>=4.5'}
+
+  buffer-reverse@1.0.1:
+    resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==}
+
+  buffer@5.7.1:
+    resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+
+  buffer@6.0.3:
+    resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+
+  bufferutil@4.0.8:
+    resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==}
+    engines: {node: '>=6.14.2'}
+
+  call-bind@1.0.7:
+    resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
+    engines: {node: '>= 0.4'}
+
+  camelcase@6.3.0:
+    resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+    engines: {node: '>=10'}
+
+  capability@0.2.5:
+    resolution: {integrity: sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg==}
+
+  chai@4.4.1:
+    resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==}
+    engines: {node: '>=4'}
+
+  chalk@4.1.2:
+    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+    engines: {node: '>=10'}
+
+  chalk@5.3.0:
+    resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+    engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+  chardet@0.7.0:
+    resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+
+  check-error@1.0.3:
+    resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
+
+  chokidar@3.5.3:
+    resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+    engines: {node: '>= 8.10.0'}
+
+  cipher-base@1.0.4:
+    resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==}
+
+  cli-cursor@3.1.0:
+    resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+    engines: {node: '>=8'}
+
+  cli-spinners@2.9.2:
+    resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+    engines: {node: '>=6'}
+
+  cli-width@3.0.0:
+    resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==}
+    engines: {node: '>= 10'}
+
+  cliui@7.0.4:
+    resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
+
+  clone@1.0.4:
+    resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+    engines: {node: '>=0.8'}
+
+  color-convert@2.0.1:
+    resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+    engines: {node: '>=7.0.0'}
+
+  color-name@1.1.4:
+    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+  combined-stream@1.0.8:
+    resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+    engines: {node: '>= 0.8'}
+
+  commander@12.1.0:
+    resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==}
+    engines: {node: '>=18'}
+
+  commander@2.20.3:
+    resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+  commander@8.3.0:
+    resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
+    engines: {node: '>= 12'}
+
+  concat-map@0.0.1:
+    resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=}
+
+  create-hash@1.2.0:
+    resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==}
+
+  create-hmac@1.1.7:
+    resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==}
+
+  cross-fetch@3.1.8:
+    resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==}
+
+  crypto-hash@1.3.0:
+    resolution: {integrity: sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==}
+    engines: {node: '>=8'}
+
+  crypto-js@3.3.0:
+    resolution: {integrity: sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==}
+
+  csv-generate@4.4.1:
+    resolution: {integrity: sha512-O/einO0v4zPmXaOV+sYqGa02VkST4GP5GLpWBNHEouIU7pF3kpGf3D0kCCvX82ydIY4EKkOK+R8b1BYsRXravg==}
+
+  csv-parse@5.5.6:
+    resolution: {integrity: sha512-uNpm30m/AGSkLxxy7d9yRXpJQFrZzVWLFBkS+6ngPcZkw/5k3L/jjFuj7tVnEpRn+QgmiXr21nDlhCiUK4ij2A==}
+
+  csv-stringify@6.5.0:
+    resolution: {integrity: sha512-edlXFVKcUx7r8Vx5zQucsuMg4wb/xT6qyz+Sr1vnLrdXqlLD1+UKyWNyZ9zn6mUW1ewmGxrpVwAcChGF0HQ/2Q==}
+
+  csv@6.3.9:
+    resolution: {integrity: sha512-eiN+Qu8NwSLxZYia6WzB8xlX/rAQ/8EgK5A4dIF7Bz96mzcr5dW1jlcNmjG0QWySWKfPdCerH3RQ96ZqqsE8cA==}
+    engines: {node: '>= 0.1.90'}
+
+  debug@4.3.3:
+    resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==}
+    engines: {node: '>=6.0'}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  debug@4.3.4:
+    resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+    engines: {node: '>=6.0'}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  decamelize@4.0.0:
+    resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==}
+    engines: {node: '>=10'}
+
+  deep-eql@4.1.3:
+    resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==}
+    engines: {node: '>=6'}
+
+  defaults@1.0.4:
+    resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+
+  define-data-property@1.1.4:
+    resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+    engines: {node: '>= 0.4'}
+
+  define-properties@1.2.1:
+    resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+    engines: {node: '>= 0.4'}
+
+  delay@5.0.0:
+    resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==}
+    engines: {node: '>=10'}
+
+  delayed-stream@1.0.0:
+    resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+    engines: {node: '>=0.4.0'}
+
+  depd@1.1.2:
+    resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==}
+    engines: {node: '>= 0.6'}
+
+  depd@2.0.0:
+    resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+    engines: {node: '>= 0.8'}
+
+  diff@3.5.0:
+    resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==}
+    engines: {node: '>=0.3.1'}
+
+  diff@5.0.0:
+    resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==}
+    engines: {node: '>=0.3.1'}
+
+  dot-case@3.0.4:
+    resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+
+  dotenv@10.0.0:
+    resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==}
+    engines: {node: '>=10'}
+
+  elliptic@6.5.4:
+    resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==}
+
+  elliptic@6.5.5:
+    resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==}
+
+  emoji-regex@8.0.0:
+    resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+  error-polyfill@0.1.3:
+    resolution: {integrity: sha512-XHJk60ufE+TG/ydwp4lilOog549iiQF2OAPhkk9DdiYWMrltz5yhDz/xnKuenNwP7gy3dsibssO5QpVhkrSzzg==}
+
+  es-define-property@1.0.0:
+    resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
+    engines: {node: '>= 0.4'}
+
+  es-errors@1.3.0:
+    resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+    engines: {node: '>= 0.4'}
+
+  es6-promise@4.2.8:
+    resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==}
+
+  es6-promisify@5.0.0:
+    resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==}
+
+  escalade@3.1.2:
+    resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
+    engines: {node: '>=6'}
+
+  escape-string-regexp@1.0.5:
+    resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+    engines: {node: '>=0.8.0'}
+
+  escape-string-regexp@4.0.0:
+    resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+    engines: {node: '>=10'}
+
+  ethereum-bloom-filters@1.1.0:
+    resolution: {integrity: sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw==}
+
+  ethereum-cryptography@2.1.3:
+    resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==}
+
+  ethers@5.7.2:
+    resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==}
+
+  ethjs-unit@0.1.6:
+    resolution: {integrity: sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=}
+    engines: {node: '>=6.5.0', npm: '>=3'}
+
+  eventemitter3@4.0.7:
+    resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
+
+  exponential-backoff@3.1.1:
+    resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==}
+
+  external-editor@3.1.0:
+    resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
+    engines: {node: '>=4'}
+
+  eyes@0.1.8:
+    resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==}
+    engines: {node: '> 0.1.90'}
+
+  fast-stable-stringify@1.0.0:
+    resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==}
+
+  fastestsmallesttextencoderdecoder@1.0.22:
+    resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==}
+
+  figures@3.2.0:
+    resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
+    engines: {node: '>=8'}
+
+  file-uri-to-path@1.0.0:
+    resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
+
+  fill-range@7.1.1:
+    resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+    engines: {node: '>=8'}
+
+  find-up@5.0.0:
+    resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+    engines: {node: '>=10'}
+
+  flat@5.0.2:
+    resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
+    hasBin: true
+
+  follow-redirects@1.15.6:
+    resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==}
+    engines: {node: '>=4.0'}
+    peerDependencies:
+      debug: '*'
+    peerDependenciesMeta:
+      debug:
+        optional: true
+
+  for-each@0.3.3:
+    resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+
+  form-data@4.0.0:
+    resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
+    engines: {node: '>= 6'}
+
+  fs.realpath@1.0.0:
+    resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+  fsevents@2.3.3:
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+
+  function-bind@1.1.2:
+    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+  get-caller-file@2.0.5:
+    resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+    engines: {node: 6.* || 8.* || >= 10.*}
+
+  get-func-name@2.0.2:
+    resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
+
+  get-intrinsic@1.2.4:
+    resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
+    engines: {node: '>= 0.4'}
+
+  glob-parent@5.1.2:
+    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+    engines: {node: '>= 6'}
+
+  glob@7.2.0:
+    resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==}
+
+  gopd@1.0.1:
+    resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+
+  growl@1.10.5:
+    resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==}
+    engines: {node: '>=4.x'}
+
+  has-flag@4.0.0:
+    resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+    engines: {node: '>=8'}
+
+  has-property-descriptors@1.0.2:
+    resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+  has-proto@1.0.3:
+    resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
+    engines: {node: '>= 0.4'}
+
+  has-symbols@1.0.3:
+    resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+    engines: {node: '>= 0.4'}
+
+  has-tostringtag@1.0.2:
+    resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+    engines: {node: '>= 0.4'}
+
+  hash-base@3.1.0:
+    resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==}
+    engines: {node: '>=4'}
+
+  hash.js@1.1.7:
+    resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==}
+
+  hasown@2.0.2:
+    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+    engines: {node: '>= 0.4'}
+
+  he@1.2.0:
+    resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+    hasBin: true
+
+  hi-base32@0.5.1:
+    resolution: {integrity: sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==}
+
+  hmac-drbg@1.0.1:
+    resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==}
+
+  http-errors@1.8.1:
+    resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==}
+    engines: {node: '>= 0.6'}
+
+  humanize-ms@1.2.1:
+    resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
+
+  iconv-lite@0.4.24:
+    resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+    engines: {node: '>=0.10.0'}
+
+  ieee754@1.2.1:
+    resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+  inflight@1.0.6:
+    resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+    deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+
+  inherits@2.0.4:
+    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+  inquirer@8.2.6:
+    resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==}
+    engines: {node: '>=12.0.0'}
+
+  is-arguments@1.1.1:
+    resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
+    engines: {node: '>= 0.4'}
+
+  is-binary-path@2.1.0:
+    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+    engines: {node: '>=8'}
+
+  is-callable@1.2.7:
+    resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+    engines: {node: '>= 0.4'}
+
+  is-extglob@2.1.1:
+    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+    engines: {node: '>=0.10.0'}
+
+  is-fullwidth-code-point@3.0.0:
+    resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+    engines: {node: '>=8'}
+
+  is-generator-function@1.0.10:
+    resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
+    engines: {node: '>= 0.4'}
+
+  is-glob@4.0.3:
+    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+    engines: {node: '>=0.10.0'}
+
+  is-hex-prefixed@1.0.0:
+    resolution: {integrity: sha1-fY035q135dEnFIkTxXPggtd39VQ=}
+    engines: {node: '>=6.5.0', npm: '>=3'}
+
+  is-interactive@1.0.0:
+    resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+    engines: {node: '>=8'}
+
+  is-nan@1.3.2:
+    resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==}
+    engines: {node: '>= 0.4'}
+
+  is-number@7.0.0:
+    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+    engines: {node: '>=0.12.0'}
+
+  is-plain-obj@2.1.0:
+    resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
+    engines: {node: '>=8'}
+
+  is-typed-array@1.1.13:
+    resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
+    engines: {node: '>= 0.4'}
+
+  is-unicode-supported@0.1.0:
+    resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+    engines: {node: '>=10'}
+
+  isexe@2.0.0:
+    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+  isomorphic-ws@4.0.1:
+    resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==}
+    peerDependencies:
+      ws: '*'
+
+  jayson@4.1.0:
+    resolution: {integrity: sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A==}
+    engines: {node: '>=8'}
+    hasBin: true
+
+  js-sha256@0.9.0:
+    resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==}
+
+  js-sha3@0.8.0:
+    resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==}
+
+  js-sha3@0.9.3:
+    resolution: {integrity: sha512-BcJPCQeLg6WjEx3FE591wVAevlli8lxsxm9/FzV4HXkV49TmBH38Yvrpce6fjbADGMKFrBMGTqrVz3qPIZ88Gg==}
+
+  js-sha512@0.8.0:
+    resolution: {integrity: sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==}
+
+  js-yaml@4.1.0:
+    resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+    hasBin: true
+
+  json-bigint@1.0.0:
+    resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==}
+
+  json-stringify-safe@5.0.1:
+    resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
+
+  json5@1.0.2:
+    resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+    hasBin: true
+
+  jsonparse@1.3.1:
+    resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
+    engines: {'0': node >= 0.2.0}
+
+  keccak@3.0.4:
+    resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==}
+    engines: {node: '>=10.0.0'}
+
+  locate-path@6.0.0:
+    resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+    engines: {node: '>=10'}
+
+  lodash.clonedeep@4.5.0:
+    resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
+
+  lodash.isequal@4.5.0:
+    resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
+
+  lodash@4.17.21:
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+  log-symbols@4.1.0:
+    resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+    engines: {node: '>=10'}
+
+  loupe@2.3.7:
+    resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
+
+  lower-case@2.0.2:
+    resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+
+  make-error@1.3.6:
+    resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+
+  md5.js@1.3.5:
+    resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
+
+  merkletreejs@0.2.32:
+    resolution: {integrity: sha512-TostQBiwYRIwSE5++jGmacu3ODcKAgqb0Y/pnIohXS7sWxh1gCkSptbmF1a43faehRDpcHf7J/kv0Ml2D/zblQ==}
+    engines: {node: '>= 7.6.0'}
+
+  micro-ftch@0.3.1:
+    resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==}
+
+  mime-db@1.52.0:
+    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+    engines: {node: '>= 0.6'}
+
+  mime-types@2.1.35:
+    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+    engines: {node: '>= 0.6'}
+
+  mime@3.0.0:
+    resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
+    engines: {node: '>=10.0.0'}
+    hasBin: true
+
+  mimic-fn@2.1.0:
+    resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+    engines: {node: '>=6'}
+
+  minimalistic-assert@1.0.1:
+    resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
+
+  minimalistic-crypto-utils@1.0.1:
+    resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==}
+
+  minimatch@3.1.2:
+    resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+  minimatch@4.2.1:
+    resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==}
+    engines: {node: '>=10'}
+
+  minimist@1.2.8:
+    resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+  mkdirp@0.5.6:
+    resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+    hasBin: true
+
+  mocha@9.2.2:
+    resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==}
+    engines: {node: '>= 12.0.0'}
+    hasBin: true
+
+  ms@2.1.2:
+    resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
+  ms@2.1.3:
+    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+  multistream@4.1.0:
+    resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==}
+
+  mustache@4.2.0:
+    resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==}
+    hasBin: true
+
+  mute-stream@0.0.8:
+    resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
+
+  nanoid@3.3.1:
+    resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==}
+    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+    hasBin: true
+
+  near-api-js@0.44.2:
+    resolution: {integrity: sha512-eMnc4V+geggapEUa3nU2p8HSHn/njtloI4P2mceHQWO8vDE1NGpnAw8FuTBrLmXSgIv9m6oocgFc9t3VNf5zwg==}
+
+  near-hd-key@1.2.1:
+    resolution: {integrity: sha512-SIrthcL5Wc0sps+2e1xGj3zceEa68TgNZDLuCx0daxmfTP7sFTB3/mtE2pYhlFsCxWoMn+JfID5E1NlzvvbRJg==}
+
+  near-seed-phrase@0.2.0:
+    resolution: {integrity: sha512-NpmrnejpY1AdlRpDZ0schJQJtfBaoUheRfiYtQpcq9TkwPgqKZCRULV5L3hHmLc0ep7KRtikbPQ9R2ztN/3cyQ==}
+
+  no-case@3.0.4:
+    resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+
+  node-addon-api@2.0.2:
+    resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==}
+
+  node-fetch@2.7.0:
+    resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+    engines: {node: 4.x || >=6.0.0}
+    peerDependencies:
+      encoding: ^0.1.0
+    peerDependenciesMeta:
+      encoding:
+        optional: true
+
+  node-gyp-build@4.8.1:
+    resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==}
+    hasBin: true
+
+  normalize-path@3.0.0:
+    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+    engines: {node: '>=0.10.0'}
+
+  number-to-bn@1.7.0:
+    resolution: {integrity: sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=}
+    engines: {node: '>=6.5.0', npm: '>=3'}
+
+  o3@1.0.3:
+    resolution: {integrity: sha512-f+4n+vC6s4ysy7YO7O2gslWZBUu8Qj2i2OUJOvjRxQva7jVjYjB29jrr9NCjmxZQR0gzrOcv1RnqoYOeMs5VRQ==}
+
+  object-is@1.1.6:
+    resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
+    engines: {node: '>= 0.4'}
+
+  object-keys@1.1.1:
+    resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+    engines: {node: '>= 0.4'}
+
+  object.assign@4.1.5:
+    resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
+    engines: {node: '>= 0.4'}
+
+  once@1.4.0:
+    resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+  onetime@5.1.2:
+    resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+    engines: {node: '>=6'}
+
+  ora@5.4.1:
+    resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+    engines: {node: '>=10'}
+
+  os-tmpdir@1.0.2:
+    resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+    engines: {node: '>=0.10.0'}
+
+  p-limit@3.1.0:
+    resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+    engines: {node: '>=10'}
+
+  p-locate@5.0.0:
+    resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+    engines: {node: '>=10'}
+
+  pako@2.1.0:
+    resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==}
+
+  path-exists@4.0.0:
+    resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+    engines: {node: '>=8'}
+
+  path-is-absolute@1.0.1:
+    resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+    engines: {node: '>=0.10.0'}
+
+  pathval@1.1.1:
+    resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
+
+  pbkdf2@3.1.2:
+    resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==}
+    engines: {node: '>=0.12'}
+
+  picomatch@2.3.1:
+    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+    engines: {node: '>=8.6'}
+
+  possible-typed-array-names@1.0.0:
+    resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
+    engines: {node: '>= 0.4'}
+
+  prettier@2.8.8:
+    resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+
+  process@0.11.10:
+    resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+    engines: {node: '>= 0.6.0'}
+
+  proxy-from-env@1.1.0:
+    resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
+  randombytes@2.1.0:
+    resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+
+  readable-stream@3.6.2:
+    resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+    engines: {node: '>= 6'}
+
+  readdirp@3.6.0:
+    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+    engines: {node: '>=8.10.0'}
+
+  regenerator-runtime@0.14.1:
+    resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+  require-directory@2.1.1:
+    resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+    engines: {node: '>=0.10.0'}
+
+  restore-cursor@3.1.0:
+    resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+    engines: {node: '>=8'}
+
+  retry@0.13.1:
+    resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
+    engines: {node: '>= 4'}
+
+  ripemd160@2.0.2:
+    resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
+
+  rpc-websockets@7.11.0:
+    resolution: {integrity: sha512-IkLYjayPv6Io8C/TdCL5gwgzd1hFz2vmBZrjMw/SPEXo51ETOhnzgS4Qy5GWi2JQN7HKHa66J3+2mv0fgNh/7w==}
+
+  run-async@2.4.1:
+    resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
+    engines: {node: '>=0.12.0'}
+
+  rxjs@7.8.1:
+    resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+
+  safe-buffer@5.2.1:
+    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+  safer-buffer@2.1.2:
+    resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+  scrypt-js@3.0.1:
+    resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==}
+
+  secp256k1@4.0.3:
+    resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==}
+    engines: {node: '>=10.0.0'}
+
+  serialize-javascript@6.0.0:
+    resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==}
+
+  set-function-length@1.2.2:
+    resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+    engines: {node: '>= 0.4'}
+
+  setprototypeof@1.2.0:
+    resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
+  sha.js@2.4.11:
+    resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==}
+    hasBin: true
+
+  signal-exit@3.0.7:
+    resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+  snake-case@3.0.4:
+    resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+
+  source-map-support@0.5.21:
+    resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+  source-map@0.6.1:
+    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+    engines: {node: '>=0.10.0'}
+
+  statuses@1.5.0:
+    resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
+    engines: {node: '>= 0.6'}
+
+  stream-transform@3.3.2:
+    resolution: {integrity: sha512-v64PUnPy9Qw94NGuaEMo+9RHQe4jTBYf+NkTtqkCgeuiNo8NlL0LtLR7fkKWNVFtp3RhIm5Dlxkgm5uz7TDimQ==}
+
+  string-width@4.2.3:
+    resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+    engines: {node: '>=8'}
+
+  string_decoder@1.3.0:
+    resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+  strip-ansi@6.0.1:
+    resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+    engines: {node: '>=8'}
+
+  strip-bom@3.0.0:
+    resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+    engines: {node: '>=4'}
+
+  strip-hex-prefix@1.0.0:
+    resolution: {integrity: sha1-DF8VX+8RUTczd96du1iNoFUA428=}
+    engines: {node: '>=6.5.0', npm: '>=3'}
+
+  strip-json-comments@3.1.1:
+    resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+    engines: {node: '>=8'}
+
+  superstruct@0.14.2:
+    resolution: {integrity: sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==}
+
+  superstruct@0.15.5:
+    resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==}
+
+  supports-color@7.2.0:
+    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+    engines: {node: '>=8'}
+
+  supports-color@8.1.1:
+    resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+    engines: {node: '>=10'}
+
+  text-encoding-utf-8@1.0.2:
+    resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==}
+
+  through@2.3.8:
+    resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+
+  tmp-promise@3.0.3:
+    resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==}
+
+  tmp@0.0.33:
+    resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+    engines: {node: '>=0.6.0'}
+
+  tmp@0.2.3:
+    resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==}
+    engines: {node: '>=14.14'}
+
+  to-regex-range@5.0.1:
+    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+    engines: {node: '>=8.0'}
+
+  toidentifier@1.0.1:
+    resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+    engines: {node: '>=0.6'}
+
+  toml@3.0.0:
+    resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==}
+
+  tr46@0.0.3:
+    resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
+  treeify@1.1.0:
+    resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==}
+    engines: {node: '>=0.6'}
+
+  ts-mocha@10.0.0:
+    resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==}
+    engines: {node: '>= 6.X.X'}
+    hasBin: true
+    peerDependencies:
+      mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X
+
+  ts-node@7.0.1:
+    resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==}
+    engines: {node: '>=4.2.0'}
+    hasBin: true
+
+  tsconfig-paths@3.15.0:
+    resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+
+  tslib@2.6.2:
+    resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+
+  tweetnacl@1.0.3:
+    resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==}
+
+  type-detect@4.0.8:
+    resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+    engines: {node: '>=4'}
+
+  type-fest@0.21.3:
+    resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+    engines: {node: '>=10'}
+
+  typescript-collections@1.3.3:
+    resolution: {integrity: sha512-7sI4e/bZijOzyURng88oOFZCISQPTHozfE2sUu5AviFYk5QV7fYGb6YiDl+vKjF/pICA354JImBImL9XJWUvdQ==}
+
+  typescript@4.9.5:
+    resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
+    engines: {node: '>=4.2.0'}
+    hasBin: true
+
+  u3@0.1.1:
+    resolution: {integrity: sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w==}
+
+  undici-types@5.26.5:
+    resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+
+  utf-8-validate@5.0.10:
+    resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==}
+    engines: {node: '>=6.14.2'}
+
+  utf8@3.0.0:
+    resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==}
+
+  util-deprecate@1.0.2:
+    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+  util@0.12.5:
+    resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==}
+
+  uuid@8.3.2:
+    resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+    hasBin: true
+
+  vlq@2.0.4:
+    resolution: {integrity: sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==}
+
+  wcwidth@1.0.1:
+    resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+
+  web3-utils@1.10.4:
+    resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==}
+    engines: {node: '>=8.0.0'}
+
+  webidl-conversions@3.0.1:
+    resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+
+  whatwg-url@5.0.0:
+    resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+
+  which-typed-array@1.1.15:
+    resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
+    engines: {node: '>= 0.4'}
+
+  which@2.0.2:
+    resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+    engines: {node: '>= 8'}
+    hasBin: true
+
+  workerpool@6.2.0:
+    resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==}
+
+  wrap-ansi@6.2.0:
+    resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+    engines: {node: '>=8'}
+
+  wrap-ansi@7.0.0:
+    resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+    engines: {node: '>=10'}
+
+  wrappy@1.0.2:
+    resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+  ws@7.4.6:
+    resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==}
+    engines: {node: '>=8.3.0'}
+    peerDependencies:
+      bufferutil: ^4.0.1
+      utf-8-validate: ^5.0.2
+    peerDependenciesMeta:
+      bufferutil:
+        optional: true
+      utf-8-validate:
+        optional: true
+
+  ws@7.5.9:
+    resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==}
+    engines: {node: '>=8.3.0'}
+    peerDependencies:
+      bufferutil: ^4.0.1
+      utf-8-validate: ^5.0.2
+    peerDependenciesMeta:
+      bufferutil:
+        optional: true
+      utf-8-validate:
+        optional: true
+
+  ws@8.17.0:
+    resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==}
+    engines: {node: '>=10.0.0'}
+    peerDependencies:
+      bufferutil: ^4.0.1
+      utf-8-validate: '>=5.0.2'
+    peerDependenciesMeta:
+      bufferutil:
+        optional: true
+      utf-8-validate:
+        optional: true
+
+  y18n@5.0.8:
+    resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+    engines: {node: '>=10'}
+
+  yargs-parser@20.2.4:
+    resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==}
+    engines: {node: '>=10'}
+
+  yargs-unparser@2.0.0:
+    resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==}
+    engines: {node: '>=10'}
+
+  yargs@16.2.0:
+    resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
+    engines: {node: '>=10'}
+
+  yn@2.0.0:
+    resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==}
+    engines: {node: '>=4'}
+
+  yocto-queue@0.1.0:
+    resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+    engines: {node: '>=10'}
+
+snapshots:
+
+  '@babel/runtime@7.24.6':
+    dependencies:
+      regenerator-runtime: 0.14.1
+
+  '@bundlr-network/client@0.8.9(bufferutil@4.0.8)(debug@4.3.4)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@supercharge/promise-pool': 2.4.0
+      algosdk: 1.24.1
+      arbundles: 0.6.23(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(debug@4.3.4)(utf-8-validate@5.0.10)
+      arweave: 1.15.1
+      async-retry: 1.3.3
+      axios: 0.25.0(debug@4.3.4)
+      base64url: 3.0.1
+      bignumber.js: 9.1.2
+      bs58: 4.0.1
+      commander: 8.3.0
+      csv: 6.3.9
+      ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      inquirer: 8.2.6
+      js-sha256: 0.9.0
+      mime-types: 2.1.35
+      near-api-js: 0.44.2
+      near-seed-phrase: 0.2.0
+    transitivePeerDependencies:
+      - bufferutil
+      - debug
+      - encoding
+      - utf-8-validate
+
+  '@coral-xyz/anchor@0.30.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@coral-xyz/borsh': 0.30.0(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))
+      '@noble/hashes': 1.4.0
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      bn.js: 5.2.1
+      bs58: 4.0.1
+      buffer-layout: 1.2.2
+      camelcase: 6.3.0
+      cross-fetch: 3.1.8
+      crypto-hash: 1.3.0
+      eventemitter3: 4.0.7
+      pako: 2.1.0
+      snake-case: 3.0.4
+      superstruct: 0.15.5
+      toml: 3.0.0
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - utf-8-validate
+
+  '@coral-xyz/borsh@0.30.0(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))':
+    dependencies:
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      bn.js: 5.2.1
+      buffer-layout: 1.2.2
+
+  '@ethereumjs/rlp@4.0.1': {}
+
+  '@ethereumjs/util@8.1.0':
+    dependencies:
+      '@ethereumjs/rlp': 4.0.1
+      ethereum-cryptography: 2.1.3
+      micro-ftch: 0.3.1
+
+  '@ethersproject/abi@5.7.0':
+    dependencies:
+      '@ethersproject/address': 5.7.0
+      '@ethersproject/bignumber': 5.7.0
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/constants': 5.7.0
+      '@ethersproject/hash': 5.7.0
+      '@ethersproject/keccak256': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      '@ethersproject/properties': 5.7.0
+      '@ethersproject/strings': 5.7.0
+
+  '@ethersproject/abstract-provider@5.7.0':
+    dependencies:
+      '@ethersproject/bignumber': 5.7.0
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      '@ethersproject/networks': 5.7.1
+      '@ethersproject/properties': 5.7.0
+      '@ethersproject/transactions': 5.7.0
+      '@ethersproject/web': 5.7.1
+
+  '@ethersproject/abstract-signer@5.7.0':
+    dependencies:
+      '@ethersproject/abstract-provider': 5.7.0
+      '@ethersproject/bignumber': 5.7.0
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      '@ethersproject/properties': 5.7.0
+
+  '@ethersproject/address@5.7.0':
+    dependencies:
+      '@ethersproject/bignumber': 5.7.0
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/keccak256': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      '@ethersproject/rlp': 5.7.0
+
+  '@ethersproject/base64@5.7.0':
+    dependencies:
+      '@ethersproject/bytes': 5.7.0
+
+  '@ethersproject/basex@5.7.0':
+    dependencies:
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/properties': 5.7.0
+
+  '@ethersproject/bignumber@5.7.0':
+    dependencies:
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      bn.js: 5.2.1
+
+  '@ethersproject/bytes@5.7.0':
+    dependencies:
+      '@ethersproject/logger': 5.7.0
+
+  '@ethersproject/constants@5.7.0':
+    dependencies:
+      '@ethersproject/bignumber': 5.7.0
+
+  '@ethersproject/contracts@5.7.0':
+    dependencies:
+      '@ethersproject/abi': 5.7.0
+      '@ethersproject/abstract-provider': 5.7.0
+      '@ethersproject/abstract-signer': 5.7.0
+      '@ethersproject/address': 5.7.0
+      '@ethersproject/bignumber': 5.7.0
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/constants': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      '@ethersproject/properties': 5.7.0
+      '@ethersproject/transactions': 5.7.0
+
+  '@ethersproject/hash@5.7.0':
+    dependencies:
+      '@ethersproject/abstract-signer': 5.7.0
+      '@ethersproject/address': 5.7.0
+      '@ethersproject/base64': 5.7.0
+      '@ethersproject/bignumber': 5.7.0
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/keccak256': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      '@ethersproject/properties': 5.7.0
+      '@ethersproject/strings': 5.7.0
+
+  '@ethersproject/hdnode@5.7.0':
+    dependencies:
+      '@ethersproject/abstract-signer': 5.7.0
+      '@ethersproject/basex': 5.7.0
+      '@ethersproject/bignumber': 5.7.0
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      '@ethersproject/pbkdf2': 5.7.0
+      '@ethersproject/properties': 5.7.0
+      '@ethersproject/sha2': 5.7.0
+      '@ethersproject/signing-key': 5.7.0
+      '@ethersproject/strings': 5.7.0
+      '@ethersproject/transactions': 5.7.0
+      '@ethersproject/wordlists': 5.7.0
+
+  '@ethersproject/json-wallets@5.7.0':
+    dependencies:
+      '@ethersproject/abstract-signer': 5.7.0
+      '@ethersproject/address': 5.7.0
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/hdnode': 5.7.0
+      '@ethersproject/keccak256': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      '@ethersproject/pbkdf2': 5.7.0
+      '@ethersproject/properties': 5.7.0
+      '@ethersproject/random': 5.7.0
+      '@ethersproject/strings': 5.7.0
+      '@ethersproject/transactions': 5.7.0
+      aes-js: 3.0.0
+      scrypt-js: 3.0.1
+
+  '@ethersproject/keccak256@5.7.0':
+    dependencies:
+      '@ethersproject/bytes': 5.7.0
+      js-sha3: 0.8.0
+
+  '@ethersproject/logger@5.7.0': {}
+
+  '@ethersproject/networks@5.7.1':
+    dependencies:
+      '@ethersproject/logger': 5.7.0
+
+  '@ethersproject/pbkdf2@5.7.0':
+    dependencies:
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/sha2': 5.7.0
+
+  '@ethersproject/properties@5.7.0':
+    dependencies:
+      '@ethersproject/logger': 5.7.0
+
+  '@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@ethersproject/abstract-provider': 5.7.0
+      '@ethersproject/abstract-signer': 5.7.0
+      '@ethersproject/address': 5.7.0
+      '@ethersproject/base64': 5.7.0
+      '@ethersproject/basex': 5.7.0
+      '@ethersproject/bignumber': 5.7.0
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/constants': 5.7.0
+      '@ethersproject/hash': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      '@ethersproject/networks': 5.7.1
+      '@ethersproject/properties': 5.7.0
+      '@ethersproject/random': 5.7.0
+      '@ethersproject/rlp': 5.7.0
+      '@ethersproject/sha2': 5.7.0
+      '@ethersproject/strings': 5.7.0
+      '@ethersproject/transactions': 5.7.0
+      '@ethersproject/web': 5.7.1
+      bech32: 1.1.4
+      ws: 7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+    transitivePeerDependencies:
+      - bufferutil
+      - utf-8-validate
+
+  '@ethersproject/random@5.7.0':
+    dependencies:
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/logger': 5.7.0
+
+  '@ethersproject/rlp@5.7.0':
+    dependencies:
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/logger': 5.7.0
+
+  '@ethersproject/sha2@5.7.0':
+    dependencies:
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      hash.js: 1.1.7
+
+  '@ethersproject/signing-key@5.7.0':
+    dependencies:
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      '@ethersproject/properties': 5.7.0
+      bn.js: 5.2.1
+      elliptic: 6.5.4
+      hash.js: 1.1.7
+
+  '@ethersproject/solidity@5.7.0':
+    dependencies:
+      '@ethersproject/bignumber': 5.7.0
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/keccak256': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      '@ethersproject/sha2': 5.7.0
+      '@ethersproject/strings': 5.7.0
+
+  '@ethersproject/strings@5.7.0':
+    dependencies:
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/constants': 5.7.0
+      '@ethersproject/logger': 5.7.0
+
+  '@ethersproject/transactions@5.7.0':
+    dependencies:
+      '@ethersproject/address': 5.7.0
+      '@ethersproject/bignumber': 5.7.0
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/constants': 5.7.0
+      '@ethersproject/keccak256': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      '@ethersproject/properties': 5.7.0
+      '@ethersproject/rlp': 5.7.0
+      '@ethersproject/signing-key': 5.7.0
+
+  '@ethersproject/units@5.7.0':
+    dependencies:
+      '@ethersproject/bignumber': 5.7.0
+      '@ethersproject/constants': 5.7.0
+      '@ethersproject/logger': 5.7.0
+
+  '@ethersproject/wallet@5.7.0':
+    dependencies:
+      '@ethersproject/abstract-provider': 5.7.0
+      '@ethersproject/abstract-signer': 5.7.0
+      '@ethersproject/address': 5.7.0
+      '@ethersproject/bignumber': 5.7.0
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/hash': 5.7.0
+      '@ethersproject/hdnode': 5.7.0
+      '@ethersproject/json-wallets': 5.7.0
+      '@ethersproject/keccak256': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      '@ethersproject/properties': 5.7.0
+      '@ethersproject/random': 5.7.0
+      '@ethersproject/signing-key': 5.7.0
+      '@ethersproject/transactions': 5.7.0
+      '@ethersproject/wordlists': 5.7.0
+
+  '@ethersproject/web@5.7.1':
+    dependencies:
+      '@ethersproject/base64': 5.7.0
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      '@ethersproject/properties': 5.7.0
+      '@ethersproject/strings': 5.7.0
+
+  '@ethersproject/wordlists@5.7.0':
+    dependencies:
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/hash': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      '@ethersproject/properties': 5.7.0
+      '@ethersproject/strings': 5.7.0
+
+  '@metaplex-foundation/beet-solana@0.3.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@metaplex-foundation/beet': 0.7.1
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      bs58: 5.0.0
+      debug: 4.3.4
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - supports-color
+      - utf-8-validate
+
+  '@metaplex-foundation/beet-solana@0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@metaplex-foundation/beet': 0.7.1
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      bs58: 5.0.0
+      debug: 4.3.4
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - supports-color
+      - utf-8-validate
+
+  '@metaplex-foundation/beet-solana@0.4.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@metaplex-foundation/beet': 0.7.2
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      bs58: 5.0.0
+      debug: 4.3.4
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - supports-color
+      - utf-8-validate
+
+  '@metaplex-foundation/beet@0.4.0':
+    dependencies:
+      ansicolors: 0.3.2
+      bn.js: 5.2.1
+      debug: 4.3.4
+    transitivePeerDependencies:
+      - supports-color
+
+  '@metaplex-foundation/beet@0.6.1':
+    dependencies:
+      ansicolors: 0.3.2
+      bn.js: 5.2.1
+      debug: 4.3.4
+    transitivePeerDependencies:
+      - supports-color
+
+  '@metaplex-foundation/beet@0.7.1':
+    dependencies:
+      ansicolors: 0.3.2
+      bn.js: 5.2.1
+      debug: 4.3.4
+    transitivePeerDependencies:
+      - supports-color
+
+  '@metaplex-foundation/beet@0.7.2':
+    dependencies:
+      ansicolors: 0.3.2
+      assert: 2.1.0
+      bn.js: 5.2.1
+      debug: 4.3.4
+    transitivePeerDependencies:
+      - supports-color
+
+  '@metaplex-foundation/cusper@0.0.2': {}
+
+  '@metaplex-foundation/js@0.19.5(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@bundlr-network/client': 0.8.9(bufferutil@4.0.8)(debug@4.3.4)(utf-8-validate@5.0.10)
+      '@metaplex-foundation/beet': 0.7.1
+      '@metaplex-foundation/mpl-auction-house': 2.5.1(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)
+      '@metaplex-foundation/mpl-bubblegum': 0.6.2(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)
+      '@metaplex-foundation/mpl-candy-guard': 0.3.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@metaplex-foundation/mpl-candy-machine': 5.1.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)
+      '@metaplex-foundation/mpl-candy-machine-core': 0.1.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@metaplex-foundation/mpl-token-metadata': 2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)
+      '@noble/ed25519': 1.7.3
+      '@noble/hashes': 1.4.0
+      '@solana/spl-account-compression': 0.1.10(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@solana/spl-token': 0.3.11(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      bignumber.js: 9.1.2
+      bn.js: 5.2.1
+      bs58: 5.0.0
+      buffer: 6.0.3
+      debug: 4.3.4
+      eventemitter3: 4.0.7
+      lodash.clonedeep: 4.5.0
+      lodash.isequal: 4.5.0
+      merkletreejs: 0.2.32
+      mime: 3.0.0
+      node-fetch: 2.7.0
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - fastestsmallesttextencoderdecoder
+      - supports-color
+      - utf-8-validate
+
+  '@metaplex-foundation/mpl-auction-house@2.5.1(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@metaplex-foundation/beet': 0.6.1
+      '@metaplex-foundation/beet-solana': 0.3.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@metaplex-foundation/cusper': 0.0.2
+      '@solana/spl-token': 0.3.11(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      bn.js: 5.2.1
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - fastestsmallesttextencoderdecoder
+      - supports-color
+      - utf-8-validate
+
+  '@metaplex-foundation/mpl-bubblegum@0.6.2(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@metaplex-foundation/beet': 0.7.1
+      '@metaplex-foundation/beet-solana': 0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@metaplex-foundation/cusper': 0.0.2
+      '@metaplex-foundation/mpl-token-metadata': 2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)
+      '@solana/spl-account-compression': 0.1.10(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@solana/spl-token': 0.1.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      bn.js: 5.2.1
+      js-sha3: 0.8.0
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - fastestsmallesttextencoderdecoder
+      - supports-color
+      - utf-8-validate
+
+  '@metaplex-foundation/mpl-bubblegum@0.7.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@metaplex-foundation/beet': 0.7.1
+      '@metaplex-foundation/beet-solana': 0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@metaplex-foundation/cusper': 0.0.2
+      '@metaplex-foundation/mpl-token-metadata': 2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)
+      '@solana/spl-account-compression': 0.1.10(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@solana/spl-token': 0.1.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      js-sha3: 0.8.0
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - fastestsmallesttextencoderdecoder
+      - supports-color
+      - utf-8-validate
+
+  '@metaplex-foundation/mpl-candy-guard@0.3.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@metaplex-foundation/beet': 0.4.0
+      '@metaplex-foundation/beet-solana': 0.3.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@metaplex-foundation/cusper': 0.0.2
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      bn.js: 5.2.1
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - supports-color
+      - utf-8-validate
+
+  '@metaplex-foundation/mpl-candy-machine-core@0.1.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@metaplex-foundation/beet': 0.4.0
+      '@metaplex-foundation/beet-solana': 0.3.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@metaplex-foundation/cusper': 0.0.2
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      bn.js: 5.2.1
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - supports-color
+      - utf-8-validate
+
+  '@metaplex-foundation/mpl-candy-machine@5.1.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@metaplex-foundation/beet': 0.7.1
+      '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@metaplex-foundation/cusper': 0.0.2
+      '@solana/spl-token': 0.3.11(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - fastestsmallesttextencoderdecoder
+      - supports-color
+      - utf-8-validate
+
+  '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@metaplex-foundation/beet': 0.7.2
+      '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@metaplex-foundation/cusper': 0.0.2
+      '@solana/spl-token': 0.3.11(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      bn.js: 5.2.1
+      debug: 4.3.4
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - fastestsmallesttextencoderdecoder
+      - supports-color
+      - utf-8-validate
+
+  '@metaplex-foundation/umi-options@0.8.9': {}
+
+  '@metaplex-foundation/umi-public-keys@0.8.9':
+    dependencies:
+      '@metaplex-foundation/umi-serializers-encodings': 0.8.9
+
+  '@metaplex-foundation/umi-serializers-core@0.8.9': {}
+
+  '@metaplex-foundation/umi-serializers-encodings@0.8.9':
+    dependencies:
+      '@metaplex-foundation/umi-serializers-core': 0.8.9
+
+  '@metaplex-foundation/umi-serializers-numbers@0.8.9':
+    dependencies:
+      '@metaplex-foundation/umi-serializers-core': 0.8.9
+
+  '@metaplex-foundation/umi-serializers@0.9.0':
+    dependencies:
+      '@metaplex-foundation/umi-options': 0.8.9
+      '@metaplex-foundation/umi-public-keys': 0.8.9
+      '@metaplex-foundation/umi-serializers-core': 0.8.9
+      '@metaplex-foundation/umi-serializers-encodings': 0.8.9
+      '@metaplex-foundation/umi-serializers-numbers': 0.8.9
+
+  '@metaplex-foundation/umi@0.9.1':
+    dependencies:
+      '@metaplex-foundation/umi-options': 0.8.9
+      '@metaplex-foundation/umi-public-keys': 0.8.9
+      '@metaplex-foundation/umi-serializers': 0.9.0
+
+  '@noble/curves@1.3.0':
+    dependencies:
+      '@noble/hashes': 1.3.3
+
+  '@noble/curves@1.4.0':
+    dependencies:
+      '@noble/hashes': 1.4.0
+
+  '@noble/ed25519@1.7.3': {}
+
+  '@noble/hashes@1.3.3': {}
+
+  '@noble/hashes@1.4.0': {}
+
+  '@randlabs/communication-bridge@1.0.1': {}
+
+  '@randlabs/myalgo-connect@1.4.2':
+    dependencies:
+      '@randlabs/communication-bridge': 1.0.1
+
+  '@scure/base@1.1.6': {}
+
+  '@scure/bip32@1.3.3':
+    dependencies:
+      '@noble/curves': 1.3.0
+      '@noble/hashes': 1.3.3
+      '@scure/base': 1.1.6
+
+  '@scure/bip39@1.2.2':
+    dependencies:
+      '@noble/hashes': 1.3.3
+      '@scure/base': 1.1.6
+
+  '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@solana/buffer-layout': 4.0.1
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      bigint-buffer: 1.1.5
+      bignumber.js: 9.1.2
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - utf-8-validate
+
+  '@solana/buffer-layout@4.0.1':
+    dependencies:
+      buffer: 6.0.3
+
+  '@solana/codecs-core@2.0.0-preview.2':
+    dependencies:
+      '@solana/errors': 2.0.0-preview.2
+
+  '@solana/codecs-data-structures@2.0.0-preview.2':
+    dependencies:
+      '@solana/codecs-core': 2.0.0-preview.2
+      '@solana/codecs-numbers': 2.0.0-preview.2
+      '@solana/errors': 2.0.0-preview.2
+
+  '@solana/codecs-numbers@2.0.0-preview.2':
+    dependencies:
+      '@solana/codecs-core': 2.0.0-preview.2
+      '@solana/errors': 2.0.0-preview.2
+
+  '@solana/codecs-strings@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)':
+    dependencies:
+      '@solana/codecs-core': 2.0.0-preview.2
+      '@solana/codecs-numbers': 2.0.0-preview.2
+      '@solana/errors': 2.0.0-preview.2
+      fastestsmallesttextencoderdecoder: 1.0.22
+
+  '@solana/codecs@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)':
+    dependencies:
+      '@solana/codecs-core': 2.0.0-preview.2
+      '@solana/codecs-data-structures': 2.0.0-preview.2
+      '@solana/codecs-numbers': 2.0.0-preview.2
+      '@solana/codecs-strings': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)
+      '@solana/options': 2.0.0-preview.2
+    transitivePeerDependencies:
+      - fastestsmallesttextencoderdecoder
+
+  '@solana/errors@2.0.0-preview.2':
+    dependencies:
+      chalk: 5.3.0
+      commander: 12.1.0
+
+  '@solana/options@2.0.0-preview.2':
+    dependencies:
+      '@solana/codecs-core': 2.0.0-preview.2
+      '@solana/codecs-numbers': 2.0.0-preview.2
+
+  '@solana/spl-account-compression@0.1.10(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@metaplex-foundation/beet': 0.7.1
+      '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      bn.js: 5.2.1
+      borsh: 0.7.0
+      js-sha3: 0.8.0
+      typescript-collections: 1.3.3
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - supports-color
+      - utf-8-validate
+
+  '@solana/spl-account-compression@0.2.1(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@metaplex-foundation/beet': 0.7.2
+      '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      bn.js: 5.2.1
+      js-sha3: 0.9.3
+      typescript-collections: 1.3.3
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - supports-color
+      - utf-8-validate
+
+  '@solana/spl-token-metadata@0.1.4(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)':
+    dependencies:
+      '@solana/codecs': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)
+      '@solana/spl-type-length-value': 0.1.0
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+    transitivePeerDependencies:
+      - fastestsmallesttextencoderdecoder
+
+  '@solana/spl-token@0.1.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@babel/runtime': 7.24.6
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      bn.js: 5.2.1
+      buffer: 6.0.3
+      buffer-layout: 1.2.2
+      dotenv: 10.0.0
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - utf-8-validate
+
+  '@solana/spl-token@0.3.11(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@solana/buffer-layout': 4.0.1
+      '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@solana/spl-token-metadata': 0.1.4(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      buffer: 6.0.3
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - fastestsmallesttextencoderdecoder
+      - utf-8-validate
+
+  '@solana/spl-type-length-value@0.1.0':
+    dependencies:
+      buffer: 6.0.3
+
+  '@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))':
+    dependencies:
+      '@solana/wallet-standard-features': 1.2.0
+      '@solana/web3.js': 1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@wallet-standard/base': 1.0.1
+      '@wallet-standard/features': 1.0.3
+      eventemitter3: 4.0.7
+
+  '@solana/wallet-standard-features@1.2.0':
+    dependencies:
+      '@wallet-standard/base': 1.0.1
+      '@wallet-standard/features': 1.0.3
+
+  '@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)':
+    dependencies:
+      '@babel/runtime': 7.24.6
+      '@noble/curves': 1.4.0
+      '@noble/hashes': 1.4.0
+      '@solana/buffer-layout': 4.0.1
+      agentkeepalive: 4.5.0
+      bigint-buffer: 1.1.5
+      bn.js: 5.2.1
+      borsh: 0.7.0
+      bs58: 4.0.1
+      buffer: 6.0.3
+      fast-stable-stringify: 1.0.0
+      jayson: 4.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      node-fetch: 2.7.0
+      rpc-websockets: 7.11.0
+      superstruct: 0.14.2
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - utf-8-validate
+
+  '@supercharge/promise-pool@2.4.0': {}
+
+  '@types/bn.js@5.1.5':
+    dependencies:
+      '@types/node': 20.12.12
+
+  '@types/chai@4.3.16': {}
+
+  '@types/connect@3.4.38':
+    dependencies:
+      '@types/node': 12.20.55
+
+  '@types/json5@0.0.29':
+    optional: true
+
+  '@types/mocha@9.1.1': {}
+
+  '@types/node@11.11.6': {}
+
+  '@types/node@12.20.55': {}
+
+  '@types/node@20.12.12':
+    dependencies:
+      undici-types: 5.26.5
+
+  '@types/ws@7.4.7':
+    dependencies:
+      '@types/node': 12.20.55
+
+  '@ungap/promise-all-settled@1.1.2': {}
+
+  '@wallet-standard/base@1.0.1': {}
+
+  '@wallet-standard/features@1.0.3':
+    dependencies:
+      '@wallet-standard/base': 1.0.1
+
+  JSONStream@1.3.5:
+    dependencies:
+      jsonparse: 1.3.1
+      through: 2.3.8
+
+  aes-js@3.0.0: {}
+
+  agentkeepalive@4.5.0:
+    dependencies:
+      humanize-ms: 1.2.1
+
+  algo-msgpack-with-bigint@2.1.1: {}
+
+  algosdk@1.24.1:
+    dependencies:
+      algo-msgpack-with-bigint: 2.1.1
+      buffer: 6.0.3
+      cross-fetch: 3.1.8
+      hi-base32: 0.5.1
+      js-sha256: 0.9.0
+      js-sha3: 0.8.0
+      js-sha512: 0.8.0
+      json-bigint: 1.0.0
+      tweetnacl: 1.0.3
+      vlq: 2.0.4
+    transitivePeerDependencies:
+      - encoding
+
+  ansi-colors@4.1.1: {}
+
+  ansi-escapes@4.3.2:
+    dependencies:
+      type-fest: 0.21.3
+
+  ansi-regex@5.0.1: {}
+
+  ansi-styles@4.3.0:
+    dependencies:
+      color-convert: 2.0.1
+
+  ansicolors@0.3.2: {}
+
+  anymatch@3.1.3:
+    dependencies:
+      normalize-path: 3.0.0
+      picomatch: 2.3.1
+
+  arbundles@0.6.23(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(debug@4.3.4)(utf-8-validate@5.0.10):
+    dependencies:
+      '@noble/ed25519': 1.7.3
+      '@randlabs/myalgo-connect': 1.4.2
+      '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.91.8(bufferutil@4.0.8)(utf-8-validate@5.0.10))
+      algosdk: 1.24.1
+      arweave: 1.15.1
+      arweave-stream-tx: 1.2.2(arweave@1.15.1)
+      avsc: https://codeload.github.com/Irys-xyz/avsc/tar.gz/a730cc8018b79e114b6a3381bbb57760a24c6cef
+      axios: 0.21.4(debug@4.3.4)
+      base64url: 3.0.1
+      bs58: 4.0.1
+      ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      keccak: 3.0.4
+      multistream: 4.1.0
+      process: 0.11.10
+      secp256k1: 4.0.3
+      tmp-promise: 3.0.3
+    transitivePeerDependencies:
+      - '@solana/web3.js'
+      - bufferutil
+      - debug
+      - encoding
+      - utf-8-validate
+
+  arconnect@0.4.2:
+    dependencies:
+      arweave: 1.15.1
+
+  argparse@2.0.1: {}
+
+  arrify@1.0.1: {}
+
+  arweave-stream-tx@1.2.2(arweave@1.15.1):
+    dependencies:
+      arweave: 1.15.1
+      exponential-backoff: 3.1.1
+
+  arweave@1.15.1:
+    dependencies:
+      arconnect: 0.4.2
+      asn1.js: 5.4.1
+      base64-js: 1.5.1
+      bignumber.js: 9.1.2
+
+  asn1.js@5.4.1:
+    dependencies:
+      bn.js: 4.12.0
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+      safer-buffer: 2.1.2
+
+  assert@2.1.0:
+    dependencies:
+      call-bind: 1.0.7
+      is-nan: 1.3.2
+      object-is: 1.1.6
+      object.assign: 4.1.5
+      util: 0.12.5
+
+  assertion-error@1.1.0: {}
+
+  async-retry@1.3.3:
+    dependencies:
+      retry: 0.13.1
+
+  asynckit@0.4.0: {}
+
+  available-typed-arrays@1.0.7:
+    dependencies:
+      possible-typed-array-names: 1.0.0
+
+  avsc@https://codeload.github.com/Irys-xyz/avsc/tar.gz/a730cc8018b79e114b6a3381bbb57760a24c6cef: {}
+
+  axios@0.21.4(debug@4.3.4):
+    dependencies:
+      follow-redirects: 1.15.6(debug@4.3.4)
+    transitivePeerDependencies:
+      - debug
+
+  axios@0.25.0(debug@4.3.4):
+    dependencies:
+      follow-redirects: 1.15.6(debug@4.3.4)
+    transitivePeerDependencies:
+      - debug
+
+  axios@1.7.2:
+    dependencies:
+      follow-redirects: 1.15.6(debug@4.3.4)
+      form-data: 4.0.0
+      proxy-from-env: 1.1.0
+    transitivePeerDependencies:
+      - debug
+
+  balanced-match@1.0.2: {}
+
+  base-x@3.0.9:
+    dependencies:
+      safe-buffer: 5.2.1
+
+  base-x@4.0.0: {}
+
+  base64-js@1.5.1: {}
+
+  base64url@3.0.1: {}
+
+  bech32@1.1.4: {}
+
+  bigint-buffer@1.1.5:
+    dependencies:
+      bindings: 1.5.0
+
+  bignumber.js@9.1.2: {}
+
+  binary-extensions@2.3.0: {}
+
+  bindings@1.5.0:
+    dependencies:
+      file-uri-to-path: 1.0.0
+
+  bip39-light@1.0.7:
+    dependencies:
+      create-hash: 1.2.0
+      pbkdf2: 3.1.2
+
+  bip39@3.0.2:
+    dependencies:
+      '@types/node': 11.11.6
+      create-hash: 1.2.0
+      pbkdf2: 3.1.2
+      randombytes: 2.1.0
+
+  bl@4.1.0:
+    dependencies:
+      buffer: 5.7.1
+      inherits: 2.0.4
+      readable-stream: 3.6.2
+
+  bn.js@4.11.6: {}
+
+  bn.js@4.12.0: {}
+
+  bn.js@5.2.0: {}
+
+  bn.js@5.2.1: {}
+
+  borsh@0.6.0:
+    dependencies:
+      bn.js: 5.2.1
+      bs58: 4.0.1
+      text-encoding-utf-8: 1.0.2
+
+  borsh@0.7.0:
+    dependencies:
+      bn.js: 5.2.1
+      bs58: 4.0.1
+      text-encoding-utf-8: 1.0.2
+
+  brace-expansion@1.1.11:
+    dependencies:
+      balanced-match: 1.0.2
+      concat-map: 0.0.1
+
+  braces@3.0.3:
+    dependencies:
+      fill-range: 7.1.1
+
+  brorand@1.1.0: {}
+
+  browser-stdout@1.3.1: {}
+
+  bs58@4.0.1:
+    dependencies:
+      base-x: 3.0.9
+
+  bs58@5.0.0:
+    dependencies:
+      base-x: 4.0.0
+
+  buffer-from@1.1.2: {}
+
+  buffer-layout@1.2.2: {}
+
+  buffer-reverse@1.0.1: {}
+
+  buffer@5.7.1:
+    dependencies:
+      base64-js: 1.5.1
+      ieee754: 1.2.1
+
+  buffer@6.0.3:
+    dependencies:
+      base64-js: 1.5.1
+      ieee754: 1.2.1
+
+  bufferutil@4.0.8:
+    dependencies:
+      node-gyp-build: 4.8.1
+    optional: true
+
+  call-bind@1.0.7:
+    dependencies:
+      es-define-property: 1.0.0
+      es-errors: 1.3.0
+      function-bind: 1.1.2
+      get-intrinsic: 1.2.4
+      set-function-length: 1.2.2
+
+  camelcase@6.3.0: {}
+
+  capability@0.2.5: {}
+
+  chai@4.4.1:
+    dependencies:
+      assertion-error: 1.1.0
+      check-error: 1.0.3
+      deep-eql: 4.1.3
+      get-func-name: 2.0.2
+      loupe: 2.3.7
+      pathval: 1.1.1
+      type-detect: 4.0.8
+
+  chalk@4.1.2:
+    dependencies:
+      ansi-styles: 4.3.0
+      supports-color: 7.2.0
+
+  chalk@5.3.0: {}
+
+  chardet@0.7.0: {}
+
+  check-error@1.0.3:
+    dependencies:
+      get-func-name: 2.0.2
+
+  chokidar@3.5.3:
+    dependencies:
+      anymatch: 3.1.3
+      braces: 3.0.3
+      glob-parent: 5.1.2
+      is-binary-path: 2.1.0
+      is-glob: 4.0.3
+      normalize-path: 3.0.0
+      readdirp: 3.6.0
+    optionalDependencies:
+      fsevents: 2.3.3
+
+  cipher-base@1.0.4:
+    dependencies:
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+
+  cli-cursor@3.1.0:
+    dependencies:
+      restore-cursor: 3.1.0
+
+  cli-spinners@2.9.2: {}
+
+  cli-width@3.0.0: {}
+
+  cliui@7.0.4:
+    dependencies:
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      wrap-ansi: 7.0.0
+
+  clone@1.0.4: {}
+
+  color-convert@2.0.1:
+    dependencies:
+      color-name: 1.1.4
+
+  color-name@1.1.4: {}
+
+  combined-stream@1.0.8:
+    dependencies:
+      delayed-stream: 1.0.0
+
+  commander@12.1.0: {}
+
+  commander@2.20.3: {}
+
+  commander@8.3.0: {}
+
+  concat-map@0.0.1: {}
+
+  create-hash@1.2.0:
+    dependencies:
+      cipher-base: 1.0.4
+      inherits: 2.0.4
+      md5.js: 1.3.5
+      ripemd160: 2.0.2
+      sha.js: 2.4.11
+
+  create-hmac@1.1.7:
+    dependencies:
+      cipher-base: 1.0.4
+      create-hash: 1.2.0
+      inherits: 2.0.4
+      ripemd160: 2.0.2
+      safe-buffer: 5.2.1
+      sha.js: 2.4.11
+
+  cross-fetch@3.1.8:
+    dependencies:
+      node-fetch: 2.7.0
+    transitivePeerDependencies:
+      - encoding
+
+  crypto-hash@1.3.0: {}
+
+  crypto-js@3.3.0: {}
+
+  csv-generate@4.4.1: {}
+
+  csv-parse@5.5.6: {}
+
+  csv-stringify@6.5.0: {}
+
+  csv@6.3.9:
+    dependencies:
+      csv-generate: 4.4.1
+      csv-parse: 5.5.6
+      csv-stringify: 6.5.0
+      stream-transform: 3.3.2
+
+  debug@4.3.3(supports-color@8.1.1):
+    dependencies:
+      ms: 2.1.2
+    optionalDependencies:
+      supports-color: 8.1.1
+
+  debug@4.3.4:
+    dependencies:
+      ms: 2.1.2
+
+  decamelize@4.0.0: {}
+
+  deep-eql@4.1.3:
+    dependencies:
+      type-detect: 4.0.8
+
+  defaults@1.0.4:
+    dependencies:
+      clone: 1.0.4
+
+  define-data-property@1.1.4:
+    dependencies:
+      es-define-property: 1.0.0
+      es-errors: 1.3.0
+      gopd: 1.0.1
+
+  define-properties@1.2.1:
+    dependencies:
+      define-data-property: 1.1.4
+      has-property-descriptors: 1.0.2
+      object-keys: 1.1.1
+
+  delay@5.0.0: {}
+
+  delayed-stream@1.0.0: {}
+
+  depd@1.1.2: {}
+
+  depd@2.0.0: {}
+
+  diff@3.5.0: {}
+
+  diff@5.0.0: {}
+
+  dot-case@3.0.4:
+    dependencies:
+      no-case: 3.0.4
+      tslib: 2.6.2
+
+  dotenv@10.0.0: {}
+
+  elliptic@6.5.4:
+    dependencies:
+      bn.js: 4.12.0
+      brorand: 1.1.0
+      hash.js: 1.1.7
+      hmac-drbg: 1.0.1
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+      minimalistic-crypto-utils: 1.0.1
+
+  elliptic@6.5.5:
+    dependencies:
+      bn.js: 4.12.0
+      brorand: 1.1.0
+      hash.js: 1.1.7
+      hmac-drbg: 1.0.1
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+      minimalistic-crypto-utils: 1.0.1
+
+  emoji-regex@8.0.0: {}
+
+  error-polyfill@0.1.3:
+    dependencies:
+      capability: 0.2.5
+      o3: 1.0.3
+      u3: 0.1.1
+
+  es-define-property@1.0.0:
+    dependencies:
+      get-intrinsic: 1.2.4
+
+  es-errors@1.3.0: {}
+
+  es6-promise@4.2.8: {}
+
+  es6-promisify@5.0.0:
+    dependencies:
+      es6-promise: 4.2.8
+
+  escalade@3.1.2: {}
+
+  escape-string-regexp@1.0.5: {}
+
+  escape-string-regexp@4.0.0: {}
+
+  ethereum-bloom-filters@1.1.0:
+    dependencies:
+      '@noble/hashes': 1.4.0
+
+  ethereum-cryptography@2.1.3:
+    dependencies:
+      '@noble/curves': 1.3.0
+      '@noble/hashes': 1.3.3
+      '@scure/bip32': 1.3.3
+      '@scure/bip39': 1.2.2
+
+  ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10):
+    dependencies:
+      '@ethersproject/abi': 5.7.0
+      '@ethersproject/abstract-provider': 5.7.0
+      '@ethersproject/abstract-signer': 5.7.0
+      '@ethersproject/address': 5.7.0
+      '@ethersproject/base64': 5.7.0
+      '@ethersproject/basex': 5.7.0
+      '@ethersproject/bignumber': 5.7.0
+      '@ethersproject/bytes': 5.7.0
+      '@ethersproject/constants': 5.7.0
+      '@ethersproject/contracts': 5.7.0
+      '@ethersproject/hash': 5.7.0
+      '@ethersproject/hdnode': 5.7.0
+      '@ethersproject/json-wallets': 5.7.0
+      '@ethersproject/keccak256': 5.7.0
+      '@ethersproject/logger': 5.7.0
+      '@ethersproject/networks': 5.7.1
+      '@ethersproject/pbkdf2': 5.7.0
+      '@ethersproject/properties': 5.7.0
+      '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+      '@ethersproject/random': 5.7.0
+      '@ethersproject/rlp': 5.7.0
+      '@ethersproject/sha2': 5.7.0
+      '@ethersproject/signing-key': 5.7.0
+      '@ethersproject/solidity': 5.7.0
+      '@ethersproject/strings': 5.7.0
+      '@ethersproject/transactions': 5.7.0
+      '@ethersproject/units': 5.7.0
+      '@ethersproject/wallet': 5.7.0
+      '@ethersproject/web': 5.7.1
+      '@ethersproject/wordlists': 5.7.0
+    transitivePeerDependencies:
+      - bufferutil
+      - utf-8-validate
+
+  ethjs-unit@0.1.6:
+    dependencies:
+      bn.js: 4.11.6
+      number-to-bn: 1.7.0
+
+  eventemitter3@4.0.7: {}
+
+  exponential-backoff@3.1.1: {}
+
+  external-editor@3.1.0:
+    dependencies:
+      chardet: 0.7.0
+      iconv-lite: 0.4.24
+      tmp: 0.0.33
+
+  eyes@0.1.8: {}
+
+  fast-stable-stringify@1.0.0: {}
+
+  fastestsmallesttextencoderdecoder@1.0.22: {}
+
+  figures@3.2.0:
+    dependencies:
+      escape-string-regexp: 1.0.5
+
+  file-uri-to-path@1.0.0: {}
+
+  fill-range@7.1.1:
+    dependencies:
+      to-regex-range: 5.0.1
+
+  find-up@5.0.0:
+    dependencies:
+      locate-path: 6.0.0
+      path-exists: 4.0.0
+
+  flat@5.0.2: {}
+
+  follow-redirects@1.15.6(debug@4.3.4):
+    optionalDependencies:
+      debug: 4.3.4
+
+  for-each@0.3.3:
+    dependencies:
+      is-callable: 1.2.7
+
+  form-data@4.0.0:
+    dependencies:
+      asynckit: 0.4.0
+      combined-stream: 1.0.8
+      mime-types: 2.1.35
+
+  fs.realpath@1.0.0: {}
+
+  fsevents@2.3.3:
+    optional: true
+
+  function-bind@1.1.2: {}
+
+  get-caller-file@2.0.5: {}
+
+  get-func-name@2.0.2: {}
+
+  get-intrinsic@1.2.4:
+    dependencies:
+      es-errors: 1.3.0
+      function-bind: 1.1.2
+      has-proto: 1.0.3
+      has-symbols: 1.0.3
+      hasown: 2.0.2
+
+  glob-parent@5.1.2:
+    dependencies:
+      is-glob: 4.0.3
+
+  glob@7.2.0:
+    dependencies:
+      fs.realpath: 1.0.0
+      inflight: 1.0.6
+      inherits: 2.0.4
+      minimatch: 3.1.2
+      once: 1.4.0
+      path-is-absolute: 1.0.1
+
+  gopd@1.0.1:
+    dependencies:
+      get-intrinsic: 1.2.4
+
+  growl@1.10.5: {}
+
+  has-flag@4.0.0: {}
+
+  has-property-descriptors@1.0.2:
+    dependencies:
+      es-define-property: 1.0.0
+
+  has-proto@1.0.3: {}
+
+  has-symbols@1.0.3: {}
+
+  has-tostringtag@1.0.2:
+    dependencies:
+      has-symbols: 1.0.3
+
+  hash-base@3.1.0:
+    dependencies:
+      inherits: 2.0.4
+      readable-stream: 3.6.2
+      safe-buffer: 5.2.1
+
+  hash.js@1.1.7:
+    dependencies:
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+
+  hasown@2.0.2:
+    dependencies:
+      function-bind: 1.1.2
+
+  he@1.2.0: {}
+
+  hi-base32@0.5.1: {}
+
+  hmac-drbg@1.0.1:
+    dependencies:
+      hash.js: 1.1.7
+      minimalistic-assert: 1.0.1
+      minimalistic-crypto-utils: 1.0.1
+
+  http-errors@1.8.1:
+    dependencies:
+      depd: 1.1.2
+      inherits: 2.0.4
+      setprototypeof: 1.2.0
+      statuses: 1.5.0
+      toidentifier: 1.0.1
+
+  humanize-ms@1.2.1:
+    dependencies:
+      ms: 2.1.3
+
+  iconv-lite@0.4.24:
+    dependencies:
+      safer-buffer: 2.1.2
+
+  ieee754@1.2.1: {}
+
+  inflight@1.0.6:
+    dependencies:
+      once: 1.4.0
+      wrappy: 1.0.2
+
+  inherits@2.0.4: {}
+
+  inquirer@8.2.6:
+    dependencies:
+      ansi-escapes: 4.3.2
+      chalk: 4.1.2
+      cli-cursor: 3.1.0
+      cli-width: 3.0.0
+      external-editor: 3.1.0
+      figures: 3.2.0
+      lodash: 4.17.21
+      mute-stream: 0.0.8
+      ora: 5.4.1
+      run-async: 2.4.1
+      rxjs: 7.8.1
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      through: 2.3.8
+      wrap-ansi: 6.2.0
+
+  is-arguments@1.1.1:
+    dependencies:
+      call-bind: 1.0.7
+      has-tostringtag: 1.0.2
+
+  is-binary-path@2.1.0:
+    dependencies:
+      binary-extensions: 2.3.0
+
+  is-callable@1.2.7: {}
+
+  is-extglob@2.1.1: {}
+
+  is-fullwidth-code-point@3.0.0: {}
+
+  is-generator-function@1.0.10:
+    dependencies:
+      has-tostringtag: 1.0.2
+
+  is-glob@4.0.3:
+    dependencies:
+      is-extglob: 2.1.1
+
+  is-hex-prefixed@1.0.0: {}
+
+  is-interactive@1.0.0: {}
+
+  is-nan@1.3.2:
+    dependencies:
+      call-bind: 1.0.7
+      define-properties: 1.2.1
+
+  is-number@7.0.0: {}
+
+  is-plain-obj@2.1.0: {}
+
+  is-typed-array@1.1.13:
+    dependencies:
+      which-typed-array: 1.1.15
+
+  is-unicode-supported@0.1.0: {}
+
+  isexe@2.0.0: {}
+
+  isomorphic-ws@4.0.1(ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10)):
+    dependencies:
+      ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+
+  jayson@4.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10):
+    dependencies:
+      '@types/connect': 3.4.38
+      '@types/node': 12.20.55
+      '@types/ws': 7.4.7
+      JSONStream: 1.3.5
+      commander: 2.20.3
+      delay: 5.0.0
+      es6-promisify: 5.0.0
+      eyes: 0.1.8
+      isomorphic-ws: 4.0.1(ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10))
+      json-stringify-safe: 5.0.1
+      uuid: 8.3.2
+      ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+    transitivePeerDependencies:
+      - bufferutil
+      - utf-8-validate
+
+  js-sha256@0.9.0: {}
+
+  js-sha3@0.8.0: {}
+
+  js-sha3@0.9.3: {}
+
+  js-sha512@0.8.0: {}
+
+  js-yaml@4.1.0:
+    dependencies:
+      argparse: 2.0.1
+
+  json-bigint@1.0.0:
+    dependencies:
+      bignumber.js: 9.1.2
+
+  json-stringify-safe@5.0.1: {}
+
+  json5@1.0.2:
+    dependencies:
+      minimist: 1.2.8
+    optional: true
+
+  jsonparse@1.3.1: {}
+
+  keccak@3.0.4:
+    dependencies:
+      node-addon-api: 2.0.2
+      node-gyp-build: 4.8.1
+      readable-stream: 3.6.2
+
+  locate-path@6.0.0:
+    dependencies:
+      p-locate: 5.0.0
+
+  lodash.clonedeep@4.5.0: {}
+
+  lodash.isequal@4.5.0: {}
+
+  lodash@4.17.21: {}
+
+  log-symbols@4.1.0:
+    dependencies:
+      chalk: 4.1.2
+      is-unicode-supported: 0.1.0
+
+  loupe@2.3.7:
+    dependencies:
+      get-func-name: 2.0.2
+
+  lower-case@2.0.2:
+    dependencies:
+      tslib: 2.6.2
+
+  make-error@1.3.6: {}
+
+  md5.js@1.3.5:
+    dependencies:
+      hash-base: 3.1.0
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+
+  merkletreejs@0.2.32:
+    dependencies:
+      bignumber.js: 9.1.2
+      buffer-reverse: 1.0.1
+      crypto-js: 3.3.0
+      treeify: 1.1.0
+      web3-utils: 1.10.4
+
+  micro-ftch@0.3.1: {}
+
+  mime-db@1.52.0: {}
+
+  mime-types@2.1.35:
+    dependencies:
+      mime-db: 1.52.0
+
+  mime@3.0.0: {}
+
+  mimic-fn@2.1.0: {}
+
+  minimalistic-assert@1.0.1: {}
+
+  minimalistic-crypto-utils@1.0.1: {}
+
+  minimatch@3.1.2:
+    dependencies:
+      brace-expansion: 1.1.11
+
+  minimatch@4.2.1:
+    dependencies:
+      brace-expansion: 1.1.11
+
+  minimist@1.2.8: {}
+
+  mkdirp@0.5.6:
+    dependencies:
+      minimist: 1.2.8
+
+  mocha@9.2.2:
+    dependencies:
+      '@ungap/promise-all-settled': 1.1.2
+      ansi-colors: 4.1.1
+      browser-stdout: 1.3.1
+      chokidar: 3.5.3
+      debug: 4.3.3(supports-color@8.1.1)
+      diff: 5.0.0
+      escape-string-regexp: 4.0.0
+      find-up: 5.0.0
+      glob: 7.2.0
+      growl: 1.10.5
+      he: 1.2.0
+      js-yaml: 4.1.0
+      log-symbols: 4.1.0
+      minimatch: 4.2.1
+      ms: 2.1.3
+      nanoid: 3.3.1
+      serialize-javascript: 6.0.0
+      strip-json-comments: 3.1.1
+      supports-color: 8.1.1
+      which: 2.0.2
+      workerpool: 6.2.0
+      yargs: 16.2.0
+      yargs-parser: 20.2.4
+      yargs-unparser: 2.0.0
+
+  ms@2.1.2: {}
+
+  ms@2.1.3: {}
+
+  multistream@4.1.0:
+    dependencies:
+      once: 1.4.0
+      readable-stream: 3.6.2
+
+  mustache@4.2.0: {}
+
+  mute-stream@0.0.8: {}
+
+  nanoid@3.3.1: {}
+
+  near-api-js@0.44.2:
+    dependencies:
+      bn.js: 5.2.0
+      borsh: 0.6.0
+      bs58: 4.0.1
+      depd: 2.0.0
+      error-polyfill: 0.1.3
+      http-errors: 1.8.1
+      js-sha256: 0.9.0
+      mustache: 4.2.0
+      node-fetch: 2.7.0
+      text-encoding-utf-8: 1.0.2
+      tweetnacl: 1.0.3
+    transitivePeerDependencies:
+      - encoding
+
+  near-hd-key@1.2.1:
+    dependencies:
+      bip39: 3.0.2
+      create-hmac: 1.1.7
+      tweetnacl: 1.0.3
+
+  near-seed-phrase@0.2.0:
+    dependencies:
+      bip39-light: 1.0.7
+      bs58: 4.0.1
+      near-hd-key: 1.2.1
+      tweetnacl: 1.0.3
+
+  no-case@3.0.4:
+    dependencies:
+      lower-case: 2.0.2
+      tslib: 2.6.2
+
+  node-addon-api@2.0.2: {}
+
+  node-fetch@2.7.0:
+    dependencies:
+      whatwg-url: 5.0.0
+
+  node-gyp-build@4.8.1: {}
+
+  normalize-path@3.0.0: {}
+
+  number-to-bn@1.7.0:
+    dependencies:
+      bn.js: 4.11.6
+      strip-hex-prefix: 1.0.0
+
+  o3@1.0.3:
+    dependencies:
+      capability: 0.2.5
+
+  object-is@1.1.6:
+    dependencies:
+      call-bind: 1.0.7
+      define-properties: 1.2.1
+
+  object-keys@1.1.1: {}
+
+  object.assign@4.1.5:
+    dependencies:
+      call-bind: 1.0.7
+      define-properties: 1.2.1
+      has-symbols: 1.0.3
+      object-keys: 1.1.1
+
+  once@1.4.0:
+    dependencies:
+      wrappy: 1.0.2
+
+  onetime@5.1.2:
+    dependencies:
+      mimic-fn: 2.1.0
+
+  ora@5.4.1:
+    dependencies:
+      bl: 4.1.0
+      chalk: 4.1.2
+      cli-cursor: 3.1.0
+      cli-spinners: 2.9.2
+      is-interactive: 1.0.0
+      is-unicode-supported: 0.1.0
+      log-symbols: 4.1.0
+      strip-ansi: 6.0.1
+      wcwidth: 1.0.1
+
+  os-tmpdir@1.0.2: {}
+
+  p-limit@3.1.0:
+    dependencies:
+      yocto-queue: 0.1.0
+
+  p-locate@5.0.0:
+    dependencies:
+      p-limit: 3.1.0
+
+  pako@2.1.0: {}
+
+  path-exists@4.0.0: {}
+
+  path-is-absolute@1.0.1: {}
+
+  pathval@1.1.1: {}
+
+  pbkdf2@3.1.2:
+    dependencies:
+      create-hash: 1.2.0
+      create-hmac: 1.1.7
+      ripemd160: 2.0.2
+      safe-buffer: 5.2.1
+      sha.js: 2.4.11
+
+  picomatch@2.3.1: {}
+
+  possible-typed-array-names@1.0.0: {}
+
+  prettier@2.8.8: {}
+
+  process@0.11.10: {}
+
+  proxy-from-env@1.1.0: {}
+
+  randombytes@2.1.0:
+    dependencies:
+      safe-buffer: 5.2.1
+
+  readable-stream@3.6.2:
+    dependencies:
+      inherits: 2.0.4
+      string_decoder: 1.3.0
+      util-deprecate: 1.0.2
+
+  readdirp@3.6.0:
+    dependencies:
+      picomatch: 2.3.1
+
+  regenerator-runtime@0.14.1: {}
+
+  require-directory@2.1.1: {}
+
+  restore-cursor@3.1.0:
+    dependencies:
+      onetime: 5.1.2
+      signal-exit: 3.0.7
+
+  retry@0.13.1: {}
+
+  ripemd160@2.0.2:
+    dependencies:
+      hash-base: 3.1.0
+      inherits: 2.0.4
+
+  rpc-websockets@7.11.0:
+    dependencies:
+      eventemitter3: 4.0.7
+      uuid: 8.3.2
+      ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+    optionalDependencies:
+      bufferutil: 4.0.8
+      utf-8-validate: 5.0.10
+
+  run-async@2.4.1: {}
+
+  rxjs@7.8.1:
+    dependencies:
+      tslib: 2.6.2
+
+  safe-buffer@5.2.1: {}
+
+  safer-buffer@2.1.2: {}
+
+  scrypt-js@3.0.1: {}
+
+  secp256k1@4.0.3:
+    dependencies:
+      elliptic: 6.5.5
+      node-addon-api: 2.0.2
+      node-gyp-build: 4.8.1
+
+  serialize-javascript@6.0.0:
+    dependencies:
+      randombytes: 2.1.0
+
+  set-function-length@1.2.2:
+    dependencies:
+      define-data-property: 1.1.4
+      es-errors: 1.3.0
+      function-bind: 1.1.2
+      get-intrinsic: 1.2.4
+      gopd: 1.0.1
+      has-property-descriptors: 1.0.2
+
+  setprototypeof@1.2.0: {}
+
+  sha.js@2.4.11:
+    dependencies:
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+
+  signal-exit@3.0.7: {}
+
+  snake-case@3.0.4:
+    dependencies:
+      dot-case: 3.0.4
+      tslib: 2.6.2
+
+  source-map-support@0.5.21:
+    dependencies:
+      buffer-from: 1.1.2
+      source-map: 0.6.1
+
+  source-map@0.6.1: {}
+
+  statuses@1.5.0: {}
+
+  stream-transform@3.3.2: {}
+
+  string-width@4.2.3:
+    dependencies:
+      emoji-regex: 8.0.0
+      is-fullwidth-code-point: 3.0.0
+      strip-ansi: 6.0.1
+
+  string_decoder@1.3.0:
+    dependencies:
+      safe-buffer: 5.2.1
+
+  strip-ansi@6.0.1:
+    dependencies:
+      ansi-regex: 5.0.1
+
+  strip-bom@3.0.0:
+    optional: true
+
+  strip-hex-prefix@1.0.0:
+    dependencies:
+      is-hex-prefixed: 1.0.0
+
+  strip-json-comments@3.1.1: {}
+
+  superstruct@0.14.2: {}
+
+  superstruct@0.15.5: {}
+
+  supports-color@7.2.0:
+    dependencies:
+      has-flag: 4.0.0
+
+  supports-color@8.1.1:
+    dependencies:
+      has-flag: 4.0.0
+
+  text-encoding-utf-8@1.0.2: {}
+
+  through@2.3.8: {}
+
+  tmp-promise@3.0.3:
+    dependencies:
+      tmp: 0.2.3
+
+  tmp@0.0.33:
+    dependencies:
+      os-tmpdir: 1.0.2
+
+  tmp@0.2.3: {}
+
+  to-regex-range@5.0.1:
+    dependencies:
+      is-number: 7.0.0
+
+  toidentifier@1.0.1: {}
+
+  toml@3.0.0: {}
+
+  tr46@0.0.3: {}
+
+  treeify@1.1.0: {}
+
+  ts-mocha@10.0.0(mocha@9.2.2):
+    dependencies:
+      mocha: 9.2.2
+      ts-node: 7.0.1
+    optionalDependencies:
+      tsconfig-paths: 3.15.0
+
+  ts-node@7.0.1:
+    dependencies:
+      arrify: 1.0.1
+      buffer-from: 1.1.2
+      diff: 3.5.0
+      make-error: 1.3.6
+      minimist: 1.2.8
+      mkdirp: 0.5.6
+      source-map-support: 0.5.21
+      yn: 2.0.0
+
+  tsconfig-paths@3.15.0:
+    dependencies:
+      '@types/json5': 0.0.29
+      json5: 1.0.2
+      minimist: 1.2.8
+      strip-bom: 3.0.0
+    optional: true
+
+  tslib@2.6.2: {}
+
+  tweetnacl@1.0.3: {}
+
+  type-detect@4.0.8: {}
+
+  type-fest@0.21.3: {}
+
+  typescript-collections@1.3.3: {}
+
+  typescript@4.9.5: {}
+
+  u3@0.1.1: {}
+
+  undici-types@5.26.5: {}
+
+  utf-8-validate@5.0.10:
+    dependencies:
+      node-gyp-build: 4.8.1
+    optional: true
+
+  utf8@3.0.0: {}
+
+  util-deprecate@1.0.2: {}
+
+  util@0.12.5:
+    dependencies:
+      inherits: 2.0.4
+      is-arguments: 1.1.1
+      is-generator-function: 1.0.10
+      is-typed-array: 1.1.13
+      which-typed-array: 1.1.15
+
+  uuid@8.3.2: {}
+
+  vlq@2.0.4: {}
+
+  wcwidth@1.0.1:
+    dependencies:
+      defaults: 1.0.4
+
+  web3-utils@1.10.4:
+    dependencies:
+      '@ethereumjs/util': 8.1.0
+      bn.js: 5.2.1
+      ethereum-bloom-filters: 1.1.0
+      ethereum-cryptography: 2.1.3
+      ethjs-unit: 0.1.6
+      number-to-bn: 1.7.0
+      randombytes: 2.1.0
+      utf8: 3.0.0
+
+  webidl-conversions@3.0.1: {}
+
+  whatwg-url@5.0.0:
+    dependencies:
+      tr46: 0.0.3
+      webidl-conversions: 3.0.1
+
+  which-typed-array@1.1.15:
+    dependencies:
+      available-typed-arrays: 1.0.7
+      call-bind: 1.0.7
+      for-each: 0.3.3
+      gopd: 1.0.1
+      has-tostringtag: 1.0.2
+
+  which@2.0.2:
+    dependencies:
+      isexe: 2.0.0
+
+  workerpool@6.2.0: {}
+
+  wrap-ansi@6.2.0:
+    dependencies:
+      ansi-styles: 4.3.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+
+  wrap-ansi@7.0.0:
+    dependencies:
+      ansi-styles: 4.3.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+
+  wrappy@1.0.2: {}
+
+  ws@7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10):
+    optionalDependencies:
+      bufferutil: 4.0.8
+      utf-8-validate: 5.0.10
+
+  ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10):
+    optionalDependencies:
+      bufferutil: 4.0.8
+      utf-8-validate: 5.0.10
+
+  ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10):
+    optionalDependencies:
+      bufferutil: 4.0.8
+      utf-8-validate: 5.0.10
+
+  y18n@5.0.8: {}
+
+  yargs-parser@20.2.4: {}
+
+  yargs-unparser@2.0.0:
+    dependencies:
+      camelcase: 6.3.0
+      decamelize: 4.0.0
+      flat: 5.0.2
+      is-plain-obj: 2.1.0
+
+  yargs@16.2.0:
+    dependencies:
+      cliui: 7.0.4
+      escalade: 3.1.2
+      get-caller-file: 2.0.5
+      require-directory: 2.1.1
+      string-width: 4.2.3
+      y18n: 5.0.8
+      yargs-parser: 20.2.4
+
+  yn@2.0.0: {}
+
+  yocto-queue@0.1.0: {}

+ 0 - 0
compression/cnft-burn/programs/cnft-burn/Cargo.toml → compression/cnft-burn/anchor/programs/cnft-burn/Cargo.toml


+ 0 - 0
compression/cnft-burn/programs/cnft-burn/Xargo.toml → compression/cnft-burn/anchor/programs/cnft-burn/Xargo.toml


+ 0 - 0
compression/cnft-burn/programs/cnft-burn/src/lib.rs → compression/cnft-burn/anchor/programs/cnft-burn/src/lib.rs


+ 40 - 70
compression/cnft-burn/tests/ReadApi/WrapperConnection.ts → compression/cnft-burn/anchor/tests/ReadApi/WrapperConnection.ts

@@ -1,4 +1,3 @@
-import { Commitment, Connection, ConnectionConfig, PublicKey } from "@solana/web3.js";
 // local imports for the ReadApi types
 import type {
   GetAssetProofRpcInput,
@@ -8,14 +7,15 @@ import type {
   GetAssetsByOwnerRpcInput,
   ReadApiAsset,
   ReadApiAssetList,
-} from "@/ReadApi/types";
-import type { Metadata, Mint, NftOriginalEdition, SplTokenCurrency } from "@metaplex-foundation/js";
+} from '@/ReadApi/types';
+import type { Metadata, Mint, NftOriginalEdition, SplTokenCurrency } from '@metaplex-foundation/js';
 // import from the `@metaplex-foundation/js`
-import { MetaplexError, Pda, amount, toBigNumber } from "@metaplex-foundation/js";
+import { MetaplexError, Pda, amount, toBigNumber } from '@metaplex-foundation/js';
+import { type Commitment, Connection, type ConnectionConfig, PublicKey } from '@solana/web3.js';
 
-import BN from "bn.js";
-import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from "@metaplex-foundation/mpl-bubblegum";
-import { TokenStandard } from "@metaplex-foundation/mpl-token-metadata";
+import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from '@metaplex-foundation/mpl-bubblegum';
+import { TokenStandard } from '@metaplex-foundation/mpl-token-metadata';
+import BN from 'bn.js';
 
 type JsonRpcParams<ReadApiMethodParams> = {
   method: string;
@@ -29,9 +29,9 @@ type JsonRpcOutput<ReadApiJsonOutput> = {
 
 /** @group Errors */
 export class ReadApiError extends MetaplexError {
-  readonly name: string = "ReadApiError";
+  readonly name: string = 'ReadApiError';
   constructor(message: string, cause?: Error) {
-    super(message, "rpc", undefined, cause);
+    super(message, 'rpc', undefined, cause);
   }
 }
 
@@ -40,7 +40,7 @@ export class ReadApiError extends MetaplexError {
  */
 export const toNftEditionFromReadApiAsset = (input: ReadApiAsset): NftOriginalEdition => {
   return {
-    model: "nftEdition",
+    model: 'nftEdition',
     isOriginal: true,
     address: new PublicKey(input.id),
     supply: toBigNumber(input.supply.print_current_supply),
@@ -53,13 +53,13 @@ export const toNftEditionFromReadApiAsset = (input: ReadApiAsset): NftOriginalEd
  */
 export const toMintFromReadApiAsset = (input: ReadApiAsset): Mint => {
   const currency: SplTokenCurrency = {
-    symbol: "Token",
+    symbol: 'Token',
     decimals: 0,
-    namespace: "spl-token",
+    namespace: 'spl-token',
   };
 
   return {
-    model: "mint",
+    model: 'mint',
     address: new PublicKey(input.id),
     mintAuthorityAddress: new PublicKey(input.id),
     freezeAuthorityAddress: new PublicKey(input.id),
@@ -74,26 +74,26 @@ export const toMintFromReadApiAsset = (input: ReadApiAsset): Mint => {
  * Convert a ReadApi asset's data into standard Metaplex `Metadata`
  */
 export const toMetadataFromReadApiAsset = (input: ReadApiAsset): Metadata => {
-  const updateAuthority = input.authorities?.find(authority => authority.scopes.includes("full"));
+  const updateAuthority = input.authorities?.find((authority) => authority.scopes.includes('full'));
 
-  const collection = input.grouping.find(({ group_key }) => group_key === "collection");
+  const collection = input.grouping.find(({ group_key }) => group_key === 'collection');
 
   return {
-    model: "metadata",
+    model: 'metadata',
     /**
      * We technically don't have a metadata address anymore.
      * So we are using the asset's id as the address
      */
     address: Pda.find(BUBBLEGUM_PROGRAM_ID, [
-      Buffer.from("asset", "utf-8"),
+      Buffer.from('asset', 'utf-8'),
       new PublicKey(input.compression.tree).toBuffer(),
-      Uint8Array.from(new BN(input.compression.leaf_id).toArray("le", 8)),
+      Uint8Array.from(new BN(input.compression.leaf_id).toArray('le', 8)),
     ]),
     mintAddress: new PublicKey(input.id),
-    updateAuthorityAddress: new PublicKey(updateAuthority!.address),
+    updateAuthorityAddress: new PublicKey(updateAuthority?.address),
 
-    name: input.content.metadata?.name ?? "",
-    symbol: input.content.metadata?.symbol ?? "",
+    name: input.content.metadata?.name ?? '',
+    symbol: input.content.metadata?.symbol ?? '',
 
     json: input.content.metadata,
     jsonLoaded: true,
@@ -107,9 +107,7 @@ export const toMetadataFromReadApiAsset = (input: ReadApiAsset): Metadata => {
     editionNonce: input.supply.edition_nonce,
     tokenStandard: TokenStandard.NonFungible,
 
-    collection: collection
-      ? { address: new PublicKey(collection.group_value), verified: false }
-      : null,
+    collection: collection ? { address: new PublicKey(collection.group_value), verified: false } : null,
 
     // Current regular `Metadata` does not currently have a `compression` value
     // @ts-ignore
@@ -130,40 +128,36 @@ export const toMetadataFromReadApiAsset = (input: ReadApiAsset): Metadata => {
  * for state compression and compressed NFTs
  */
 export class WrapperConnection extends Connection {
-  constructor(endpoint: string, commitmentOrConfig?: Commitment | ConnectionConfig) {
-    super(endpoint, commitmentOrConfig);
-  }
-
   private callReadApi = async <ReadApiMethodParams, ReadApiJsonOutput>(
     jsonRpcParams: JsonRpcParams<ReadApiMethodParams>,
   ): Promise<JsonRpcOutput<ReadApiJsonOutput>> => {
     const response = await fetch(this.rpcEndpoint, {
-      method: "POST",
+      method: 'POST',
       headers: {
-        "Content-Type": "application/json",
+        'Content-Type': 'application/json',
       },
       body: JSON.stringify({
-        jsonrpc: "2.0",
+        jsonrpc: '2.0',
         method: jsonRpcParams.method,
-        id: jsonRpcParams.id ?? "rpd-op-123",
+        id: jsonRpcParams.id ?? 'rpd-op-123',
         params: jsonRpcParams.params,
       }),
     });
 
-    return await response.json() as JsonRpcOutput<ReadApiJsonOutput>;
+    return (await response.json()) as JsonRpcOutput<ReadApiJsonOutput>;
   };
 
   // Asset id can be calculated via Bubblegum#getLeafAssetId
   // It is a PDA with the following seeds: ["asset", tree, leafIndex]
   async getAsset(assetId: PublicKey): Promise<ReadApiAsset> {
     const { result: asset } = await this.callReadApi<GetAssetRpcInput, ReadApiAsset>({
-      method: "getAsset",
+      method: 'getAsset',
       params: {
         id: assetId.toBase58(),
       },
     });
 
-    if (!asset) throw new ReadApiError("No asset returned");
+    if (!asset) throw new ReadApiError('No asset returned');
 
     return asset;
   }
@@ -171,41 +165,27 @@ export class WrapperConnection extends Connection {
   // Asset id can be calculated via Bubblegum#getLeafAssetId
   // It is a PDA with the following seeds: ["asset", tree, leafIndex]
   async getAssetProof(assetId: PublicKey): Promise<GetAssetProofRpcResponse> {
-    const { result: proof } = await this.callReadApi<
-      GetAssetProofRpcInput,
-      GetAssetProofRpcResponse
-    >({
-      method: "getAssetProof",
+    const { result: proof } = await this.callReadApi<GetAssetProofRpcInput, GetAssetProofRpcResponse>({
+      method: 'getAssetProof',
       params: {
         id: assetId.toBase58(),
       },
     });
 
-    if (!proof) throw new ReadApiError("No asset proof returned");
+    if (!proof) throw new ReadApiError('No asset proof returned');
 
     return proof;
   }
 
   //
-  async getAssetsByGroup({
-    groupKey,
-    groupValue,
-    page,
-    limit,
-    sortBy,
-    before,
-    after,
-  }: GetAssetsByGroupRpcInput): Promise<ReadApiAssetList> {
+  async getAssetsByGroup({ groupKey, groupValue, page, limit, sortBy, before, after }: GetAssetsByGroupRpcInput): Promise<ReadApiAssetList> {
     // `page` cannot be supplied with `before` or `after`
-    if (typeof page == "number" && (before || after))
-      throw new ReadApiError(
-        "Pagination Error. Only one pagination parameter supported per query.",
-      );
+    if (typeof page === 'number' && (before || after)) throw new ReadApiError('Pagination Error. Only one pagination parameter supported per query.');
 
     // a pagination method MUST be selected, but we are defaulting to using `page=0`
 
     const { result } = await this.callReadApi<GetAssetsByGroupRpcInput, ReadApiAssetList>({
-      method: "getAssetsByGroup",
+      method: 'getAssetsByGroup',
       params: {
         groupKey,
         groupValue,
@@ -217,30 +197,20 @@ export class WrapperConnection extends Connection {
       },
     });
 
-    if (!result) throw new ReadApiError("No results returned");
+    if (!result) throw new ReadApiError('No results returned');
 
     return result;
   }
 
   //
-  async getAssetsByOwner({
-    ownerAddress,
-    page,
-    limit,
-    sortBy,
-    before,
-    after,
-  }: GetAssetsByOwnerRpcInput): Promise<ReadApiAssetList> {
+  async getAssetsByOwner({ ownerAddress, page, limit, sortBy, before, after }: GetAssetsByOwnerRpcInput): Promise<ReadApiAssetList> {
     // `page` cannot be supplied with `before` or `after`
-    if (typeof page == "number" && (before || after))
-      throw new ReadApiError(
-        "Pagination Error. Only one pagination parameter supported per query.",
-      );
+    if (typeof page === 'number' && (before || after)) throw new ReadApiError('Pagination Error. Only one pagination parameter supported per query.');
 
     // a pagination method MUST be selected, but we are defaulting to using `page=0`
 
     const { result } = await this.callReadApi<GetAssetsByOwnerRpcInput, ReadApiAssetList>({
-      method: "getAssetsByOwner",
+      method: 'getAssetsByOwner',
       params: {
         ownerAddress,
         after: after ?? null,
@@ -251,7 +221,7 @@ export class WrapperConnection extends Connection {
       },
     });
 
-    if (!result) throw new ReadApiError("No results returned");
+    if (!result) throw new ReadApiError('No results returned');
 
     return result;
   }

+ 18 - 18
compression/cnft-burn/tests/ReadApi/types.ts → compression/cnft-burn/anchor/tests/ReadApi/types.ts

@@ -2,25 +2,25 @@
   Types specific to the ReadApi
 */
 
-import type { Metadata, Option } from "@metaplex-foundation/js";
-import { ConcurrentMerkleTreeAccount } from "@solana/spl-account-compression";
+import type { Metadata, Option } from '@metaplex-foundation/js';
+import type { ConcurrentMerkleTreeAccount } from '@solana/spl-account-compression';
 
 export type ReadApiAssetInterface =
-  | "V1_NFT"
-  | "V1_PRINT"
-  | "LEGACY_NFT"
-  | "V2_NFT"
-  | "FungibleAsset"
-  | "Custom"
-  | "Identity"
-  | "Executable"
-  | "ProgrammableNFT";
+  | 'V1_NFT'
+  | 'V1_PRINT'
+  | 'LEGACY_NFT'
+  | 'V2_NFT'
+  | 'FungibleAsset'
+  | 'Custom'
+  | 'Identity'
+  | 'Executable'
+  | 'ProgrammableNFT';
 
-export type ReadApiPropGroupKey = "collection";
+export type ReadApiPropGroupKey = 'collection';
 
-export type ReadApiPropSortBy = "created" | "updated" | "recent_action";
+export type ReadApiPropSortBy = 'created' | 'updated' | 'recent_action';
 
-export type ReadApiPropSortDirection = "asc" | "desc";
+export type ReadApiPropSortDirection = 'asc' | 'desc';
 
 export type TransferNftCompressionParam = {
   ownership?: ReadApiOwnershipMetadata;
@@ -36,7 +36,7 @@ export type ReadApiParamAssetSortBy = {
 
 export type ReadApiAssetContent = {
   json_uri: string;
-  metadata: Metadata["json"];
+  metadata: Metadata['json'];
 };
 
 export type ReadApiCompressionMetadata = {
@@ -55,7 +55,7 @@ export type ReadApiOwnershipMetadata = {
   delegated: boolean;
   delegate: string | null;
   owner: string;
-  ownership_model: "single" | "token";
+  ownership_model: 'single' | 'token';
 };
 
 export type ReadApiAssetSupplyMetadata = {
@@ -74,7 +74,7 @@ export type ReadApiAssetGrouping = {
   group_value: string;
 };
 
-export type ReadApiAuthorityScope = "full";
+export type ReadApiAuthorityScope = 'full';
 
 export type ReadApiAssetAuthority = {
   address: string;
@@ -133,7 +133,7 @@ export type ReadApiAsset = {
   content: ReadApiAssetContent;
   royalty: ReadApiAssetRoyaltyMetadata;
   supply: ReadApiAssetSupplyMetadata;
-  creators: Metadata["creators"];
+  creators: Metadata['creators'];
   grouping: Array<ReadApiAssetGrouping>;
   compression: ReadApiCompressionMetadata;
 };

+ 20 - 32
compression/cnft-burn/tests/cnft-burn.ts → compression/cnft-burn/anchor/tests/cnft-burn.ts

@@ -1,20 +1,17 @@
-import * as anchor from "@coral-xyz/anchor";
-import { Program } from "@coral-xyz/anchor";
-import { CnftBurn } from "../target/types/cnft_burn";
-import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from "@metaplex-foundation/mpl-bubblegum";
-import { decode, mapProof } from "./utils";
-import { getAsset, getAssetProof } from "./readApi";
-import { createAndMint } from "./createAndMint";
-import { getcNFTsFromCollection } from "./fetchNFTsByCollection";
-import {
-  SPL_ACCOUNT_COMPRESSION_PROGRAM_ID,
-  SPL_NOOP_PROGRAM_ID,
-} from "@solana/spl-account-compression";
+import * as anchor from '@coral-xyz/anchor';
+import type { Program } from '@coral-xyz/anchor';
+import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from '@metaplex-foundation/mpl-bubblegum';
+import { SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, SPL_NOOP_PROGRAM_ID } from '@solana/spl-account-compression';
+import type { CnftBurn } from '../target/types/cnft_burn';
+import { createAndMint } from './createAndMint';
+import { getcNFTsFromCollection } from './fetchNFTsByCollection';
+import { getAsset, getAssetProof } from './readApi';
+import { decode, mapProof } from './utils';
 
 // Replace this with your custom RPC endpoint that supports cNFT indexing
-export const RPC_PATH = "https://api.devnet.solana.com";
+export const RPC_PATH = 'https://api.devnet.solana.com';
 
-describe("cnft-burn", () => {
+describe('cnft-burn', () => {
   // Configure the client to use the local cluster.
   anchor.setProvider(anchor.AnchorProvider.env());
 
@@ -23,28 +20,23 @@ describe("cnft-burn", () => {
   const payerWallet = provider.wallet as anchor.Wallet;
 
   let treeAddress: anchor.web3.PublicKey | undefined = undefined;
-  const MPL_BUBBLEGUM_PROGRAM_ID_KEY = new anchor.web3.PublicKey(
-    BUBBLEGUM_PROGRAM_ID
-  );
+  const MPL_BUBBLEGUM_PROGRAM_ID_KEY = new anchor.web3.PublicKey(BUBBLEGUM_PROGRAM_ID);
 
   // this is the assetId of the cNft you want to burn
-  let assetId: string = "";
+  let assetId = '';
 
-  it("Should create the tree and mint a cnft", async () => {
+  it('Should create the tree and mint a cnft', async () => {
     const { tree, collection } = await createAndMint();
     if (!tree.treeAddress) {
-      throw new Error("Tree address not found");
+      throw new Error('Tree address not found');
     }
     treeAddress = tree.treeAddress;
 
-    const fetchcNFTs = await getcNFTsFromCollection(
-      collection.mint,
-      payerWallet.publicKey.toString()
-    );
-    console.log("fetchcNFTs", fetchcNFTs);
+    const fetchcNFTs = await getcNFTsFromCollection(collection.mint, payerWallet.publicKey.toString());
+    console.log('fetchcNFTs', fetchcNFTs);
     assetId = fetchcNFTs[0];
   });
-  it("Burn cNft!", async () => {
+  it('Burn cNft!', async () => {
     const asset = await getAsset(assetId);
 
     const proof = await getAssetProof(assetId);
@@ -54,11 +46,7 @@ describe("cnft-burn", () => {
     const creatorHash = decode(asset.compression.creator_hash);
     const nonce = new anchor.BN(asset.compression.leaf_id);
     const index = asset.compression.leaf_id;
-    const [treeAuthority, _bump2] =
-      anchor.web3.PublicKey.findProgramAddressSync(
-        [treeAddress.toBuffer()],
-        MPL_BUBBLEGUM_PROGRAM_ID_KEY
-      );
+    const [treeAuthority, _bump2] = anchor.web3.PublicKey.findProgramAddressSync([treeAddress.toBuffer()], MPL_BUBBLEGUM_PROGRAM_ID_KEY);
     const tx = await program.methods
       .burnCnft(root, dataHash, creatorHash, nonce, index)
       .accounts({
@@ -74,7 +62,7 @@ describe("cnft-burn", () => {
       .rpc({
         skipPreflight: true,
       });
-    console.log("Your transaction signature", tx);
+    console.log('Your transaction signature', tx);
     // here is a sample transaction signature on devnet
     // https://explorer.solana.com/tx/2MpeHi64pbWNY7BKBuhAp4yND5HdfQqNqkd8pu6F6meoSNUYRvxQgV5TC4w8BM8hUihB8G8TwBAaPRqS7pnN8Nu1?cluster=devnet
   });

Some files were not shown because too many files changed in this diff