[
  {
    "path": ".changeset/README.md",
    "content": "# Changesets\n\nHello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works\nwith multi-package repos, or single-package repos to help you version and publish your code. You can\nfind the full documentation for it [in our repository](https://github.com/changesets/changesets)\n\nWe have a quick list of common questions to get you started engaging with this project in\n[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)\n"
  },
  {
    "path": ".changeset/config.json",
    "content": "{\n  \"$schema\": \"https://unpkg.com/@changesets/config@3.0.0/schema.json\",\n  \"changelog\": [\n    \"@changesets/changelog-github\",\n    { \"repo\": \"codama-idl/codama\" }\n  ],\n  \"commit\": false,\n  \"fixed\": [\n        [\n            \"codama\",\n            \"@codama/errors\",\n            \"@codama/node-types\",\n            \"@codama/nodes\",\n            \"@codama/validators\",\n            \"@codama/visitors*\"\n        ]\n    ],\n  \"linked\": [],\n  \"access\": \"public\",\n  \"baseBranch\": \"main\",\n  \"privatePackages\": {\n        \"version\": false,\n        \"tag\": false\n  },\n  \"updateInternalDependencies\": \"patch\"\n}\n"
  },
  {
    "path": ".github/actions/setup-anchor/action.yml",
    "content": "name: Setup Anchor CLI\ndescription: Install Rust toolchain and a pinned Anchor CLI version via AVM with caching for CI.\n\ninputs:\n  anchor-version:\n    description: Anchor CLI version to install (e.g. 0.32.1)\n    required: true\n  rust-version:\n    description: Rust toolchain version to install (e.g. 1.93.0)\n    required: true\n  cargo-lock-path:\n    description: Path to Cargo.lock for cache key hashing\n    required: false\n    default: packages/dynamic-client/test/programs/anchor/Cargo.lock\n  build-target-path:\n    description: Path to the build target directory to cache\n    required: false\n    default: packages/dynamic-client/test/programs/anchor/target\n\nruns:\n  using: composite\n  steps:\n    - name: Setup Rust\n      uses: dtolnay/rust-toolchain@stable\n      with:\n        toolchain: ${{ inputs.rust-version }}\n\n    - name: Cache Rust and Anchor toolchain\n      uses: actions/cache@v4\n      with:\n        path: |\n          ~/.cargo/registry\n          ~/.cargo/git\n          ~/.cargo/bin/avm\n          ~/.avm\n          ${{ inputs.build-target-path }}\n        key: ${{ runner.os }}-rust-anchor-${{ inputs.rust-version }}-${{ inputs.anchor-version }}-${{ inputs.cargo-lock-path && hashFiles(inputs.cargo-lock-path) || 'no-lock' }}\n        restore-keys: |\n          ${{ runner.os }}-rust-anchor-${{ inputs.rust-version }}-${{ inputs.anchor-version }}-\n          ${{ runner.os }}-rust-anchor-${{ inputs.rust-version }}-\n\n    - name: Install Anchor (pinned)\n      shell: bash\n      run: |\n        set -euo pipefail\n        echo \"$HOME/.cargo/bin\" >> \"$GITHUB_PATH\"\n        echo \"$HOME/.avm/bin\" >> \"$GITHUB_PATH\"\n        export PATH=\"$HOME/.cargo/bin:$HOME/.avm/bin:$PATH\"\n\n        desired=\"${{ inputs.anchor-version }}\"\n\n        # Install AVM if needed.\n        if ! command -v avm >/dev/null 2>&1; then\n          sudo apt-get update\n          sudo apt-get install -y pkg-config libssl-dev\n          cargo install --git https://github.com/coral-xyz/anchor avm --locked\n        fi\n\n        # Ensure the desired Anchor version exists and is active.\n        avm install \"$desired\"\n        avm use \"$desired\"\n\n        anchor --version\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: 'npm'\n    directory: '/'\n    schedule:\n      interval: daily\n      time: '01:00'\n      timezone: America/Los_Angeles\n    open-pull-requests-limit: 10\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: Main\n\non:\n  push:\n    branches: [main]\n  pull_request:\n\nenv:\n  # Among other things, opts out of Turborepo telemetry. See https://consoledonottrack.com/.\n  DO_NOT_TRACK: '1'\n  NODE_VERSION: 20\n  CODAMA_VERSION: 1.x\n  SOLANA_VERSION: 3.1.8\n  ANCHOR_VERSION: '0.32.1'\n  RUST_VERSION: '1.93.0'\n\njobs:\n  lint:\n    name: Check styling\n    runs-on: ubuntu-latest\n    steps:\n      - name: Git checkout\n        uses: actions/checkout@v4\n\n      - name: Setup pnpm\n        uses: pnpm/action-setup@v3\n\n      - name: Setup Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ env.NODE_VERSION }}\n          cache: 'pnpm'\n\n      - name: Install dependencies\n        run: pnpm install --frozen-lockfile\n\n      - name: Compile JS and types\n        run: pnpm run build\n\n      - name: Check linting\n        run: pnpm run lint\n\n  tests:\n    name: Test\n    runs-on: ubuntu-latest\n    steps:\n      - name: Git checkout\n        uses: actions/checkout@v4\n\n      - name: Install Solana\n        uses: solana-program/actions/install-solana@v1\n        with:\n          version: ${{ env.SOLANA_VERSION }}\n\n      - name: Setup Anchor\n        uses: ./.github/actions/setup-anchor\n        with:\n          anchor-version: ${{ env.ANCHOR_VERSION }}\n          rust-version: ${{ env.RUST_VERSION }}\n\n      - name: Install pnpm\n        uses: pnpm/action-setup@v3\n\n      - name: Setup Node.js ${{ env.NODE_VERSION }}\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ env.NODE_VERSION }}\n          cache: 'pnpm'\n\n      - name: Install dependencies\n        run: pnpm install --frozen-lockfile\n\n      - name: Build and run tests\n        run: pnpm run test\n\n      - name: Ensure working directory is clean\n        run: |\n          git status\n          test -z \"$(git status --porcelain)\"\n\n  release:\n    name: Release\n    runs-on: ubuntu-latest\n    if: github.event_name == 'push'\n    needs: [lint, tests]\n    permissions:\n      contents: write\n      pull-requests: write\n    outputs:\n      published: ${{ steps.changesets.outputs.published }}\n    steps:\n      - name: Checkout Repo\n        uses: actions/checkout@v4\n\n      - name: Setup pnpm\n        uses: pnpm/action-setup@v3\n\n      - name: Setup Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ env.NODE_VERSION }}\n          cache: 'pnpm'\n\n      - name: Install Dependencies\n        run: pnpm install --frozen-lockfile\n\n      - name: Create Release Pull Request or Publish\n        id: changesets\n        uses: changesets/action@v1\n        with:\n          commit: '[${{ env.CODAMA_VERSION }}] Publish packages'\n          title: '[${{ env.CODAMA_VERSION }}] Publish packages'\n          publish: pnpm publish-packages\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}\n\n  dependabot:\n    runs-on: ubuntu-latest\n    if: github.event_name == 'pull_request' && github.event.pull_request.user.login == 'dependabot[bot]' && github.repository == 'codama-idl/codama'\n    needs: [lint, tests]\n    permissions:\n      contents: write\n      pull-requests: write\n    steps:\n      - name: Auto-approve the PR\n        run: gh pr review --approve \"$PR_URL\"\n        env:\n          PR_URL: ${{ github.event.pull_request.html_url }}\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      - name: Enable auto-merge\n        run: gh pr merge --auto --squash \"$PR_URL\"\n        env:\n          PR_URL: ${{ github.event.pull_request.html_url }}\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\nnode_modules\n.pnp\n.pnp.js\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n.pnpm-debug.log*\n\n# turbo\n.turbo\n\n# `solana-test-validator`\n.solana/\ntest-ledger/\ntarget/\nCHANGELOG.md\n"
  },
  {
    "path": ".prettierignore",
    "content": ".changeset/\n.github/workflows/PULL_REQUEST_TEMPLATE.md\n\ndeclarations/\ndist/\ndoc/\nlib/\ntest-ledger/\ntarget/\nCHANGELOG.md\n\npnpm-lock.yaml\npnpm-workspace.yaml\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Codama\nCopyright (c) 2024 Metaplex Foundation\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Codama\n\n[![npm][npm-image]][npm-url]\n[![npm-downloads][npm-downloads-image]][npm-url]\n[![ci][ci-image]][ci-url]\n\n[npm-downloads-image]: https://img.shields.io/npm/dm/codama.svg?style=flat\n[npm-image]: https://img.shields.io/npm/v/codama.svg?style=flat\n[npm-url]: https://www.npmjs.com/package/codama\n[ci-image]: https://img.shields.io/github/actions/workflow/status/codama-idl/codama/main.yml?logo=GitHub\n[ci-url]: https://github.com/codama-idl/codama/actions/workflows/main.yml\n\nCodama is a tool that describes any Solana program in a standardised format called a **Codama IDL**.\n\nA Codama IDL can be used to:\n\n- ✨ Generate **program clients** in various languages and frameworks.\n- 📚 Generate **documentation and tooling** for your programs.\n- 🗃️ **Register your IDL** for others to discover and index.\n- 🔭 Provide valuable information to **explorers and wallets**.\n\n![Codama header: A small double-sided mind-map with the Codama logo in the middle. On the left, we see the various ways to get a Codama IDL from your Solana programs such as \"Codama Macros\" and \"Anchor Program\". On the right, we see the various utility tools that are offered for the IDL such as \"Generate clients\" or \"Register IDL\".](https://github.com/user-attachments/assets/7a2ef5fa-049e-45a8-a5fc-7c11ff46a54b)\n\n## Table of contents\n\n- [Getting started](#getting-started). Install and use Codama in your project.\n- [Coming from Anchor](#coming-from-anchor). Have an Anchor IDL instead? Let’s make that work.\n- [Codama scripts](#codama-scripts). Enrich your Codama config file with more scripts.\n- [Available visitors](#available-visitors). See what’s available for you to use.\n- [Getting a Codama IDL](#getting-a-codama-idl). Extract Codama IDLs from any program.\n- [Codama’s architecture](#codamas-architecture). A bit more on the node/visitor design.\n- [Other resources](#other-resources).\n\n## Getting started\n\n### Installation\n\nTo get started with Codama, simply install `codama` to your project and run the `init` command like so:\n\n```sh\npnpm install codama\ncodama init\n```\n\nYou will be prompted for the path of your IDL and asked to select any script presets you would like to use. This will create a Codama configuration file at the root of your project.\n\n### Usage\n\nYou may then use the `codama run` command to execute any script defined in your configuration file.\n\n```sh\ncodama run --all # Run all Codama scripts.\ncodama run js    # Generates a JavaScript client.\ncodama run rust  # Generates a Rust client.\n```\n\n## Coming from Anchor\n\nIf you are using [Anchor](https://www.anchor-lang.com/docs) or [Shank macros](https://github.com/metaplex-foundation/shank), then you should already have an **Anchor IDL**. To make it work with Codama, you simply need to provide the path to your Anchor IDL in your Codama configuration file. Codama will automatically identify this as an Anchor IDL and will convert it to a Codama IDL before executing your scripts.\n\n```json\n{\n    \"idl\": \"path/to/my/anchor/idl.json\"\n}\n```\n\n## Codama scripts\n\nYou can use your Codama configuration file to define any script you want by using one or more visitors that will be invoked when the script is ran.\n\n**Visitors** are objects that will visit your Codama IDL and either perform some operation — like generating a program client — or update the IDL further — like renaming accounts. You can either use visitors from external packages or from a local file, and — in both cases — you can provide any argument the visitor may require.\n\nFor instance, the example script below will invoke three visitors:\n\n- The first will use the `default` import from the `my-external-visitor` package and pass `42` as the first argument.\n- The second will use the `withDefaults` import from the `my-external-visitor` package.\n- The third will use a local visitor located next to the configuration file.\n\n```json\n{\n    \"scripts\": {\n        \"my-script\": [\n            { \"from\": \"my-external-visitor\", \"args\": [42] },\n            \"my-external-visitor#withDefaults\",\n            \"./my-local-visitor.js\"\n        ]\n    }\n}\n```\n\nNote that if an external visitor in your script isn’t installed locally, you will be asked to install it next time you try to run that script.\n\n```sh\n❯ codama run my-script\n\n▲ Your script requires additional dependencies.\n▲ Install command: pnpm install my-external-visitor\n? Install dependencies? › (Y/n)\n```\n\nYou can [learn more about the Codama CLI here](/packages/cli/README.md).\n\n## Available visitors\n\nThe tables below aim to help you discover visitors from the Codama ecosystem that you can use in your scripts.\n\nFeel free to PR your own visitor here for others to discover. Note that they are ordered alphabetically.\n\n### Generates documentation\n\n| Visitor                                                                         | Description                                                                      | Maintainer |\n| ------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ---------- |\n| `@codama/renderers-demo` ([docs](https://github.com/codama-idl/renderers-demo)) | Generates simple documentation as a template to help others create new visitors. | Codama     |\n\n### Generates program clients\n\n| Visitor                                                                                         | Description                                                                                             | Maintainer                                    |\n| ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| `@codama/renderers-go` ([docs](https://github.com/codama-idl/renderers-go))                     | Generates a Go client compatible with [the Solana Go SDK](https://github.com/gagliardetto/solana-go).   | [Sonic](hhttps://github.com/sonicfromnewyoke) |\n| `@codama/renderers-js` ([docs](https://github.com/codama-idl/renderers-js))                     | Generates a JavaScript client compatible with [Solana Kit](https://www.solanakit.com/).                 | [Anza](https://www.anza.xyz/)                 |\n| `@codama/renderers-js-umi` ([docs](https://github.com/codama-idl/renderers-js-umi))             | Generates a JavaScript client compatible with [the Umi framework](https://developers.metaplex.com/umi). | [Metaplex](https://www.metaplex.com/)         |\n| `@codama/renderers-rust` ([docs](https://github.com/codama-idl/renderers-rust))                 | Generates a Rust client compatible with [the Solana SDK](https://github.com/anza-xyz/solana-sdk).       | [Anza](https://www.anza.xyz/)                 |\n| `@codama/renderers-vixen-parser` ([docs](https://github.com/codama-idl/renderers-vixen-parser)) | Generates [Yellowstone](https://github.com/rpcpool/yellowstone-grpc) account and instruction parsers.   | [Triton One](https://triton.one/)             |\n| `@limechain/codama-dart` ([docs](https://github.com/limechain/codama-dart))                     | Generates a Dart client.                                                                                | [LimeChain](https://github.com/limechain/)    |\n| `codama-py` ([docs](https://github.com/Solana-ZH/codama-py))                                    | Generates a Python client.                                                                              | [Solar](https://github.com/Solana-ZH)         |\n\n### Provides utility\n\n| Visitor                                                                                                             | Description                                                                                                                                                                                                                                                                                                   | Maintainer |\n| ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |\n| `@codama/visitors#*` ([docs](https://github.com/codama-idl/codama/blob/main/packages/visitors/README.md))           | Provides a big library of utility visitors that can be used to manipulate Codama IDLs. For instance, `updateErrorsVisitor` can be used to update error messages in your IDL . [Check out the docs](https://github.com/codama-idl/codama/blob/main/packages/visitors/README.md) to see all available visitors. | Codama     |\n| `@codama/visitors-core#*` ([docs](https://github.com/codama-idl/codama/blob/main/packages/visitors-core/README.md)) | Everything included in `visitors-core` is also included in `visitors`. The helpers offered in this package are slightly more advanced and can be used to help you [build your own visitors](https://github.com/codama-idl/codama/blob/main/packages/visitors-core/README.md#writing-your-own-visitor).        | Codama     |\n\n## Getting a Codama IDL\n\nWe are currently working on a set of transparent macros that can be added to any program in order to extract a Codama IDL from it. There are still a lot more macros and scenarios for us to support but most programs can already benefit from these macros. You can then extract an IDL from the provided crate path using the Codama API like so:\n\n```rust\nuse codama::Codama;\n\nlet codama = Codama::load(crate_path)?;\nlet idl_json = codama.get_json_idl()?;\n```\n\nWe will add documentation on Codama macros when they are fully implemented but feel free to check this example that extract a Codama IDL from the [System program interface](https://github.com/lorisleiva/codama-demo-2025-08/tree/main/3-from-macros/program/src) using a [build script](https://github.com/lorisleiva/codama-demo-2025-08/blob/main/3-from-macros/program/build.rs).\n\n## Codama's architecture\n\nThe Codama IDL is designed as a tree of nodes starting with the `RootNode` which contains a `ProgramNode` and additional data such as the Codama version used when the IDL was created. Codama provides over 60 different types of nodes that help describe nearly every aspect of your Solana programs. [You can read more about the Codama nodes here](./packages/nodes).\n\n![A small example of a Codama IDL as a tree of nodes. It starts with a RootNode and goes down to ProgramNode, AccountNode, InstructionNode, etc.](https://github.com/codama-idl/codama/assets/3642397/9d53485d-a4f6-459a-b7eb-58faab716bc1)\n\nBecause everything is designed as a `Node`, we can transform the IDL, aggregate information, and output various utility tools using special objects that can traverse node trees known as visitors. [See this documentation to learn more about Codama visitors](./packages/visitors-core).\n\n![A small example of how a visitor can transform a Codama IDL into another Codama IDL. This example illustrates the \"deleteNodesVisitor\" which recursively removes NumberTypeNodes from a tree of nested TypleTypeNodes.](https://github.com/codama-idl/codama/assets/3642397/f54e83d1-eade-4674-80dc-7ddc360f5f66)\n\n## Other resources\n\n- [Solana Stack Exchange](https://solana.stackexchange.com/questions/tagged/codama).\n- Working with Anchor\n    - [Anchor and Solana Kit tutorial](https://www.youtube.com/watch?v=2T3DOMv7iR4).\n    - [Anchor Election app](https://github.com/quiknode-labs/anchor-election-2025).\n    - [Anchor Swap/Escrow app](https://github.com/quiknode-labs/you-will-build-a-solana-program).\n"
  },
  {
    "path": "eslint.config.mjs",
    "content": "import solanaConfig from '@solana/eslint-config-solana';\nimport { defineConfig } from 'eslint/config';\n\nexport default defineConfig([\n    {\n        ignores: ['**/dist/**', '**/e2e/**', '**/generated/**', '**/target/**'],\n    },\n    {\n        files: ['**/*.ts', '**/*.(c|m)?js'],\n        extends: [solanaConfig],\n    },\n    {\n        files: ['packages/cli/**', 'packages/nodes/**', 'packages/node-types/**'],\n        rules: {\n            'sort-keys-fix/sort-keys-fix': 'off',\n            'typescript-sort-keys/interface': 'off',\n        },\n    },\n]);\n"
  },
  {
    "path": "package.json",
    "content": "{\n    \"name\": \"codama-monorepo\",\n    \"private\": true,\n    \"scripts\": {\n        \"build\": \"turbo run build --log-order grouped\",\n        \"lint\": \"turbo run lint --log-order grouped\",\n        \"lint:fix\": \"turbo lint:fix --log-order grouped && pnpm prettier --ignore-unknown --write '{.,!packages}/*'\",\n        \"test\": \"turbo run test --log-order grouped\",\n        \"publish-packages\": \"pnpm build && changeset publish\"\n    },\n    \"devDependencies\": {\n        \"@changesets/changelog-github\": \"^0.5.2\",\n        \"@changesets/cli\": \"^2.29.8\",\n        \"@solana/eslint-config-solana\": \"^5.0.0\",\n        \"@solana/prettier-config-solana\": \"0.0.6\",\n        \"@types/node\": \"^25\",\n        \"agadoo\": \"^3.0.0\",\n        \"browserslist-to-esbuild\": \"^2.1.1\",\n        \"eslint\": \"^9.39.2\",\n        \"happy-dom\": \"^20.1.0\",\n        \"prettier\": \"^3.7.4\",\n        \"rimraf\": \"6.1.2\",\n        \"tsup\": \"^8.5.1\",\n        \"turbo\": \"^2.7.4\",\n        \"typescript\": \"^5.9.3\",\n        \"vitest\": \"^4.0.16\"\n    },\n    \"engines\": {\n        \"node\": \">=20.18.0\"\n    },\n    \"packageManager\": \"pnpm@10.15.1\",\n    \"prettier\": \"@solana/prettier-config-solana\"\n}\n"
  },
  {
    "path": "packages/cli/.gitignore",
    "content": "dist/\n"
  },
  {
    "path": "packages/cli/.prettierignore",
    "content": "dist/\ntest/e2e/\ntest-ledger/\ntarget/\nCHANGELOG.md\n"
  },
  {
    "path": "packages/cli/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Codama\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/cli/README.md",
    "content": "# Codama ➤ CLI\n\n[![npm][npm-image]][npm-url]\n[![npm-downloads][npm-downloads-image]][npm-url]\n\n[npm-downloads-image]: https://img.shields.io/npm/dm/@codama/cli.svg?style=flat\n[npm-image]: https://img.shields.io/npm/v/@codama/cli.svg?style=flat&label=%40codama%2Fcli\n[npm-url]: https://www.npmjs.com/package/@codama/cli\n\nThis package provides a CLI for the Codama library that can be used to run scripts on Codama IDLs.\n\nNote that, whilst the CLI code is located in the `@codama/cli` package, the CLI binary is also included in the main `codama` library.\n\n## Installation\n\nOnce you have the `codama` package installed, you can use the CLI using the `codama` binary.\n\n```sh\npnpm install codama\ncodama --help\n```\n\nNote that you may install it from `@codama/cli` instead if you only want the CLI without the rest of the Codama library.\n\n## Commands\n\n### `codama init`\n\nTo get started with the Codama CLI, you will first need to create a [Codama configuration file](#configuration-file). You can do this using the `init` command as follows:\n\n```sh\ncodama init\n```\n\nYou will be prompted for the path of your IDL and asked to select any script presets you would like to use.\n\nHere are the available options for the `init` command:\n\n| Option            | Description                                                                                               |\n| ----------------- | --------------------------------------------------------------------------------------------------------- |\n| `[output]`        | As an optional argument, you may provide the path used to output the configuration file.                  |\n| `--default`, `-d` | Skips all prompts and uses the default values.                                                            |\n| `--force`         | Overwrites any existing configuration file.                                                               |\n| `--gill`          | Initializes a configuration file for a [gill based Codama](https://gill.site/docs/guides/codama) project. |\n| `--js`            | Generates a JavaScript configuration file instead of a JSON one.                                          |\n\n### `codama run`\n\nOnce you have a configuration file, you can run your Codama scripts using the `codama run` command as follows:\n\n```sh\ncodama run         # Only runs your before visitors, no scripts.\ncodama run js rust # Runs your before visitors followed by the `js` and `rust` scripts.\ncodama run --all   # Runs your before visitors followed by all your scripts.\n```\n\nHere are the available options for the `run` command:\n\n| Option                  | Description                                                                              |\n| ----------------------- | ---------------------------------------------------------------------------------------- |\n| `[scripts...]`          | As optional arguments, you may provide the names of the scripts you wish to run.         |\n| `--all`, `-a`           | Runs all the scripts defined in your configuration file.                                 |\n| `--config <path>`, `-c` | Specifies the path to your configuration file. Defaults to `codama.json` or `codama.js`. |\n| `--idl`, `-i`           | Overrides the `idl` field in your configuration file.                                    |\n\n## Configuration file\n\n> [!NOTE]\n> If you don't have a Codama configuration file yet, you can generate a new one using the `codama init` command as [described above](#codama-init).\n\nThe Codama configuration file defines an object containing the following fields:\n\n- `idl` (string): The path to the IDL file. This can be a Codama IDL or an Anchor IDL which will be automatically converted to a Codama IDL.\n    ```json\n    {\n        \"idl\": \"path/to/idl\"\n    }\n    ```\n- `before` (array): An array of visitors that will run before every script. See [the next section](#using-visitors) for more details on how to use visitors in your configuration file.\n    ```json\n    {\n        \"before\": [\"./my-visitor.js\", \"external-library#someVisitor\"]\n    }\n    ```\n- `scripts` (object): An object defining the available Codama scripts. The keys identify the scripts and the values are arrays of visitors that make up the script.\n    ```json\n    {\n        \"scripts\": {\n            \"apple\": [\"./my-apple-visitor.js\"],\n            \"banana\": [\"./my-banana-visitor.js\"]\n        }\n    }\n    ```\n\nWhether it is in the `before` array or in the `scripts` values, if you have a single visitor, you may provide it directly instead of wrapping it in an array. For instance, the following configuration file is valid:\n\n```json\n{\n    \"idl\": \"path/to/idl\",\n    \"before\": \"./my-visitor.js\",\n    \"scripts\": { \"apple\": \"./my-apple-visitor.js\" }\n}\n```\n\nNote that the configuration file can also be a JavaScript file exporting the configuration object as the `default` export.\n\n```js\nexport default {\n    idl: 'path/to/idl',\n    before: './my-visitor.js',\n    scripts: { apple: './my-apple-visitor.js' },\n};\n```\n\n## Using visitors\n\nWhen using a visitor in your configuration file, **you must provide its import path**. This can either be a local path (relative or absolute) or an external NPM package. For instance the following are all valid visitor import paths:\n\n```js\n'./my-visitor.js'; // Relative local path.\n'/Users/me/my-visitor.js'; // Absolute local path.\n'some-library'; // External package.\n'@acme/some-library'; // Scoped external package.\n```\n\nIn all these cases, the visitor will be imported from the `default` export of the module by default. If you want to **import a named export** instead, you may append a `#` followed by the export name to the import path. For instance:\n\n```js\n'./my-visitor.js#myExport'; // Named export from a local path.\n'@acme/some-library#myExport'; // Named export from an external package.\n```\n\nSome visitors may instead be **exported as functions** that return visitor objects. This allows the visitor to receive arguments from the end-user to customize its behavior. When that is the case, you may instead define your visitor as an object with the following fields:\n\n- `from` (string): The import path (and potentially the export name) of the visitor.\n- `args` (array): An array of arguments to pass to the visitor. If you don't need to pass any arguments to the visitor function, you may simply provide the import path as a string instead of an object.\n\n```json\n{\n    \"from\": \"@acme/some-library#myExport\",\n    \"args\": [\"hello\", { \"someOption\": true }]\n}\n```\n\nFinally note that, if the invoked visitor returns a new `RootNode`, this new `RootNode` will be used for the subsequent visitors instead of the original one. This allows us to chain visitors that modify the Codama IDL. Consider the following example such that the `./delete-all-accounts.js` visitor returns a new IDL with all accounts removed it.\n\n```js\nexport default {\n    scripts: {\n        documentation: [\n            './delete-all-accounts.js', // After this visitor, the IDL has no accounts.\n            './generate-documentation.js', // Generates documentation for an IDL with no accounts.\n        ],\n    },\n};\n```\n\n## Recipes\n\nThere are plenty of existing visitors that you can use in your Codama scripts. The \"[Available visitors](https://github.com/codama-idl/codama?tab=readme-ov-file#available-visitors)\" section of the Codama README aims to list as many of them as possible. This includes visitors maintained by various teams across the ecosystem.\n\nThe examples below show how to use some of these visitors in your configuration file. They make heavy use of the [`@codama/visitors`](https://github.com/codama-idl/codama/tree/main/packages/visitors/README.md) package which provides a large number of utility visitors.\n\n### Deleting nodes\n\nReturns a new IDL with the specified nodes removed.\n\nSee [`deleteNodesVisitor`](https://github.com/codama-idl/codama/tree/main/packages/visitors-core#deletenodesvisitor) and [node selectors](https://github.com/codama-idl/codama/tree/main/packages/visitors-core#selecting-nodes).\n\nIn the example below, we remove the `mint` account, the `initializeMint` instruction and all errors from the IDL.\n\n```json\n{\n    \"from\": \"@codama/visitors#deleteNodesVisitor\",\n    \"args\": [[\"[accountNode]mint\", \"[instructionNode]initializeMint\", \"[errorNode]\"]]\n}\n```\n\n### Generating a JavaScript client\n\nGenerates a JavaScript client for the IDL at the specified output path.\n\nSee [`@codama/renderer-js`](https://github.com/codama-idl/renderers-js).\n\n```json\n{\n    \"from\": \"@codama/renderers-js\",\n    \"args\": [\"clients/js/src/generated\"]\n}\n```\n\n### Removing documentation\n\nReturns a new IDL with documentation removed from all nodes.\n\nSee [`removeDocsVisitor`](https://github.com/codama-idl/codama/tree/main/packages/visitors-core#removedocsvisitor)\n\n```json\n\"@codama/visitors#removeDocsVisitor\"\n```\n\n### Unwrapping linked types\n\nReturns a new IDL with specified type links replaced by their underlying types.\n\nSee [`unwrapDefinedTypesVisitor`](https://github.com/codama-idl/codama/tree/main/packages/visitors#unwrapDefinedTypesVisitor)\n\nIn the example below, any links to the `counter` or `escrow` types will be replaced by the actual definitions of these types.\n\n```json\n{\n    \"from\": \"@codama/visitors#unwrapDefinedTypesVisitor\",\n    \"args\": [[\"counter\", \"escrow\"]]\n}\n```\n\n### Updating accounts\n\nReturns a new IDL with updated account information.\n\nSee [`updateAccountsVisitor`](https://github.com/codama-idl/codama/tree/main/packages/visitors#updateAccountsVisitor)\n\nIn the example below, we rename the `vault` account to `safe` and update the `authority` field of the `bank` account to `treasury`.\n\n```json\n{\n    \"from\": \"@codama/visitors#updateAccountsVisitor\",\n    \"args\": [\n        {\n            \"vault\": {\n                \"name\": \"safe\"\n            },\n            \"bank\": {\n                \"data\": { \"authority\": \"treasury\" }\n            }\n        }\n    ]\n}\n```\n"
  },
  {
    "path": "packages/cli/bin/cli.cjs",
    "content": "#!/usr/bin/env -S node\n\nconst run = require('../dist/cli.cjs').run;\n\nrun(process.argv);\n"
  },
  {
    "path": "packages/cli/package.json",
    "content": "{\n    \"name\": \"@codama/cli\",\n    \"version\": \"1.5.1\",\n    \"description\": \"A CLI for setting up and managing Codama IDLs\",\n    \"exports\": {\n        \"types\": \"./dist/types/index.d.ts\",\n        \"node\": {\n            \"import\": \"./dist/index.node.mjs\",\n            \"require\": \"./dist/index.node.cjs\"\n        }\n    },\n    \"main\": \"./dist/index.node.cjs\",\n    \"module\": \"./dist/index.node.mjs\",\n    \"types\": \"./dist/types/index.d.ts\",\n    \"type\": \"commonjs\",\n    \"bin\": {\n        \"codama\": \"./bin/cli.cjs\"\n    },\n    \"files\": [\n        \"./bin\",\n        \"./dist/types\",\n        \"./dist/cli.*\",\n        \"./dist/index.*\"\n    ],\n    \"sideEffects\": false,\n    \"keywords\": [\n        \"codama\",\n        \"standard\",\n        \"cli\"\n    ],\n    \"scripts\": {\n        \"build\": \"rimraf dist && tsup && tsc -p ./tsconfig.declarations.json\",\n        \"dev\": \"vitest --project node\",\n        \"lint\": \"eslint . && prettier --check .\",\n        \"lint:fix\": \"eslint --fix . && prettier --write .\",\n        \"test\": \"pnpm test:types && pnpm test:treeshakability && pnpm test:unit && pnpm test:exports\",\n        \"test:exports\": \"node test/exports/module.mjs && node test/exports/commonjs.cjs\",\n        \"test:treeshakability\": \"for file in dist/index.*.mjs; do agadoo $file; done\",\n        \"test:types\": \"tsc --noEmit\",\n        \"test:unit\": \"vitest run\"\n    },\n    \"dependencies\": {\n        \"@codama/nodes\": \"workspace:*\",\n        \"@codama/visitors\": \"workspace:*\",\n        \"@codama/visitors-core\": \"workspace:*\",\n        \"commander\": \"^14.0.2\",\n        \"picocolors\": \"^1.1.1\",\n        \"prompts\": \"^2.4.2\"\n    },\n    \"devDependencies\": {\n        \"@types/prompts\": \"^2.4.9\"\n    },\n    \"license\": \"MIT\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/codama-idl/codama\"\n    },\n    \"bugs\": {\n        \"url\": \"http://github.com/codama-idl/codama/issues\"\n    },\n    \"browserslist\": [\n        \"supports bigint and not dead\",\n        \"maintained node versions\"\n    ]\n}\n"
  },
  {
    "path": "packages/cli/src/cli/index.ts",
    "content": "import { createProgram, runProgram } from '../program';\n\nconst program = createProgram();\n\nexport async function run(argv: readonly string[]) {\n    await runProgram(program, argv);\n}\n"
  },
  {
    "path": "packages/cli/src/commands/convert.ts",
    "content": "import { Command } from 'commander';\n\nimport { getRootNodeFromIdl, readJson, writeFile } from '../utils';\n\nexport function setConvertCommand(program: Command): void {\n    program\n        .command('convert')\n        .argument('<idlPath>', 'Path to the input IDL file (e.g., Anchor or supported standard)')\n        .argument('<outPath>', 'Path for the output Codama IDL file')\n        .description('Convert a supported IDL file to Codama IDL format')\n        .action(doConvert);\n}\n\nasync function doConvert(idlPath: string, outPath: string) {\n    const idl = await readJson(idlPath);\n\n    const node = await getRootNodeFromIdl(idl);\n\n    await writeFile(outPath, JSON.stringify(node, null, 2));\n\n    console.log(`Converted IDL written to ${outPath}`);\n}\n"
  },
  {
    "path": "packages/cli/src/commands/index.ts",
    "content": "export * from './init';\nexport * from './run';\nexport * from './convert';\n"
  },
  {
    "path": "packages/cli/src/commands/init.ts",
    "content": "import { Command } from 'commander';\nimport pico from 'picocolors';\nimport prompts, { PromptType } from 'prompts';\n\nimport { Config, ScriptConfig, ScriptName } from '../config';\nimport {\n    canRead,\n    CliError,\n    importModuleItem,\n    installMissingDependencies,\n    isRootNode,\n    logBanner,\n    logSuccess,\n    PROMPT_OPTIONS,\n    resolveRelativePath,\n    writeFile,\n} from '../utils';\n\nexport function setInitCommand(program: Command): void {\n    program\n        .command('init')\n        .argument('[output]', 'Optional path used to output the configuration file')\n        .option('-d, --default', 'Bypass prompts and select all defaults options')\n        .option('--force', 'Overwrite existing configuration file, if any')\n        .option('--js', 'Forces the output to be a JavaScript file')\n        .option('--gill', 'Forces the output to be a gill based JavaScript file')\n        .action(doInit);\n}\n\ntype InitOptions = {\n    default?: boolean;\n    force?: boolean;\n    gill?: boolean;\n    js?: boolean;\n};\n\nasync function doInit(explicitOutput: string | undefined, options: InitOptions) {\n    const output = getOutputPath(explicitOutput, options);\n    const configFileType = getConfigFileType(output, options);\n\n    if (!options.force && (await canRead(output))) {\n        throw new CliError(`Configuration file already exists.`, [`${pico.bold('Path')}: ${output}`]);\n    }\n\n    // Start prompts.\n    logBanner();\n    const result = await getPromptResult(options, configFileType);\n\n    // Check dependencies.\n    const isAnchor = await isAnchorIdl(result.idlPath);\n    await installMissingDependencies(`Your configuration requires additional dependencies.`, [\n        ...(isAnchor ? ['@codama/nodes-from-anchor'] : []),\n        ...(result.scripts.includes('js') ? ['@codama/renderers-js'] : []),\n        ...(result.scripts.includes('rust') ? ['@codama/renderers-rust'] : []),\n    ]);\n\n    // Write configuration file.\n    const content = getContentFromPromptResult(result, configFileType);\n    await writeFile(output, content);\n    console.log();\n    logSuccess(pico.bold('Configuration file created.'), [`${pico.bold('Path')}: ${output}`]);\n}\n\nfunction getOutputPath(explicitOutput: string | undefined, options: Pick<InitOptions, 'gill' | 'js'>): string {\n    if (explicitOutput) {\n        return resolveRelativePath(explicitOutput);\n    }\n    return resolveRelativePath(options.js || options.gill ? 'codama.js' : 'codama.json');\n}\n\ntype PromptResult = {\n    idlPath: string;\n    jsPath?: string;\n    rustPath?: string;\n    scripts: string[];\n};\n\nasync function getPromptResult(\n    options: Pick<InitOptions, 'default'>,\n    configFileType: ConfigFileType,\n): Promise<PromptResult> {\n    const defaults = getDefaultPromptResult();\n    if (options.default) {\n        return defaults;\n    }\n\n    const hasScript =\n        (script: string, type: PromptType = 'text') =>\n        (_: unknown, values: { scripts: string[] }) =>\n            values.scripts.includes(script) ? type : null;\n    return await prompts(\n        [\n            {\n                initial: defaults.idlPath,\n                message: 'Where is your IDL located? (Supports Codama and Anchor IDLs).',\n                name: 'idlPath',\n                type: 'text',\n            },\n            {\n                choices: [\n                    { selected: true, title: 'Generate JavaScript client', value: 'js' },\n                    { selected: true, title: 'Generate Rust client', value: 'rust' },\n                ],\n                instructions: '[space] to toggle / [a] to toggle all / [enter] to submit',\n                message: 'Which script preset would you like to use?',\n                name: 'scripts',\n                type: 'multiselect',\n                onRender() {\n                    if (configFileType === 'gill') {\n                        const value = (this as unknown as { value: prompts.Choice[] }).value;\n                        const jsChoice = value.find(choice => choice.value === 'js')!;\n                        jsChoice.description = pico.yellow('Required with --gill option.');\n                        jsChoice.selected = true;\n                    }\n                },\n            },\n            {\n                initial: defaults.jsPath,\n                message: '[js] Where is the JavaScript client package located?',\n                name: 'jsPath',\n                type: hasScript('js'),\n            },\n            {\n                initial: defaults.rustPath,\n                message: '[rust] Where is the Rust client crate located?',\n                name: 'rustPath',\n                type: hasScript('rust'),\n            },\n        ],\n        PROMPT_OPTIONS,\n    );\n}\n\nfunction getDefaultPromptResult(): PromptResult {\n    return {\n        idlPath: 'program/idl.json',\n        jsPath: 'clients/js',\n        rustPath: 'clients/rust',\n        scripts: ['js', 'rust'],\n    };\n}\n\ntype ConfigFileType = 'gill' | 'js' | 'json';\nfunction getConfigFileType(output: string, options: Pick<InitOptions, 'gill' | 'js'>): ConfigFileType {\n    if (options.gill) return 'gill';\n    else if (options.js) return 'js';\n    return output.endsWith('.js') ? 'js' : 'json';\n}\n\nfunction getContentFromPromptResult(result: PromptResult, configFileType: ConfigFileType): string {\n    switch (configFileType) {\n        case 'gill':\n            return getContentForGill(result);\n        case 'js':\n            return (\n                `export default ` +\n                JSON.stringify(getConfigFromPromptResult(result), null, 4)\n                    // Remove quotes around property names\n                    .replace(/\"([^\"]+)\":/g, '$1:')\n                    // Convert double-quoted strings to single quotes\n                    .replace(/\"([^\"]*)\"/g, \"'$1'\")\n            );\n        case 'json':\n        default:\n            return JSON.stringify(getConfigFromPromptResult(result), null, 4);\n    }\n}\n\nfunction getConfigFromPromptResult(result: PromptResult): Config {\n    const scripts: Record<ScriptName, ScriptConfig> = {};\n    if (result.scripts.includes('js')) {\n        scripts.js = {\n            from: '@codama/renderers-js',\n            args: [result.jsPath],\n        };\n    }\n    if (result.scripts.includes('rust')) {\n        scripts.rust = {\n            from: '@codama/renderers-rust',\n            args: [result.rustPath, { formatCode: true }],\n        };\n    }\n    return { idl: result.idlPath, before: [], scripts };\n}\n\nfunction getContentForGill(result: PromptResult): string {\n    const attributes: string[] = [\n        `idl: \"${result.idlPath}\"`,\n        `clientJs: \"${result.jsPath}\"`,\n        ...(result.scripts.includes('rust') ? [`clientRust: \"${result.rustPath}\"`] : []),\n    ];\n    const attributesString = attributes.map(attr => `    ${attr},\\n`).join('');\n\n    return (\n        `import { createCodamaConfig } from \"gill\";\\n\\n` +\n        `export default createCodamaConfig({\\n${attributesString}});\\n`\n    );\n}\n\nasync function isAnchorIdl(idlPath: string): Promise<boolean> {\n    const resolvedIdlPath = resolveRelativePath(idlPath);\n    if (!(await canRead(resolvedIdlPath))) return false;\n    try {\n        const idlContent = await importModuleItem({ identifier: 'IDL', from: resolvedIdlPath });\n        return !isRootNode(idlContent);\n    } catch {\n        return false;\n    }\n}\n"
  },
  {
    "path": "packages/cli/src/commands/run.ts",
    "content": "import type { RootNode } from '@codama/nodes';\nimport { visit, type Visitor } from '@codama/visitors-core';\nimport { Command } from 'commander';\nimport pico from 'picocolors';\n\nimport { ScriptName } from '../config';\nimport { getParsedConfigFromCommand, ParsedConfig } from '../parsedConfig';\nimport {\n    CliError,\n    getRootNodeVisitors,\n    installMissingDependencies,\n    isLocalModulePath,\n    logInfo,\n    logSuccess,\n    logWarning,\n} from '../utils';\n\nexport function setRunCommand(program: Command): void {\n    program\n        .command('run')\n        .argument('[scripts...]', 'The scripts to execute')\n        .option('-a, --all', 'Run all scripts in the configuration file')\n        .action(doRun);\n}\n\ntype RunOptions = {\n    all?: boolean;\n};\n\nasync function doRun(explicitScripts: string[], { all }: RunOptions, cmd: Command) {\n    if (all && explicitScripts.length > 0) {\n        logWarning(`CLI arguments \"${explicitScripts.join(' ')}\" are ignored because the \"--all\" option is set.`);\n    }\n    const parsedConfig = await getParsedConfigFromCommand(cmd);\n    const scripts = all ? Object.keys(parsedConfig.scripts) : explicitScripts;\n    const plans = await getPlans(parsedConfig, scripts);\n    runPlans(plans, parsedConfig.rootNode);\n}\n\ntype RunPlan = {\n    script: ScriptName | null;\n    visitors: Visitor<RootNode, 'rootNode'>[];\n};\n\nasync function getPlans(\n    parsedConfig: Pick<ParsedConfig, 'before' | 'configPath' | 'scripts'>,\n    scripts: ScriptName[],\n): Promise<RunPlan[]> {\n    const plans: RunPlan[] = [];\n    if (scripts.length === 0 && parsedConfig.before.length === 0) {\n        throw new CliError('There are no scripts or before visitors to run.');\n    }\n\n    checkMissingScripts(parsedConfig, scripts);\n    await checkMissingDependencies(parsedConfig, scripts);\n\n    if (parsedConfig.before.length > 0) {\n        plans.push({ script: null, visitors: await getRootNodeVisitors(parsedConfig.before) });\n    }\n\n    for (const script of scripts) {\n        plans.push({ script, visitors: await getRootNodeVisitors(parsedConfig.scripts[script]) });\n    }\n\n    return plans;\n}\n\nfunction runPlans(plans: RunPlan[], rootNode: RootNode): void {\n    for (const plan of plans) {\n        const result = runPlan(plan, rootNode);\n        if (!plan.script) {\n            rootNode = result;\n        }\n    }\n}\n\nfunction runPlan(plan: RunPlan, rootNode: RootNode): RootNode {\n    const visitorLength = plan.visitors.length;\n    const visitorPluralized = visitorLength === 1 ? 'visitor' : 'visitors';\n    const identifier = plan.script\n        ? `script \"${plan.script}\" with ${visitorLength} ${visitorPluralized}`\n        : `${visitorLength} before ${visitorPluralized}`;\n    logInfo(`Running ${identifier}...`);\n    const newRoot = plan.visitors.reduce(visit, rootNode);\n    logSuccess(`Executed ${identifier}!`);\n    return newRoot;\n}\n\nfunction checkMissingScripts(parsedConfig: Pick<ParsedConfig, 'configPath' | 'scripts'>, scripts: ScriptName[]) {\n    const missingScripts = scripts.filter(script => !parsedConfig.scripts[script]);\n    if (missingScripts.length === 0) return;\n\n    const scriptPluralized = missingScripts.length === 1 ? 'Script' : 'Scripts';\n    const message = parsedConfig.configPath\n        ? `${scriptPluralized} not found in configuration file.`\n        : `${scriptPluralized} not found because no configuration file was found.`;\n    const items = [\n        `${pico.bold(scriptPluralized)}: ${missingScripts.join(', ')}`,\n        ...(parsedConfig.configPath ? [`${pico.bold('Path')}: ${parsedConfig.configPath}`] : []),\n    ];\n    throw new CliError(message, items);\n}\n\nasync function checkMissingDependencies(\n    parsedConfig: Pick<ParsedConfig, 'before' | 'configPath' | 'scripts'>,\n    scripts: ScriptName[],\n) {\n    const dependencies = new Set<string>([\n        ...parsedConfig.before.map(v => v.path),\n        ...scripts.flatMap(script => parsedConfig.scripts[script]?.map(v => v.path) ?? []),\n    ]);\n    const externalDependencies = [...dependencies].filter(dep => !isLocalModulePath(dep));\n    const scriptsRequirePluralized = scripts.length === 1 ? 'script requires' : 'scripts require';\n    const installed = await installMissingDependencies(\n        `Your ${scriptsRequirePluralized} additional dependencies.`,\n        externalDependencies,\n    );\n    if (!installed) {\n        throw new CliError('Cannot proceed without missing dependencies.');\n    }\n}\n"
  },
  {
    "path": "packages/cli/src/config.ts",
    "content": "import path from 'node:path';\n\nimport pico from 'picocolors';\n\nimport { ProgramOptions } from './programOptions';\nimport { canRead, CliError, importModuleItem, logWarning } from './utils';\n\nexport type Config = Readonly<{\n    idl?: string;\n    scripts?: ScriptsConfig;\n    before?: readonly VisitorConfig[];\n}>;\n\nexport type ScriptName = string;\nexport type ScriptConfig = VisitorConfig | readonly VisitorConfig[];\nexport type ScriptsConfig = Readonly<Record<ScriptName, ScriptConfig>>;\n\nexport type VisitorPath = string;\nexport type VisitorConfig<T extends readonly unknown[] = readonly unknown[]> = VisitorConfigObject<T> | VisitorPath;\nexport type VisitorConfigObject<T extends readonly unknown[] = readonly unknown[]> = Readonly<{\n    args?: T;\n    from: VisitorPath;\n}>;\n\nexport async function getConfig(options: Pick<ProgramOptions, 'config'>): Promise<[Config, string | null]> {\n    const configPath = options.config != null ? path.resolve(options.config) : await getDefaultConfigPath();\n\n    if (!configPath) {\n        logWarning('No configuration file found. Using empty configs. Make sure you provide the `--idl` option.');\n        return [{}, configPath];\n    }\n\n    const configFile = await importModuleItem({ identifier: 'configuration file', from: configPath });\n    if (!configFile || typeof configFile !== 'object') {\n        throw new CliError(`Invalid configuration file.`, [`${pico.bold('Path')}: ${configPath}`]);\n    }\n\n    return [configFile, configPath];\n}\n\nasync function getDefaultConfigPath(): Promise<string | null> {\n    const candidatePaths = ['codama.js', 'codama.mjs', 'codama.cjs', 'codama.json'];\n    for (const candidatePath of candidatePaths) {\n        const resolvedPath = path.resolve(process.cwd(), candidatePath);\n        if (await canRead(resolvedPath)) {\n            return resolvedPath;\n        }\n    }\n    return null;\n}\n"
  },
  {
    "path": "packages/cli/src/index.ts",
    "content": "export * from './program';\n"
  },
  {
    "path": "packages/cli/src/parsedConfig.ts",
    "content": "import type { RootNode } from '@codama/nodes';\nimport { Command } from 'commander';\n\nimport { Config, getConfig, ScriptName, ScriptsConfig, VisitorConfig, VisitorPath } from './config';\nimport { ProgramOptions } from './programOptions';\nimport {\n    CliError,\n    getRootNodeFromIdl,\n    importModuleItem,\n    isLocalModulePath,\n    resolveConfigPath,\n    resolveRelativePath,\n} from './utils';\n\nexport type ParsedConfig = Readonly<{\n    configPath: string | null;\n    idlContent: unknown;\n    idlPath: string;\n    rootNode: RootNode;\n    scripts: ParsedScriptsConfig;\n    before: readonly ParsedVisitorConfig[];\n}>;\n\nexport type ParsedScriptsConfig = Readonly<Record<ScriptName, readonly ParsedVisitorConfig[]>>;\nexport type ParsedVisitorConfig<T extends readonly unknown[] = readonly unknown[]> = Readonly<{\n    args: T;\n    index: number;\n    item: string | undefined;\n    path: VisitorPath;\n    script: ScriptName | null;\n}>;\n\nexport async function getParsedConfigFromCommand(cmd: Command): Promise<ParsedConfig> {\n    return await getParsedConfig(cmd.optsWithGlobals());\n}\n\nexport async function getParsedConfig(options: Pick<ProgramOptions, 'config' | 'idl'>): Promise<ParsedConfig> {\n    const [config, configPath] = await getConfig(options);\n    return await parseConfig(config, configPath, options);\n}\n\nasync function parseConfig(\n    config: Config,\n    configPath: string | null,\n    options: Pick<ProgramOptions, 'idl'>,\n): Promise<ParsedConfig> {\n    const idlPath = parseIdlPath(config, configPath, options);\n    const idlContent = await importModuleItem({ identifier: 'IDL', from: idlPath });\n    const rootNode = await getRootNodeFromIdl(idlContent);\n    const scripts = parseScripts(config.scripts ?? {}, configPath);\n    const visitors = (config.before ?? []).map((v, i) => parseVisitorConfig(v, configPath, i, null));\n\n    return { configPath, idlContent, idlPath, rootNode, scripts, before: visitors };\n}\n\nfunction parseIdlPath(\n    config: Pick<Config, 'idl'>,\n    configPath: string | null,\n    options: Pick<ProgramOptions, 'idl'>,\n): string {\n    if (options.idl) {\n        return resolveRelativePath(options.idl);\n    }\n    if (config.idl) {\n        return resolveConfigPath(config.idl, configPath);\n    }\n    throw new CliError('No IDL identified. Please provide the `--idl` option or set it in the configuration file.');\n}\n\nfunction parseScripts(scripts: ScriptsConfig, configPath: string | null): ParsedScriptsConfig {\n    const entryPromises = Object.entries(scripts).map(([name, scriptConfig]) => {\n        const visitors: readonly VisitorConfig[] = Array.isArray(scriptConfig) ? scriptConfig : [scriptConfig];\n        return [name, visitors.map((v, i) => parseVisitorConfig(v, configPath, i, name))] as const;\n    });\n    return Object.fromEntries(entryPromises);\n}\n\nfunction parseVisitorConfig<T extends readonly unknown[]>(\n    visitorConfig: VisitorConfig<T>,\n    configPath: string | null,\n    index: number,\n    script: ScriptName | null,\n): ParsedVisitorConfig<T> {\n    const emptyArgs = [] as readonly unknown[] as T;\n    const visitorPath = typeof visitorConfig === 'string' ? visitorConfig : visitorConfig.from;\n    const visitorArgs = typeof visitorConfig === 'string' ? emptyArgs : (visitorConfig.args ?? emptyArgs);\n    const [path, item] = resolveVisitorPath(visitorPath, configPath);\n    return { args: visitorArgs, index, item, path, script };\n}\n\nfunction resolveVisitorPath(visitorPath: string, configPath: string | null): readonly [string, string | undefined] {\n    const [modulePath, itemName] = visitorPath.split('#') as [string, string | undefined];\n    const resolveModulePath = isLocalModulePath(modulePath) ? resolveConfigPath(modulePath, configPath) : modulePath;\n    return [resolveModulePath, itemName];\n}\n"
  },
  {
    "path": "packages/cli/src/program.ts",
    "content": "import { Command, createCommand, ParseOptions } from 'commander';\nimport pico from 'picocolors';\n\nimport { setConvertCommand, setInitCommand, setRunCommand } from './commands';\nimport { setProgramOptions } from './programOptions';\nimport { logDebug, logError } from './utils';\n\nexport async function codama(args: string[], opts?: { suppressOutput?: boolean }): Promise<void> {\n    const program = createProgram({\n        exitOverride: true,\n        suppressOutput: opts?.suppressOutput,\n    });\n    await runProgram(program, args, { from: 'user' });\n}\n\nexport async function runProgram(program: Command, argv: readonly string[], parseOptions?: ParseOptions) {\n    try {\n        await program.parseAsync(argv, parseOptions);\n    } catch (err) {\n        const error = err as { message: string; stack?: string; items?: string[] };\n        if (program.opts().debug) {\n            logDebug(`${error.stack}`);\n        }\n        logError(pico.bold(error.message), error.items ?? []);\n        process.exitCode = 1;\n    }\n}\n\nexport function createProgram(internalOptions?: { exitOverride?: boolean; suppressOutput?: boolean }): Command {\n    const program = createCommand()\n        .version(__VERSION__)\n        .allowExcessArguments(false)\n        .configureHelp({ showGlobalOptions: true, sortOptions: true, sortSubcommands: true });\n\n    // Set program options and commands.\n    setProgramOptions(program);\n    setInitCommand(program);\n    setRunCommand(program);\n    setConvertCommand(program);\n\n    // Internal options.\n    if (internalOptions?.exitOverride) {\n        program.exitOverride();\n    }\n    if (internalOptions?.suppressOutput) {\n        program.configureOutput({\n            writeErr: () => {},\n            writeOut: () => {},\n        });\n    }\n\n    return program;\n}\n"
  },
  {
    "path": "packages/cli/src/programOptions.ts",
    "content": "import { Command } from 'commander';\n\nexport type ProgramOptions = Readonly<{\n    config?: string;\n    debug?: boolean;\n    idl?: string;\n}>;\n\nexport function setProgramOptions(program: Command): void {\n    program\n        .option('--debug', 'include debugging information, such as stack dump')\n        .option('-i, --idl <path>', 'The path to the IDL to use.')\n        .option('-c, --config <path>', 'The path to the Codama configuration file. Defaults to `codama.(js|json)`.');\n}\n"
  },
  {
    "path": "packages/cli/src/types/global.d.ts",
    "content": "declare const __BROWSER__: boolean;\ndeclare const __ESM__: boolean;\ndeclare const __NODEJS__: boolean;\ndeclare const __REACTNATIVE__: boolean;\ndeclare const __TEST__: boolean;\ndeclare const __VERSION__: string;\n"
  },
  {
    "path": "packages/cli/src/utils/childCommands.ts",
    "content": "import { ChildProcess, spawn, SpawnOptions } from 'child_process';\n\nexport type ChildCommand = {\n    command: string;\n    args: string[];\n};\n\nexport function createChildCommand(command: string, args: string[] = []): ChildCommand {\n    return { command, args };\n}\n\nexport function formatChildCommand(childCommand: ChildCommand): string {\n    const { command, args } = childCommand;\n    return [command, ...args].join(' ');\n}\n\nexport type ChildProcessResult = ChildProcess & {\n    stdoutString: string;\n    stderrString: string;\n};\n\nexport type ChildProcessError = Error & {\n    childProcess: ChildProcessResult;\n};\n\nexport async function spawnChildCommand(\n    childCommand: ChildCommand,\n    options: SpawnOptions & { quiet: boolean } = { quiet: false },\n): Promise<ChildProcess & { stdoutString: string; stderrString: string }> {\n    const { command, args } = childCommand;\n    const childProcess = spawn(command, args, options) as ChildProcessResult;\n    childProcess.stdoutString = '';\n    childProcess.stderrString = '';\n\n    childProcess.stdout?.on('data', (chunk: Uint8Array) => {\n        childProcess.stdoutString += chunk.toString();\n        if (!options.quiet) {\n            process.stdout.write(chunk);\n        }\n    });\n    childProcess.stderr?.on('data', (chunk: Uint8Array) => {\n        childProcess.stderrString += chunk.toString();\n        if (!options.quiet) {\n            process.stderr.write(chunk);\n        }\n    });\n\n    const exitCode: number = await new Promise((resolve, reject) => {\n        childProcess.on('error', () => reject(createChildProcessResultError(childCommand, childProcess)));\n        childProcess.on('close', resolve);\n    });\n    if (exitCode) {\n        throw createChildProcessResultError(childCommand, childProcess);\n    }\n\n    return childProcess;\n}\n\nfunction createChildProcessResultError(\n    childCommand: ChildCommand,\n    childProcess: ChildProcessResult,\n): ChildProcessError {\n    const error = new Error(`Command [${formatChildCommand(childCommand)}] failed`) as ChildProcessError;\n    error.childProcess = childProcess;\n    return error;\n}\n"
  },
  {
    "path": "packages/cli/src/utils/errors.ts",
    "content": "export class CliError extends Error {\n    constructor(\n        message: string,\n        public items: string[] = [],\n        options?: ErrorOptions,\n    ) {\n        super(message, options);\n        this.name = 'CliError';\n    }\n}\n"
  },
  {
    "path": "packages/cli/src/utils/fs.ts",
    "content": "import { R_OK, W_OK } from 'node:constants';\nimport fs, { PathLike } from 'node:fs';\nimport path from 'node:path';\n\nexport function resolveRelativePath(childPath: string, relativeDirectory: string | null = null) {\n    return path.resolve(relativeDirectory ?? process.cwd(), childPath);\n}\n\nexport function resolveConfigPath(childPath: string, configPath: string | null) {\n    const configDir = configPath ? path.dirname(configPath) : null;\n    return resolveRelativePath(childPath, configDir);\n}\n\nexport function isLocalModulePath(modulePath: string) {\n    return modulePath.startsWith('.') || modulePath.startsWith('/');\n}\n\nexport async function readJson<T>(filePath: string): Promise<T> {\n    return JSON.parse(await readFile(filePath)) as T;\n}\n\nexport async function readFile(filePath: string): Promise<string> {\n    return await fs.promises.readFile(filePath, 'utf8');\n}\n\nexport async function writeFile(filePath: string, content: string) {\n    const directory = path.dirname(filePath);\n    if (!(await canWrite(directory))) {\n        await fs.promises.mkdir(directory, { recursive: true });\n    }\n    await fs.promises.writeFile(filePath, content);\n}\n\nexport async function canRead(p: PathLike) {\n    try {\n        await fs.promises.access(p, R_OK);\n        return true;\n    } catch {\n        return false;\n    }\n}\n\nexport async function canWrite(p: PathLike) {\n    try {\n        await fs.promises.access(p, W_OK);\n        return true;\n    } catch {\n        return false;\n    }\n}\n"
  },
  {
    "path": "packages/cli/src/utils/import.ts",
    "content": "import { createRequire } from 'node:module';\n\nimport pico from 'picocolors';\n\nimport { CliError } from './errors';\nimport { canRead, isLocalModulePath, resolveRelativePath } from './fs';\n\ntype ImportModuleItemOptions = {\n    from: string;\n    identifier?: string;\n    item?: string;\n};\n\nexport async function importModuleItem<T = unknown>(options: ImportModuleItemOptions): Promise<T> {\n    const module = await importModule(options);\n    const moduleItem = pickModuleItem(module, options.item) as T | undefined;\n    if (moduleItem === undefined) {\n        const items = getErrorItems(options);\n        throw new CliError(`Failed to load ${options.identifier ?? 'module'}.`, items);\n    }\n    return moduleItem;\n}\n\ntype ModuleDefinition = Partial<Record<string, unknown>> & {\n    __esModule?: boolean;\n    default?: Partial<Record<string, unknown>> & { default?: Partial<Record<string, unknown>> };\n};\n\nfunction pickModuleItem(module: ModuleDefinition, item: string = 'default'): unknown {\n    if (item === 'default') {\n        return module.default?.default ?? module.default ?? module;\n    }\n    return module[item] ?? module.default?.[item] ?? module.default?.default?.[item];\n}\n\nasync function importModule<T extends object>(options: ImportModuleItemOptions): Promise<T> {\n    if (isLocalModulePath(options.from)) {\n        return await importLocalModule(options);\n    }\n\n    try {\n        return await importExternalUserModule(options);\n    } catch {\n        return await importExternalModule(options);\n    }\n}\n\nasync function importLocalModule<T extends object>(options: ImportModuleItemOptions): Promise<T> {\n    const { from, identifier } = options;\n    if (!(await canRead(from))) {\n        const items = getErrorItems(options);\n        throw new CliError(`Cannot access ${identifier ?? 'module'}.`, items);\n    }\n\n    const dotIndex = from.lastIndexOf('.');\n    const extension = dotIndex === -1 ? undefined : from.slice(dotIndex);\n    const modulePromise = extension === '.json' ? import(from, { with: { type: 'json' } }) : import(from);\n    return await handleImportPromise(modulePromise, options);\n}\n\nasync function importExternalModule<T extends object>(options: ImportModuleItemOptions): Promise<T> {\n    return await handleImportPromise(import(options.from), options);\n}\n\nasync function importExternalUserModule<T extends object>(options: ImportModuleItemOptions): Promise<T> {\n    const userPackageJsonPath = resolveRelativePath('package.json');\n    const userRequire = createRequire(userPackageJsonPath);\n    const userFrom = userRequire.resolve(options.from);\n    return await importExternalModule<T>({ ...options, from: userFrom });\n}\n\nasync function handleImportPromise<T extends object>(\n    importPromise: Promise<unknown>,\n    options: ImportModuleItemOptions,\n): Promise<T> {\n    try {\n        return (await importPromise) as T;\n    } catch (cause) {\n        const items = getErrorItems(options, cause);\n        throw new CliError(`Failed to load ${options.identifier ?? 'module'}.`, items, { cause });\n    }\n}\n\nfunction getErrorItems(options: ImportModuleItemOptions, cause?: unknown): string[] {\n    const { from, item } = options;\n    const items = [`${pico.bold('Module')}: ${from}`];\n    if (item) {\n        items.push(`${pico.bold('Item')}: ${item}`);\n    }\n\n    const hasCause = !!cause && typeof cause === 'object' && 'message' in cause && typeof cause.message === 'string';\n    if (hasCause) {\n        items.push(`${pico.bold('Caused by')}: ${(cause as { message: string }).message}`);\n    }\n\n    return items;\n}\n"
  },
  {
    "path": "packages/cli/src/utils/index.ts",
    "content": "export * from './childCommands';\nexport * from './errors';\nexport * from './fs';\nexport * from './import';\nexport * from './logs';\nexport * from './nodes';\nexport * from './packageInstall';\nexport * from './packageJson';\nexport * from './packageManager';\nexport * from './promises';\nexport * from './prompts';\nexport * from './visitors';\n"
  },
  {
    "path": "packages/cli/src/utils/logs.ts",
    "content": "import pico from 'picocolors';\n\ntype LogLevel = 'debug' | 'error' | 'info' | 'success' | 'warning';\n\ntype LogOptions = {\n    level: LogLevel;\n    message: string;\n    items?: string[];\n};\n\nfunction getLogLevelInfo(logLevel: LogLevel) {\n    const identity = (text: string) => text;\n    const infos: Record<LogLevel, [string, (text: string) => string, (text: string) => string]> = {\n        success: ['✔', pico.green, pico.green],\n        info: ['→', pico.blueBright, identity],\n        warning: ['▲', pico.yellow, pico.yellow],\n        error: ['✖', pico.red, pico.red],\n        debug: ['✱', pico.magenta, pico.magenta],\n    };\n\n    return {\n        icon: infos[logLevel][0],\n        color: infos[logLevel][1],\n        messageColor: infos[logLevel][2],\n    };\n}\n\nconst logWrapper = (level: LogLevel) => (message: string, items?: string[]) => log({ level, message, items });\nexport const logSuccess = logWrapper('success');\nexport const logError = logWrapper('error');\nexport const logInfo = logWrapper('info');\nexport const logWarning = logWrapper('warning');\nexport const logDebug = logWrapper('debug');\n\nfunction log({ level, message, items }: LogOptions): void {\n    const { icon, color, messageColor } = getLogLevelInfo(level);\n    console.log(color(icon), messageColor(message));\n    if (items) {\n        logItems(items, color);\n    }\n}\n\nfunction logItems(items: string[], color?: (text: string) => string): void {\n    const colorFn = color ?? (text => text);\n    items.forEach((item, index) => {\n        const prefix = index === items.length - 1 ? '└─' : '├─';\n        console.log('  ' + colorFn(prefix), item);\n    });\n}\n\nexport function logBanner(): void {\n    console.log(pico.bold(codamaColor('Welcome to Codama!')));\n}\n\nfunction codamaColor(text: string): string {\n    if (!pico.isColorSupported) return text;\n    return `\\x1b[38;2;231;171;97m${text}\\x1b[0m`;\n}\n"
  },
  {
    "path": "packages/cli/src/utils/nodes.ts",
    "content": "import type { RootNode } from '@codama/nodes';\n\nimport { CliError } from './errors';\nimport { importModuleItem } from './import';\nimport { installMissingDependencies } from './packageInstall';\n\nexport async function getRootNodeFromIdl(idl: unknown): Promise<RootNode> {\n    if (typeof idl !== 'object' || idl === null) {\n        throw new CliError('Unexpected IDL content. Expected an object, got ' + typeof idl);\n    }\n    if (isRootNode(idl)) {\n        return idl;\n    }\n\n    const hasNodesFromAnchor = await installMissingDependencies(\n        'Anchor IDL detected. Additional dependencies are required to process Anchor IDLs.',\n        ['@codama/nodes-from-anchor'],\n    );\n    if (!hasNodesFromAnchor) {\n        throw new CliError('Cannot proceed without Anchor IDL support.');\n    }\n\n    const rootNodeFromAnchor = await importModuleItem<(idl: unknown) => RootNode>({\n        from: '@codama/nodes-from-anchor',\n        item: 'rootNodeFromAnchor',\n    });\n    return rootNodeFromAnchor(idl);\n}\n\nexport function isRootNode(value: unknown): value is RootNode {\n    return (\n        typeof value === 'object' &&\n        value !== null &&\n        (value as { standard?: string }).standard === 'codama' &&\n        (value as { kind?: string }).kind === 'rootNode'\n    );\n}\n"
  },
  {
    "path": "packages/cli/src/utils/packageInstall.ts",
    "content": "import pico from 'picocolors';\nimport prompts from 'prompts';\n\nimport { ChildCommand, createChildCommand, formatChildCommand, spawnChildCommand } from './childCommands';\nimport { logError, logInfo, logSuccess, logWarning } from './logs';\nimport { getPackageJsonDependencies } from './packageJson';\nimport { getPackageManager } from './packageManager';\nimport { PROMPT_OPTIONS } from './prompts';\n\nexport async function getPackageManagerInstallCommand(\n    packages: string[],\n    options: string[] = [],\n): Promise<ChildCommand> {\n    const packageManager = await getPackageManager();\n    const args = [packageManager === 'yarn' ? 'add' : 'install', ...packages, ...options];\n    return createChildCommand(packageManager, args);\n}\n\nexport async function installMissingDependencies(message: string, requiredDependencies: string[]): Promise<boolean> {\n    if (requiredDependencies.length === 0) return true;\n\n    const installedDependencies = await getPackageJsonDependencies({ includeDev: true });\n    const missingDependencies = requiredDependencies.filter(dep => !installedDependencies.includes(dep));\n    if (missingDependencies.length === 0) return true;\n\n    return await installDependencies(message, missingDependencies);\n}\n\nexport async function installDependencies(message: string, dependencies: string[]): Promise<boolean> {\n    if (dependencies.length === 0) return true;\n    const installCommand = await getPackageManagerInstallCommand(dependencies);\n    const formattedInstallCommand = pico.yellow(formatChildCommand(installCommand));\n\n    if (process.env.CI) {\n        logWarning(message);\n        logWarning(`Skipping installation in CI environment. Please install manually:`);\n        logWarning(formattedInstallCommand);\n        return false;\n    }\n\n    logWarning(message);\n    logWarning(`Install command: ${formattedInstallCommand}`);\n\n    const dependencyResult: { installDependencies: boolean } = await prompts(\n        { initial: true, message: 'Install dependencies?', name: 'installDependencies', type: 'confirm' },\n        PROMPT_OPTIONS,\n    );\n    if (!dependencyResult.installDependencies) {\n        logWarning('Skipping installation.');\n        return false;\n    }\n\n    try {\n        logInfo(`Installing`, dependencies);\n        await spawnChildCommand(installCommand, { quiet: true });\n        logSuccess(`Dependencies installed successfully.`);\n        return true;\n    } catch {\n        logError(`Failed to install dependencies. Please try manually:`);\n        logError(formattedInstallCommand);\n        return false;\n    }\n}\n"
  },
  {
    "path": "packages/cli/src/utils/packageJson.ts",
    "content": "import pico from 'picocolors';\n\nimport { CliError } from './errors';\nimport { canRead, readJson, resolveRelativePath } from './fs';\n\ntype PackageJson = {\n    name: string;\n    dependencies?: Record<string, string>;\n    devDependencies?: Record<string, string>;\n    scripts?: Record<string, string>;\n    packageManager?: string;\n    [key: string]: unknown;\n};\n\nlet packageJson: PackageJson | undefined;\nexport async function getPackageJson(): Promise<PackageJson> {\n    if (!packageJson) {\n        const packageJsonPath = resolveRelativePath('package.json');\n        if (!(await canRead(packageJsonPath))) {\n            throw new CliError('Cannot read package.json.', [`${pico.bold('Path')}: ${packageJsonPath}`]);\n        }\n        packageJson = await readJson<PackageJson>(packageJsonPath);\n    }\n    return packageJson;\n}\n\nexport async function getPackageJsonDependencies(options: { includeDev?: boolean } = {}): Promise<string[]> {\n    const packageJson = await getPackageJson();\n    return [\n        ...(packageJson.dependencies ? Object.keys(packageJson.dependencies) : []),\n        ...(options.includeDev && packageJson.devDependencies ? Object.keys(packageJson.devDependencies) : []),\n    ];\n}\n"
  },
  {
    "path": "packages/cli/src/utils/packageManager.ts",
    "content": "import { createChildCommand, spawnChildCommand } from './childCommands';\nimport { canRead, resolveRelativePath } from './fs';\nimport { getPackageJson } from './packageJson';\n\ntype PackageManager = 'bun' | 'npm' | 'pnpm' | 'yarn';\n\nconst FALLBACK_PACKAGE_MANAGER: PackageManager = 'npm';\n\nlet packageManager: PackageManager | undefined;\nexport async function getPackageManager(): Promise<PackageManager> {\n    if (!packageManager) {\n        packageManager = await detectPackageManager();\n    }\n    return packageManager;\n}\n\nasync function detectPackageManager(): Promise<PackageManager> {\n    const fromPackageJson = await detectPackageManagerFromPackageJson();\n    if (fromPackageJson) return fromPackageJson;\n\n    const fromLockfile = await detectPackageManagerFromLockfile();\n    if (fromLockfile) return fromLockfile;\n\n    const fromInstalledCli = await detectPackageManagerFromInstalledCli();\n    if (fromInstalledCli) return fromInstalledCli;\n\n    return FALLBACK_PACKAGE_MANAGER;\n}\n\nasync function detectPackageManagerFromPackageJson(): Promise<PackageManager | undefined> {\n    const packageJson = await getPackageJson();\n    if (!packageJson.packageManager) return undefined;\n    if (packageJson.packageManager.startsWith('npm@')) return 'npm';\n    if (packageJson.packageManager.startsWith('pnpm@')) return 'pnpm';\n    if (packageJson.packageManager.startsWith('yarn@')) return 'yarn';\n    if (packageJson.packageManager.startsWith('bun@')) return 'bun';\n    return undefined;\n}\n\nasync function detectPackageManagerFromLockfile(): Promise<PackageManager | undefined> {\n    const [isYarn, isPnpm, isBun, isNpm] = await Promise.all([\n        canRead(resolveRelativePath('yarn.lock')),\n        canRead(resolveRelativePath('pnpm-lock.yaml')),\n        canRead(resolveRelativePath('bun.lockb')),\n        canRead(resolveRelativePath('package-lock.json')),\n    ]);\n\n    if (isYarn) return 'yarn';\n    if (isPnpm) return 'pnpm';\n    if (isBun) return 'bun';\n    if (isNpm) return 'npm';\n    return undefined;\n}\n\nasync function detectPackageManagerFromInstalledCli(): Promise<PackageManager | undefined> {\n    const [isPnpm, isYarn, isBun] = await Promise.all([\n        hasPackageManagerCli('pnpm'),\n        hasPackageManagerCli('yarn'),\n        hasPackageManagerCli('bun'),\n    ]);\n\n    if (isPnpm) return 'pnpm';\n    if (isYarn) return 'yarn';\n    if (isBun) return 'bun';\n    return undefined;\n}\n\nasync function hasPackageManagerCli(packageManager: PackageManager): Promise<boolean> {\n    return await spawnChildCommand(createChildCommand(packageManager, ['--version']), { quiet: true })\n        .then(() => true)\n        .catch(() => false);\n}\n"
  },
  {
    "path": "packages/cli/src/utils/promises.ts",
    "content": "export function promisify<T>(value: Promise<T> | T): Promise<T> {\n    return Promise.resolve(value);\n}\n"
  },
  {
    "path": "packages/cli/src/utils/prompts.ts",
    "content": "import prompts from 'prompts';\n\nimport { CliError } from './errors';\n\nexport const PROMPT_OPTIONS: prompts.Options = {\n    onCancel: () => {\n        throw new CliError('Operation cancelled.');\n    },\n};\n"
  },
  {
    "path": "packages/cli/src/utils/visitors.ts",
    "content": "import type { RootNode } from '@codama/nodes';\nimport { rootNodeVisitor, visit, type Visitor } from '@codama/visitors-core';\nimport pico from 'picocolors';\n\nimport { ParsedVisitorConfig } from '../parsedConfig';\nimport { CliError } from './errors';\nimport { importModuleItem } from './import';\nimport { isRootNode } from './nodes';\nimport { promisify } from './promises';\n\nexport async function getRootNodeVisitors(\n    visitors: readonly ParsedVisitorConfig[],\n): Promise<Visitor<RootNode, 'rootNode'>[]> {\n    return await Promise.all(visitors.map(getRootNodeVisitor));\n}\n\nasync function getRootNodeVisitor(visitorConfig: ParsedVisitorConfig): Promise<Visitor<RootNode, 'rootNode'>> {\n    const { item, path } = visitorConfig;\n    const identifier = getVisitorIdentifier(visitorConfig);\n    const moduleItem = await importModuleItem({ identifier, from: path, item });\n    const visitor = await getVisitorFromModuleItem(identifier, moduleItem, visitorConfig);\n    return rootNodeVisitor(root => {\n        const result = visit(root, visitor);\n        return isRootNode(result) ? result : root;\n    });\n}\n\ntype UnknownFunction = (...args: readonly unknown[]) => unknown;\nasync function getVisitorFromModuleItem(\n    identifier: string,\n    moduleItem: unknown,\n    visitorConfig: ParsedVisitorConfig,\n): Promise<Visitor<unknown, 'rootNode'>> {\n    const { args, item, path } = visitorConfig;\n    if (isRootNodeVisitor(moduleItem)) {\n        return moduleItem;\n    }\n    if (typeof moduleItem === 'function') {\n        const result = await promisify((moduleItem as UnknownFunction)(...args));\n        if (isRootNodeVisitor(result)) {\n            return result;\n        }\n    }\n    throw new CliError(`Invalid visitor. Expected a visitor or a function returning a visitor.`, [\n        `${pico.bold('Visitor')}: ${identifier}`,\n        `${pico.bold('Path')}: ${path}`,\n        ...(item ? [`${pico.bold('Item')}: ${item}`] : []),\n    ]);\n}\n\nfunction isRootNodeVisitor(value: unknown): value is Visitor<unknown, 'rootNode'> {\n    return !!value && typeof value === 'object' && 'visitRoot' in value;\n}\n\nfunction getVisitorIdentifier(visitorConfig: ParsedVisitorConfig): string {\n    const { index, script } = visitorConfig;\n    let identifier = `visitor #${index}`;\n    identifier += script ? ` in script \"${script}\"` : '';\n    return identifier;\n}\n"
  },
  {
    "path": "packages/cli/test/exports/commonjs.cjs",
    "content": "const path = require('path');\nconst { codama } = require('../../dist/index.node.cjs');\n\nconst configPath = path.join('test', 'exports', 'mock-config.json');\ncodama(['run', '-c', configPath]);\n"
  },
  {
    "path": "packages/cli/test/exports/mock-config.json",
    "content": "{\n    \"idl\": \"mock-idl.json\",\n    \"before\": [\"@codama/visitors#identityVisitor\"],\n    \"scripts\": {}\n}\n"
  },
  {
    "path": "packages/cli/test/exports/mock-idl.json",
    "content": "{\n    \"kind\": \"rootNode\",\n    \"standard\": \"codama\",\n    \"version\": \"1.0.0\",\n    \"program\": {\n        \"kind\": \"programNode\",\n        \"name\": \"myProgram\",\n        \"accounts\": [],\n        \"instructions\": [],\n        \"definedTypes\": [],\n        \"errors\": [],\n        \"pdas\": []\n    },\n    \"additionalPrograms\": []\n}\n"
  },
  {
    "path": "packages/cli/test/exports/module.mjs",
    "content": "import path from 'path';\nimport { codama } from '../../dist/index.node.mjs';\n\nconst configPath = path.join('test', 'exports', 'mock-config.json');\ncodama(['run', '-c', configPath]);\n"
  },
  {
    "path": "packages/cli/test/index.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { createProgram } from '../src';\n\ntest('it exports a function to create a CLI program', () => {\n    expect(typeof createProgram).toBe('function');\n});\n"
  },
  {
    "path": "packages/cli/tsconfig.declarations.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"declarationMap\": true,\n        \"emitDeclarationOnly\": true,\n        \"outDir\": \"./dist/types\"\n    },\n    \"extends\": \"./tsconfig.json\",\n    \"include\": [\"src/index.ts\", \"src/types\"]\n}\n"
  },
  {
    "path": "packages/cli/tsconfig.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": {\n        \"module\": \"ESNext\"\n    },\n    \"display\": \"codama\",\n    \"extends\": \"../../tsconfig.json\",\n    \"include\": [\"src\", \"test\"]\n}\n"
  },
  {
    "path": "packages/cli/tsup.config.ts",
    "content": "import { defineConfig, Options as TsupConfig } from 'tsup';\n\nimport { getBuildConfig, getCliBuildConfig } from '../../tsup.config.base';\n\nexport default defineConfig([\n    removeAdditionalTreeShaking(getBuildConfig({ format: 'cjs', platform: 'node' })),\n    removeAdditionalTreeShaking(getBuildConfig({ format: 'esm', platform: 'node' })),\n    removeAdditionalTreeShaking(getCliBuildConfig()),\n]);\n\nfunction removeAdditionalTreeShaking(config: TsupConfig): TsupConfig {\n    return {\n        ...config,\n\n        // Treeshaking already happens with esbuild but tsup offers this options\n        // for \"better\" treeshaking strategies using Rollup as an additional step.\n        // The issue is Rollup now uses the deprecated \"assert\" import keyword by default\n        // And tsup doesn't offer a way to change this behavior. Since the CLI package\n        // relies on using the \"with\" keyword to dynamically import JSON files,\n        // we can't use Rollup for treeshaking.\n        treeshake: false,\n    };\n}\n"
  },
  {
    "path": "packages/cli/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\nimport { getVitestConfig } from '../../vitest.config.base.mjs';\n\nexport default defineConfig({\n    test: {\n        projects: [getVitestConfig('node')],\n    },\n});\n"
  },
  {
    "path": "packages/dynamic-client/.gitignore",
    "content": "dist/\ntest/programs/anchor/.anchor/\ntest/programs/anchor/target/\ntest/programs/generated/\n"
  },
  {
    "path": "packages/dynamic-client/.prettierignore",
    "content": "dist/\ntest/e2e/\ntest-ledger/\ntarget/\nCHANGELOG.md\ngenerated/\nidls/"
  },
  {
    "path": "packages/dynamic-client/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Codama\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/dynamic-client/README.md",
    "content": "# Codama ➤ Dynamic Client\n\n[![npm][npm-image]][npm-url]\n[![npm-downloads][npm-downloads-image]][npm-url]\n\n[npm-downloads-image]: https://img.shields.io/npm/dm/@codama/dynamic-client.svg?style=flat\n[npm-image]: https://img.shields.io/npm/v/@codama/dynamic-client.svg?style=flat&label=%40codama%2Fdynamic-client\n[npm-url]: https://www.npmjs.com/package/@codama/dynamic-client\n\nThis package provides a runtime Solana instruction builder that dynamically constructs `Instruction` (`@solana/instructions`) from Codama IDL and provides type generation for full TypeScript type safety.\n\n## Installation\n\n```sh\npnpm install @codama/dynamic-client\n```\n\n> [!NOTE]\n> This package is **not** included in the main [`codama`](../library) package.\n\n## Quick Start\n\n### Untyped\n\n```ts\nimport { createProgramClient } from '@codama/dynamic-client';\nimport idl from './my-program-idl.json';\n\nconst client = createProgramClient(idl);\n\nconst instruction = await client.methods\n    .transferSol({ amount: 1_000_000_000 })\n    .accounts({ source: senderAddress, destination: receiverAddress })\n    .instruction();\n```\n\n### Typed with generated types\n\n```ts\nimport { createProgramClient } from '@codama/dynamic-client';\nimport type { MyProgramClient } from './generated/my-program-types';\nimport idl from './my-program-idl.json';\n\nconst client = createProgramClient<MyProgramClient>(idl);\n// client.methods, .accounts(), args are now fully typed\n```\n\n## API Reference\n\n### `createProgramClient<T>(idl, options?)`\n\nCreates a program client from a Codama IDL.\n\n| Parameter           | Type               | Description                               |\n| ------------------- | ------------------ | ----------------------------------------- |\n| `idl`               | `object \\| string` | Codama IDL object or JSON string          |\n| `options.programId` | `AddressInput`     | Override the program address from the IDL |\n\nReturns a `ProgramClient` (or `T` when a type parameter is provided).\n\n### `ProgramClient`\n\n```ts\ntype InstructionName = CamelCaseString;\ntype AccountName = CamelCaseString;\n\ntype ProgramClient = {\n    methods: Record<InstructionName, (args?) => ProgramMethodBuilder>;\n    pdas?: Record<AccountName, (seeds?) => Promise<ProgramDerivedAddress>>;\n    programAddress: Address;\n    instructions: Map<InstructionName, InstructionNode>;\n    root: RootNode;\n};\n```\n\n### `ProgramMethodBuilder` (fluent API)\n\n```ts\nclient.methods\n    .myInstruction(args) // provide instruction arguments\n    .accounts(accounts) // provide account addresses\n    .signers(['accountName']) // optionally mark ambiguous accounts as signers\n    .resolvers({ customResolver: async (argumentsInput, accountsInput) => {} }) // optionally provide custom resolver according to resolverValueNode in IDL\n    .instruction(); // Promise<Instruction>\n```\n\n### `AddressInput`\n\nAccepts any of:\n\n- `Address` (from `@solana/addresses`)\n- Legacy `PublicKey` (any object with `.toBase58()`)\n- Base58 string\n\n## Accounts\n\n### Automatic resolution rules\n\nAccounts (pda, program ids) with `defaultValue` are resolved automatically, hence can be omitted.\n\n| Account scenario                                                | Type in `.accounts()`          | Auto resolution                                                                              |\n| --------------------------------------------------------------- | ------------------------------ | -------------------------------------------------------------------------------------------- |\n| Required account without `defaultValue`                         | `{ system: Address }`          | No                                                                                           |\n| Required account with `defaultValue`<br>(PDA, programId, etc.)  | `{ system?: Address }`         | Auto-resolved to `defaultValue` if omitted                                                   |\n| Optional account (`isOptional: true`)<br>without `defaultValue` | `{ system: Address \\| null }`  | Resolved via `optionalAccountStrategy`,<br>if provided as `null`                             |\n| Optional account (`isOptional: true`)<br>with `defaultValue`    | `{ system?: Address \\| null }` | - `null` resolves via `optionalAccountStrategy`<br>- `undefined` resolves via `defaultValue` |\n\n### Auto-resolved account addresses\n\nAccounts with `defaultValue` in the IDL are automatically resolved when omitted from `.accounts()`. This includes:\n\n- **PDA accounts** — derived from seeds defined in the IDL\n- **Program IDs** — resolved to known program addresses (e.g., System Program, Token Program)\n- **Constants** — resolved from constant value nodes\n\nYou can always override auto-derived accounts by providing an explicit address.\n\n### Optional accounts\n\nPass `null` for optional accounts to be resolved according to `optionalAccountStrategy` (either will be `omitted` or replaced on `programId`):\n\n```ts\n.accounts({\n    authority,\n    program: programAddress,\n    programData: null,  // optional - resolved via optionalAccountStrategy\n})\n```\n\n### Ambiguous signers\n\nWhen an account has `isSigner: 'either'` in the IDL, use `.signers()` to explicitly mark it:\n\n```ts\n.accounts({ owner: ownerAddress })\n.signers(['owner'])\n```\n\n### Custom resolvers\n\nWhen an account or argument is `resolverValueNode` in the IDL, provide a custom resolver function `.resolvers({ [resolverName]: async fn })` to help with account/arguments resolution:\n\n```ts\nclient.methods\n    .create({ tokenStandard: 'NonFungible' })\n    .accounts({ owner: ownerAddress })\n    .resolvers({\n        resolveIsNonFungible: async (argumentsInput, accountsInput) => {\n            return argumentsInput.tokenStandard === 'NonFungible';\n        },\n    });\n```\n\n## PDA Derivation\n\n### Standalone\n\n```ts\nconst [address, bump] = await client.pdas.canonical({\n    program: programAddress,\n    seed: 'idl',\n});\n```\n\n### Auto-derived in instructions\n\nAccounts with `pdaValueNode` defaults are resolved automatically. Seeds are pulled from other accounts and arguments in the instruction:\n\n```ts\n// metadata PDA is auto-derived from program + seed\nconst ix = await client.methods\n    .initialize({ seed: 'idl', data: myData /* ... */ })\n    .accounts({ authority, program: programAddress, programData })\n    .instruction();\n```\n\nNested/dependent PDAs (where one PDA seed references another PDA) are resolved recursively.\n\n## Arguments\n\nArguments with `defaultValueStrategy: 'omitted'` (e.g., discriminators) are auto-encoded and should not be provided.\n\n## Error Handling\n\nAll errors are instances of `CodamaError` from `@codama/errors`:\n\n```ts\nimport { CodamaError, isCodamaError, CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING } from '@codama/dynamic-client';\n\ntry {\n    const ix = await client.methods.transferSol({ amount: 100 }).accounts({}).instruction();\n} catch (err) {\n    if (isCodamaError(err, CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING)) {\n        console.error(`Missing account: ${err.context.accountName}`);\n    }\n}\n```\n\n## CLI\n\nThe package includes a CLI for generating TypeScript types from Codama IDL files.\n\n```sh\nnpx @codama/dynamic-client generate-client-types <codama-idl.json> <output-dir>\n```\n\nExample:\n\n```sh\nnpx @codama/dynamic-client generate-client-types ./idl/codama.json ./generated\n```\n\nThis reads the IDL file and writes a `*-types.ts` file to the output directory containing strongly-typed interfaces for all instructions, accounts, arguments, PDAs, and the program client.\n\n### `generateClientTypes(idl)`\n\nThe same is available as a TypeScript function:\n\n```ts\nimport { generateClientTypes } from '@codama/dynamic-client';\nimport type { RootNode } from 'codama';\nimport { readFileSync, writeFileSync } from 'node:fs';\n\nconst idl: RootNode = JSON.parse(readFileSync('./my-program-idl.json', 'utf-8'));\nconst typesSource = generateClientTypes(idl);\nwriteFileSync('./generated/my-program-idl-types.ts', typesSource);\n```\n\n## Utilities\n\n```ts\nimport { toAddress, isPublicKeyLike } from '@codama/dynamic-client';\n\n// Convert any AddressInput to Address\nconst addr = toAddress('11111111111111111111111111111111');\nconst addr2 = toAddress(new PublicKey('...'));\n\n// Type guard for legacy PublicKey objects\nif (isPublicKeyLike(value)) {\n    const addr = toAddress(value);\n}\n```\n"
  },
  {
    "path": "packages/dynamic-client/bin/cli.cjs",
    "content": "#!/usr/bin/env node\n\nconst run = require('../dist/cli.cjs').run;\n\nrun(process.argv);\n"
  },
  {
    "path": "packages/dynamic-client/package.json",
    "content": "{\n    \"name\": \"@codama/dynamic-client\",\n    \"version\": \"0.1.0\",\n    \"description\": \"Tool to dynamically build instructions based on Codama IDLs\",\n    \"license\": \"MIT\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/codama-idl/codama\",\n        \"directory\": \"packages/dynamic-client\"\n    },\n    \"bugs\": {\n        \"url\": \"http://github.com/codama-idl/codama/issues\"\n    },\n    \"bin\": {\n        \"dynamic-client\": \"./bin/cli.cjs\"\n    },\n    \"exports\": {\n        \"types\": \"./dist/types/index.d.ts\",\n        \"react-native\": \"./dist/index.react-native.mjs\",\n        \"browser\": {\n            \"import\": \"./dist/index.browser.mjs\",\n            \"require\": \"./dist/index.browser.cjs\"\n        },\n        \"node\": {\n            \"import\": \"./dist/index.node.mjs\",\n            \"require\": \"./dist/index.node.cjs\"\n        }\n    },\n    \"browser\": {\n        \"./dist/index.node.cjs\": \"./dist/index.browser.cjs\",\n        \"./dist/index.node.mjs\": \"./dist/index.browser.mjs\"\n    },\n    \"main\": \"./dist/index.node.cjs\",\n    \"module\": \"./dist/index.node.mjs\",\n    \"react-native\": \"./dist/index.react-native.mjs\",\n    \"types\": \"./dist/types/index.d.ts\",\n    \"type\": \"commonjs\",\n    \"files\": [\n        \"./dist/types\",\n        \"./dist/index.*\",\n        \"./dist/cli.*\",\n        \"./bin/*\"\n    ],\n    \"sideEffects\": false,\n    \"keywords\": [\n        \"solana\",\n        \"framework\",\n        \"standard\",\n        \"specifications\",\n        \"dynamic client\"\n    ],\n    \"scripts\": {\n        \"build\": \"rimraf dist && tsup && tsc -p ./tsconfig.declarations.json\",\n        \"dev\": \"vitest --project node\",\n        \"lint\": \"pnpm generate-program-types && eslint . && prettier --check .\",\n        \"lint:fix\": \"pnpm generate-program-types && eslint --fix . && prettier --write .\",\n        \"test\": \"pnpm test:setup && pnpm test:types && pnpm test:treeshakability && pnpm test:unit\",\n        \"test:setup\": \"pnpm test:anchor:build && ( [ -n \\\"$CI\\\" ] || pnpm generate-idl-from-anchor ) && pnpm generate-program-types\",\n        \"test:anchor:build\": \"cd test/programs/anchor && anchor build\",\n        \"test:treeshakability\": \"for file in dist/index.*.mjs; do agadoo $file; done\",\n        \"test:types\": \"tsc --noEmit\",\n        \"test:unit\": \"vitest run\",\n        \"generate-idl-from-anchor\": \"node ./scripts/generate-idl-from-anchor.mjs\",\n        \"generate-program-types\": \"for f in test/programs/idls/*.json; do node ./bin/cli.cjs generate-client-types \\\"$f\\\" ./test/programs/generated; done\"\n    },\n    \"dependencies\": {\n        \"@codama/dynamic-codecs\": \"workspace:*\",\n        \"@codama/errors\": \"workspace:*\",\n        \"@solana/addresses\": \"^5.3.0\",\n        \"@solana/codecs\": \"^5.3.0\",\n        \"@solana/instructions\": \"^5.3.0\",\n        \"codama\": \"workspace:*\",\n        \"commander\": \"^14.0.2\",\n        \"superstruct\": \"^2.0.2\"\n    },\n    \"devDependencies\": {\n        \"@codama/nodes-from-anchor\": \"workspace:*\",\n        \"@codama/renderers-core\": \"workspace:*\",\n        \"@metaplex-foundation/mpl-token-metadata-kit\": \"^0.0.2\",\n        \"@solana-program/program-metadata\": \"^0.5.1\",\n        \"@solana-program/token\": \"0.10.0\",\n        \"@solana-program/token-2022\": \"^0.9.0\",\n        \"@solana/kit\": \"6.5.0\",\n        \"litesvm\": \"1.0.0\",\n        \"sas-lib\": \"^1.0.10\"\n    },\n    \"browserslist\": [\n        \"supports bigint and not dead\",\n        \"maintained node versions\"\n    ]\n}\n"
  },
  {
    "path": "packages/dynamic-client/scripts/generate-idl-from-anchor.mjs",
    "content": "import { readFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { rootNodeFromAnchor } from '@codama/nodes-from-anchor';\nimport { writeFile } from '@codama/renderers-core';\nimport { createFromRoot } from 'codama';\n\n// This script generates Codama IDL from Anchor programs for tests.\nconst packageRoot = process.cwd();\nconst programs = ['example', 'blog'];\n\nfor (const program of programs) {\n    const idlPath = path.join(packageRoot, 'test', 'programs', 'anchor', 'target', 'idl', `${program}.json`);\n    console.log(`Start generation from IDL: ${idlPath}`);\n    const idl = JSON.parse(readFileSync(idlPath, 'utf-8'));\n\n    console.log('Creating codama client..');\n    const codama = createFromRoot(rootNodeFromAnchor(idl));\n\n    const pathToIdl = path.join(packageRoot, 'test', 'programs', 'idls', `${program}-idl.json`);\n    console.log(`Writing Codama IDL to: ${pathToIdl}`);\n\n    const codamaJson = JSON.parse(codama.getJson());\n    const json = JSON.stringify(codamaJson, null, 4) + '\\n';\n\n    writeFile(pathToIdl, json);\n    console.log(`Done: ${program}`);\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/cli/commands/generate-client-types/generate-client-types-from-file.ts",
    "content": "import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { createFromJson, type RootNode } from 'codama';\n\nimport { generateClientTypes } from './generate-client-types';\n\nexport function generateClientTypesFromFile(codamaIdlPath: string, outputDirPath: string) {\n    const idlPath = path.resolve(codamaIdlPath);\n    const outputDir = path.resolve(outputDirPath);\n\n    if (!existsSync(idlPath)) {\n        console.error(`Error: IDL file not found: ${idlPath}`);\n        process.exit(1);\n    }\n\n    console.log(`Reading IDL from: ${idlPath}`);\n\n    let idlJson: string;\n    try {\n        idlJson = readFileSync(idlPath, 'utf-8');\n    } catch (err) {\n        console.error(`Error reading IDL file: ${err instanceof Error ? err.message : String(err)}`);\n        process.exit(1);\n    }\n\n    let idl: RootNode;\n    try {\n        idl = createFromJson(idlJson).getRoot();\n    } catch (err) {\n        console.error(\n            `Error: ${idlPath} is not valid Codama JSON: ${err instanceof Error ? err.message : String(err)}`,\n        );\n        process.exit(1);\n    }\n\n    let types: string = '';\n    try {\n        console.log(`Generating types for program: ${idl.program.name}`);\n        types = generateClientTypes(idl);\n    } catch (err) {\n        console.error(`Error generating client types: ${err instanceof Error ? err.message : String(err)}`);\n        process.exit(1);\n    }\n\n    try {\n        mkdirSync(outputDir, { recursive: true });\n        const fileName = path.basename(idlPath);\n        const outputFile = fileName.replace(/\\.json$/, '-types.ts');\n        const outputPath = path.join(outputDir, outputFile);\n\n        console.log(`Writing types to: ${outputPath}`);\n        writeFileSync(outputPath, types, 'utf-8');\n        console.log('Done!');\n    } catch (err) {\n        console.error(`Error writing generated types: ${err instanceof Error ? err.message : String(err)}`);\n        process.exit(1);\n    }\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/cli/commands/generate-client-types/generate-client-types.ts",
    "content": "import type {\n    DefinedTypeNode,\n    InstructionAccountNode,\n    InstructionInputValueNode,\n    InstructionNode,\n    PdaNode,\n    RootNode,\n    TypeNode,\n} from 'codama';\n\nimport { OPTIONAL_NODE_KINDS } from '../../../shared/nodes';\n\n/**\n * Generate TypeScript type for program client.\n */\nexport function generateClientTypes(idl: RootNode): string {\n    const programName = toPascalCase(idl.program.name);\n    const definedTypes = idl.program.definedTypes ?? [];\n\n    const pdaMap = collectPdaNodesFromIdl(idl);\n\n    const hasPdas = pdaMap.size > 0;\n    const addressImports = hasPdas ? 'Address, ProgramDerivedAddress' : 'Address';\n\n    let output = `/**\n * Auto-generated types for strongly-typed ProgramClient\n * DO NOT EDIT - Generated by @codama/dynamic-client generate-client-types\n *\n * Note: When the IDL contains types that cannot be resolved (e.g. unsupported\n * kind, missing definition), argument types fall back to \\`unknown\\` instead of\n * \\`any\\`. Consumers should narrow these values before use.\n */\n\nimport type { InstructionNode, RootNode } from 'codama';\nimport type { ${addressImports} } from '@solana/addresses';\nimport type { Instruction } from '@solana/instructions';\n\nexport type ResolverFn<\n    TArgumentsInput = Record<string, unknown>,\n    TAccountsInput = Record<string, unknown>\n> = (argumentsInput: TArgumentsInput, accountsInput: TAccountsInput) => Promise<unknown>;\n\n/**\n * Method builder interface.\n */\nexport type MethodBuilder<TAccounts, TSigners extends string[], TResolvers = Record<string, never>> = {\n    accounts(accounts: TAccounts): MethodBuilder<TAccounts, TSigners, TResolvers>;\n    resolvers(resolvers: Partial<TResolvers>): MethodBuilder<TAccounts, TSigners, TResolvers>;\n    signers(signers: TSigners): MethodBuilder<TAccounts, TSigners, TResolvers>;\n    instruction(): Promise<Instruction>;\n};\n\n`;\n\n    for (const ix of idl.program.instructions) {\n        const typeName = toPascalCase(ix.name);\n\n        // Build args interface\n        const args = ix.arguments.filter(arg => arg.defaultValueStrategy !== 'omitted');\n        const remainingAccountArgs = (ix.remainingAccounts ?? []).filter(ra => ra.value.kind === 'argumentValueNode');\n        let argsRef = 'void';\n        if (args.length > 0 || remainingAccountArgs.length > 0) {\n            const argsInterfaceName = `${typeName}Args`;\n            output += `export type ${argsInterfaceName} = {\\n`;\n            for (const arg of args) {\n                const tsType = codamaTypeToTS(arg.type, definedTypes);\n                const isOptional = OPTIONAL_NODE_KINDS.includes(arg.type.kind);\n                const sep = isOptional ? '?:' : ':';\n                output += `    ${arg.name}${sep} ${tsType};\\n`;\n            }\n            for (const ra of remainingAccountArgs) {\n                const sep = ra.isOptional ? '?:' : ':';\n                output += `    ${ra.value.name}${sep} Address[];\\n`;\n            }\n            output += '};\\n\\n';\n            argsRef = argsInterfaceName;\n        }\n\n        // Build accounts interface\n        // these ValueNodes don't have default value and must be provided if required.\n        const nonResolvableValueNodes = ['payerValueNode', 'identityValueNode'];\n        function isAccAutoResolvable(acc: InstructionAccountNode): boolean {\n            if (acc.defaultValue == null) return false;\n            return !nonResolvableValueNodes.includes(acc.defaultValue.kind);\n        }\n        const accountsInterfaceName = `${typeName}Accounts`;\n        if (ix.accounts.length > 0) {\n            output += `export type ${accountsInterfaceName} = {\\n`;\n            for (const acc of ix.accounts) {\n                // Omittable accounts have a defaultValue that can be auto-resolved, so they can be omitted from .accounts().\n                // When null: resolved via optionalAccountStrategy.\n                // When undefined: resolved via defaultValue.\n                const omittable = isAccAutoResolvable(acc) ? '?' : '';\n                const type = acc.isOptional ? 'Address | null' : 'Address';\n                output += `    ${acc.name}${omittable}: ${type};\\n`;\n            }\n            output += '} & Record<string, Address | null | undefined>;\\n\\n';\n        } else {\n            output += `export type ${accountsInterfaceName} = Record<string, Address | null | undefined>;\\n\\n`;\n        }\n\n        // Collect all ambiguous isSigner: \"either\" account names\n        const eitherSignerAccounts = ix.accounts.filter(acc => acc.isSigner === 'either').map(acc => `'${acc.name}'`);\n        if (eitherSignerAccounts.length > 0) {\n            output += `export type ${typeName}Signers = (${eitherSignerAccounts.join(' | ')})[];\\n\\n`;\n        }\n\n        // Collect resolver names for this instruction\n        const resolverNames = collectResolverNames(ix);\n        let resolversRef = '';\n        if (resolverNames.size > 0) {\n            const resolversTypeName = `${typeName}Resolvers`;\n            output += `export type ${resolversTypeName} = {\\n`;\n            for (const name of resolverNames) {\n                output += `    ${name}: ResolverFn<${argsRef === 'void' ? 'Record<string, unknown>' : argsRef}, ${accountsInterfaceName}>;\\n`;\n            }\n            output += '};\\n\\n';\n            resolversRef = resolversTypeName;\n        }\n\n        // Generate method type\n        const hasRequiredArgs = args.some(arg => !OPTIONAL_NODE_KINDS.includes(arg.type.kind));\n        const hasRequiredRemainingAccounts = remainingAccountArgs.some(ra => !ra.isOptional);\n        const allArgsOptional = !hasRequiredArgs && !hasRequiredRemainingAccounts;\n        const argsParam = argsRef === 'void' ? '' : allArgsOptional ? `args?: ${argsRef}` : `args: ${argsRef}`;\n        const signersGeneric = eitherSignerAccounts.length > 0 ? `${typeName}Signers` : 'string[]';\n        const resolversGeneric = resolversRef ? `, ${resolversRef}` : '';\n        const methodSignature = `(${argsParam}) => MethodBuilder<${accountsInterfaceName}, ${signersGeneric}${resolversGeneric}>`;\n        output += `export type ${typeName}Method = ${methodSignature};\\n\\n`;\n    }\n\n    output += `/**\n * Strongly-typed methods for ${programName}.\n */\nexport type ${programName}Methods = {\\n`;\n\n    for (const ix of idl.program.instructions) {\n        const typeName = toPascalCase(ix.name);\n        output += `    ${ix.name}: ${typeName}Method;\\n`;\n    }\n\n    output += '};\\n\\n';\n\n    // Generate PDA seed types and pdas namespace\n    if (pdaMap.size > 0) {\n        for (const [pdaName, pdaNode] of pdaMap) {\n            const typeName = toPascalCase(pdaName);\n            const variableSeeds = (pdaNode.seeds ?? []).filter(s => s.kind === 'variablePdaSeedNode');\n            if (variableSeeds.length > 0) {\n                output += `export type ${typeName}PdaSeeds = {\\n`;\n                for (const seed of variableSeeds) {\n                    const tsType = seed.type ? codamaTypeToTS(seed.type, definedTypes) : 'unknown';\n                    output += `    ${seed.name}: ${tsType};\\n`;\n                }\n                output += '};\\n\\n';\n            }\n        }\n\n        output += `/**\\n * Strongly-typed PDAs for ${programName}.\\n */\\n`;\n        output += `export type ${programName}Pdas = {\\n`;\n        for (const [pdaName, pdaNode] of pdaMap) {\n            const typeName = toPascalCase(pdaName);\n            const variableSeeds = (pdaNode.seeds ?? []).filter(s => s.kind === 'variablePdaSeedNode');\n            const seedsParam =\n                variableSeeds.length > 0 ? `seeds: ${typeName}PdaSeeds` : `seeds?: Record<string, unknown>`;\n            output += `    ${pdaName}: (${seedsParam}) => Promise<ProgramDerivedAddress>;\\n`;\n        }\n        output += '};\\n\\n';\n    }\n\n    const pdasProp = pdaMap.size > 0 ? `    pdas: ${programName}Pdas;\\n` : '';\n    output += `/**\n * Strongly-typed program client for ${programName}.\n */\nexport type ${programName}ProgramClient = {\n    methods: ${programName}Methods;\n${pdasProp}    programAddress: Address;\n    root: RootNode;\n    instructions: Map<string, InstructionNode>;\n};\n`;\n\n    return output;\n}\n\n/**\n * Convert Codama type to TypeScript type string.\n */\nfunction codamaTypeToTS(type: TypeNode | undefined, definedTypes: DefinedTypeNode[]): string {\n    if (!type || typeof type !== 'object') return 'unknown';\n\n    switch (type.kind) {\n        case 'numberTypeNode':\n            return ['u64', 'u128', 'i64', 'i128'].includes(type.format ?? '') ? 'number | bigint' : 'number';\n        case 'publicKeyTypeNode':\n            return 'Address';\n        case 'stringTypeNode':\n            return 'string';\n        case 'booleanTypeNode':\n            return 'boolean';\n        case 'optionTypeNode':\n            return `${codamaTypeToTS(type.item, definedTypes)} | null`;\n        case 'remainderOptionTypeNode':\n        case 'zeroableOptionTypeNode':\n            return `${codamaTypeToTS(type.item, definedTypes)} | null`;\n        case 'bytesTypeNode':\n            return 'Uint8Array';\n        case 'fixedSizeTypeNode':\n        case 'sizePrefixTypeNode':\n        case 'hiddenPrefixTypeNode':\n        case 'preOffsetTypeNode':\n        case 'postOffsetTypeNode':\n        case 'hiddenSuffixTypeNode':\n        case 'sentinelTypeNode':\n            return codamaTypeToTS(type.type, definedTypes);\n        case 'amountTypeNode':\n        case 'solAmountTypeNode':\n            return 'number | bigint';\n        case 'structTypeNode': {\n            if (!type.fields || type.fields.length === 0) return '{}';\n            const fields = type.fields\n                .filter(f => f.defaultValueStrategy !== 'omitted')\n                .map(f => `${f.name}: ${codamaTypeToTS(f.type, definedTypes)}`);\n            if (fields.length === 0) return '{}';\n            return `{ ${fields.join('; ')} }`;\n        }\n        case 'enumTypeNode': {\n            if (!type.variants || type.variants.length === 0) return 'unknown';\n            const allEmpty = type.variants.every(v => v.kind === 'enumEmptyVariantTypeNode');\n            if (allEmpty) {\n                return type.variants.map(v => `'${v.name}'`).join(' | ');\n            }\n            // Enum with struct/tuple variants — discriminated union\n            const variantTypes = type.variants.map(v => {\n                if (v.kind === 'enumEmptyVariantTypeNode') {\n                    return `{ __kind: '${v.name}' }`;\n                }\n                if (v.kind === 'enumStructVariantTypeNode' && v.struct) {\n                    const inner = codamaTypeToTS(v.struct, definedTypes);\n                    return `{ __kind: '${v.name}' } & ${inner}`;\n                }\n                if (v.kind === 'enumTupleVariantTypeNode' && v.tuple) {\n                    const inner = codamaTypeToTS(v.tuple, definedTypes);\n                    return `{ __kind: '${v.name}'; fields: ${inner} }`;\n                }\n                return `{ __kind: '${v.name}' }`;\n            });\n            return variantTypes.join(' | ');\n        }\n        case 'tupleTypeNode': {\n            if (!type.items || type.items.length === 0) return '[]';\n            const items = type.items.map(i => codamaTypeToTS(i, definedTypes));\n            return `[${items.join(', ')}]`;\n        }\n        case 'arrayTypeNode':\n        case 'setTypeNode': {\n            const itemType = codamaTypeToTS(type.item, definedTypes);\n            const needsParens = itemType.includes(' | ') || itemType.includes(' & ');\n            return needsParens ? `(${itemType})[]` : `${itemType}[]`;\n        }\n        case 'mapTypeNode': {\n            const v = codamaTypeToTS(type.value, definedTypes);\n            return `Record<string, ${v}>`;\n        }\n        case 'definedTypeLinkNode': {\n            if (!type.name) return 'unknown';\n            const def = definedTypes.find(d => d.name === type.name);\n            if (!def) return 'unknown';\n            return codamaTypeToTS(def.type, definedTypes);\n        }\n        case 'dateTimeTypeNode': {\n            return codamaTypeToTS(type.number, definedTypes);\n        }\n        default:\n            type['kind'] satisfies never;\n            return 'unknown';\n    }\n}\n\nfunction collectPdaNodesFromIdl(idl: RootNode): Map<string, PdaNode> {\n    const pdas = new Map<string, PdaNode>();\n\n    for (const pda of idl.program.pdas ?? []) {\n        pdas.set(pda.name, pda);\n    }\n\n    for (const ix of idl.program.instructions) {\n        for (const acc of ix.accounts) {\n            if (!acc.defaultValue || acc.defaultValue.kind !== 'pdaValueNode') continue;\n            const pdaDef = acc.defaultValue.pda;\n            if (!pdaDef || pdaDef.kind !== 'pdaNode') continue;\n            if (!pdas.has(pdaDef.name)) {\n                pdas.set(pdaDef.name, pdaDef);\n            }\n        }\n    }\n\n    return pdas;\n}\n\n/**\n * Collects all unique resolverValueNode names from an instruction's accounts and arguments.\n */\nfunction collectResolverNames(ix: InstructionNode): Set<string> {\n    const names = new Set<string>();\n\n    function extractResolverNodeName(node: InstructionInputValueNode | undefined): void {\n        if (!node) return;\n        if (node.kind === 'resolverValueNode' && node.name) {\n            names.add(node.name);\n        } else if (node.kind === 'conditionalValueNode') {\n            extractResolverNodeName(node.condition);\n            extractResolverNodeName(node.ifTrue);\n            extractResolverNodeName(node.ifFalse);\n        }\n    }\n\n    for (const acc of ix.accounts) {\n        extractResolverNodeName(acc.defaultValue);\n    }\n    for (const arg of ix.arguments) {\n        extractResolverNodeName(arg.defaultValue);\n    }\n\n    return names;\n}\n\nfunction toPascalCase(str: string): string {\n    return str\n        .split(/[-_]/)\n        .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n        .join('');\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/cli/commands/generate-client-types/register-command.ts",
    "content": "import type { Command } from 'commander';\n\nimport { generateClientTypesFromFile } from './generate-client-types-from-file';\n\nexport function registerGenerateClientTypesCommand(program: Command): void {\n    program\n        .command('generate-client-types')\n        .description('Generate TypeScript types from a Codama IDL JSON file')\n        .argument('<codama-idl>', 'Path to a Codama IDL JSON file (e.g., ./idl/codama.json)')\n        .argument('<output-dir>', 'Path to the output directory for the generated .ts file, e.g., ./generated')\n        .action((idlArg: string, outputDirArg: string) => {\n            generateClientTypesFromFile(idlArg, outputDirArg);\n        });\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/cli/commands/index.ts",
    "content": "import type { Command } from 'commander';\n\nimport { registerGenerateClientTypesCommand } from './generate-client-types/register-command';\n\nexport function registerCommands(program: Command): void {\n    registerGenerateClientTypesCommand(program);\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/cli/index.ts",
    "content": "import { createProgram } from './program';\n\nconst program = createProgram();\n\nexport function run(argv: string[]): void {\n    // Show help when invoked with no arguments.\n    if (argv.length <= 2) {\n        program.outputHelp();\n        return;\n    }\n\n    program.parse(argv);\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/cli/program.ts",
    "content": "import { Command } from 'commander';\n\nimport { registerCommands } from './commands';\n\nexport function createProgram(): Command {\n    const program = new Command();\n\n    program.name('dynamic-client').description('CLI for @codama/dynamic-client').showHelpAfterError(true);\n\n    registerCommands(program);\n    return program;\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/index.ts",
    "content": "export type { ProgramDerivedAddress } from '@solana/addresses';\n\nexport { isPublicKeyLike, toAddress } from './shared/address';\nexport type { AddressInput, PublicKeyLike } from './shared/address';\n\nexport { CodamaError, isCodamaError } from '@codama/errors';\nexport {\n    CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_RESOLVER_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__CANNOT_CONVERT_TO_ADDRESS,\n    CODAMA_ERROR__DYNAMIC_CLIENT__CIRCULAR_ACCOUNT_DEPENDENCY,\n    CODAMA_ERROR__DYNAMIC_CLIENT__DEFAULT_VALUE_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_DERIVE_PDA,\n    CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_ENCODE_ARGUMENT,\n    CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_EXECUTE_RESOLVER,\n    CODAMA_ERROR__DYNAMIC_CLIENT__INSTRUCTION_NOT_FOUND,\n    CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ACCOUNT_ADDRESS,\n    CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ARGUMENT_INPUT,\n    CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION,\n    CODAMA_ERROR__DYNAMIC_CLIENT__NODE_REFERENCE_NOT_FOUND,\n    CODAMA_ERROR__DYNAMIC_CLIENT__PDA_NOT_FOUND,\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ADDRESS_TYPE,\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE,\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_NODE,\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_OPTIONAL_ACCOUNT_STRATEGY,\n    CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_VALIDATE_INPUT,\n} from '@codama/errors';\n\nexport type { AccountsInput, ArgumentsInput } from './shared/types';\n\nexport { createProgramClient } from './program-client/create-program-client';\nexport type {\n    CreateProgramClientOptions,\n    IdlInput,\n    ProgramClient,\n    ProgramMethodBuilder,\n} from './program-client/create-program-client';\n\nexport { generateClientTypes } from './cli/commands/generate-client-types/generate-client-types';\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/accounts/create-account-meta.ts",
    "content": "import {\n    CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ARGUMENT_INPUT,\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ADDRESS_TYPE,\n    CODAMA_ERROR__UNEXPECTED_NODE_KIND,\n    CodamaError,\n} from '@codama/errors';\nimport type { Address } from '@solana/addresses';\nimport type { AccountMeta } from '@solana/instructions';\nimport { AccountRole } from '@solana/instructions';\nimport { type InstructionAccountNode, type InstructionNode, isNode, type RootNode } from 'codama';\n\nimport { isConvertibleAddress, toAddress } from '../../shared/address';\nimport type { AccountsInput, ArgumentsInput, EitherSigners, ResolversInput } from '../../shared/types';\nimport { formatValueType, safeStringify } from '../../shared/util';\nimport { resolveAccountAddress } from '../resolvers/resolve-account-address';\n\ntype ResolvedAccount = {\n    address: Address | null;\n    optional: boolean;\n    role: AccountRole;\n};\n\ntype ResolvedAccountWithAddress = ResolvedAccount & { address: Address };\n\n/**\n * Resolves account addresses and creates AccountMeta for each account in the instruction by evaluating their default values.\n * Handles optional accounts based on the instruction's optionalAccountStrategy.\n * Throws errors if required accounts are missing or cannot be resolved.\n */\nexport async function createAccountMeta(\n    root: RootNode,\n    ixNode: InstructionNode,\n    argumentsInput: ArgumentsInput = {},\n    accountsInput: AccountsInput = {},\n    signers: EitherSigners = [],\n    resolversInput: ResolversInput = {},\n): Promise<AccountMeta[]> {\n    const programAddress = toAddress(root.program.publicKey);\n    const resolvedAccounts = await Promise.all(\n        ixNode.accounts.map<Promise<ResolvedAccount>>(async ixAccountNode => {\n            const accountAddressInput = accountsInput?.[ixAccountNode.name];\n\n            const isAccountProvided = accountAddressInput !== undefined && accountAddressInput !== null;\n            // Accounts with default values can be omitted, as they can be resolved from default value\n            if (!isAccountProvided && !ixAccountNode.isOptional && !ixAccountNode.defaultValue) {\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING, {\n                    accountName: ixAccountNode.name,\n                    instructionName: ixNode.name,\n                });\n            }\n\n            let resolvedAccountAddress: Address | null = null;\n            if (!isAccountProvided) {\n                resolvedAccountAddress = await resolveAccountAddress({\n                    accountAddressInput,\n                    accountsInput,\n                    argumentsInput,\n                    ixAccountNode,\n                    ixNode,\n                    resolutionPath: [],\n                    resolversInput,\n                    root,\n                });\n            }\n\n            const finalAddress = isAccountProvided ? toAddress(accountAddressInput) : resolvedAccountAddress;\n\n            // Optional accounts resolved via \"programId\" optionalAccountStrategy get the program address,\n            // which cannot be writable on-chain — downgrade to readonly.\n            // E.g. PMP's setData instruction `buffer` account. (isWritable, isOptional and \"programId\" strategy).\n            // But when buffer is null it resolves to the program address which cannot be writable, hence must be downgraded to readonly.\n            const role =\n                ixAccountNode.isOptional &&\n                !isAccountProvided &&\n                ixNode.optionalAccountStrategy === 'programId' &&\n                finalAddress === programAddress\n                    ? getReadonlyAccountRole(ixAccountNode, signers)\n                    : getAccountRole(ixAccountNode, signers);\n\n            return {\n                address: finalAddress,\n                optional: Boolean(ixAccountNode.isOptional),\n                role,\n            };\n        }),\n    );\n\n    const accountMetas: AccountMeta[] = resolvedAccounts\n        // Filter out optional accounts with \"omitted\" strategy (nulls).\n        .filter((acc): acc is ResolvedAccountWithAddress => acc.address !== null)\n        .map(acc => ({\n            address: acc.address,\n            role: acc.role,\n        }));\n\n    // Resolve remaining accounts from argument values\n    // https://github.com/codama-idl/codama/blob/main/packages/nodes/docs/InstructionRemainingAccountsNode.md\n    for (const remainingNode of ixNode.remainingAccounts ?? []) {\n        if (!isNode(remainingNode.value, 'argumentValueNode')) {\n            throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n                expectedKinds: ['argumentValueNode'],\n                kind: remainingNode.value.kind,\n                node: remainingNode.value,\n            });\n        }\n        const addresses = argumentsInput[remainingNode.value.name];\n\n        if (addresses === undefined) {\n            // Required remaining accounts must be provided.\n            if (!remainingNode.isOptional) {\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING, {\n                    argumentName: remainingNode.value.name,\n                    instructionName: ixNode.name,\n                });\n            }\n            // Optional remaining accounts can be safely omitted.\n            continue;\n        }\n\n        if (!Array.isArray(addresses)) {\n            throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ARGUMENT_INPUT, {\n                argumentName: remainingNode.value.name,\n                expectedType: 'Address[]',\n                value: safeStringify(addresses),\n            });\n        }\n        const role = getRemainingAccountRole(remainingNode.isSigner, remainingNode.isWritable);\n        for (let i = 0; i < addresses.length; i++) {\n            const addr: unknown = addresses[i];\n            if (!isConvertibleAddress(addr)) {\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ADDRESS_TYPE, {\n                    accountName: `${remainingNode.value.name}[${i}]`,\n                    actualType: formatValueType(addr),\n                    expectedType: 'Address | PublicKey',\n                });\n            }\n            accountMetas.push({ address: toAddress(addr), role });\n        }\n    }\n\n    return accountMetas;\n}\n\n// TODO: 'either' is treated as signer — this works for Token Program multisig signers,\n// but may need refinement for programs where 'either' accounts are sometimes non-signers.\nfunction getRemainingAccountRole(isSigner?: boolean | 'either', isWritable?: boolean): AccountRole {\n    const signer = isSigner === true || isSigner === 'either';\n    const writable = isWritable === true;\n    if (writable && signer) return AccountRole.WRITABLE_SIGNER;\n    if (writable) return AccountRole.WRITABLE;\n    if (signer) return AccountRole.READONLY_SIGNER;\n    return AccountRole.READONLY;\n}\n\nfunction getAccountRole(acc: InstructionAccountNode, signers: string[] | undefined): AccountRole {\n    const isSigner = isSignerAccount(acc, signers ?? []);\n    if (acc.isWritable && isSigner) {\n        return AccountRole.WRITABLE_SIGNER;\n    }\n    if (acc.isWritable) {\n        return AccountRole.WRITABLE;\n    }\n    if (isSigner) {\n        return AccountRole.READONLY_SIGNER;\n    }\n    return AccountRole.READONLY;\n}\n\nfunction getReadonlyAccountRole(acc: InstructionAccountNode, signers: string[] | undefined): AccountRole {\n    const isSigner = isSignerAccount(acc, signers ?? []);\n    return isSigner ? AccountRole.READONLY_SIGNER : AccountRole.READONLY;\n}\n\nfunction isSignerAccount(acc: InstructionAccountNode, signers: string[]) {\n    if (acc.isSigner === 'either') {\n        return signers.includes(acc.name);\n    }\n    return acc.isSigner === true;\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/accounts/index.ts",
    "content": "export { createAccountMeta } from './create-account-meta';\nexport { createAccountsInputValidator } from './validate-accounts-input';\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/accounts/validate-accounts-input.ts",
    "content": "import {\n    CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_VALIDATE_INPUT,\n    CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ACCOUNT_ADDRESS,\n    CodamaError,\n} from '@codama/errors';\nimport { camelCase, type InstructionNode } from 'codama';\nimport { assert, StructError } from 'superstruct';\n\nimport type { AccountsInput } from '../../shared/types';\nimport { safeStringify } from '../../shared/util';\nimport { createIxAccountsValidator } from '../validators';\n\n/**\n * Creates a validation function for InstructionAccountNodes.\n * Pre-built superstruct validator ensures all required accounts are provided and have valid addresses.\n * Skips validation for instructions without accounts.\n */\nexport function createAccountsInputValidator(ixNode: InstructionNode) {\n    const validator = ixNode.accounts.length ? createIxAccountsValidator(ixNode.accounts) : null;\n\n    return (accountsInput: AccountsInput = {}) => {\n        if (!validator) return;\n\n        try {\n            assert(accountsInput, validator);\n        } catch (error) {\n            if (error instanceof StructError) {\n                const key = error.key as string;\n                const value = error.value as unknown;\n                if (value == null) {\n                    throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING, {\n                        accountName: camelCase(key),\n                        instructionName: ixNode.name,\n                    });\n                } else {\n                    throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ACCOUNT_ADDRESS, {\n                        accountName: camelCase(key),\n                        value: safeStringify(value),\n                    });\n                }\n            }\n            throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_VALIDATE_INPUT, {\n                cause: error,\n                message: 'Unexpected validation error',\n            });\n        }\n    };\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/arguments/encode-instruction-arguments.ts",
    "content": "import { getNodeCodec, type ReadonlyUint8Array } from '@codama/dynamic-codecs';\nimport {\n    CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__DEFAULT_VALUE_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_ENCODE_ARGUMENT,\n    CODAMA_ERROR__UNEXPECTED_NODE_KIND,\n    CodamaError,\n} from '@codama/errors';\nimport { type Codec, mergeBytes } from '@solana/codecs';\nimport type { InstructionNode, RootNode } from 'codama';\nimport { visitOrElse } from 'codama';\n\nimport type { ArgumentsInput } from '../../shared/types';\nimport {\n    createDefaultValueEncoderVisitor,\n    createInputValueTransformer,\n    DEFAULT_VALUE_ENCODER_SUPPORTED_NODE_KINDS,\n} from '../visitors';\nimport { isOmittedArgument, isOptionalArgument } from './shared';\n\n/**\n * Encodes all instruction arguments into a single byte array.\n * Iterates over each InstructionArgumentNode and encodes based on its category:\n *\n * Omitted arguments use their default value.\n * Optional arguments are encoded as null.\n * Required arguments are transformed from user input and then encoded.\n */\nexport function encodeInstructionArguments(\n    root: RootNode,\n    ix: InstructionNode,\n    argumentsInput: ArgumentsInput = {},\n): ReadonlyUint8Array {\n    const chunks = ix.arguments.map(ixArgumentNode => {\n        const input = argumentsInput?.[ixArgumentNode.name];\n        const nodeCodec = getNodeCodec([root, root.program, ix, ixArgumentNode]);\n        if (isOmittedArgument(ixArgumentNode)) {\n            return encodeOmittedArgument(ix, ixArgumentNode, nodeCodec);\n        } else if (isOptionalArgument(ixArgumentNode, input)) {\n            return encodeOptionalArgument(ix, ixArgumentNode, nodeCodec);\n        } else {\n            return encodeRequiredArgument(root, ix, ixArgumentNode, input, nodeCodec);\n        }\n    });\n\n    return mergeBytes(chunks as Uint8Array[]);\n}\n\nfunction encodeOmittedArgument(\n    ix: InstructionNode,\n    ixArgumentNode: InstructionNode['arguments'][number],\n    nodeCodec: Codec<unknown>,\n): ReadonlyUint8Array {\n    const defaultValue = ixArgumentNode.defaultValue;\n    if (defaultValue === undefined) {\n        throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__DEFAULT_VALUE_MISSING, {\n            argumentName: ixArgumentNode.name,\n            instructionName: ix.name,\n        });\n    }\n\n    const visitor = createDefaultValueEncoderVisitor(nodeCodec);\n    return visitOrElse(defaultValue, visitor, node => {\n        throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n            expectedKinds: [...DEFAULT_VALUE_ENCODER_SUPPORTED_NODE_KINDS],\n            kind: node.kind,\n            node,\n        });\n    });\n}\n\nfunction encodeOptionalArgument(\n    ix: InstructionNode,\n    ixArgumentNode: InstructionNode['arguments'][number],\n    nodeCodec: Codec<unknown>,\n): ReadonlyUint8Array {\n    try {\n        return nodeCodec.encode(null);\n    } catch (error) {\n        throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_ENCODE_ARGUMENT, {\n            argumentName: ixArgumentNode.name,\n            cause: error,\n            instructionName: ix.name,\n        });\n    }\n}\n\nfunction encodeRequiredArgument(\n    root: RootNode,\n    ix: InstructionNode,\n    ixArgumentNode: InstructionNode['arguments'][number],\n    input: ArgumentsInput[string],\n    nodeCodec: Codec<unknown>,\n): ReadonlyUint8Array {\n    if (input === undefined) {\n        throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING, {\n            argumentName: ixArgumentNode.name,\n            instructionName: ix.name,\n        });\n    }\n\n    const transformer = createInputValueTransformer(ixArgumentNode.type, root, {\n        bytesEncoding: 'base16',\n    });\n    const transformedInput = transformer(input);\n    try {\n        return nodeCodec.encode(transformedInput);\n    } catch (error) {\n        throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_ENCODE_ARGUMENT, {\n            argumentName: ixArgumentNode.name,\n            cause: error,\n            instructionName: ix.name,\n        });\n    }\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/arguments/index.ts",
    "content": "export { encodeInstructionArguments } from './encode-instruction-arguments';\nexport { createArgumentsInputValidator } from './validate-arguments-input';\nexport { resolveArgumentDefaultsFromCustomResolvers } from './resolve-argument-from-custom-resolvers';\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/arguments/resolve-argument-from-custom-resolvers.ts",
    "content": "import { CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_EXECUTE_RESOLVER, CodamaError } from '@codama/errors';\nimport type { InstructionNode } from 'codama';\nimport { isNode } from 'codama';\n\nimport type { AccountsInput, ArgumentsInput, ResolversInput } from '../../shared/types';\nimport { isOmittedArgument } from './shared';\n\n/**\n * Resolves argument defaults from user-provided resolvers.\n * For each argument that has a ResolverValueNode and is not provided by argumentsInput,\n * try to invoke the corresponding resolver function and fill ArgumentsInput with the resolved values.\n */\nexport async function resolveArgumentDefaultsFromCustomResolvers(\n    ixNode: InstructionNode,\n    argumentsInput: ArgumentsInput = {},\n    accountsInput: AccountsInput = {},\n    resolversInput: ResolversInput = {},\n): Promise<ArgumentsInput> {\n    const resolvedArgumentsInput = { ...argumentsInput };\n\n    const allArguments = [...ixNode.arguments, ...(ixNode.extraArguments ?? [])];\n    for (const argumentNode of allArguments) {\n        if (resolvedArgumentsInput[argumentNode.name] !== undefined) continue;\n        if (isOmittedArgument(argumentNode)) continue;\n        if (!isNode(argumentNode.defaultValue, 'resolverValueNode')) continue;\n\n        const resolverFn = resolversInput[argumentNode.defaultValue.name];\n        // If no resolver provided — skip and let the encoding step handle it:\n        // Optional arguments will be encoded as none\n        // Required arguments will emit error\n        if (!resolverFn) continue;\n\n        try {\n            resolvedArgumentsInput[argumentNode.name] = await resolverFn(resolvedArgumentsInput, accountsInput);\n        } catch (error) {\n            throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_EXECUTE_RESOLVER, {\n                cause: error,\n                resolverName: argumentNode.defaultValue.name,\n                targetKind: 'instructionArgumentNode',\n                targetName: argumentNode.name,\n            });\n        }\n    }\n\n    return resolvedArgumentsInput;\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/arguments/shared.ts",
    "content": "import type { InstructionArgumentNode } from 'codama';\n\nimport { OPTIONAL_NODE_KINDS } from '../../shared/nodes';\n\nexport function isOmittedArgument(node: InstructionArgumentNode) {\n    return node.defaultValueStrategy === 'omitted';\n}\n\nexport function isOptionalArgument(ixArgumentNode: InstructionArgumentNode, input: unknown) {\n    return OPTIONAL_NODE_KINDS.includes(ixArgumentNode.type.kind) && (input === null || input === undefined);\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/arguments/validate-arguments-input.ts",
    "content": "import { CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_VALIDATE_INPUT, CodamaError } from '@codama/errors';\nimport type { InstructionNode, RootNode } from 'codama';\nimport type { Failure } from 'superstruct';\nimport { assert, StructError } from 'superstruct';\n\nimport type { ArgumentsInput } from '../../shared/types';\nimport { safeStringify } from '../../shared/util';\nimport { createIxArgumentsValidator } from '../validators';\nimport { isOmittedArgument } from './shared';\n\n/**\n * Creates a cached validation function for InstructionArgumentNodes.\n *\n * Skips \"omitted\" arguments.\n * Arguments with resolverValueNode defaults are expected to use optionTypeNode and NOT filtered out here.\n * Optional validation allows undefined so custom resolvers will fill default values after validation.\n */\nexport function createArgumentsInputValidator(root: RootNode, ixNode: InstructionNode) {\n    const requiredArguments = ixNode.arguments.filter(arg => arg?.defaultValueStrategy !== 'omitted');\n    const validator = requiredArguments.length\n        ? createIxArgumentsValidator(ixNode.name, requiredArguments, root.program.definedTypes)\n        : null;\n\n    return (argumentsInput: ArgumentsInput = {}) => {\n        // Ensure arguments with \"omitted\" defaultValueStrategy are not provided in argumentsInput.\n        validateOmittedArguments(ixNode, argumentsInput);\n\n        if (!validator) return;\n\n        const filteredInput = filterRemainingAccountArguments(ixNode, argumentsInput);\n\n        try {\n            assert(filteredInput, validator);\n        } catch (error) {\n            if (!(error instanceof StructError)) {\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_VALIDATE_INPUT, {\n                    cause: error,\n                    message: 'Unexpected validation error',\n                });\n            }\n            const formattedMessage = error.failures().map(failure => {\n                const fieldPath = formatFailurePath(failure);\n                const value = formatFailureValue(failure.value);\n                return `Invalid argument \"${fieldPath}\", value: ${value}. ${failure.message}\\n`;\n            });\n            throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_VALIDATE_INPUT, {\n                cause: error,\n                message: formattedMessage.join(''),\n            });\n        }\n    };\n}\n\n/**\n * Formats a full dotted path from failure, e.g. \"command\", \"innerStruct.pubkey\", \"enumsArray[1]\"\n */\nfunction formatFailurePath(failure: Failure): string {\n    const path = failure.path;\n    if (!path || path.length === 0) return String(failure.key ?? '');\n    return path\n        .map((segment, i) => {\n            if (typeof segment === 'number') {\n                return `[${segment}]`;\n            }\n            return `${i === 0 ? '' : '.'}${String(segment)}`;\n        })\n        .join('');\n}\n\n/**\n * Formats failure values for error messages, truncating long values and stringifying objects.\n */\nconst MAX_VALUE_LENGTH = 120;\nfunction formatFailureValue(value: unknown): string {\n    const raw = typeof value === 'object' ? safeStringify(value) : String(value as unknown);\n    return raw.length > MAX_VALUE_LENGTH ? `${raw.slice(0, MAX_VALUE_LENGTH)}...` : raw;\n}\n\n/**\n * Ensures that arguments with \"omitted\" defaultValueStrategy are not provided by the user (e.g. discriminator).\n */\nfunction validateOmittedArguments(ixNode: InstructionNode, argumentsInput: ArgumentsInput = {}) {\n    ixNode.arguments.filter(isOmittedArgument).forEach(ixArgumentNode => {\n        if (Object.hasOwn(argumentsInput, ixArgumentNode.name)) {\n            throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_VALIDATE_INPUT, {\n                message: 'Omitted argument must not be provided',\n            });\n        }\n    });\n}\n\nfunction getRemainingAccountArgNames(ixNode: InstructionNode): string[] {\n    return (ixNode.remainingAccounts ?? [])\n        .filter(node => node.value.kind === 'argumentValueNode')\n        .map(node => node.value.name);\n}\n\n/**\n * Filters out remaining account argument names from the arguments input.\n * So superstruct's object() doesn't reject them as extra keys.\n */\nfunction filterRemainingAccountArguments(ixNode: InstructionNode, argumentsInput: ArgumentsInput): ArgumentsInput {\n    const remainingAccountArgNames = getRemainingAccountArgNames(ixNode);\n    if (!remainingAccountArgNames.length) {\n        return argumentsInput;\n    }\n\n    const remainingAccountArgNamesSet = new Set(remainingAccountArgNames);\n    return Object.fromEntries(Object.entries(argumentsInput).filter(([key]) => !remainingAccountArgNamesSet.has(key)));\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/index.ts",
    "content": "// accounts\nexport { createAccountMeta } from './accounts/create-account-meta';\nexport { createAccountsInputValidator } from './accounts/validate-accounts-input';\n\n// arguments\nexport { encodeInstructionArguments } from './arguments/encode-instruction-arguments';\nexport { createArgumentsInputValidator } from './arguments/validate-arguments-input';\nexport { resolveArgumentDefaultsFromCustomResolvers } from './arguments/resolve-argument-from-custom-resolvers';\n\n// visitors\nexport {\n    ACCOUNT_DEFAULT_VALUE_SUPPORTED_NODE_KINDS,\n    createAccountDefaultValueVisitor,\n} from './visitors/account-default-value';\nexport { createConditionNodeValueVisitor } from './visitors/condition-node-value';\nexport {\n    createDefaultValueEncoderVisitor,\n    DEFAULT_VALUE_ENCODER_SUPPORTED_NODE_KINDS,\n} from './visitors/default-value-encoder';\nexport { createInputValueTransformer, createInputValueTransformerVisitor } from './visitors/input-value-transformer';\nexport { createPdaSeedValueVisitor, PDA_SEED_VALUE_SUPPORTED_NODE_KINDS } from './visitors/pda-seed-value';\nexport { createValueNodeVisitor, VALUE_NODE_SUPPORTED_NODE_KINDS } from './visitors/value-node-value';\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/instructions.ts",
    "content": "import { address } from '@solana/addresses';\nimport type { InstructionNode, RootNode } from 'codama';\n\nimport type { BuildIxFn } from '../shared/types';\nimport { createAccountMeta, createAccountsInputValidator } from './accounts';\nimport {\n    createArgumentsInputValidator,\n    encodeInstructionArguments,\n    resolveArgumentDefaultsFromCustomResolvers,\n} from './arguments';\n\n/**\n * Creates an instruction builder for a given InstructionNode.\n */\nexport function createIxBuilder(root: RootNode, ixNode: InstructionNode): BuildIxFn {\n    const programAddress = address(root.program.publicKey);\n    const validateArguments = createArgumentsInputValidator(root, ixNode);\n    const validateAccounts = createAccountsInputValidator(ixNode);\n\n    return async (argumentsInput, accountsInput, signers, resolversInput) => {\n        // Validate arguments according to Codama schema.\n        validateArguments(argumentsInput);\n\n        // Ensure required accounts are present and validate provided pubkey addresses.\n        validateAccounts(accountsInput);\n\n        // Resolve arguments that depend on custom resolvers.\n        const enrichedArgumentsInput = await resolveArgumentDefaultsFromCustomResolvers(\n            ixNode,\n            argumentsInput,\n            accountsInput,\n            resolversInput,\n        );\n\n        // Encode arguments into buffer.\n        const argumentsData = encodeInstructionArguments(root, ixNode, enrichedArgumentsInput);\n\n        const accountsData = await createAccountMeta(\n            root,\n            ixNode,\n            enrichedArgumentsInput,\n            accountsInput,\n            signers,\n            resolversInput,\n        );\n\n        return {\n            accounts: accountsData,\n            data: argumentsData,\n            programAddress,\n        };\n    };\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/resolvers/index.ts",
    "content": "export { resolveAccountAddress } from './resolve-account-address';\nexport { resolveAccountValueNodeAddress } from './resolve-account-value-node-address';\nexport { resolveConditionalValueNodeCondition } from './resolve-conditional';\nexport { resolvePDAAddress } from './resolve-pda-address';\nexport type { BaseResolutionContext, ResolutionPath } from './types';\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/resolvers/resolve-account-address.ts",
    "content": "import {\n    CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION,\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_OPTIONAL_ACCOUNT_STRATEGY,\n    CODAMA_ERROR__UNEXPECTED_NODE_KIND,\n    CodamaError,\n} from '@codama/errors';\nimport type { Address } from '@solana/addresses';\nimport type { InstructionAccountNode, InstructionNode, RootNode } from 'codama';\nimport { visitOrElse } from 'codama';\n\nimport { type AddressInput, toAddress } from '../../shared/address';\nimport { safeStringify } from '../../shared/util';\nimport {\n    ACCOUNT_DEFAULT_VALUE_SUPPORTED_NODE_KINDS,\n    createAccountDefaultValueVisitor,\n} from '../visitors/account-default-value';\nimport type { BaseResolutionContext } from './types';\n\ntype ResolveAccountAddressContext = BaseResolutionContext & {\n    accountAddressInput?: AddressInput | null | undefined;\n    ixAccountNode: InstructionAccountNode;\n};\n\n/**\n * Resolves the address of an instruction account node via either defaultValue or optionalAccountStrategy.\n */\nexport async function resolveAccountAddress({\n    root,\n    ixNode,\n    ixAccountNode,\n    argumentsInput,\n    accountsInput,\n    resolutionPath,\n    resolversInput,\n    accountAddressInput,\n}: ResolveAccountAddressContext): Promise<Address | null> {\n    // Optional accounts explicitly provided as null should be resolved based on optionalAccountStrategy\n    if (accountAddressInput === null && ixAccountNode.isOptional) {\n        return resolveOptionalAccountWithStrategy(root, ixNode, ixAccountNode);\n    }\n\n    if (ixAccountNode.defaultValue) {\n        const visitor = createAccountDefaultValueVisitor({\n            accountAddressInput,\n            accountsInput,\n            argumentsInput,\n            ixAccountNode,\n            ixNode,\n            resolutionPath,\n            resolversInput,\n            root,\n        });\n\n        const addressValue = await visitOrElse(ixAccountNode.defaultValue, visitor, node => {\n            throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n                expectedKinds: [...ACCOUNT_DEFAULT_VALUE_SUPPORTED_NODE_KINDS],\n                kind: node.kind,\n                node,\n            });\n        });\n\n        // conditionalValueNode with ifFalse branch returns null.\n        // This should be resolved via optionalAccountStrategy for optional accounts.\n        if (addressValue === null && ixAccountNode.isOptional) {\n            return resolveOptionalAccountWithStrategy(root, ixNode, ixAccountNode);\n        }\n\n        return addressValue;\n    }\n\n    throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING, {\n        accountName: ixAccountNode.name,\n        instructionName: ixNode.name,\n    });\n}\n\n/**\n * Optional account resolution via instruction strategy.\n * With \"programId\" strategy, optional accounts are resolved to programId.\n * With \"omitted\" strategy, optional accounts must be excluded from accounts list.\n */\nfunction resolveOptionalAccountWithStrategy(\n    root: RootNode,\n    ixNode: InstructionNode,\n    ixAccountNode: InstructionAccountNode,\n) {\n    if (!ixAccountNode.isOptional) {\n        throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION, {\n            message: `resolveOptionalAccountWithStrategy called for non-optional account: ${ixAccountNode.name}`,\n        });\n    }\n    switch (ixNode.optionalAccountStrategy) {\n        case 'omitted':\n            return null;\n        case 'programId':\n            return toAddress(root.program.publicKey);\n        default:\n            throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_OPTIONAL_ACCOUNT_STRATEGY, {\n                accountName: ixAccountNode.name,\n                instructionName: ixNode.name,\n                strategy: safeStringify(ixNode.optionalAccountStrategy),\n            });\n    }\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/resolvers/resolve-account-value-node-address.ts",
    "content": "import {\n    CODAMA_ERROR__DYNAMIC_CLIENT__CIRCULAR_ACCOUNT_DEPENDENCY,\n    CODAMA_ERROR__DYNAMIC_CLIENT__NODE_REFERENCE_NOT_FOUND,\n    CodamaError,\n} from '@codama/errors';\nimport type { Address } from '@solana/addresses';\nimport type { AccountValueNode } from 'codama';\n\nimport { toAddress } from '../../shared/address';\nimport { resolveAccountAddress } from './resolve-account-address';\nimport type { BaseResolutionContext, ResolutionPath } from './types';\n\n/**\n * Resolves an AccountValueNode reference to an Address.\n *\n * Shared logic for resolving account references across visitors:\n * Checks if the user provided the account address in accountsInput.\n * Finds the referenced InstructionAccountNode.\n * Delegates to resolveAccountAddress for default value resolution.\n */\nexport async function resolveAccountValueNodeAddress(\n    node: AccountValueNode,\n    ctx: BaseResolutionContext,\n): Promise<Address | null> {\n    const { accountsInput, ixNode, resolutionPath } = ctx;\n\n    // Check if user provided the account address.\n    const providedAddress = accountsInput?.[node.name];\n    if (providedAddress !== undefined && providedAddress !== null) {\n        return toAddress(providedAddress);\n    }\n\n    // Find the referenced account in the instruction.\n    const referencedIxAccountNode = ixNode.accounts.find(acc => acc.name === node.name);\n    if (!referencedIxAccountNode) {\n        throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__NODE_REFERENCE_NOT_FOUND, {\n            instructionName: ixNode.name,\n            referencedName: node.name,\n        });\n    }\n\n    // Detect circular dependencies before recursing.\n    detectCircularDependency(node.name, resolutionPath);\n\n    return await resolveAccountAddress({\n        accountAddressInput: providedAddress,\n        accountsInput: ctx.accountsInput,\n        argumentsInput: ctx.argumentsInput,\n        ixAccountNode: referencedIxAccountNode,\n        ixNode,\n        resolutionPath: [...resolutionPath, node.name],\n        resolversInput: ctx.resolversInput,\n        root: ctx.root,\n    });\n}\n\nexport function detectCircularDependency(nodeName: string, resolutionPath: ResolutionPath) {\n    if (resolutionPath.includes(nodeName)) {\n        throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__CIRCULAR_ACCOUNT_DEPENDENCY, {\n            chain: [...resolutionPath, nodeName].join(' -> '),\n        });\n    }\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/resolvers/resolve-conditional.ts",
    "content": "import {\n    CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION,\n    CODAMA_ERROR__UNEXPECTED_NODE_KIND,\n    CodamaError,\n} from '@codama/errors';\nimport type { ConditionalValueNode, InstructionAccountNode, InstructionInputValueNode } from 'codama';\nimport { isNode, visitOrElse } from 'codama';\n\nimport { getMaybeNodeKind } from '../../shared/util';\nimport { CONDITION_NODE_SUPPORTED_NODE_KINDS, createConditionNodeValueVisitor } from '../visitors/condition-node-value';\nimport { createValueNodeVisitor, VALUE_NODE_SUPPORTED_NODE_KINDS } from '../visitors/value-node-value';\nimport type { BaseResolutionContext } from './types';\n\nexport type ResolveConditionalContext = BaseResolutionContext & {\n    conditionalValueNode: ConditionalValueNode;\n    ixAccountNode: InstructionAccountNode;\n};\n\n/**\n * Evaluates a ConditionalValueNode's condition.\n * Returns the matching branch (ifTrue or ifFalse) as an InstructionInputValueNode or undefined if no branch matches.\n */\nexport async function resolveConditionalValueNodeCondition({\n    root,\n    ixNode,\n    ixAccountNode,\n    conditionalValueNode,\n    argumentsInput,\n    accountsInput,\n    resolutionPath,\n    resolversInput,\n}: ResolveConditionalContext): Promise<InstructionInputValueNode | undefined> {\n    if (!isNode(conditionalValueNode, 'conditionalValueNode')) {\n        throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n            expectedKinds: ['conditionalValueNode'],\n            kind: getMaybeNodeKind(conditionalValueNode),\n            node: conditionalValueNode,\n        });\n    }\n    const { condition, value: expectedValueNode, ifTrue, ifFalse } = conditionalValueNode;\n\n    if (!expectedValueNode && !ifTrue && !ifFalse) {\n        throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION, {\n            message: `Invalid conditionalValueNode: missing value and branches for account ${ixAccountNode.name} in ${ixNode.name}`,\n        });\n    }\n\n    // Resolve the condition value of ConditionalValueNode.\n    const conditionVisitor = createConditionNodeValueVisitor({\n        accountsInput,\n        argumentsInput,\n        ixNode,\n        resolutionPath,\n        resolversInput,\n        root,\n    });\n    const actualProvidedValue = await visitOrElse(condition, conditionVisitor, condNode => {\n        throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n            expectedKinds: [...CONDITION_NODE_SUPPORTED_NODE_KINDS],\n            kind: condNode.kind,\n            node: condNode,\n        });\n    });\n\n    if (!expectedValueNode) {\n        return actualProvidedValue ? ifTrue : ifFalse;\n    }\n\n    // If expectedValueNode exists, the condition must be equal to expected value.\n    const valueVisitor = createValueNodeVisitor();\n    const expectedValue = visitOrElse(expectedValueNode, valueVisitor, valueNode => {\n        throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n            expectedKinds: [...VALUE_NODE_SUPPORTED_NODE_KINDS],\n            kind: valueNode.kind,\n            node: valueNode,\n        });\n    });\n\n    if (typeof expectedValue.value === 'object' || typeof actualProvidedValue === 'object') {\n        throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION, {\n            message: 'Deep equality comparison not yet supported for conditional value',\n        });\n    }\n\n    return actualProvidedValue === expectedValue.value ? ifTrue : ifFalse;\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/resolvers/resolve-pda-address.ts",
    "content": "import {\n    CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION,\n    CODAMA_ERROR__DYNAMIC_CLIENT__NODE_REFERENCE_NOT_FOUND,\n    CODAMA_ERROR__LINKED_NODE_NOT_FOUND,\n    CODAMA_ERROR__UNEXPECTED_NODE_KIND,\n    CODAMA_ERROR__UNRECOGNIZED_NODE_KIND,\n    CodamaError,\n} from '@codama/errors';\nimport type { Address, ProgramDerivedAddress } from '@solana/addresses';\nimport { address, getProgramDerivedAddress } from '@solana/addresses';\nimport type { ReadonlyUint8Array } from '@solana/codecs';\nimport type { Node, PdaNode, PdaSeedValueNode, PdaValueNode, RegisteredPdaSeedNode, VariablePdaSeedNode } from 'codama';\nimport { isNode, visitOrElse } from 'codama';\n\nimport { getMaybeNodeKind } from '../../shared/util';\nimport { createPdaSeedValueVisitor, PDA_SEED_VALUE_SUPPORTED_NODE_KINDS } from '../visitors/pda-seed-value';\nimport type { BaseResolutionContext } from './types';\n\nexport type ResolvePDAAddressContext = BaseResolutionContext & {\n    pdaValueNode: PdaValueNode;\n};\n\n/**\n * Derives a PDA from a PdaValueNode.\n * Encodes each seed (ConstantPdaSeedNode and VariablePdaSeedNode) into bytes and computes the address.\n */\nexport async function resolvePDAAddress({\n    root,\n    ixNode,\n    argumentsInput = {},\n    accountsInput = {},\n    pdaValueNode,\n    resolutionPath,\n    resolversInput,\n}: ResolvePDAAddressContext): Promise<ProgramDerivedAddress | null> {\n    if (!isNode(pdaValueNode, 'pdaValueNode')) {\n        throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n            expectedKinds: ['pdaValueNode'],\n            kind: getMaybeNodeKind(pdaValueNode),\n            node: pdaValueNode,\n        });\n    }\n\n    const pdaNode = resolvePdaNode(pdaValueNode, root.program.pdas);\n    const programId = address(pdaNode.programId || root.program.publicKey);\n\n    const seedValues = await Promise.all(\n        pdaNode.seeds.map(async seedNode => {\n            if (seedNode.kind === 'constantPdaSeedNode') {\n                return await resolveConstantPdaSeed({\n                    accountsInput,\n                    argumentsInput,\n                    ixNode,\n                    programId,\n                    resolutionPath,\n                    resolversInput,\n                    root,\n                    seedNode,\n                });\n            }\n\n            if (seedNode.kind === 'variablePdaSeedNode') {\n                const variableSeedValueNodes = pdaValueNode.seeds;\n                const seedName = seedNode.name;\n                const variableSeedValueNode = variableSeedValueNodes.find(node => node.name === seedName);\n\n                if (!variableSeedValueNode) {\n                    throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__NODE_REFERENCE_NOT_FOUND, {\n                        instructionName: ixNode.name,\n                        referencedName: seedName,\n                    });\n                }\n\n                return await resolveVariablePdaSeed({\n                    accountsInput,\n                    argumentsInput,\n                    ixNode,\n                    programId,\n                    resolutionPath,\n                    resolversInput,\n                    root,\n                    seedNode,\n                    variableSeedValueNode,\n                });\n            }\n\n            throw new CodamaError(CODAMA_ERROR__UNRECOGNIZED_NODE_KIND, {\n                kind: getMaybeNodeKind(seedNode) ?? 'unknown',\n            });\n        }),\n    );\n\n    return await getProgramDerivedAddress({\n        programAddress: programId,\n        seeds: seedValues,\n    });\n}\n\nfunction resolvePdaNode(pdaDefaultValue: PdaValueNode, pdas: PdaNode[]): PdaNode {\n    if (isNode(pdaDefaultValue.pda, 'pdaLinkNode')) {\n        const linkedPda = pdas.find(p => p.name === pdaDefaultValue.pda.name);\n        if (!linkedPda) {\n            throw new CodamaError(CODAMA_ERROR__LINKED_NODE_NOT_FOUND, {\n                kind: 'pdaLinkNode',\n                linkNode: pdaDefaultValue.pda,\n                name: pdaDefaultValue.pda.name,\n                path: [],\n            });\n        }\n        return linkedPda;\n    }\n\n    if (isNode(pdaDefaultValue.pda, 'pdaNode')) {\n        return pdaDefaultValue.pda;\n    }\n\n    throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n        expectedKinds: ['pdaLinkNode', 'pdaNode'],\n        kind: getMaybeNodeKind(pdaDefaultValue.pda),\n        node: pdaDefaultValue.pda,\n    });\n}\n\ntype ResolvePdaSeedContext = BaseResolutionContext & {\n    programId: Address;\n    seedNode: VariablePdaSeedNode;\n    variableSeedValueNode: PdaSeedValueNode;\n};\nfunction resolveVariablePdaSeed({\n    accountsInput = {},\n    argumentsInput = {},\n    ixNode,\n    programId,\n    resolutionPath,\n    resolversInput,\n    root,\n    seedNode,\n    variableSeedValueNode,\n}: ResolvePdaSeedContext): Promise<ReadonlyUint8Array> {\n    if (!isNode(variableSeedValueNode, 'pdaSeedValueNode')) {\n        throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n            expectedKinds: ['pdaSeedValueNode'],\n            kind: getMaybeNodeKind(variableSeedValueNode),\n            node: variableSeedValueNode as Node,\n        });\n    }\n\n    if (seedNode.name !== variableSeedValueNode.name) {\n        // Sanity check: this should not happen.\n        throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION, {\n            message: `Mismatched PDA seed names: expected [${seedNode.name}], got [${variableSeedValueNode.name}]`,\n        });\n    }\n\n    const visitor = createPdaSeedValueVisitor({\n        accountsInput,\n        argumentsInput,\n        ixNode,\n        programId,\n        resolutionPath,\n        resolversInput,\n        root,\n        seedTypeNode: seedNode.type,\n    });\n\n    return visitOrElse(variableSeedValueNode.value, visitor, node => {\n        throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n            expectedKinds: [...PDA_SEED_VALUE_SUPPORTED_NODE_KINDS],\n            kind: node.kind,\n            node,\n        });\n    });\n}\n\ntype ResolveConstantPdaSeedContext = BaseResolutionContext & {\n    programId: Address;\n    seedNode: RegisteredPdaSeedNode;\n};\nfunction resolveConstantPdaSeed({\n    accountsInput,\n    argumentsInput,\n    ixNode,\n    programId,\n    resolutionPath,\n    resolversInput,\n    root,\n    seedNode,\n}: ResolveConstantPdaSeedContext): Promise<ReadonlyUint8Array> {\n    if (!isNode(seedNode, 'constantPdaSeedNode')) {\n        throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n            expectedKinds: ['constantPdaSeedNode'],\n            kind: seedNode.kind,\n            node: seedNode,\n        });\n    }\n\n    const visitor = createPdaSeedValueVisitor({\n        accountsInput,\n        argumentsInput,\n        ixNode,\n        programId,\n        resolutionPath,\n        resolversInput,\n        root,\n        seedTypeNode: seedNode.type,\n    });\n    return visitOrElse(seedNode.value, visitor, node => {\n        throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n            expectedKinds: [...PDA_SEED_VALUE_SUPPORTED_NODE_KINDS],\n            kind: node.kind,\n            node,\n        });\n    });\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/resolvers/types.ts",
    "content": "import type { InstructionNode, RootNode } from 'codama';\n\nimport type { AccountsInput, ArgumentsInput, ResolversInput } from '../../shared/types';\n\n// Array of node names being resolved to detect circular dependencies.\nexport type ResolutionPath = readonly string[];\n\n/**\n * Shared context threaded through the account/PDA resolution pipeline.\n * Individual resolvers/visitors extend this with domain-specific fields.\n */\nexport type BaseResolutionContext = {\n    accountsInput: AccountsInput | undefined;\n    argumentsInput: ArgumentsInput | undefined;\n    ixNode: InstructionNode;\n    resolutionPath: ResolutionPath;\n    resolversInput: ResolversInput | undefined;\n    root: RootNode;\n};\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/validators.ts",
    "content": "import { isAddress } from '@solana/addresses';\nimport type {\n    ArrayTypeNode,\n    CountNode,\n    DefinedTypeNode,\n    EnumVariantTypeNode,\n    InstructionAccountNode,\n    InstructionArgumentNode,\n    SetTypeNode,\n    TypeNode,\n} from 'codama';\nimport {\n    array,\n    boolean,\n    define,\n    intersection,\n    number,\n    object,\n    size,\n    string,\n    Struct,\n    StructError,\n    tuple,\n} from 'superstruct';\n\nimport { isPublicKeyLike } from '../shared/address';\nimport { getMemoizedUtf8Encoder } from '../shared/codecs';\nimport { formatValueType, getMaybeNodeKind, safeStringify } from '../shared/util';\n\ntype StructUnknown = Struct<unknown, unknown>;\n\n/**\n * Creates a superstruct validator for InstructionAccountNodes.\n *\n * if node is optional, then validate only if it's provided.\n * if node has defaultValue, then consider it as optional and validate only if it's provided because it will be resolved from defaultValue.\n */\nexport function createIxAccountsValidator(ixAccountNodes: InstructionAccountNode[]): StructUnknown {\n    const shape = ixAccountNodes.reduce<Record<string, StructUnknown>>((acc, node) => {\n        acc[node.name] = node.isOptional || node.defaultValue ? OptionalSolanaAddressValidator : SolanaAddressValidator;\n        return acc;\n    }, {});\n    return object(shape) as StructUnknown;\n}\n\n/**\n * Creates a superstruct validator for instruction InstructionArgumentNodes.\n */\nexport function createIxArgumentsValidator(\n    ixNodeName: string,\n    ixArgumentNodes: InstructionArgumentNode[],\n    definedTypes: DefinedTypeNode[],\n): StructUnknown {\n    const shape = ixArgumentNodes.reduce<Record<string, StructUnknown>>((acc, argumentNode, index) => {\n        if (!argumentNode.type) {\n            throw new Error(`Argument ${argumentNode.name} of instruction ${ixNodeName} does not have a type`);\n        }\n        acc[argumentNode.name] = createValidatorForTypeNode(\n            `${ixNodeName}_${argumentNode.name}_${index}`,\n            argumentNode.type,\n            definedTypes,\n        );\n        return acc;\n    }, {});\n    return object(shape) as StructUnknown;\n}\n\nfunction createValidatorForTypeNode(nodeName: string, node: TypeNode, definedTypes: DefinedTypeNode[]): StructUnknown {\n    if (!node) {\n        throw new Error(\n            `Node ${nodeName} is not defined. ${definedTypes.length} defined types were provided: ${definedTypes.map(t => t.name).join(', ')}`,\n        );\n    }\n    switch (node.kind) {\n        case 'arrayTypeNode': {\n            return ArrayValidator(`${nodeName}_array`, node, definedTypes);\n        }\n        case 'booleanTypeNode': {\n            return boolean() as StructUnknown;\n        }\n        case 'numberTypeNode': {\n            const format = node.format;\n            if (format === 'u64' || format === 'u128' || format === 'i64' || format === 'i128') {\n                return NumberOrBigintValidator;\n            }\n            return number() as StructUnknown;\n        }\n        case 'publicKeyTypeNode': {\n            return SolanaAddressValidator;\n        }\n        case 'setTypeNode': {\n            // array of unique items\n            return intersection([\n                UniqueItemsValidator,\n                ArrayValidator(`${nodeName}_set`, node, definedTypes),\n            ]) as StructUnknown;\n        }\n        case 'stringTypeNode': {\n            return string() as StructUnknown;\n        }\n        case 'fixedSizeTypeNode': {\n            // fixedSizeTypeNode wraps an inner type and constrains its byte size\n            if (node.type.kind === 'stringTypeNode') {\n                // For fixed-size strings, validate that UTF-8 bytes fit within the size\n                return StringValidatorForFixedSize(node.size);\n            }\n            if (node.type.kind === 'bytesTypeNode') {\n                // For fixed-size bytes, validate exact byte length\n                return BytesWithSizeValidator(node.size);\n            }\n            // For other types, delegate to the inner type validator\n            // The size constraint is handled during encoding\n            return createValidatorForTypeNode(`${nodeName}_fixed_size`, node.type, definedTypes);\n        }\n        case 'bytesTypeNode': {\n            return BytesLikeValidator;\n        }\n        case 'dateTimeTypeNode': {\n            return createValidatorForTypeNode(`${nodeName}_date_time`, node.number, definedTypes);\n        }\n        case 'definedTypeLinkNode': {\n            const definedType = definedTypes.find(d => d.name === node.name);\n            if (!definedType) {\n                throw new Error(`Undefined type: ${node.name} ${node.kind}`);\n            }\n            return createValidatorForTypeNode(`${nodeName}_defined_type`, definedType.type, definedTypes);\n        }\n        case 'mapTypeNode': {\n            const keyValidator = createValidatorForTypeNode(\n                `${nodeName}_map_key_${node.key.kind}`,\n                node.key,\n                definedTypes,\n            );\n            const valueValidator = createValidatorForTypeNode(\n                `${nodeName}_map_value_${node.value.kind}`,\n                node.value,\n                definedTypes,\n            );\n            const sizeValidator = MapCountValidator(node.count);\n            const keyValueValidator = KeyValueValidator(nodeName, keyValidator, valueValidator);\n            if (sizeValidator) {\n                return intersection([keyValueValidator, sizeValidator]) as StructUnknown;\n            }\n            return keyValueValidator;\n        }\n        case 'structTypeNode': {\n            const structShape = node.fields.reduce<Record<string, StructUnknown>>((acc, field) => {\n                acc[field.name] = createValidatorForTypeNode(\n                    `${nodeName}_struct_${field.name}`,\n                    field.type,\n                    definedTypes,\n                );\n                return acc;\n            }, {});\n            return object(structShape) as StructUnknown;\n        }\n        case 'tupleTypeNode': {\n            const validators = node.items.map((typeNode, index) =>\n                createValidatorForTypeNode(`${nodeName}_tuple${typeNode.kind}_${index}`, typeNode, definedTypes),\n            );\n            return tuple(validators as [StructUnknown, ...StructUnknown[]]) as StructUnknown;\n        }\n        case 'zeroableOptionTypeNode': {\n            const innerValidator = createValidatorForTypeNode(\n                `${nodeName}_zeroable_option_item`,\n                node.item,\n                definedTypes,\n            );\n            return ZeroableOptionValidator(`${nodeName}_zeroable_option`, innerValidator);\n        }\n        case 'optionTypeNode': {\n            // TODO: Do we need to validate node.fixed and node.prefix of OptionTypeNode?\n            const SomeValueValidator = createValidatorForTypeNode(`${nodeName}_option_item`, node.item, definedTypes);\n            return OptionValueValidator(`${nodeName}_option`, SomeValueValidator);\n        }\n        case 'remainderOptionTypeNode': {\n            const innerValidator = RemainderOptionTypeItemValidator(\n                `${nodeName}_remainder_option_item`,\n                node.item,\n                definedTypes,\n            );\n            return OptionValueValidator(`${nodeName}_remainder_option`, innerValidator);\n        }\n        case 'hiddenPrefixTypeNode':\n        case 'hiddenSuffixTypeNode':\n        case 'sentinelTypeNode':\n        case 'postOffsetTypeNode':\n        case 'preOffsetTypeNode':\n        case 'sizePrefixTypeNode': {\n            return createValidatorForTypeNode(`${nodeName}_size_prefix`, node.type, definedTypes);\n        }\n        case 'enumTypeNode': {\n            return EnumVariantValidator(nodeName, node.variants, definedTypes);\n        }\n        case 'amountTypeNode': {\n            return AmountTypeValidator(nodeName);\n        }\n        case 'solAmountTypeNode': {\n            return AmountTypeValidator(nodeName);\n        }\n        default: {\n            node['kind'] satisfies never;\n            throw new Error(`Validator for TypeNode \"${nodeName}\" kind: ${getMaybeNodeKind(node)} is not implemented!`);\n        }\n    }\n}\n\nfunction RemainderOptionTypeItemValidator(\n    nodeName: string,\n    itemNode: TypeNode,\n    definedTypes: DefinedTypeNode[],\n): StructUnknown {\n    if (itemNode.kind === 'fixedSizeTypeNode' && itemNode.type.kind === 'stringTypeNode') {\n        // For fixed-size strings in remainder options, accept any string\n        return StringValidatorForFixedSize(itemNode.size);\n    }\n\n    if (itemNode.kind === 'definedTypeLinkNode') {\n        const definedType = definedTypes.find(d => d.name === itemNode.name);\n        if (definedType?.type.kind === 'fixedSizeTypeNode' && definedType.type.type.kind === 'stringTypeNode') {\n            return StringValidatorForFixedSize(definedType.type.size);\n        }\n    }\n\n    return createValidatorForTypeNode(nodeName, itemNode, definedTypes);\n}\n\nfunction StringValidatorForFixedSize(maxSize: number): StructUnknown {\n    return define(`StringForFixedSize_max_${maxSize}`, (value: unknown) => {\n        if (typeof value !== 'string') {\n            return `Expected a string, received: ${formatValueType(value)}`;\n        }\n        const encoder = getMemoizedUtf8Encoder();\n        const bytes = encoder.encode(value);\n        return (\n            bytes.length <= maxSize ||\n            `String exceeds max size: ${bytes.length} bytes (UTF-8), limit is ${maxSize} bytes`\n        );\n    }) as StructUnknown;\n}\n\n/**\n * Validator for enum variants.\n * Handles both scalar enums and enums with data.\n */\nfunction EnumVariantValidator(\n    nodeName: string,\n    variants: EnumVariantTypeNode[],\n    definedTypes: DefinedTypeNode[],\n): StructUnknown {\n    const variantMap = new Map<string, EnumVariantTypeNode>(variants.map(v => [v.name, v]));\n    const variantNames = Array.from(variantMap.keys());\n\n    // Eagerly build per-variant payload validators for struct and tuple variants\n    const variantValidators = new Map<string, StructUnknown>();\n    for (const variant of variants) {\n        if (variant.kind === 'enumStructVariantTypeNode') {\n            variantValidators.set(\n                variant.name,\n                createValidatorForTypeNode(`${nodeName}_${variant.name}`, variant.struct, definedTypes),\n            );\n        } else if (variant.kind === 'enumTupleVariantTypeNode') {\n            variantValidators.set(\n                variant.name,\n                createValidatorForTypeNode(`${nodeName}_${variant.name}`, variant.tuple, definedTypes),\n            );\n        }\n    }\n\n    return define(`${nodeName}_EnumVariant`, (value: unknown) => {\n        // Scalar enum: plain string variant name (e.g. 'foo', 'bar')\n        if (typeof value === 'string')\n            return (\n                variantMap.has(value) || `Invalid enum value \"${value}\". Expected one of: ${variantNames.join(', ')}`\n            );\n\n        // Data enum variant: object with __kind (e.g. { __kind: 'tokenTransfer', amount: 1000 })\n        if (typeof value === 'object' && value !== null && '__kind' in value) {\n            const kind = (value as Record<string, unknown>)['__kind'];\n            if (typeof kind !== 'string') {\n                return `Expected __kind to be a string, received: ${formatValueType(kind)}`;\n            }\n            const variant = variantMap.get(kind);\n            if (!variant) {\n                return `Invalid enum variant \"${kind}\". Expected one of: ${variantNames.join(', ')}`;\n            }\n\n            if (variant.kind === 'enumEmptyVariantTypeNode') {\n                return true;\n            }\n\n            // Validations of enum payloads\n            // eslint-disable-next-line @typescript-eslint/no-unused-vars\n            const { __kind: _, ...rest } = value as Record<string, unknown>;\n            const payloadValidator = variantValidators.get(kind);\n            if (!payloadValidator) {\n                return true;\n            }\n\n            if (variant.kind === 'enumStructVariantTypeNode') {\n                const [structError] = payloadValidator.validate(rest);\n                return structError ? formatErrorForEnumTypeNode(kind, structError) : true;\n            }\n\n            if (variant.kind === 'enumTupleVariantTypeNode') {\n                const fields = (rest as { fields?: unknown }).fields;\n                const [structError] = payloadValidator.validate(fields);\n                return structError ? formatErrorForEnumTypeNode(kind, structError) : true;\n            }\n        }\n\n        return `Expected an enum variant (string or object with __kind), received: ${formatValueType(value)}`;\n    }) as StructUnknown;\n}\n\nfunction formatErrorForEnumTypeNode(enumVariantKind: string, error: StructError) {\n    const failures = error.failures();\n    const first = failures?.[0];\n    if (first) {\n        return `Enum variant \"${enumVariantKind}\" has invalid \"${String(first.key)}\"`;\n    }\n    return `Enum variant \"${enumVariantKind}\" has invalid payload`;\n}\n\nconst SolanaAddressValidator: StructUnknown = /* @__PURE__ */ define('SolanaAddress', (value: unknown) => {\n    if (typeof value === 'string') {\n        return isAddress(value) || `Expected a valid Solana address (base58), received string: \"${value}\"`;\n    }\n    if (isPublicKeyLike(value)) {\n        return isAddress(value.toBase58()) || 'Expected a valid Solana address, received an invalid PublicKey';\n    }\n    return `Expected a Solana address (base58 string or PublicKey), received: ${formatValueType(value)}`;\n});\n\nconst OptionalSolanaAddressValidator: StructUnknown = /* @__PURE__ */ define(\n    'OptionalSolanaAddress',\n    (value: unknown) => {\n        if (value === undefined || value === null) return true;\n        const [error] = SolanaAddressValidator.validate(value);\n        if (!error) return true;\n        return error.failures()[0]?.message ?? 'Expected a valid Solana address or null/undefined';\n    },\n);\n\nconst NumberOrBigintValidator: StructUnknown = /* @__PURE__ */ define('NumberOrBigint', (value: unknown) => {\n    if (typeof value === 'number') {\n        return Number.isSafeInteger(value) || `Expected a safe integer, received unsafe number: ${value}`;\n    }\n    if (typeof value === 'bigint') return true;\n    return `Expected a number or bigint, received: ${formatValueType(value)}`;\n});\n\nconst BytesLikeValidator: StructUnknown = /* @__PURE__ */ define('BytesLike', (value: unknown) => {\n    if (value instanceof Uint8Array) return true;\n    if (!Array.isArray(value)) {\n        return `Expected a Uint8Array or number[] (bytes 0-255), received: ${formatValueType(value)}`;\n    }\n    const invalidIndex = value.findIndex(n => typeof n !== 'number' || !Number.isInteger(n) || n < 0 || n > 255);\n    if (invalidIndex !== -1) {\n        return `Expected byte values (integers 0-255), invalid element at index ${invalidIndex}: ${String(value[invalidIndex])}`;\n    }\n    return true;\n});\n\n/**\n * Validator for bytes that must be exactly a specific size.\n * Used for fixedSizeTypeNode wrapping bytesTypeNode.\n */\nfunction BytesWithSizeValidator(exactSize: number): StructUnknown {\n    return define(`BytesWithSize_${exactSize}`, (value: unknown) => {\n        if (value instanceof Uint8Array) {\n            return value.length === exactSize || `Expected exactly ${exactSize} bytes, received ${value.length} bytes`;\n        }\n        if (!Array.isArray(value)) {\n            return `Expected a Uint8Array or number[] of exactly ${exactSize} bytes, received: ${formatValueType(value)}`;\n        }\n        if (value.length !== exactSize) {\n            return `Expected exactly ${exactSize} bytes, received ${value.length} elements`;\n        }\n        const invalidIndex = value.findIndex(n => typeof n !== 'number' || !Number.isInteger(n) || n < 0 || n > 255);\n        if (invalidIndex !== -1) {\n            return `Expected byte values (integers 0-255), invalid element at index ${invalidIndex}: ${String(value[invalidIndex])}`;\n        }\n        return true;\n    }) as StructUnknown;\n}\n\n// Validates value only if it is not null or undefined (i.e. if it's provided).\n// SomeValueValidator validates the provided value (i.e. Some(value)).\nfunction OptionValueValidator(name: string, SomeValueValidator: StructUnknown): StructUnknown {\n    return define(`${name}_OptionValueValidator`, (value: unknown) => {\n        if (value === null || value === undefined) return true;\n        const [error] = SomeValueValidator.validate(value);\n        if (!error) return true;\n        return error.failures()[0]?.message ?? 'Invalid value for optional field';\n    }) as StructUnknown;\n}\n\n// Validates zeroable option: null is valid, otherwise validates the inner validator.\nfunction ZeroableOptionValidator(name: string, innerValidator: StructUnknown): StructUnknown {\n    return define(name, (value: unknown) => {\n        if (value == null) return true;\n        const [error] = innerValidator.validate(value);\n        if (!error) return true;\n        return error.failures()[0]?.message ?? 'Expected a valid value or null for zeroable option';\n    }) as StructUnknown;\n}\n\n// Checks that all items in the array are unique.\nconst UniqueItemsValidator: StructUnknown = /* @__PURE__ */ define('UniqueItems', (value: unknown) => {\n    if (!Array.isArray(value)) {\n        return `Expected an array with unique items, received: ${formatValueType(value)}`;\n    }\n\n    const unique = new Map<string, number>();\n    for (let i = 0; i < value.length; i++) {\n        const key = safeStringify(value[i]);\n        const index = unique.get(key);\n        if (index !== undefined) {\n            return `Expected all items to be unique, found duplicate at indices ${index} and ${i}`;\n        }\n        unique.set(key, i);\n    }\n    return true;\n}) as StructUnknown;\n\n// Validates every key of an object according to KeyValidator.\n// Validates every value of an object according to ValueValidator.\n// Used in MapTypeNode, where the keys and values are of the same type.\nfunction KeyValueValidator(name: string, KeyValidator: StructUnknown, ValueValidator: StructUnknown): StructUnknown {\n    return define(`${name}_KeyValueValidator`, (value: unknown) => {\n        if (typeof value !== 'object' || value === null) {\n            return `Expected a map (object), received: ${formatValueType(value)}`;\n        }\n        const record = value as Record<string, unknown>;\n        const invalidKeys: string[] = [];\n        const invalidValues: string[] = [];\n        for (const key of Object.keys(record)) {\n            if (KeyValidator.validate(key)[0]) invalidKeys.push(key);\n            if (ValueValidator.validate(record[key])[0]) invalidValues.push(key);\n        }\n        if (!invalidKeys.length && !invalidValues.length) return true;\n        const parts: string[] = [];\n        if (invalidKeys.length) parts.push(`invalid keys: ${invalidKeys.join(', ')}`);\n        if (invalidValues.length) parts.push(`invalid values: ${invalidValues.join(', ')}`);\n        return `Map validation failed: ${parts.join('; ')}`;\n    }) as StructUnknown;\n}\n\nfunction MapCountValidator(node: CountNode): StructUnknown | null {\n    switch (node.kind) {\n        case 'fixedCountNode':\n            return KeysLengthValidator(node.value);\n        case 'remainderCountNode':\n        case 'prefixedCountNode':\n            return null; // the number of items is unknown or arbitrary, like vec![]\n        default:\n            throw new Error(`Unsupported map count type: ${getMaybeNodeKind(node)}`);\n    }\n}\n\n// Validates the number of keys in an object\n// Can be used in MapTypeNode with \"fixed\" CountNode type\nfunction KeysLengthValidator(count: number): StructUnknown {\n    return define(`KeysLengthValidator_len_${count}`, (value: unknown) => {\n        if (typeof value !== 'object' || value === null) {\n            return `Expected a map with exactly ${count} entries, received: ${formatValueType(value)}`;\n        }\n        const actual = Object.keys(value).length;\n        return actual === count || `Expected exactly ${count} map entries, received ${actual}`;\n    }) as StructUnknown;\n}\n\n// Handles both fixed-size and variable-size arrays\nfunction ArrayValidator(\n    nodeName: string,\n    node: ArrayTypeNode | SetTypeNode,\n    definedTypes: DefinedTypeNode[],\n): StructUnknown {\n    // First define a validator for every array item\n    const itemValidator = createValidatorForTypeNode(nodeName, node.item, definedTypes);\n    // Then validate CountNode representing array size:\n    // https://github.com/codama-idl/codama/blob/main/packages/nodes/docs/typeNodes/ArrayTypeNode.md\n    switch (node.count.kind) {\n        case 'fixedCountNode': {\n            return size(array(itemValidator), node.count.value) as StructUnknown;\n        }\n        case 'remainderCountNode':\n        case 'prefixedCountNode': {\n            return array(itemValidator) as StructUnknown;\n        }\n        default: {\n            // This should be unreachable with the current `CountNode` union but helps\n            // guard against future Codama expansions.\n            throw new Error(`Node: ${nodeName}. Unsupported array count type`);\n        }\n    }\n}\n\n/**\n * Validator for amountTypeNode and solAmountTypeNode.\n * Accepts number, bigint.\n */\nfunction AmountTypeValidator(nodeName: string): StructUnknown {\n    return define(`AmountType_${nodeName}`, (value: unknown) => {\n        if (typeof value === 'number') {\n            return Number.isSafeInteger(value) || `Expected a safe integer, received unsafe number: ${value}`;\n        }\n        if (typeof value === 'bigint') {\n            return true;\n        }\n        return `Expected a number or bigint, received: ${formatValueType(value)}`;\n    }) as StructUnknown;\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/visitors/account-default-value.ts",
    "content": "import {\n    CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_RESOLVER_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_DERIVE_PDA,\n    CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_EXECUTE_RESOLVER,\n    CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ACCOUNT_ADDRESS,\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ADDRESS_TYPE,\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_NODE,\n    CODAMA_ERROR__UNEXPECTED_NODE_KIND,\n    CodamaError,\n} from '@codama/errors';\nimport type { Address } from '@solana/addresses';\nimport { address } from '@solana/addresses';\nimport type { Visitor } from 'codama';\nimport type {\n    AccountBumpValueNode,\n    AccountValueNode,\n    ArgumentValueNode,\n    ConditionalValueNode,\n    IdentityValueNode,\n    InstructionAccountNode,\n    PayerValueNode,\n    PdaValueNode,\n    ProgramIdValueNode,\n    PublicKeyValueNode,\n    ResolverValueNode,\n} from 'codama';\nimport { visitOrElse } from 'codama';\n\nimport type { AddressInput } from '../../shared/address';\nimport { isConvertibleAddress, toAddress } from '../../shared/address';\nimport { formatValueType, safeStringify } from '../../shared/util';\nimport { resolveAccountValueNodeAddress } from '../resolvers/resolve-account-value-node-address';\nimport { resolveConditionalValueNodeCondition } from '../resolvers/resolve-conditional';\nimport { resolvePDAAddress } from '../resolvers/resolve-pda-address';\nimport type { BaseResolutionContext } from '../resolvers/types';\n\ntype AccountDefaultValueVisitorContext = BaseResolutionContext & {\n    accountAddressInput: AddressInput | null | undefined;\n    ixAccountNode: InstructionAccountNode;\n};\n\nexport const ACCOUNT_DEFAULT_VALUE_SUPPORTED_NODE_KINDS = [\n    'accountBumpValueNode',\n    'accountValueNode',\n    'argumentValueNode',\n    'conditionalValueNode',\n    'identityValueNode',\n    'payerValueNode',\n    'pdaValueNode',\n    'programIdValueNode',\n    'publicKeyValueNode',\n    'resolverValueNode',\n] as const;\n\ntype AccountDefaultValueSupportedNodeKind = (typeof ACCOUNT_DEFAULT_VALUE_SUPPORTED_NODE_KINDS)[number];\n\n/**\n * Visitor for resolving InstructionInputValueNode types to Address values for account resolution.\n */\nexport function createAccountDefaultValueVisitor(\n    ctx: AccountDefaultValueVisitorContext,\n): Visitor<Promise<Address | null>, AccountDefaultValueSupportedNodeKind> {\n    const {\n        root,\n        ixNode,\n        ixAccountNode,\n        accountAddressInput,\n        argumentsInput,\n        accountsInput,\n        resolversInput,\n        resolutionPath,\n    } = ctx;\n\n    return {\n        visitAccountBumpValue: async (_node: AccountBumpValueNode) => {\n            return await Promise.reject(\n                new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_NODE, {\n                    nodeKind: 'accountBumpValueNode',\n                }),\n            );\n        },\n\n        visitAccountValue: async (node: AccountValueNode) => {\n            return await resolveAccountValueNodeAddress(node, {\n                accountsInput,\n                argumentsInput,\n                ixNode,\n                resolutionPath,\n                resolversInput,\n                root,\n            });\n        },\n\n        visitArgumentValue: async (node: ArgumentValueNode) => {\n            const argValue = argumentsInput?.[node.name];\n            if (argValue === undefined || argValue === null) {\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING, {\n                    argumentName: node.name,\n                    instructionName: ixNode.name,\n                });\n            }\n\n            if (!isConvertibleAddress(argValue)) {\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ADDRESS_TYPE, {\n                    accountName: ixAccountNode.name,\n                    actualType: formatValueType(argValue),\n                    expectedType: 'Address | PublicKey',\n                });\n            }\n\n            return await Promise.resolve(toAddress(argValue));\n        },\n\n        visitConditionalValue: async (conditionalValueNode: ConditionalValueNode) => {\n            // ifTrue or ifFalse branch of ConditionalValueNode.\n            const resolvedInputValueNode = await resolveConditionalValueNodeCondition({\n                accountsInput,\n                argumentsInput,\n                conditionalValueNode,\n                ixAccountNode,\n                ixNode,\n                resolutionPath,\n                resolversInput,\n                root,\n            });\n\n            if (resolvedInputValueNode === undefined) {\n                // No matching branch (e.g. conditional with no ifFalse and falsy condition).\n                // Return null to signal \"unresolved\" to apply optionalAccountStrategy.\n                if (ixAccountNode.isOptional) {\n                    return null;\n                }\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING, {\n                    accountName: ixAccountNode.name,\n                    instructionName: ixNode.name,\n                });\n            }\n            // Recursively resolve the chosen branch.\n            const visitor = createAccountDefaultValueVisitor(ctx);\n            const addressValue = await visitOrElse(resolvedInputValueNode, visitor, innerNode => {\n                throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n                    expectedKinds: [...ACCOUNT_DEFAULT_VALUE_SUPPORTED_NODE_KINDS],\n                    kind: innerNode.kind,\n                    node: innerNode,\n                });\n            });\n            return addressValue;\n        },\n\n        visitIdentityValue: async (_node: IdentityValueNode) => {\n            if (accountAddressInput === undefined || accountAddressInput === null) {\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING, {\n                    accountName: ixAccountNode.name,\n                    instructionName: ixNode.name,\n                });\n            }\n            return await Promise.resolve(toAddress(accountAddressInput));\n        },\n\n        visitPayerValue: async (_node: PayerValueNode) => {\n            if (accountAddressInput === undefined || accountAddressInput === null) {\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING, {\n                    accountName: ixAccountNode.name,\n                    instructionName: ixNode.name,\n                });\n            }\n            return await Promise.resolve(toAddress(accountAddressInput));\n        },\n\n        visitPdaValue: async (node: PdaValueNode) => {\n            const pda = await resolvePDAAddress({\n                accountsInput,\n                argumentsInput,\n                ixNode,\n                pdaValueNode: node,\n                resolutionPath,\n                resolversInput,\n                root,\n            });\n            if (pda === null) {\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_DERIVE_PDA, {\n                    accountName: ixAccountNode.name,\n                });\n            }\n            return pda[0];\n        },\n\n        visitProgramIdValue: async (_node: ProgramIdValueNode) => {\n            return await Promise.resolve(address(root.program.publicKey));\n        },\n\n        visitPublicKeyValue: async (node: PublicKeyValueNode) => {\n            return await Promise.resolve(address(node.publicKey));\n        },\n\n        visitResolverValue: async (node: ResolverValueNode) => {\n            const resolverFn = resolversInput?.[node.name];\n            if (!resolverFn) {\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_RESOLVER_MISSING, {\n                    accountName: ixAccountNode.name,\n                    resolverName: node.name,\n                });\n            }\n            let result: unknown;\n            try {\n                result = await resolverFn(argumentsInput ?? {}, accountsInput ?? {});\n            } catch (error) {\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_EXECUTE_RESOLVER, {\n                    cause: error,\n                    resolverName: node.name,\n                    targetKind: 'instructionAccountNode',\n                    targetName: ixAccountNode.name,\n                });\n            }\n\n            if (!isConvertibleAddress(result)) {\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ACCOUNT_ADDRESS, {\n                    accountName: ixAccountNode.name,\n                    value: safeStringify(result),\n                });\n            }\n\n            return toAddress(result);\n        },\n    };\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/visitors/condition-node-value.ts",
    "content": "import { CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_EXECUTE_RESOLVER, CodamaError } from '@codama/errors';\nimport type { Visitor } from 'codama';\nimport type { AccountValueNode, ArgumentValueNode, ResolverValueNode } from 'codama';\n\nimport { resolveAccountValueNodeAddress } from '../resolvers/resolve-account-value-node-address';\nimport type { BaseResolutionContext } from '../resolvers/types';\n\nexport const CONDITION_NODE_SUPPORTED_NODE_KINDS = [\n    'accountValueNode',\n    'argumentValueNode',\n    'resolverValueNode',\n] as const;\n\ntype ConditionNodeSupportedNodeKind = (typeof CONDITION_NODE_SUPPORTED_NODE_KINDS)[number];\n\n/**\n * Visitor for resolving condition nodes in ConditionalValueNode.\n * Returns the runtime value of the condition (from accounts or arguments).\n */\nexport function createConditionNodeValueVisitor(\n    ctx: BaseResolutionContext,\n): Visitor<Promise<unknown>, ConditionNodeSupportedNodeKind> {\n    const { root, ixNode, argumentsInput, accountsInput, resolutionPath, resolversInput } = ctx;\n\n    return {\n        visitAccountValue: async (node: AccountValueNode) => {\n            // If the user explicitly provides null for a conditional account,\n            // return it for the conditionalValueNode ifFalse branch.\n            const accountAddressInput = accountsInput?.[node.name];\n            if (accountAddressInput === null) {\n                return null;\n            }\n\n            return await resolveAccountValueNodeAddress(node, {\n                accountsInput,\n                argumentsInput,\n                ixNode,\n                resolutionPath,\n                resolversInput,\n                root,\n            });\n        },\n\n        visitArgumentValue: async (node: ArgumentValueNode) => {\n            const argInput = argumentsInput?.[node.name];\n            return await Promise.resolve(argInput);\n        },\n\n        visitResolverValue: async (node: ResolverValueNode) => {\n            const resolverFn = resolversInput?.[node.name];\n            if (!resolverFn) {\n                // ConditionalValueNode evaluates condition and based on result it chooses to take either ifTrue or ifFalse branch.\n                // If resolver is not provided, we assume condition is false and return undefined instead of throwing an error to take ifFalse branch.\n                return undefined;\n            }\n            try {\n                return await resolverFn(argumentsInput ?? {}, accountsInput ?? {});\n            } catch (error) {\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_EXECUTE_RESOLVER, {\n                    cause: error,\n                    resolverName: node.name,\n                    targetKind: 'conditionalValueNode',\n                    targetName: node.name,\n                });\n            }\n        },\n    };\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/visitors/default-value-encoder.ts",
    "content": "import type { ReadonlyUint8Array } from '@solana/codecs';\nimport type { Visitor } from 'codama';\nimport type {\n    BooleanValueNode,\n    BytesValueNode,\n    EnumValueNode,\n    NumberValueNode,\n    PublicKeyValueNode,\n    StringValueNode,\n} from 'codama';\n\nexport const DEFAULT_VALUE_ENCODER_SUPPORTED_NODE_KINDS = [\n    'booleanValueNode',\n    'bytesValueNode',\n    'enumValueNode',\n    'noneValueNode',\n    'numberValueNode',\n    'publicKeyValueNode',\n    'stringValueNode',\n] as const;\n\ntype DefaultValueEncoderSupportedNodeKind = (typeof DEFAULT_VALUE_ENCODER_SUPPORTED_NODE_KINDS)[number];\n\n/**\n * Visitor for encoding default (omitted) values for instruction arguments.\n *\n * Today, Anchor/Codama primarily uses omitted defaults for discriminators\n * (`bytesValueNode`), but this visitor is intentionally extensible as we\n * expand node coverage over time.\n */\nexport function createDefaultValueEncoderVisitor(codec: {\n    encode: (value: unknown) => ReadonlyUint8Array;\n}): Visitor<ReadonlyUint8Array, DefaultValueEncoderSupportedNodeKind> {\n    return {\n        visitBooleanValue: (node: BooleanValueNode) => codec.encode(node.boolean),\n        visitBytesValue: (node: BytesValueNode) => codec.encode([node.encoding, node.data]),\n        visitEnumValue: (node: EnumValueNode) => codec.encode(node.variant),\n        visitNoneValue: () => codec.encode(null),\n        visitNumberValue: (node: NumberValueNode) => codec.encode(node.number),\n        visitPublicKeyValue: (node: PublicKeyValueNode) => codec.encode(node.publicKey),\n        visitStringValue: (node: StringValueNode) => codec.encode(node.string),\n    };\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/visitors/index.ts",
    "content": "export { createAccountDefaultValueVisitor } from './account-default-value';\nexport { createConditionNodeValueVisitor } from './condition-node-value';\nexport { createDefaultValueEncoderVisitor, DEFAULT_VALUE_ENCODER_SUPPORTED_NODE_KINDS } from './default-value-encoder';\nexport { createPdaSeedValueVisitor } from './pda-seed-value';\nexport { createValueNodeVisitor } from './value-node-value';\nexport { createInputValueTransformer, createInputValueTransformerVisitor } from './input-value-transformer';\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/visitors/input-value-transformer.ts",
    "content": "import {\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE,\n    CODAMA_ERROR__LINKED_NODE_NOT_FOUND,\n    CODAMA_ERROR__UNEXPECTED_NODE_KIND,\n    CodamaError,\n} from '@codama/errors';\nimport type { BytesEncoding, Node, RootNode, TypeNode, Visitor } from 'codama';\nimport { isNode, pascalCase, visitOrElse } from 'codama';\n\nimport { isUint8Array, uint8ArrayToEncodedString } from '../../shared/bytes-encoding';\nimport { formatValueType, isObjectRecord } from '../../shared/util';\n\n/**\n * Type nodes that the input value transformer can process.\n * Includes all StandaloneTypeNode kinds plus definedTypeLinkNode.\n */\nexport const INPUT_VALUE_TRANSFORMER_SUPPORTED_NODE_KINDS = [\n    'amountTypeNode',\n    'arrayTypeNode',\n    'booleanTypeNode',\n    'bytesTypeNode',\n    'dateTimeTypeNode',\n    'definedTypeLinkNode',\n    'enumTypeNode',\n    'fixedSizeTypeNode',\n    'hiddenPrefixTypeNode',\n    'hiddenSuffixTypeNode',\n    'mapTypeNode',\n    'numberTypeNode',\n    'optionTypeNode',\n    'postOffsetTypeNode',\n    'preOffsetTypeNode',\n    'publicKeyTypeNode',\n    'remainderOptionTypeNode',\n    'sentinelTypeNode',\n    'setTypeNode',\n    'sizePrefixTypeNode',\n    'solAmountTypeNode',\n    'stringTypeNode',\n    'structFieldTypeNode',\n    'structTypeNode',\n    'tupleTypeNode',\n    'zeroableOptionTypeNode',\n] as const;\n\nexport type TransformableTypeNodeKind = (typeof INPUT_VALUE_TRANSFORMER_SUPPORTED_NODE_KINDS)[number];\n\nexport type InputValueTransformerOptions = {\n    bytesEncoding?: BytesEncoding;\n};\n\n/**\n * A transformer function that converts user input to Codama codec-compatible format.\n */\nexport type InputTransformer = (input: unknown) => unknown;\n\nfunction unexpectedNodeFallback(node: Node): never {\n    throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n        expectedKinds: [...INPUT_VALUE_TRANSFORMER_SUPPORTED_NODE_KINDS],\n        kind: node.kind,\n        node,\n    });\n}\n\nexport function createInputValueTransformerVisitor(\n    root: RootNode,\n    options: InputValueTransformerOptions = {},\n): Visitor<InputTransformer, TransformableTypeNodeKind> {\n    const bytesEncoding = options.bytesEncoding ?? 'base16';\n\n    const visitor: Visitor<InputTransformer, TransformableTypeNodeKind> = {\n        visitAmountType(node) {\n            return visitOrElse(node.number, visitor, unexpectedNodeFallback);\n        },\n\n        visitArrayType(node) {\n            const itemTransform = visitOrElse(node.item, visitor, unexpectedNodeFallback);\n            return (input: unknown) => {\n                if (!Array.isArray(input)) {\n                    throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE, {\n                        actualType: formatValueType(input),\n                        expectedType: 'array',\n                        nodeKind: 'arrayTypeNode',\n                    });\n                }\n                return input.map(itemTransform);\n            };\n        },\n\n        visitBooleanType() {\n            return (input: unknown) => input;\n        },\n\n        visitBytesType() {\n            return (input: unknown) => {\n                if (isUint8Array(input)) {\n                    return [bytesEncoding, uint8ArrayToEncodedString(input, bytesEncoding)];\n                }\n                // Accept number[] by coercing to Uint8Array.\n                if (Array.isArray(input) && input.every(item => typeof item === 'number')) {\n                    return [bytesEncoding, uint8ArrayToEncodedString(new Uint8Array(input), bytesEncoding)];\n                }\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE, {\n                    actualType: formatValueType(input),\n                    expectedType: 'Uint8Array | number[]',\n                    nodeKind: 'bytesTypeNode',\n                });\n            };\n        },\n\n        visitDateTimeType(node) {\n            return visitOrElse(node.number, visitor, unexpectedNodeFallback);\n        },\n\n        visitDefinedTypeLink(node) {\n            const definedType = root.program.definedTypes.find(dt => dt.name === node.name);\n            if (!definedType) {\n                throw new CodamaError(CODAMA_ERROR__LINKED_NODE_NOT_FOUND, {\n                    kind: 'definedTypeLinkNode',\n                    linkNode: node,\n                    name: node.name,\n                    path: [],\n                });\n            }\n            return visitOrElse(definedType.type, visitor, unexpectedNodeFallback);\n        },\n\n        visitEnumType(node) {\n            // Scalar enums pass through (just numbers/strings)\n            // Data enums need variant transformation with PascalCase __kind\n            // Because @codama/dynamic-codecs applies pascalCase() to variant names when building discriminated union codecs:\n            // @see https://github.com/codama-idl/codama/blob/main/packages/dynamic-codecs/src/codecs.ts#L199\n            return (input: unknown) => {\n                if (typeof input === 'number' || typeof input === 'string') {\n                    return input;\n                }\n\n                if (!isObjectRecord(input)) {\n                    return input;\n                }\n\n                if (!('__kind' in input)) {\n                    return input;\n                }\n\n                const { __kind, ...rest } = input;\n                const kindObj = { __kind: pascalCase(String(__kind)) };\n                const variantNode = node.variants.find(v => v.name === __kind);\n\n                if (!variantNode) {\n                    const availableVariants = node.variants.map(v => v.name).join(', ');\n                    throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE, {\n                        actualType: `variant '${String(__kind)}'`,\n                        expectedType: `one of [${availableVariants}]`,\n                        nodeKind: 'enumTypeNode',\n                    });\n                }\n\n                if (isNode(variantNode, 'enumEmptyVariantTypeNode')) {\n                    return { ...input, ...kindObj };\n                }\n\n                if (isNode(variantNode, 'enumStructVariantTypeNode')) {\n                    const structTransform = visitOrElse(variantNode.struct, visitor, unexpectedNodeFallback);\n                    const transformedFields = structTransform(rest);\n                    if (!isObjectRecord(transformedFields)) {\n                        throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE, {\n                            actualType: formatValueType(transformedFields),\n                            expectedType: 'object',\n                            nodeKind: 'enumStructVariantTypeNode',\n                        });\n                    }\n                    return { ...kindObj, ...transformedFields };\n                }\n\n                if (isNode(variantNode, 'enumTupleVariantTypeNode')) {\n                    const tupleTransform = visitOrElse(variantNode.tuple, visitor, unexpectedNodeFallback);\n                    if (!('fields' in rest) || !Array.isArray(rest.fields)) {\n                        throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE, {\n                            actualType: formatValueType(rest.fields ?? rest),\n                            expectedType: 'array (fields)',\n                            nodeKind: 'enumTupleVariantTypeNode',\n                        });\n                    }\n                    return { ...kindObj, fields: tupleTransform(rest.fields) };\n                }\n\n                return input;\n            };\n        },\n\n        visitFixedSizeType(node) {\n            return visitOrElse(node.type, visitor, unexpectedNodeFallback);\n        },\n\n        visitHiddenPrefixType(node) {\n            return visitOrElse(node.type, visitor, unexpectedNodeFallback);\n        },\n\n        visitHiddenSuffixType(node) {\n            return visitOrElse(node.type, visitor, unexpectedNodeFallback);\n        },\n\n        visitMapType(node) {\n            // Maps are represented as objects in dynamic-codecs\n            const valueTransform = visitOrElse(node.value, visitor, unexpectedNodeFallback);\n            return (input: unknown) => {\n                if (!isObjectRecord(input)) {\n                    throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE, {\n                        actualType: formatValueType(input),\n                        expectedType: 'object',\n                        nodeKind: 'mapTypeNode',\n                    });\n                }\n                const result: Record<string, unknown> = {};\n                for (const [key, value] of Object.entries(input)) {\n                    result[key] = valueTransform(value);\n                }\n                return result;\n            };\n        },\n\n        // Primitive types (pass through)\n        visitNumberType() {\n            return (input: unknown) => input;\n        },\n\n        visitOptionType(node) {\n            const innerTransform = visitOrElse(node.item, visitor, unexpectedNodeFallback);\n            return (input: unknown) => {\n                if (input === null || input === undefined) return input;\n                return innerTransform(input);\n            };\n        },\n\n        visitPostOffsetType(node) {\n            return visitOrElse(node.type, visitor, unexpectedNodeFallback);\n        },\n\n        visitPreOffsetType(node) {\n            return visitOrElse(node.type, visitor, unexpectedNodeFallback);\n        },\n\n        visitPublicKeyType() {\n            return (input: unknown) => input;\n        },\n\n        visitRemainderOptionType(node) {\n            const innerTransform = visitOrElse(node.item, visitor, unexpectedNodeFallback);\n            return (input: unknown) => {\n                if (input === null || input === undefined) return input;\n                return innerTransform(input);\n            };\n        },\n\n        visitSentinelType(node) {\n            return visitOrElse(node.type, visitor, unexpectedNodeFallback);\n        },\n\n        visitSetType(node) {\n            // Sets are represented as arrays in dynamic-codecs\n            const itemTransform = visitOrElse(node.item, visitor, unexpectedNodeFallback);\n            return (input: unknown) => {\n                if (!Array.isArray(input)) {\n                    throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE, {\n                        actualType: formatValueType(input),\n                        expectedType: 'array',\n                        nodeKind: 'setTypeNode',\n                    });\n                }\n                return input.map(itemTransform);\n            };\n        },\n\n        visitSizePrefixType(node) {\n            return visitOrElse(node.type, visitor, unexpectedNodeFallback);\n        },\n\n        visitSolAmountType(node) {\n            return visitOrElse(node.number, visitor, unexpectedNodeFallback);\n        },\n\n        visitStringType() {\n            return (input: unknown) => input;\n        },\n\n        visitStructFieldType(node) {\n            return visitOrElse(node.type, visitor, unexpectedNodeFallback);\n        },\n\n        visitStructType(node) {\n            const fieldTransformers = node.fields.map(field => {\n                const transform = visitOrElse(field, visitor, unexpectedNodeFallback);\n                return { name: field.name, transform };\n            });\n            return (input: unknown) => {\n                if (!isObjectRecord(input)) {\n                    throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE, {\n                        actualType: formatValueType(input),\n                        expectedType: 'object',\n                        nodeKind: 'structTypeNode',\n                    });\n                }\n                const result = { ...input } as Record<string, unknown>;\n                for (const { name, transform } of fieldTransformers) {\n                    if (name in result) {\n                        result[name] = transform(result[name]);\n                    }\n                }\n                return result;\n            };\n        },\n\n        visitTupleType(node) {\n            const itemTransforms = node.items.map(item => visitOrElse(item, visitor, unexpectedNodeFallback));\n            return (input: unknown) => {\n                if (!Array.isArray(input)) {\n                    throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE, {\n                        actualType: formatValueType(input),\n                        expectedType: 'array',\n                        nodeKind: 'tupleTypeNode',\n                    });\n                }\n                if (input.length !== itemTransforms.length) {\n                    throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE, {\n                        actualType: `array(length:${input.length})`,\n                        expectedType: `array(length:${itemTransforms.length})`,\n                        nodeKind: 'tupleTypeNode',\n                    });\n                }\n                return input.map((value: unknown, index) => itemTransforms[index](value));\n            };\n        },\n\n        visitZeroableOptionType(node) {\n            const innerTransform = visitOrElse(node.item, visitor, unexpectedNodeFallback);\n            return (input: unknown) => {\n                if (input === null || input === undefined) return input;\n                return innerTransform(input);\n            };\n        },\n    };\n\n    return visitor;\n}\n\n/**\n * Creates a transformer function that converts user input to codec-compatible input format.\n * For example: user input Uint8Array for binary data but @codama/dynamic-codecs expects [BytesEncoding, string] as input\n *\n * @param typeNode - The Codama type node describing the expected structure\n * @param root - Root node for resolving definedTypeLinkNode references\n * @param options - Configuration options (encoding preference)\n * @returns Transformer function that converts input to codec format\n *\n * @example\n * const transformer = createInputValueTransformer(\n *     bytesTypeNode(),\n *     root,\n *     { bytesEncoding: 'base16' }\n * );\n *\n * const input = new Uint8Array([72, 101, 108, 108, 111]);\n * const transformed = transformer(input); // => ['base16', '48656c6c6f']\n * Usage with codec: codamaCodec.encode(['base16', '48656c6c6f'])\n */\nexport function createInputValueTransformer(\n    typeNode: TypeNode,\n    root: RootNode,\n    options?: InputValueTransformerOptions,\n): InputTransformer {\n    const visitor = createInputValueTransformerVisitor(root, options);\n    return visitOrElse(typeNode, visitor, unexpectedNodeFallback);\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/visitors/pda-seed-value.ts",
    "content": "import { getNodeCodec } from '@codama/dynamic-codecs';\nimport {\n    CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_DERIVE_PDA,\n    CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION,\n    CODAMA_ERROR__DYNAMIC_CLIENT__NODE_REFERENCE_NOT_FOUND,\n    CODAMA_ERROR__UNEXPECTED_NODE_KIND,\n    CodamaError,\n} from '@codama/errors';\nimport type { Address } from '@solana/addresses';\nimport type { ReadonlyUint8Array } from '@solana/codecs';\nimport type {\n    AccountValueNode,\n    ArgumentValueNode,\n    BooleanValueNode,\n    BytesValueNode,\n    ConstantValueNode,\n    NoneValueNode,\n    NumberValueNode,\n    ProgramIdValueNode,\n    PublicKeyValueNode,\n    SomeValueNode,\n    StringValueNode,\n    TypeNode,\n    Visitor,\n} from 'codama';\nimport { isNode, visitOrElse } from 'codama';\n\nimport { toAddress } from '../../shared/address';\nimport { getCodecFromBytesEncoding } from '../../shared/bytes-encoding';\nimport { getMemoizedAddressEncoder, getMemoizedBooleanEncoder, getMemoizedUtf8Codec } from '../../shared/codecs';\nimport { resolveAccountValueNodeAddress } from '../resolvers/resolve-account-value-node-address';\nimport type { BaseResolutionContext } from '../resolvers/types';\nimport { createInputValueTransformer } from './input-value-transformer';\n\nexport const PDA_SEED_VALUE_SUPPORTED_NODE_KINDS = [\n    'accountValueNode',\n    'argumentValueNode',\n    'booleanValueNode',\n    'bytesValueNode',\n    'constantValueNode',\n    'noneValueNode',\n    'numberValueNode',\n    'programIdValueNode',\n    'publicKeyValueNode',\n    'someValueNode',\n    'stringValueNode',\n] as const;\n\ntype PdaSeedValueSupportedNodeKind = (typeof PDA_SEED_VALUE_SUPPORTED_NODE_KINDS)[number];\n\ntype PdaSeedValueVisitorContext = BaseResolutionContext & {\n    programId: Address;\n    seedTypeNode?: TypeNode;\n};\n\n/**\n * Visitor for resolving PdaSeedValueNode value to raw bytes.\n * Supports recursive resolution of dependent PDAs (accounts that are themselves auto-derived PDAs).\n * This is used for both:\n * - Variable seeds (e.g. seeds based on instruction accounts/arguments), and\n * - Constant seeds (e.g. bytes/string/programId/publicKey constants).\n */\nexport function createPdaSeedValueVisitor(\n    ctx: PdaSeedValueVisitorContext,\n): Visitor<Promise<ReadonlyUint8Array>, PdaSeedValueSupportedNodeKind> {\n    const { root, ixNode, programId, seedTypeNode, resolversInput, resolutionPath } = ctx;\n    const accountsInput = ctx.accountsInput ?? {};\n    const argumentsInput = ctx.argumentsInput ?? {};\n\n    return {\n        visitAccountValue: async (node: AccountValueNode) => {\n            const resolvedAddress = await resolveAccountValueNodeAddress(node, {\n                accountsInput,\n                argumentsInput,\n                ixNode,\n                resolutionPath,\n                resolversInput,\n                root,\n            });\n\n            if (resolvedAddress === null) {\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_DERIVE_PDA, {\n                    accountName: node.name,\n                });\n            }\n\n            return getMemoizedAddressEncoder().encode(resolvedAddress);\n        },\n\n        visitArgumentValue: async (node: ArgumentValueNode) => {\n            const ixArgumentNode = ixNode.arguments.find(arg => arg.name === node.name);\n            if (!ixArgumentNode) {\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__NODE_REFERENCE_NOT_FOUND, {\n                    instructionName: ixNode.name,\n                    referencedName: node.name,\n                });\n            }\n            const argInput = argumentsInput[node.name];\n\n            // Use the PDA seed's declared type (e.g. plain stringTypeNode) rather than\n            // the instruction argument's type (e.g. sizePrefixTypeNode) so the seed\n            // bytes match what the on-chain program derives.\n            const typeNode = seedTypeNode ?? ixArgumentNode.type;\n\n            if (argInput === undefined || argInput === null) {\n                // optional remainderOptionTypeNode seeds encodes to zero bytes.\n                if (isNode(typeNode, 'remainderOptionTypeNode')) {\n                    return new Uint8Array(0);\n                }\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING, {\n                    argumentName: node.name,\n                    instructionName: ixNode.name,\n                });\n            }\n            const codec = getNodeCodec([root, root.program, ixNode, { ...ixArgumentNode, type: typeNode }]);\n            const transformer = createInputValueTransformer(typeNode, root, {\n                bytesEncoding: 'base16',\n            });\n            const transformedInput = transformer(argInput);\n            return await Promise.resolve(codec.encode(transformedInput));\n        },\n\n        visitBooleanValue: async (node: BooleanValueNode) =>\n            await Promise.resolve(getMemoizedBooleanEncoder().encode(node.boolean)),\n\n        visitBytesValue: async (node: BytesValueNode) => {\n            const encodedValue = getCodecFromBytesEncoding(node.encoding).encode(node.data);\n            return await Promise.resolve(encodedValue);\n        },\n\n        visitConstantValue: async (node: ConstantValueNode) => {\n            const innerVisitor = createPdaSeedValueVisitor(ctx);\n            return await visitOrElse(node.value, innerVisitor, innerNode => {\n                throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n                    expectedKinds: [...PDA_SEED_VALUE_SUPPORTED_NODE_KINDS],\n                    kind: innerNode.kind,\n                    node: innerNode,\n                });\n            });\n        },\n\n        visitNoneValue: async (_node: NoneValueNode) => await Promise.resolve(new Uint8Array(0)),\n\n        visitNumberValue: async (node: NumberValueNode) => {\n            // Sanity check: a violation here indicates a malformed IDL, not a user input error.\n            if (!Number.isInteger(node.number) || node.number < 0 || node.number > 0xff) {\n                throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION, {\n                    message: `NumberValueNode PDA seed is out of range: must be a valid u8 (0–255), got ${node.number}`,\n                });\n            }\n            return await Promise.resolve(new Uint8Array([node.number]));\n        },\n\n        visitProgramIdValue: async (_node: ProgramIdValueNode) => {\n            return await Promise.resolve(getMemoizedAddressEncoder().encode(toAddress(programId)));\n        },\n\n        visitPublicKeyValue: async (node: PublicKeyValueNode) => {\n            return await Promise.resolve(getMemoizedAddressEncoder().encode(toAddress(node.publicKey)));\n        },\n\n        visitSomeValue: async (node: SomeValueNode) => {\n            const innerVisitor = createPdaSeedValueVisitor(ctx);\n            return await visitOrElse(node.value, innerVisitor, innerNode => {\n                throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n                    expectedKinds: [...PDA_SEED_VALUE_SUPPORTED_NODE_KINDS],\n                    kind: innerNode.kind,\n                    node: innerNode,\n                });\n            });\n        },\n\n        visitStringValue: async (node: StringValueNode) =>\n            await Promise.resolve(getMemoizedUtf8Codec().encode(node.string)),\n    };\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/instruction-encoding/visitors/value-node-value.ts",
    "content": "import { CODAMA_ERROR__UNEXPECTED_NODE_KIND, CodamaError } from '@codama/errors';\nimport { address } from '@solana/addresses';\nimport type { Visitor } from 'codama';\nimport type {\n    ArrayValueNode,\n    BooleanValueNode,\n    BytesValueNode,\n    ConstantValueNode,\n    EnumValueNode,\n    MapValueNode,\n    NoneValueNode,\n    NumberValueNode,\n    PublicKeyValueNode,\n    SetValueNode,\n    SomeValueNode,\n    StringValueNode,\n    StructValueNode,\n    TupleValueNode,\n} from 'codama';\nimport { visitOrElse } from 'codama';\n\ntype ResolvedValue = {\n    encoding?: string;\n    kind: string;\n    value: unknown;\n};\n\nexport const VALUE_NODE_SUPPORTED_NODE_KINDS = [\n    'arrayValueNode',\n    'booleanValueNode',\n    'bytesValueNode',\n    'constantValueNode',\n    'enumValueNode',\n    'mapValueNode',\n    'noneValueNode',\n    'numberValueNode',\n    'publicKeyValueNode',\n    'setValueNode',\n    'someValueNode',\n    'stringValueNode',\n    'structValueNode',\n    'tupleValueNode',\n] as const;\n\ntype ValueNodeSupportedNodeKind = (typeof VALUE_NODE_SUPPORTED_NODE_KINDS)[number];\n\n/**\n * Visitor for resolving regular ValueNode types to their typed values.\n */\nexport function createValueNodeVisitor(): Visitor<ResolvedValue, ValueNodeSupportedNodeKind> {\n    const visitor: Visitor<ResolvedValue, ValueNodeSupportedNodeKind> = {\n        visitArrayValue: (node: ArrayValueNode) => ({\n            kind: node.kind,\n            value: node.items.map(item =>\n                visitOrElse(item, visitor, n => {\n                    throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n                        expectedKinds: [...VALUE_NODE_SUPPORTED_NODE_KINDS],\n                        kind: n.kind,\n                        node: n,\n                    });\n                }),\n            ),\n        }),\n\n        visitBooleanValue: (node: BooleanValueNode) => ({\n            kind: node.kind,\n            value: node.boolean,\n        }),\n\n        visitBytesValue: (node: BytesValueNode) => ({\n            encoding: node.encoding,\n            kind: node.kind,\n            value: node.data,\n        }),\n\n        visitConstantValue: (node: ConstantValueNode) => {\n            return visitOrElse(node.value, visitor, innerNode => {\n                throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n                    expectedKinds: [...VALUE_NODE_SUPPORTED_NODE_KINDS],\n                    kind: innerNode.kind,\n                    node: innerNode,\n                });\n            });\n        },\n\n        visitEnumValue: (node: EnumValueNode) => ({\n            kind: node.kind,\n            value: node.variant,\n        }),\n\n        visitMapValue: (node: MapValueNode) => ({\n            kind: node.kind,\n            value: node.entries.map(entry => ({\n                key: visitOrElse(entry.key, visitor, n => {\n                    throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n                        expectedKinds: [...VALUE_NODE_SUPPORTED_NODE_KINDS],\n                        kind: n.kind,\n                        node: n,\n                    });\n                }),\n                value: visitOrElse(entry.value, visitor, n => {\n                    throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n                        expectedKinds: [...VALUE_NODE_SUPPORTED_NODE_KINDS],\n                        kind: n.kind,\n                        node: n,\n                    });\n                }),\n            })),\n        }),\n\n        visitNoneValue: (node: NoneValueNode) => ({\n            kind: node.kind,\n            value: null,\n        }),\n\n        visitNumberValue: (node: NumberValueNode) => ({\n            kind: node.kind,\n            value: node.number,\n        }),\n\n        visitPublicKeyValue: (node: PublicKeyValueNode) => ({\n            kind: node.kind,\n            value: address(node.publicKey),\n        }),\n\n        visitSetValue: (node: SetValueNode) => ({\n            kind: node.kind,\n            value: node.items.map(item =>\n                visitOrElse(item, visitor, n => {\n                    throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n                        expectedKinds: [...VALUE_NODE_SUPPORTED_NODE_KINDS],\n                        kind: n.kind,\n                        node: n,\n                    });\n                }),\n            ),\n        }),\n\n        visitSomeValue: (node: SomeValueNode) => {\n            return visitOrElse(node.value, visitor, innerNode => {\n                throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n                    expectedKinds: [...VALUE_NODE_SUPPORTED_NODE_KINDS],\n                    kind: innerNode.kind,\n                    node: innerNode,\n                });\n            });\n        },\n\n        visitStringValue: (node: StringValueNode) => ({\n            kind: node.kind,\n            value: node.string,\n        }),\n\n        visitStructValue: (node: StructValueNode) => ({\n            kind: node.kind,\n            value: Object.fromEntries(\n                node.fields.map(field => [\n                    field.name,\n                    visitOrElse(field.value, visitor, n => {\n                        throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n                            expectedKinds: [...VALUE_NODE_SUPPORTED_NODE_KINDS],\n                            kind: n.kind,\n                            node: n,\n                        });\n                    }),\n                ]),\n            ),\n        }),\n\n        visitTupleValue: (node: TupleValueNode) => ({\n            kind: node.kind,\n            value: node.items.map(item =>\n                visitOrElse(item, visitor, n => {\n                    throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n                        expectedKinds: [...VALUE_NODE_SUPPORTED_NODE_KINDS],\n                        kind: n.kind,\n                        node: n,\n                    });\n                }),\n            ),\n        }),\n    };\n\n    return visitor;\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/program-client/collect-pdas.ts",
    "content": "import { isNode, type PdaNode, type RootNode } from 'codama';\n\n/**\n * Collects unique PDA definitions from the IDL.\n *\n * Scans both `root.program.pdas` (registered PDAs) and inline\n * `pdaValueNode > pdaNode` definitions inside instruction account\n * `defaultValue` nodes. Deduplicates by PDA name.\n */\nexport function collectPdaNodes(root: RootNode): Map<string, PdaNode> {\n    const pdas = new Map<string, PdaNode>();\n\n    for (const pda of root.program.pdas) {\n        pdas.set(pda.name, pda);\n    }\n\n    for (const ix of root.program.instructions) {\n        for (const acc of ix.accounts) {\n            if (!acc.defaultValue || !isNode(acc.defaultValue, 'pdaValueNode')) continue;\n            if (!isNode(acc.defaultValue.pda, 'pdaNode')) continue;\n            const pdaNode = acc.defaultValue.pda;\n            if (!pdas.has(pdaNode.name)) {\n                pdas.set(pdaNode.name, pdaNode);\n            }\n        }\n    }\n\n    return pdas;\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/program-client/create-program-client.ts",
    "content": "import {\n    CODAMA_ERROR__DYNAMIC_CLIENT__INSTRUCTION_NOT_FOUND,\n    CODAMA_ERROR__DYNAMIC_CLIENT__PDA_NOT_FOUND,\n    CodamaError,\n} from '@codama/errors';\nimport { type Address, address, type ProgramDerivedAddress } from '@solana/addresses';\nimport type { Instruction } from '@solana/instructions';\nimport type { InstructionNode, RootNode } from 'codama';\nimport { createFromJson, updateProgramsVisitor } from 'codama';\n\nimport type { AddressInput } from '../shared/address';\nimport { toAddress } from '../shared/address';\nimport type { AccountsInput, ArgumentsInput, ResolversInput } from '../shared/types';\nimport { collectPdaNodes } from './collect-pdas';\nimport { deriveStandalonePDA } from './derive-standalone-pda';\nimport { MethodsBuilder } from './methods-builder';\n\nexport type IdlInput = object | string;\n\nexport type CreateProgramClientOptions = {\n    /**\n     * Optional override for the program id.\n     * If not provided, uses `root.program.publicKey` from the IDL.\n     */\n    programId?: AddressInput;\n};\n\nexport type ProgramClient = {\n    /** Quick lookup by instruction name. */\n    instructions: Map<string, InstructionNode>;\n    /** Anchor-like facade namespace for building instructions. */\n    methods: Record<string, (args?: ArgumentsInput) => ProgramMethodBuilder>;\n    /** Anchor-like facade namespace for standalone PDA derivation. */\n    pdas?: Record<string, (seeds?: Record<string, unknown>) => Promise<ProgramDerivedAddress>>;\n    /** Program id as an `Address`. */\n    programAddress: Address;\n    /** Parsed Codama root node for advanced use-cases. */\n    root: RootNode;\n};\n\nexport type ProgramMethodBuilder = {\n    accounts(accounts: AccountsInput): ProgramMethodBuilder;\n    instruction(): Promise<Instruction>;\n    resolvers(resolvers: ResolversInput): ProgramMethodBuilder;\n    signers(signers: string[]): ProgramMethodBuilder;\n};\n\n/**\n * Creates a program client from a Codama IDL.\n *\n * For type safety, generate types and pass as a generic. See the README.md for details.\n */\nexport function createProgramClient<TClient = ProgramClient>(\n    idl: IdlInput,\n    options: CreateProgramClientOptions = {},\n): TClient {\n    const json = typeof idl === 'string' ? idl : JSON.stringify(idl);\n    const codama = createFromJson(json);\n\n    if (options.programId) {\n        codama.update(\n            updateProgramsVisitor({\n                [codama.getRoot().program.name]: {\n                    publicKey: toAddress(options.programId),\n                },\n            }),\n        );\n    }\n\n    const root = codama.getRoot();\n    const programAddress = address(root.program.publicKey);\n\n    const instructions = new Map<string, InstructionNode>();\n    for (const ix of root.program.instructions) {\n        instructions.set(ix.name, ix);\n    }\n\n    const methods = new Proxy(\n        {},\n        {\n            get(_target, prop) {\n                if (typeof prop !== 'string' || PASSTHROUGH_PROPS.has(prop)) return undefined;\n\n                const ixNode = instructions.get(prop);\n                if (!ixNode) {\n                    if (prop in Object.prototype) return undefined;\n                    throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__INSTRUCTION_NOT_FOUND, {\n                        availableIxs: [...instructions.keys()],\n                        instructionName: prop,\n                    });\n                }\n\n                return (args?: ArgumentsInput) => new MethodsBuilder(root, ixNode, args) as ProgramMethodBuilder;\n            },\n            has(target, prop) {\n                return Reflect.has(target, prop) || (typeof prop === 'string' && instructions.has(prop));\n            },\n        },\n    ) as ProgramClient['methods'];\n\n    const pdaNodes = collectPdaNodes(root);\n\n    const pdas =\n        pdaNodes.size === 0\n            ? undefined\n            : (new Proxy(\n                  {},\n                  {\n                      get(_target, prop) {\n                          if (typeof prop !== 'string' || PASSTHROUGH_PROPS.has(prop)) return undefined;\n\n                          const pdaNode = pdaNodes.get(prop);\n                          if (!pdaNode) {\n                              if (prop in Object.prototype) return undefined;\n                              const available = [...pdaNodes.keys()].join(', ');\n                              throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__PDA_NOT_FOUND, {\n                                  available,\n                                  pdaName: prop,\n                              });\n                          }\n\n                          return (seeds?: Record<string, unknown>) => deriveStandalonePDA(root, pdaNode, seeds);\n                      },\n                      has(target, prop) {\n                          return Reflect.has(target, prop) || (typeof prop === 'string' && pdaNodes.has(prop));\n                      },\n                  },\n              ) as ProgramClient['pdas']);\n\n    return {\n        instructions,\n        methods,\n        pdas,\n        programAddress,\n        root,\n    } as unknown as TClient;\n}\n\nconst PASSTHROUGH_PROPS = new Set<string>(['then', 'toJSON', 'valueOf', 'toString']);\n"
  },
  {
    "path": "packages/dynamic-client/src/program-client/derive-standalone-pda.ts",
    "content": "import { getNodeCodec } from '@codama/dynamic-codecs';\nimport {\n    CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE,\n    CODAMA_ERROR__UNEXPECTED_NODE_KIND,\n    CODAMA_ERROR__UNRECOGNIZED_NODE_KIND,\n    CodamaError,\n} from '@codama/errors';\nimport type { Address, ProgramDerivedAddress } from '@solana/addresses';\nimport { getProgramDerivedAddress } from '@solana/addresses';\nimport type { ReadonlyUint8Array } from '@solana/codecs';\nimport type { InstructionNode, PdaNode, RegisteredPdaSeedNode, RootNode, VariablePdaSeedNode } from 'codama';\nimport { camelCase, isNode, visitOrElse } from 'codama';\n\nimport {\n    createInputValueTransformer,\n    createPdaSeedValueVisitor,\n    PDA_SEED_VALUE_SUPPORTED_NODE_KINDS,\n} from '../instruction-encoding';\nimport { toAddress } from '../shared/address';\nimport { getMemoizedUtf8Encoder } from '../shared/codecs';\nimport { formatValueType, getMaybeNodeKind } from '../shared/util';\n\n/**\n * Minimal InstructionNode stub to satisfy constant PDA seeds requirements.\n * Constant seeds only use programIdValue / publicKeyValue / bytesValue / stringValue, none of which reference instruction arguments or accounts\n */\nconst STANDALONE_IX_NODE: InstructionNode = {\n    accounts: [],\n    arguments: [],\n    kind: 'instructionNode',\n    name: '__standalone__' as InstructionNode['name'],\n};\n\n/**\n * Derives a PDA from a standalone `PdaNode` and user-supplied seed values,\n * without requiring an instruction context.\n */\nexport async function deriveStandalonePDA(\n    root: RootNode,\n    pdaNode: PdaNode,\n    seedInputs: Record<string, unknown> = {},\n): Promise<ProgramDerivedAddress> {\n    const programAddress = toAddress(pdaNode.programId || root.program.publicKey);\n    const seedValues = await Promise.all(\n        pdaNode.seeds.map(async (seedNode): Promise<ReadonlyUint8Array> => {\n            if (seedNode.kind === 'constantPdaSeedNode') {\n                return await resolveStandaloneConstantSeed(root, programAddress, seedNode);\n            }\n            if (seedNode.kind === 'variablePdaSeedNode') {\n                return await resolveStandaloneVariableSeed(root, seedNode, seedInputs);\n            }\n            throw new CodamaError(CODAMA_ERROR__UNRECOGNIZED_NODE_KIND, {\n                kind: getMaybeNodeKind(seedNode) ?? 'unknown',\n            });\n        }),\n    );\n\n    return await getProgramDerivedAddress({ programAddress, seeds: seedValues });\n}\n\nfunction resolveStandaloneConstantSeed(\n    root: RootNode,\n    programAddress: Address,\n    seedNode: RegisteredPdaSeedNode,\n): Promise<ReadonlyUint8Array> {\n    if (!isNode(seedNode, 'constantPdaSeedNode')) {\n        throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n            expectedKinds: ['constantPdaSeedNode'],\n            kind: seedNode.kind,\n            node: seedNode,\n        });\n    }\n    const visitor = createPdaSeedValueVisitor({\n        accountsInput: undefined,\n        argumentsInput: undefined,\n        ixNode: STANDALONE_IX_NODE,\n        programId: programAddress,\n        resolutionPath: [],\n        resolversInput: undefined,\n        root,\n    });\n    return visitOrElse(seedNode.value, visitor, node => {\n        throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n            expectedKinds: Array.from(PDA_SEED_VALUE_SUPPORTED_NODE_KINDS),\n            kind: node.kind,\n            node,\n        });\n    });\n}\n\nfunction resolveStandaloneVariableSeed(\n    root: RootNode,\n    seedNode: VariablePdaSeedNode,\n    seedInputs: Record<string, unknown>,\n): Promise<ReadonlyUint8Array> {\n    const input = seedInputs[seedNode.name];\n    const typeNode = seedNode.type;\n\n    // remainderOptionTypeNode seeds are optional — null means zero bytes.\n    if (input === undefined || input === null) {\n        if (isNode(typeNode, 'remainderOptionTypeNode')) {\n            return Promise.resolve(new Uint8Array(0));\n        }\n        throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING, {\n            argumentName: seedNode.name,\n            instructionName: camelCase('standaloneSeedNode'),\n        });\n    }\n\n    // For simple string seeds encode directly with UTF-8 (no length prefix)\n    if (isNode(typeNode, 'stringTypeNode')) {\n        if (typeof input !== 'string') {\n            throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE, {\n                actualType: formatValueType(input),\n                expectedType: 'string',\n                nodeKind: 'stringTypeNode',\n            });\n        }\n        return Promise.resolve(getMemoizedUtf8Encoder().encode(input));\n    }\n\n    // Create a synthetic instructionArgumentNode so getNodeCodec can resolve the type.\n    // The seed's declared type is used directly (no size-prefix wrapper).\n    const syntheticArgNode = createSyntheticArgNode(seedNode);\n    const codec = getNodeCodec([root, root.program, syntheticArgNode]);\n    const transformer = createInputValueTransformer(typeNode, root, { bytesEncoding: 'base16' });\n    const transformedInput = transformer(input);\n    return Promise.resolve(codec.encode(transformedInput));\n}\n\nfunction createSyntheticArgNode(seedNode: VariablePdaSeedNode) {\n    return {\n        docs: [] as string[],\n        kind: 'instructionArgumentNode' as const,\n        name: seedNode.name,\n        type: seedNode.type,\n    };\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/program-client/methods-builder.ts",
    "content": "import type { Instruction } from '@solana/instructions';\nimport type { InstructionNode, RootNode } from 'codama';\n\nimport { createIxBuilder } from '../instruction-encoding/instructions';\nimport type { AccountsInput, ArgumentsInput, EitherSigners, ResolversInput } from '../shared/types';\n\nexport class MethodsBuilder {\n    private _accounts?: AccountsInput;\n    // \"either\" signers Account names\n    private _signers?: EitherSigners;\n    // Custom resolver functions for ResolverValueNode\n    private _resolvers?: ResolversInput;\n\n    constructor(\n        private readonly root: RootNode,\n        private readonly ixNode: InstructionNode,\n        private readonly args?: ArgumentsInput,\n    ) {}\n\n    accounts(accounts: AccountsInput) {\n        this._accounts = accounts;\n        return this;\n    }\n\n    // Explicitly provide Account names which must be Signers.\n    // This is to help InstructionAccountNode resolution with ambiguous isSigner: \"either\". Other signers will be auto-resolved\n    signers(signers: EitherSigners) {\n        this._signers = signers;\n        return this;\n    }\n\n    resolvers(resolvers: ResolversInput) {\n        this._resolvers = resolvers;\n        return this;\n    }\n\n    async instruction(): Promise<Instruction> {\n        const build = createIxBuilder(this.root, this.ixNode);\n        return await build(this.args, this._accounts, this._signers, this._resolvers);\n    }\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/shared/address.ts",
    "content": "import { CODAMA_ERROR__DYNAMIC_CLIENT__CANNOT_CONVERT_TO_ADDRESS, CodamaError } from '@codama/errors';\nimport type { Address } from '@solana/addresses';\nimport { address, isAddress } from '@solana/addresses';\n\nimport { safeStringify } from './util';\n\n/**\n * Accept both modern Address strings and legacy PublicKey-like objects.\n * We intentionally use duck-typing to avoid hard dependency on @solana/web3.js types.\n */\nexport type PublicKeyLike = { toBase58(): string };\n\nexport type AddressInput = Address | PublicKeyLike | string;\n\nexport function isPublicKeyLike(value: unknown): value is PublicKeyLike {\n    const obj = value as Record<string, unknown>;\n    return typeof value === 'object' && value !== null && 'toBase58' in obj && typeof obj.toBase58 === 'function';\n}\n\nexport function toAddress(input: AddressInput): Address {\n    if (isPublicKeyLike(input)) return address(input.toBase58());\n    if (typeof input === 'string' && isAddress(input)) return address(input);\n\n    throw new CodamaError(CODAMA_ERROR__DYNAMIC_CLIENT__CANNOT_CONVERT_TO_ADDRESS, {\n        value: safeStringify(input),\n    });\n}\n\nexport function isConvertibleAddress(value: unknown): value is AddressInput {\n    if (value == null) return false;\n    return isPublicKeyLike(value) || (typeof value === 'string' && isAddress(value));\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/shared/bytes-encoding.ts",
    "content": "import { CODAMA_ERROR__UNRECOGNIZED_BYTES_ENCODING, CodamaError } from '@codama/errors';\nimport type { BytesEncoding } from 'codama';\n\nimport { getMemoizedBase16Codec, getMemoizedBase58Codec, getMemoizedBase64Codec, getMemoizedUtf8Codec } from './codecs';\nimport { safeStringify } from './util';\n\n/**\n * Converts Uint8Array to encoded string based on encoding type.\n * Uses @solana/codecs encoders internally for consistent encoding/decoding.\n */\nexport function uint8ArrayToEncodedString(bytes: Uint8Array, encoding: BytesEncoding): string {\n    const codec = getCodecFromBytesEncoding(encoding);\n    return codec.decode(bytes);\n}\n\n/**\n * Gets the appropriate codec for a given bytes encoding format.\n */\nexport function getCodecFromBytesEncoding(encoding: BytesEncoding) {\n    switch (encoding) {\n        case 'base16':\n            return getMemoizedBase16Codec();\n        case 'base58':\n            return getMemoizedBase58Codec();\n        case 'base64':\n            return getMemoizedBase64Codec();\n        case 'utf8':\n            return getMemoizedUtf8Codec();\n        default:\n            throw new CodamaError(CODAMA_ERROR__UNRECOGNIZED_BYTES_ENCODING, {\n                encoding: safeStringify(encoding as unknown),\n            });\n    }\n}\n/**\n * Type guard to check if a value is a Uint8Array.\n */\nexport function isUint8Array(value: unknown): value is Uint8Array {\n    return value instanceof Uint8Array;\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/shared/codecs.ts",
    "content": "import { getAddressEncoder } from '@solana/addresses';\nimport type { Encoder } from '@solana/codecs';\nimport {\n    getBase16Codec,\n    getBase58Codec,\n    getBase64Codec,\n    getBooleanEncoder,\n    getUtf8Codec,\n    getUtf8Encoder,\n} from '@solana/codecs';\n\n// Memoized encoders and codecs to avoid unnecessary re-instantiation.\n\nlet addressEncoder: ReturnType<typeof getAddressEncoder> | undefined;\nexport function getMemoizedAddressEncoder() {\n    if (!addressEncoder) addressEncoder = getAddressEncoder();\n    return addressEncoder;\n}\n\nlet utf8Encoder: ReturnType<typeof getUtf8Encoder> | undefined;\nexport function getMemoizedUtf8Encoder() {\n    if (!utf8Encoder) utf8Encoder = getUtf8Encoder();\n    return utf8Encoder;\n}\n\nlet booleanEncoder: Encoder<boolean> | undefined;\nexport function getMemoizedBooleanEncoder() {\n    if (!booleanEncoder) booleanEncoder = getBooleanEncoder();\n    return booleanEncoder;\n}\n\nlet utf8Codec: ReturnType<typeof getUtf8Codec> | undefined;\nexport function getMemoizedUtf8Codec() {\n    if (!utf8Codec) utf8Codec = getUtf8Codec();\n    return utf8Codec;\n}\n\nlet base16Codec: ReturnType<typeof getBase16Codec> | undefined;\nexport function getMemoizedBase16Codec() {\n    if (!base16Codec) base16Codec = getBase16Codec();\n    return base16Codec;\n}\n\nlet base58Codec: ReturnType<typeof getBase58Codec> | undefined;\nexport function getMemoizedBase58Codec() {\n    if (!base58Codec) base58Codec = getBase58Codec();\n    return base58Codec;\n}\n\nlet base64Codec: ReturnType<typeof getBase64Codec> | undefined;\nexport function getMemoizedBase64Codec() {\n    if (!base64Codec) base64Codec = getBase64Codec();\n    return base64Codec;\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/shared/nodes.ts",
    "content": "export const OPTIONAL_NODE_KINDS = ['optionTypeNode', 'zeroableOptionTypeNode', 'remainderOptionTypeNode'];\n"
  },
  {
    "path": "packages/dynamic-client/src/shared/types.ts",
    "content": "import type { Instruction } from '@solana/instructions';\n\nimport type { AddressInput } from './address';\n\n// Note: optional accounts may be explicitly set to null.\nexport type AccountsInput = Partial<Record<string, AddressInput | null>>;\nexport type ArgumentsInput = Partial<Record<string, unknown>>;\ntype AccountName = string;\nexport type EitherSigners = AccountName[];\n\nexport type ResolverFn = (argumentsInput: ArgumentsInput, accountsInput: AccountsInput) => Promise<unknown>;\nexport type ResolversInput = Record<string, ResolverFn>;\n\ntype TBuildIxFn<TInstruction> = (\n    argumentsInput?: ArgumentsInput,\n    accountsInput?: AccountsInput,\n    signers?: EitherSigners,\n    resolversInput?: ResolversInput,\n) => Promise<TInstruction>;\nexport type BuildIxFn = TBuildIxFn<Instruction>;\n"
  },
  {
    "path": "packages/dynamic-client/src/shared/util.ts",
    "content": "import type { NodeKind } from 'codama';\n\n/**\n * Checks if a value is a plain object record (struct-like).\n */\nexport function isObjectRecord(value: unknown): value is Record<string, unknown> {\n    return typeof value === 'object' && value !== null && Object.getPrototypeOf(value) === Object.prototype;\n}\n\n/** Returns the `NodeKind` of a node or `null`. */\nexport function getMaybeNodeKind(node: unknown): NodeKind | null {\n    if (!isObjectRecord(node)) return null;\n    return (node as { kind: NodeKind }).kind ?? null;\n}\n\nexport function formatValueType(value: unknown): string {\n    if (value === null) return 'null';\n    if (Array.isArray(value)) return `array (length ${value.length})`;\n    if (value instanceof Uint8Array) return `Uint8Array (length ${value.length})`;\n    if (typeof value === 'object') return 'object';\n    return typeof value;\n}\n\n/**\n * Serializes a value for use in error messages and diagnostic output.\n * Converts BigInt to strings, always returns a string and never throws.\n */\nexport function safeStringify(value: unknown): string {\n    try {\n        return JSON.stringify(value, (_key, v: unknown) => (typeof v === 'bigint' ? String(v) : v));\n    } catch {\n        return `non-serializable ${formatValueType(value)}`;\n    }\n}\n"
  },
  {
    "path": "packages/dynamic-client/src/types/index.ts",
    "content": "export type { AddressInput, PublicKeyLike } from '../shared/address';\nexport type { AccountsInput, ArgumentsInput } from '../shared/types';\nexport type {\n    CreateProgramClientOptions,\n    IdlInput,\n    ProgramClient,\n    ProgramMethodBuilder,\n} from '../program-client/create-program-client';\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/anchor/Anchor.toml",
    "content": "[toolchain]\n\n[features]\nresolution = true\nskip-lint = false\n\n[programs.localnet]\nanchor-codama = \"5xjPsgMHuoj4MrAPJVBrTomk5UAZvCxVtAdcWwgheoZs\"\nblog = \"1rAs9KgDjEnMVrU1nJPWVhN4b6W4VEBxzcNJoeJpbVR\"\n\n[registry]\nurl = \"https://api.apr.dev\"\n\n[provider]\ncluster = \"Localnet\"\nwallet = \"~/.config/solana/id.json\"\n\n[scripts]\ntest = \"pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.spec.ts\"\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/anchor/Cargo.toml",
    "content": "[workspace]\nmembers = [\"programs/*\"]\nresolver = \"2\"\n\n[profile.release]\noverflow-checks = true\nlto = \"fat\"\ncodegen-units = 1\n[profile.release.build-override]\nopt-level = 3\nincremental = false\ncodegen-units = 1\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/anchor/programs/blog/Cargo.toml",
    "content": "[package]\nname = \"blog\"\nversion = \"0.1.0\"\ndescription = \"Created with Anchor\"\nedition = \"2021\"\n\n[lib]\ncrate-type = [\"cdylib\", \"lib\"]\nname = \"blog\"\n\n\n[features]\ndefault = []\ncpi = [\"no-entrypoint\"]\nno-entrypoint = []\nno-idl = []\nno-log-ix-name = []\nidl-build = [\"anchor-lang/idl-build\"]\n\n\n[dependencies]\nanchor-lang = \"=0.32.1\"\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/anchor/programs/blog/Xargo.toml",
    "content": "[target.bpfel-unknown-unknown.dependencies.std]\nfeatures = []\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/anchor/programs/blog/src/lib.rs",
    "content": "#![allow(unexpected_cfgs)]\nuse anchor_lang::prelude::*;\n\ndeclare_id!(\"1rAs9KgDjEnMVrU1nJPWVhN4b6W4VEBxzcNJoeJpbVR\");\n\n#[program]\npub mod blog {\n    use super::*;\n\n    pub fn create_profile(ctx: Context<CreateProfile>, username: String) -> Result<()> {\n        let profile = &mut ctx.accounts.profile;\n        profile.authority = ctx.accounts.authority.key();\n        profile.username = username;\n        profile.post_count = 0;\n        profile.bump = ctx.bumps.profile;\n        Ok(())\n    }\n\n    pub fn create_post(\n        ctx: Context<CreatePost>,\n        title: String,\n        content: String,\n    ) -> Result<()> {\n        let profile = &mut ctx.accounts.profile;\n        let post = &mut ctx.accounts.post;\n\n        post.author = profile.key();\n        post.id = profile.post_count;\n        post.title = title;\n        post.content = content;\n        post.bump = ctx.bumps.post;\n\n        profile.post_count += 1;\n        Ok(())\n    }\n\n    pub fn update_post(\n        ctx: Context<UpdatePost>,\n        _post_id: u64,\n        title: String,\n        content: String,\n    ) -> Result<()> {\n        let post = &mut ctx.accounts.post;\n        post.title = title;\n        post.content = content;\n        Ok(())\n    }\n\n    pub fn create_category(ctx: Context<CreateCategory>, name: String) -> Result<()> {\n        let category = &mut ctx.accounts.category;\n        category.creator = ctx.accounts.creator.key();\n        category.name = name;\n        category.bump = ctx.bumps.category;\n        Ok(())\n    }\n\n    pub fn subscribe(ctx: Context<Subscribe>) -> Result<()> {\n        let subscription = &mut ctx.accounts.subscription;\n        subscription.follower = ctx.accounts.follower.key();\n        subscription.author = ctx.accounts.author.key();\n        subscription.bump = ctx.bumps.subscription;\n        Ok(())\n    }\n\n    pub fn react(ctx: Context<React>, kind: u8) -> Result<()> {\n        let reaction = &mut ctx.accounts.reaction;\n        reaction.post = ctx.accounts.post.key();\n        reaction.user = ctx.accounts.user.key();\n        reaction.kind = kind;\n        reaction.bump = ctx.bumps.reaction;\n        Ok(())\n    }\n\n    pub fn create_daily_digest(\n        ctx: Context<CreateDailyDigest>,\n        year: u16,\n        month: u8,\n        day: u8,\n    ) -> Result<()> {\n        let digest = &mut ctx.accounts.daily_digest;\n        digest.profile = ctx.accounts.profile.key();\n        digest.year = year;\n        digest.month = month;\n        digest.day = day;\n        digest.post_count = 0;\n        digest.bump = ctx.bumps.daily_digest;\n        Ok(())\n    }\n\n    pub fn create_access_grant(\n        ctx: Context<CreateAccessGrant>,\n        permissions: [u8; 4],\n    ) -> Result<()> {\n        let grant = &mut ctx.accounts.access_grant;\n        grant.profile = ctx.accounts.profile.key();\n        grant.permissions = permissions;\n        grant.bump = ctx.bumps.access_grant;\n        Ok(())\n    }\n\n    pub fn create_bookmark_list(\n        ctx: Context<CreateBookmarkList>,\n        bookmarks: Vec<Pubkey>,\n    ) -> Result<()> {\n        let list = &mut ctx.accounts.bookmark_list;\n        list.owner = ctx.accounts.owner.key();\n        list.bookmarks = bookmarks;\n        list.bump = ctx.bumps.bookmark_list;\n        Ok(())\n    }\n}\n\n#[derive(Accounts)]\n#[instruction(username: String)]\npub struct CreateProfile<'info> {\n    #[account(mut)]\n    pub authority: Signer<'info>,\n    #[account(\n        init,\n        payer = authority,\n        space = 8 + Profile::INIT_SPACE,\n        seeds = [b\"profile\", authority.key().as_ref()],\n        bump\n    )]\n    pub profile: Account<'info, Profile>,\n    pub system_program: Program<'info, System>,\n}\n\n#[derive(Accounts)]\n#[instruction(title: String, content: String)]\npub struct CreatePost<'info> {\n    #[account(mut)]\n    pub authority: Signer<'info>,\n    #[account(\n        mut,\n        seeds = [b\"profile\", authority.key().as_ref()],\n        bump = profile.bump,\n        has_one = authority,\n    )]\n    pub profile: Account<'info, Profile>,\n    #[account(\n        init,\n        payer = authority,\n        space = 8 + Post::INIT_SPACE,\n        seeds = [b\"post\", profile.key().as_ref(), &profile.post_count.to_le_bytes()],\n        bump\n    )]\n    pub post: Account<'info, Post>,\n    pub system_program: Program<'info, System>,\n}\n\n#[derive(Accounts)]\n#[instruction(post_id: u64)]\npub struct UpdatePost<'info> {\n    pub authority: Signer<'info>,\n    #[account(\n        seeds = [b\"profile\", authority.key().as_ref()],\n        bump = profile.bump,\n        has_one = authority,\n    )]\n    pub profile: Account<'info, Profile>,\n    #[account(\n        mut,\n        seeds = [b\"post\", profile.key().as_ref(), &post_id.to_le_bytes()],\n        bump = post.bump,\n        has_one = author,\n    )]\n    pub post: Account<'info, Post>,\n    /// CHECK: validated via has_one on post\n    pub author: UncheckedAccount<'info>,\n}\n\n#[derive(Accounts)]\n#[instruction(name: String)]\npub struct CreateCategory<'info> {\n    #[account(mut)]\n    pub creator: Signer<'info>,\n    #[account(\n        init,\n        payer = creator,\n        space = 8 + Category::INIT_SPACE,\n        seeds = [b\"category\", name.as_bytes()],\n        bump\n    )]\n    pub category: Account<'info, Category>,\n    pub system_program: Program<'info, System>,\n}\n\n#[derive(Accounts)]\npub struct Subscribe<'info> {\n    #[account(mut)]\n    pub follower: Signer<'info>,\n    /// CHECK: the author profile being followed\n    pub author: UncheckedAccount<'info>,\n    #[account(\n        init,\n        payer = follower,\n        space = 8 + Subscription::INIT_SPACE,\n        seeds = [b\"sub\", follower.key().as_ref(), author.key().as_ref()],\n        bump\n    )]\n    pub subscription: Account<'info, Subscription>,\n    pub system_program: Program<'info, System>,\n}\n\n#[derive(Accounts)]\n#[instruction(kind: u8)]\npub struct React<'info> {\n    #[account(mut)]\n    pub user: Signer<'info>,\n    /// CHECK: the post being reacted to\n    pub post: UncheckedAccount<'info>,\n    #[account(\n        init,\n        payer = user,\n        space = 8 + Reaction::INIT_SPACE,\n        seeds = [b\"reaction\", post.key().as_ref(), user.key().as_ref(), &kind.to_le_bytes()],\n        bump\n    )]\n    pub reaction: Account<'info, Reaction>,\n    pub system_program: Program<'info, System>,\n}\n\n#[derive(Accounts)]\n#[instruction(year: u16, month: u8, day: u8)]\npub struct CreateDailyDigest<'info> {\n    #[account(mut)]\n    pub authority: Signer<'info>,\n    #[account(\n        seeds = [b\"profile\", authority.key().as_ref()],\n        bump = profile.bump,\n        has_one = authority,\n    )]\n    pub profile: Account<'info, Profile>,\n    #[account(\n        init,\n        payer = authority,\n        space = 8 + DailyDigest::INIT_SPACE,\n        seeds = [b\"digest\", profile.key().as_ref(), &year.to_le_bytes(), &month.to_le_bytes(), &day.to_le_bytes()],\n        bump\n    )]\n    pub daily_digest: Account<'info, DailyDigest>,\n    pub system_program: Program<'info, System>,\n}\n\n#[account]\n#[derive(InitSpace)]\npub struct Profile {\n    pub authority: Pubkey,\n    #[max_len(32)]\n    pub username: String,\n    pub post_count: u64,\n    pub bump: u8,\n}\n\n#[account]\n#[derive(InitSpace)]\npub struct Post {\n    pub author: Pubkey,\n    pub id: u64,\n    #[max_len(64)]\n    pub title: String,\n    #[max_len(512)]\n    pub content: String,\n    pub bump: u8,\n}\n\n#[account]\n#[derive(InitSpace)]\npub struct Category {\n    pub creator: Pubkey,\n    #[max_len(32)]\n    pub name: String,\n    pub bump: u8,\n}\n\n#[account]\n#[derive(InitSpace)]\npub struct Subscription {\n    pub follower: Pubkey,\n    pub author: Pubkey,\n    pub bump: u8,\n}\n\n#[account]\n#[derive(InitSpace)]\npub struct Reaction {\n    pub post: Pubkey,\n    pub user: Pubkey,\n    pub kind: u8,\n    pub bump: u8,\n}\n\n#[derive(Accounts)]\n#[instruction(permissions: [u8; 4])]\npub struct CreateAccessGrant<'info> {\n    #[account(mut)]\n    pub authority: Signer<'info>,\n    #[account(\n        seeds = [b\"profile\", authority.key().as_ref()],\n        bump = profile.bump,\n        has_one = authority,\n    )]\n    pub profile: Account<'info, Profile>,\n    #[account(\n        init,\n        payer = authority,\n        space = 8 + AccessGrant::INIT_SPACE,\n        seeds = [b\"grant\", profile.key().as_ref(), permissions.as_ref()],\n        bump\n    )]\n    pub access_grant: Account<'info, AccessGrant>,\n    pub system_program: Program<'info, System>,\n}\n\n#[derive(Accounts)]\n#[instruction(bookmarks: Vec<Pubkey>)]\npub struct CreateBookmarkList<'info> {\n    #[account(mut)]\n    pub owner: Signer<'info>,\n    #[account(\n        init,\n        payer = owner,\n        space = 8 + BookmarkList::INIT_SPACE,\n        seeds = [b\"bookmarks\", owner.key().as_ref()],\n        bump\n    )]\n    pub bookmark_list: Account<'info, BookmarkList>,\n    pub system_program: Program<'info, System>,\n}\n\n#[account]\n#[derive(InitSpace)]\npub struct DailyDigest {\n    pub profile: Pubkey,\n    pub year: u16,\n    pub month: u8,\n    pub day: u8,\n    pub post_count: u8,\n    pub bump: u8,\n}\n\n#[account]\n#[derive(InitSpace)]\npub struct AccessGrant {\n    pub profile: Pubkey,\n    pub permissions: [u8; 4],\n    pub bump: u8,\n}\n\n#[account]\n#[derive(InitSpace)]\npub struct BookmarkList {\n    pub owner: Pubkey,\n    #[max_len(10)]\n    pub bookmarks: Vec<Pubkey>,\n    pub bump: u8,\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/anchor/programs/example/Cargo.toml",
    "content": "[package]\nname = \"example\"\nversion = \"0.1.0\"\ndescription = \"Created with Anchor\"\nedition = \"2021\"\n\n[lib]\ncrate-type = [\"cdylib\", \"lib\"]\nname = \"example\"\n\n\n[features]\ndefault = []\ncpi = [\"no-entrypoint\"]\nno-entrypoint = []\nno-idl = []\nno-log-ix-name = []\nidl-build = [\"anchor-lang/idl-build\", \"anchor-spl/idl-build\"]\n\n\n[dependencies]\nanchor-lang = \"=0.32.1\"\nanchor-spl = \"=0.32.1\""
  },
  {
    "path": "packages/dynamic-client/test/programs/anchor/programs/example/Xargo.toml",
    "content": "[target.bpfel-unknown-unknown.dependencies.std]\nfeatures = []\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/anchor/programs/example/src/lib.rs",
    "content": "#![allow(unexpected_cfgs)]\nuse anchor_lang::prelude::*;\n\nuse anchor_spl::{token::{Token, Mint, TokenAccount}, associated_token::AssociatedToken};\nmod nested_example;\npub use nested_example::*;\n\ndeclare_id!(\"5xjPsgMHuoj4MrAPJVBrTomk5UAZvCxVtAdcWwgheoZs\");\n\n#[program]\npub mod example {\n    use super::*;\n\n    pub fn pubkey_seed_ix(ctx: Context<PubkeySeedIx>, input: u64) -> Result<()> {\n        ctx.accounts.new_account.input = input;\n        ctx.accounts.new_account.bump = ctx.bumps.new_account;\n        Ok(())\n    }\n\n    pub fn update_optional_input(\n        ctx: Context<UpdateOptionalInput>,\n        input: u64,\n        optional_input: Option<Pubkey>,\n    ) -> Result<()> {\n        ctx.accounts.existing_account.input = input;\n        ctx.accounts.existing_account.optional_input = optional_input;\n        Ok(())\n    }\n\n    pub fn update_optional_account(ctx: Context<UpdateOptionalAccount>, _id: u64) -> Result<()> {\n        ctx.accounts.created_optional_acc.optional_acc =\n            ctx.accounts.optional_acc_key.as_ref().map(|acc| acc.key());\n        Ok(())\n    }\n\n    pub fn no_arguments(_ctx: Context<NoArguments>) -> Result<()> {\n        Ok(())\n    }\n\n    pub fn external_programs_with_pda(_ctx: Context<ExternalProgramsWithPdaIx>) -> Result<()> {\n        Ok(())\n    }\n\n    pub fn four_level_pda(_ctx: Context<FourLevelPda>) -> Result<()> {\n        Ok(())\n    }\n\n    pub fn self_reference_pda(_ctx: Context<SelfReferencePda>) -> Result<()> {\n        Ok(())\n    }\n\n    pub fn two_node_cycle_pda(_ctx: Context<TwoNodeCyclePda>) -> Result<()> {\n        Ok(())\n    }\n\n    pub fn nested_example(ctx: Context<NestedStructsAndEnums>, input: StructAndEnumsInput) -> Result<()> {\n        nested_example::handler(ctx, input)\n    }\n\n    pub fn string_seed_pda(ctx: Context<StringSeedPda>, _name: String, id: u64) -> Result<()> {\n        ctx.accounts.pda_account.input = id;\n        ctx.accounts.pda_account.bump = ctx.bumps.pda_account;\n        Ok(())\n    }\n}\n\n#[derive(Accounts)]\npub struct PubkeySeedIx<'info> {\n    #[account(mut)]\n    pub signer: Signer<'info>,\n    #[account(\n        init,\n        payer = signer,\n        space = 8 + 8 + 1 + 32 + 1,\n        seeds = [b\"seed\", signer.key().as_ref()],\n        bump\n    )]\n    pub new_account: Account<'info, DataAccount1>,\n    pub system_program: Program<'info, System>,\n}\n\n#[account]\n#[derive(InitSpace)]\npub struct DataAccount1 {\n    input: u64,\n    optional_input: Option<Pubkey>,\n    bump: u8,\n}\n\n#[derive(Accounts)]\npub struct UpdateOptionalInput<'info> {\n    pub signer: Signer<'info>,\n    #[account(\n        mut,\n        seeds = [b\"seed\", signer.key().as_ref()],\n        bump = existing_account.bump\n    )]\n    pub existing_account: Account<'info, DataAccount1>,\n}\n\n#[derive(Accounts)]\n#[instruction(id: u64)]\npub struct UpdateOptionalAccount<'info> {\n    #[account(mut)]\n    pub signer: Signer<'info>,\n    #[account(\n        init,\n        seeds = [b\"optional_acc\".as_ref(), &id.to_le_bytes()],\n        payer = signer,\n        space = 8 + StoreOptionalAccount::INIT_SPACE,\n        bump,\n    )]\n    pub created_optional_acc: Account<'info, StoreOptionalAccount>,\n    pub optional_acc_key: Option<UncheckedAccount<'info>>,\n    pub system_program: Program<'info, System>,\n}\n\n#[derive(Accounts)]\npub struct NoArguments<'info> {\n    #[account(mut)]\n    pub signer: Signer<'info>,\n    #[account(\n        init,\n        payer = signer,\n        space = 8 + StoreOptionalAccount::INIT_SPACE,\n    )]\n    pub acc: Account<'info, StoreOptionalAccount>,\n    pub system_program: Program<'info, System>,\n}\n\n#[account]\n#[derive(InitSpace)]\npub struct StoreOptionalAccount {\n    optional_acc: Option<Pubkey>,\n}\n\n#[derive(Accounts)]\npub struct ExternalProgramsWithPdaIx<'info> {\n    #[account(mut)]\n    pub signer: Signer<'info>,\n\n    // mint and token_account are to check auto-resolution with external program\n    #[account(\n        init,\n        payer = signer,\n        mint::decimals = 9,\n        mint::authority = signer,\n    )]\n    pub mint: Account<'info, Mint>,\n    #[account(\n        init,\n        payer = signer,\n        associated_token::mint = mint,\n        associated_token::authority = signer,\n    )]\n    pub token_account: Account<'info, TokenAccount>,\n\n    // dependent_account to check that auto-resolution and seeds derivation from both:\n    // signer (accountInput) and token_account (another auto-derived account)\n    #[account(\n        init,\n        payer = signer,\n        space = 8 + DataAccount1::INIT_SPACE,\n        seeds = [b\"signer_and_ata\", signer.key().as_ref(), token_account.key().as_ref()],\n        bump\n    )]\n    pub dependent_account: Account<'info, DataAccount1>,\n\n    pub system_program: Program<'info, System>,\n    pub token_program: Program<'info, Token>,\n    pub associated_token_program: Program<'info, AssociatedToken>,\n    pub rent: Sysvar<'info, Rent>,\n}\n\n#[derive(Accounts)]\npub struct FourLevelPda<'info> {\n    #[account(mut)]\n    pub signer: Signer<'info>,\n\n    #[account(\n        init,\n        payer = signer,\n        space = 8 + DataAccount1::INIT_SPACE,\n        seeds = [b\"level1\", signer.key().as_ref()],\n        bump\n    )]\n    pub level1: Account<'info, DataAccount1>,\n\n    #[account(\n        init,\n        payer = signer,\n        space = 8 + DataAccount1::INIT_SPACE,\n        seeds = [b\"level2\", level1.key().as_ref()],\n        bump\n    )]\n    pub level2: Account<'info, DataAccount1>,\n\n    #[account(\n        init,\n        payer = signer,\n        space = 8 + DataAccount1::INIT_SPACE,\n        seeds = [b\"level3\", level2.key().as_ref()],\n        bump\n    )]\n    pub level3: Account<'info, DataAccount1>,\n\n    #[account(\n        init,\n        payer = signer,\n        space = 8 + DataAccount1::INIT_SPACE,\n        seeds = [b\"level4\", level3.key().as_ref()],\n        bump\n    )]\n    pub level4: Account<'info, DataAccount1>,\n\n    pub system_program: Program<'info, System>,\n}\n\n#[derive(Accounts)]\npub struct SelfReferencePda<'info> {\n    #[account(mut)]\n    pub signer: Signer<'info>,\n\n    #[account(\n        init,\n        payer = signer,\n        space = 8 + DataAccount1::INIT_SPACE,\n        seeds = [b\"recursive\", recursive.key().as_ref()],\n        bump\n    )]\n    pub recursive: Account<'info, DataAccount1>,\n\n    pub system_program: Program<'info, System>,\n}\n\n#[derive(Accounts)]\npub struct TwoNodeCyclePda<'info> {\n    #[account(mut)]\n    pub signer: Signer<'info>,\n\n    #[account(\n        init,\n        payer = signer,\n        space = 8 + DataAccount1::INIT_SPACE,\n        seeds = [b\"pda_a\", pda_b.key().as_ref()],\n        bump\n    )]\n    pub pda_a: Account<'info, DataAccount1>,\n\n    #[account(\n        init,\n        payer = signer,\n        space = 8 + DataAccount1::INIT_SPACE,\n        seeds = [b\"pda_b\", pda_a.key().as_ref()],\n        bump\n    )]\n    pub pda_b: Account<'info, DataAccount1>,\n\n    pub system_program: Program<'info, System>,\n}\n\n// Reproducer for the PDA seed type mismatch:\n// The `name` argument is a Rust `String`, which Borsh serializes with a u32 length prefix\n// (sizePrefixTypeNode in Codama). But the PDA seed uses `name.as_bytes()` — raw UTF-8 bytes\n// without any prefix (stringTypeNode in Codama). Without the proper seedTypeNode in\n// pda-seed-value.ts, the library would encode the seed with the length prefix, deriving\n// the wrong PDA address.\n#[derive(Accounts)]\n#[instruction(name: String, id: u64)]\npub struct StringSeedPda<'info> {\n    #[account(mut)]\n    pub signer: Signer<'info>,\n    #[account(\n        init,\n        payer = signer,\n        space = 8 + DataAccount1::INIT_SPACE,\n        seeds = [&id.to_le_bytes(), name.as_bytes()],\n        bump\n    )]\n    pub pda_account: Account<'info, DataAccount1>,\n    pub system_program: Program<'info, System>,\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/anchor/programs/example/src/nested_example.rs",
    "content": "\nuse anchor_lang::prelude::*;\nuse anchor_lang::Space;\n\n// All arguments are stored in the NestedExampleAccount.input field for testing.\n#[derive(AnchorSerialize, AnchorDeserialize, Clone)]\npub struct StructAndEnumsInput {\n\tpub header: InnerHeader,\n\tpub inner_struct: InnerStruct,\n\tpub inner_enum: InnerEnum,\n    pub seed_enum: SeedEnum,\n    pub pubkey: Pubkey,\n}\n\n#[account]\n#[derive(InitSpace)]\npub struct NestedExampleAccount {\n    pub input: StructAndEnumsInput,\n}\n\n// We need to implement Space for all structures for size calculation.\nimpl Space for StructAndEnumsInput {\n\tconst INIT_SPACE: usize =\n\t\tInnerHeader::INIT_SPACE\n\t\t+ InnerStruct::INIT_SPACE\n\t\t+ InnerEnum::INIT_SPACE\n\t\t+ SeedEnum::INIT_SPACE\n\t\t+ 32; // Pubkey field\n}\n\n// header: InnerHeader\n#[derive(AnchorSerialize, AnchorDeserialize, Clone)]\npub struct InnerHeader {\n\tpub version: u32,\n\tpub command: Command,\n}\nimpl Space for InnerHeader {\n\tconst INIT_SPACE: usize = 4 + Command::INIT_SPACE;\n}\n// command: Command\n#[derive(AnchorSerialize, AnchorDeserialize, Clone)]\npub enum Command {\n\tStart(u64),\n\tStop,\n\tContinue { reason: String },\n}\nimpl Space for Command {\n\tconst INIT_SPACE: usize = 1 + 8 + 4 + 64; // discriminant + u64 + String (max 64 for simplicity)\n}\n\n// inner_struct: InnerStruct\n#[derive(AnchorSerialize, AnchorDeserialize, Clone)]\npub struct InnerStruct {\n\tpub value: u64,\n\tpub name: String,\n    pub seed_enum: SeedEnum,\n    pub bytes: Vec<u8>,\n    pub optional_pubkey: Option<Pubkey>,\n    pub enums_array: [SeedEnum; 2],\n}\nimpl Space for InnerStruct {\n\tconst INIT_SPACE: usize =\n\t\t8 // value: u64\n\t\t+ 4 + 32 // name: String (max 32 for simplicity)\n\t\t+ SeedEnum::INIT_SPACE\n\t\t+ 4 + 32 // bytes: Vec<u8> (max 32 for simplicity)\n\t\t+ 1 + 32 // optional_pubkey: Option<Pubkey>\n\t\t+ 2 * SeedEnum::INIT_SPACE; // enums_array\n}\n\n// inner_enum: InnerEnum\n#[derive(AnchorSerialize, AnchorDeserialize, Clone)]\npub enum InnerEnum {\n\tTokenTransfer { amount: u64, token_type: TokenType },\n\tStake { duration: u64 },\n\tNone,\n}\nimpl Space for InnerEnum {\n\tconst INIT_SPACE: usize = 1 + 8 + TokenType::INIT_SPACE;\n}\n#[derive(AnchorSerialize, AnchorDeserialize, Clone)]\npub enum TokenType {\n\tSPL,\n\tNFT { collection: String },\n}\nimpl Space for TokenType {\n\tconst INIT_SPACE: usize = 1 + 4 + 64;\n}\n\n// seed_enum: SeedEnum (used as example of nested enum PDA seed)\n#[derive(AnchorSerialize, AnchorDeserialize, Clone)]\npub enum SeedEnum {\n\tArm = 0,\n\tBar = 1,\n\tCar = 2,\n}\nimpl SeedEnum {\n    pub fn as_seed(&self) -> [u8; 1] {\n        [self.clone() as u8]\n    }\n}\nimpl Space for SeedEnum {\n\tconst INIT_SPACE: usize = 1;\n}\n\n#[derive(Accounts)]\n#[instruction(input: StructAndEnumsInput)]\npub struct NestedStructsAndEnums<'info> {\n\t#[account(mut)]\n\tpub signer: Signer<'info>,\n    // The PDA account is derived using multiple fields from the input arguments, demonstrating complex seed derivation.\n    // Dependency from argument doesn't produce pdaAccountNode with seeds in Codama IDL.\n\t#[account(\n\t\tinit,\n        payer = signer,\n        space = 8 + NestedExampleAccount::INIT_SPACE,\n\t\tseeds = [\n\t\t\tb\"nested_example_account\",\n\t\t\tinput.pubkey.as_ref(),\n\t\t\tinput.seed_enum.as_seed().as_ref(),\n\t\t\tinput.inner_struct.seed_enum.as_seed().as_ref(),\n\t\t],\n\t\tbump\n\t)]\n\tpub nested_example_account: Account<'info, NestedExampleAccount>,\n    pub system_program: Program<'info, System>,\n}\n\npub fn handler(\n\tctx: Context<NestedStructsAndEnums>,\n\tinput: StructAndEnumsInput,\n) -> Result<()> {\n    let nested_example_account = &mut ctx.accounts.nested_example_account;\n\tnested_example_account.input = input;\n\tOk(())\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/anchor/rust-toolchain.toml",
    "content": "[toolchain]\nchannel = \"1.93.0\"\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/anchor/tests/blog.test.ts",
    "content": "import path from 'node:path';\n\nimport { getNodeCodec } from '@codama/dynamic-codecs';\nimport { type Address, getProgramDerivedAddress } from '@solana/addresses';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { createProgramClient } from '../../../../src';\nimport type { BlogProgramClient } from '../../generated/blog-idl-types';\nimport { loadIdl, SvmTestContext } from '../../test-utils';\n\nconst idl = loadIdl('blog-idl.json');\nconst programClient = createProgramClient<BlogProgramClient>(idl);\nconst programSoPath = path.resolve(__dirname, '..', '..', 'dumps', 'blog.so');\n\ndescribe('blog', () => {\n    let ctx: SvmTestContext;\n    let payer: Address;\n\n    beforeEach(async () => {\n        ctx = new SvmTestContext({ defaultPrograms: true });\n        ctx.loadProgram(programClient.programAddress, programSoPath);\n        payer = await ctx.createFundedAccount();\n    });\n\n    describe('category PDA — string seed', () => {\n        test('should create a category and read it back via pdas helper', async () => {\n            const ix = await programClient.methods\n                .createCategory({ name: 'solana' })\n                .accounts({ creator: payer })\n                .instruction();\n\n            await ctx.sendInstruction(ix, [payer]);\n\n            const [categoryPda] = await programClient.pdas.category({ name: 'solana' });\n            const decoded = decodeAccount('category', categoryPda);\n            expect(decoded.creator).toBe(payer);\n            expect(decoded.name).toBe('solana');\n        });\n\n        test('should derive distinct PDAs for different category names', async () => {\n            for (const name of ['tech', 'art', 'science']) {\n                const ix = await programClient.methods\n                    .createCategory({ name })\n                    .accounts({ creator: payer })\n                    .instruction();\n                await ctx.sendInstruction(ix, [payer]);\n            }\n\n            const [techPda] = await programClient.pdas.category({ name: 'tech' });\n            const [artPda] = await programClient.pdas.category({ name: 'art' });\n            const [sciencePda] = await programClient.pdas.category({ name: 'science' });\n\n            expect(decodeAccount('category', techPda).name).toBe('tech');\n            expect(decodeAccount('category', artPda).name).toBe('art');\n            expect(decodeAccount('category', sciencePda).name).toBe('science');\n        });\n    });\n\n    describe('subscription PDA — two pubkey seeds', () => {\n        test('should create a subscription and read it back via pdas helper', async () => {\n            const author = payer;\n            const follower = await ctx.createFundedAccount();\n\n            const ix = await programClient.methods.subscribe().accounts({ author, follower }).instruction();\n\n            await ctx.sendInstruction(ix, [follower]);\n\n            const [subPda] = await programClient.pdas.subscription({ author, follower });\n            const decoded = decodeAccount('subscription', subPda);\n            expect(decoded.follower).toBe(follower);\n            expect(decoded.author).toBe(author);\n        });\n\n        test('should derive distinct PDAs when follower/author are swapped', async () => {\n            const alice = await ctx.createFundedAccount();\n            const bob = await ctx.createFundedAccount();\n\n            // Alice follows Bob\n            const ix1 = await programClient.methods\n                .subscribe()\n                .accounts({ author: bob, follower: alice })\n                .instruction();\n            await ctx.sendInstruction(ix1, [alice]);\n\n            // Bob follows Alice\n            const ix2 = await programClient.methods\n                .subscribe()\n                .accounts({ author: alice, follower: bob })\n                .instruction();\n            await ctx.sendInstruction(ix2, [bob]);\n\n            const [sub1] = await programClient.pdas.subscription({ author: bob, follower: alice });\n            const [sub2] = await programClient.pdas.subscription({ author: alice, follower: bob });\n\n            expect(decodeAccount('subscription', sub1).follower).toBe(alice);\n            expect(decodeAccount('subscription', sub2).follower).toBe(bob);\n        });\n    });\n\n    describe('post PDA — updatePost auto-derives post from postId argument', () => {\n        test('should create a post then update it with auto-derived PDA', async () => {\n            // Create profile\n            const createProfileIx = await programClient.methods\n                .createProfile({ username: 'writer' })\n                .accounts({ authority: payer })\n                .instruction();\n            await ctx.sendInstruction(createProfileIx, [payer]);\n\n            const [profilePda] = await programClient.pdas.profile({ authority: payer });\n\n            // Create post (manual PDA — Codama can't express profile.post_count dependency)\n            const [postPda] = await programClient.pdas.post({ postId: 0, profile: profilePda });\n            const createPostIx = await programClient.methods\n                .createPost({ content: 'Original content', title: 'Original' })\n                .accounts({ authority: payer, post: postPda })\n                .instruction();\n            await ctx.sendInstruction(createPostIx, [payer]);\n\n            // Update post — post account should auto-derive from postId arg + profile account\n            const updatePostIx = await programClient.methods\n                .updatePost({ content: 'Updated content', postId: 0, title: 'Updated' })\n                .accounts({ author: profilePda, authority: payer })\n                .instruction();\n            await ctx.sendInstruction(updatePostIx, [payer]);\n\n            const decoded = decodeAccount('post', postPda);\n            expect(decoded.title).toBe('Updated');\n            expect(decoded.content).toBe('Updated content');\n        });\n    });\n\n    describe('reaction PDA — two pubkeys + u8 seed', () => {\n        test('should create a reaction and read it back via pdas helper', async () => {\n            // Setup: create profile + post\n            const createProfileIx = await programClient.methods\n                .createProfile({ username: 'alice' })\n                .accounts({ authority: payer })\n                .instruction();\n            await ctx.sendInstruction(createProfileIx, [payer]);\n\n            const [profilePda] = await programClient.pdas.profile({ authority: payer });\n            const [postPda] = await programClient.pdas.post({ postId: 0, profile: profilePda });\n\n            const createPostIx = await programClient.methods\n                .createPost({ content: 'World', title: 'Hello' })\n                .accounts({ authority: payer, post: postPda })\n                .instruction();\n            await ctx.sendInstruction(createPostIx, [payer]);\n\n            // React with kind=1 (like)\n            const reactor = await ctx.createFundedAccount();\n            const ix = await programClient.methods\n                .react({ kind: 1 })\n                .accounts({ post: postPda, user: reactor })\n                .instruction();\n            await ctx.sendInstruction(ix, [reactor]);\n\n            const [reactionPda] = await programClient.pdas.reaction({\n                kind: 1,\n                post: postPda,\n                user: reactor,\n            });\n            const decoded = decodeAccount('reaction', reactionPda);\n            expect(decoded.post).toBe(postPda);\n            expect(decoded.user).toBe(reactor);\n            expect(decoded.kind).toBe(1);\n        });\n\n        test('should derive distinct PDAs for different reaction kinds on the same post', async () => {\n            // Setup: create profile + post\n            const createProfileIx = await programClient.methods\n                .createProfile({ username: 'bob' })\n                .accounts({ authority: payer })\n                .instruction();\n            await ctx.sendInstruction(createProfileIx, [payer]);\n\n            const [profilePda] = await programClient.pdas.profile({ authority: payer });\n            const [postPda] = await programClient.pdas.post({ postId: 0, profile: profilePda });\n\n            const createPostIx = await programClient.methods\n                .createPost({ content: 'There', title: 'Hi' })\n                .accounts({ authority: payer, post: postPda })\n                .instruction();\n            await ctx.sendInstruction(createPostIx, [payer]);\n\n            // Same user, two reaction kinds\n            const reactor = await ctx.createFundedAccount();\n            for (const kind of [0, 1]) {\n                const ix = await programClient.methods\n                    .react({ kind })\n                    .accounts({ post: postPda, user: reactor })\n                    .instruction();\n                await ctx.sendInstruction(ix, [reactor]);\n            }\n\n            const [likePda] = await programClient.pdas.reaction({ kind: 0, post: postPda, user: reactor });\n            const [lovePda] = await programClient.pdas.reaction({ kind: 1, post: postPda, user: reactor });\n\n            expect(decodeAccount('reaction', likePda).kind).toBe(0);\n            expect(decodeAccount('reaction', lovePda).kind).toBe(1);\n        });\n    });\n\n    describe('dailyDigest PDA — pubkey + u16 + u8 + u8 seeds', () => {\n        test('should create a daily digest and read it back via pdas helper', async () => {\n            const createProfileIx = await programClient.methods\n                .createProfile({ username: 'charlie' })\n                .accounts({ authority: payer })\n                .instruction();\n            await ctx.sendInstruction(createProfileIx, [payer]);\n\n            const [profilePda] = await programClient.pdas.profile({ authority: payer });\n\n            const ix = await programClient.methods\n                .createDailyDigest({ day: 25, month: 2, year: 2026 })\n                .accounts({ authority: payer })\n                .instruction();\n            await ctx.sendInstruction(ix, [payer]);\n\n            const [digestPda] = await programClient.pdas.dailyDigest({\n                day: 25,\n                month: 2,\n                profile: profilePda,\n                year: 2026,\n            });\n            const decoded = decodeAccount('dailyDigest', digestPda);\n            expect(decoded.profile).toBe(profilePda);\n            expect(decoded.year).toBe(2026);\n            expect(decoded.month).toBe(2);\n            expect(decoded.day).toBe(25);\n            expect(decoded.postCount).toBe(0);\n        });\n\n        test('should derive distinct PDAs for different dates', async () => {\n            const createProfileIx = await programClient.methods\n                .createProfile({ username: 'dave' })\n                .accounts({ authority: payer })\n                .instruction();\n            await ctx.sendInstruction(createProfileIx, [payer]);\n\n            const [profilePda] = await programClient.pdas.profile({ authority: payer });\n\n            const dates = [\n                { day: 1, month: 1, year: 2026 },\n                { day: 2, month: 1, year: 2026 },\n                { day: 1, month: 2, year: 2026 },\n            ];\n\n            for (const date of dates) {\n                const ix = await programClient.methods\n                    .createDailyDigest(date)\n                    .accounts({ authority: payer })\n                    .instruction();\n                await ctx.sendInstruction(ix, [payer]);\n            }\n\n            for (const date of dates) {\n                const [pda] = await programClient.pdas.dailyDigest({ profile: profilePda, ...date });\n                const decoded = decodeAccount('dailyDigest', pda);\n                expect(decoded.year).toBe(date.year);\n                expect(decoded.month).toBe(date.month);\n                expect(decoded.day).toBe(date.day);\n            }\n        });\n    });\n\n    describe('accessGrant PDA — pubkey + [u8; 4] array seed', () => {\n        test('should create an access grant and read it back via pdas helper', async () => {\n            const createProfileIx = await programClient.methods\n                .createProfile({ username: 'eve' })\n                .accounts({ authority: payer })\n                .instruction();\n            await ctx.sendInstruction(createProfileIx, [payer]);\n\n            const [profilePda] = await programClient.pdas.profile({ authority: payer });\n            const permissions = new Uint8Array([1, 0, 1, 0]); // read, no-write, execute, no-admin\n\n            const ix = await programClient.methods\n                .createAccessGrant({ permissions })\n                .accounts({ authority: payer })\n                .instruction();\n            await ctx.sendInstruction(ix, [payer]);\n\n            const [grantPda] = await programClient.pdas.accessGrant({\n                permissions,\n                profile: profilePda,\n            });\n            const decoded = decodeAccount('accessGrant', grantPda);\n            expect(decoded.profile).toBe(profilePda);\n            expect(decodeBytes(decoded.permissions)).toEqual([1, 0, 1, 0]);\n        });\n\n        test('should derive distinct PDAs for different permission sets', async () => {\n            const createProfileIx = await programClient.methods\n                .createProfile({ username: 'frank' })\n                .accounts({ authority: payer })\n                .instruction();\n            await ctx.sendInstruction(createProfileIx, [payer]);\n\n            const [profilePda] = await programClient.pdas.profile({ authority: payer });\n            const readOnly = new Uint8Array([1, 0, 0, 0]);\n            const fullAccess = new Uint8Array([1, 1, 1, 1]);\n\n            for (const permissions of [readOnly, fullAccess]) {\n                const ix = await programClient.methods\n                    .createAccessGrant({ permissions })\n                    .accounts({ authority: payer })\n                    .instruction();\n                await ctx.sendInstruction(ix, [payer]);\n            }\n\n            const [readPda] = await programClient.pdas.accessGrant({ permissions: readOnly, profile: profilePda });\n            const [fullPda] = await programClient.pdas.accessGrant({ permissions: fullAccess, profile: profilePda });\n\n            expect(decodeBytes(decodeAccount('accessGrant', readPda).permissions)).toEqual([1, 0, 0, 0]);\n            expect(decodeBytes(decodeAccount('accessGrant', fullPda).permissions)).toEqual([1, 1, 1, 1]);\n        });\n    });\n\n    describe('bookmarkList PDA — pubkey seed with Vec<Pubkey> arg', () => {\n        test('should create a bookmark list with vec arg and read it back via pdas helper', async () => {\n            const bookmark1 = await ctx.createAccount();\n            const bookmark2 = await ctx.createAccount();\n            const bookmark3 = await ctx.createAccount();\n\n            const ix = await programClient.methods\n                .createBookmarkList({ bookmarks: [bookmark1, bookmark2, bookmark3] })\n                .accounts({ owner: payer })\n                .instruction();\n            await ctx.sendInstruction(ix, [payer]);\n\n            const [listPda] = await programClient.pdas.bookmarkList({ owner: payer });\n            const decoded = decodeAccount('bookmarkList', listPda);\n            expect(decoded.owner).toBe(payer);\n            expect(decoded.bookmarks).toEqual([bookmark1, bookmark2, bookmark3]);\n        });\n\n        test('should create a bookmark list with empty vec', async () => {\n            const ix = await programClient.methods\n                .createBookmarkList({ bookmarks: [] })\n                .accounts({ owner: payer })\n                .instruction();\n            await ctx.sendInstruction(ix, [payer]);\n\n            const [listPda] = await programClient.pdas.bookmarkList({ owner: payer });\n            const decoded = decodeAccount('bookmarkList', listPda);\n            expect(decoded.owner).toBe(payer);\n            expect(decoded.bookmarks).toEqual([]);\n        });\n    });\n\n    describe('category PDA — matches manual derivation with root program', () => {\n        test('should derive PDA using root program address when no pdaNode.programId', async () => {\n            const [categoryPda] = await programClient.pdas.category({ name: 'my-category' });\n\n            const [expectedPda] = await getProgramDerivedAddress({\n                programAddress: programClient.programAddress,\n                seeds: ['category', 'my-category'],\n            });\n            expect(categoryPda).toBe(expectedPda);\n        });\n    });\n\n    function decodeAccount(name: string, pda: Address) {\n        const accountNode = programClient.root.program.accounts.find(a => a.name === name);\n        if (!accountNode) throw new Error(`Account node \"${name}\" not found in IDL`);\n\n        const codec = getNodeCodec([programClient.root, programClient.root.program, accountNode]);\n        const data = ctx.requireEncodedAccount(pda).data;\n        return codec.decode(Uint8Array.from(data)) as Record<string, unknown>;\n    }\n\n    /** Codama decodes fixedSize(bytes) as ['base64', encoded] — convert back to number[] */\n    function decodeBytes(value: unknown): number[] {\n        if (Array.isArray(value) && value[0] === 'base64' && typeof value[1] === 'string') {\n            return [...Buffer.from(value[1], 'base64')];\n        }\n        throw new Error(`Expected ['base64', string], got: ${JSON.stringify(value)}`);\n    }\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/anchor/tests/example.test.ts",
    "content": "import { getNodeCodec } from '@codama/dynamic-codecs';\nimport { type Address, getAddressEncoder, getProgramDerivedAddress } from '@solana/addresses';\nimport { getU64Encoder, type Option, unwrapOption } from '@solana/codecs';\nimport type { RootNode } from 'codama';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { createProgramClient } from '../../../../src';\nimport type { ExampleProgramClient } from '../../generated/example-idl-types';\nimport { SvmTestContext } from '../../test-utils';\nimport { createTestContext, idl, programClient } from './helpers';\n\ndescribe('anchor-example: commonIxs', () => {\n    let ctx: SvmTestContext;\n    let payer: Address;\n\n    beforeEach(async () => {\n        ({ ctx, payer } = await createTestContext());\n    });\n\n    describe('pubkeySeedIx', () => {\n        test('should execute instruction with pubkey seed', async () => {\n            const ix = await programClient.methods\n                .pubkeySeedIx({ input: 42 })\n                .accounts({ signer: payer })\n                .instruction();\n\n            await ctx.sendInstruction(ix, [payer]);\n        });\n    });\n\n    describe('updateOptionalInput', () => {\n        test('should update optional input field with and without value', async () => {\n            const signer = await ctx.createFundedAccount();\n\n            const ix0 = await programClient.methods.pubkeySeedIx({ input: 42 }).accounts({ signer }).instruction();\n\n            await ctx.sendInstruction(ix0, [signer]);\n\n            const [pda] = await getProgramDerivedAddress({\n                programAddress: programClient.programAddress,\n                seeds: ['seed', getAddressEncoder().encode(signer)],\n            });\n\n            const optionalAddress = await ctx.createAccount();\n            const ix1 = await programClient.methods\n                .updateOptionalInput({\n                    input: 44,\n                    optionalInput: optionalAddress,\n                })\n                .accounts({ signer })\n                .instruction();\n\n            await ctx.sendInstruction(ix1, [signer]);\n\n            const account1 = ctx.requireEncodedAccount(pda);\n            const decoded1 = decodeDataAccount1(programClient.root, account1.data);\n            expect(decoded1.optionalInput).eq(optionalAddress);\n\n            const ix2 = await programClient.methods\n                .updateOptionalInput({ input: 45 })\n                .accounts({ signer })\n                .instruction();\n\n            await ctx.sendInstruction(ix2, [signer]);\n\n            const account2 = ctx.requireEncodedAccount(pda);\n            const decoded2 = decodeDataAccount1(programClient.root, account2.data);\n            expect(decoded2.optionalInput).toBeNull();\n        });\n    });\n\n    describe('updateOptionalAccount', () => {\n        test('should handle optional accounts', async () => {\n            const optionalAccount = await ctx.createAccount();\n            const ix1 = await programClient.methods\n                .updateOptionalAccount({ id: 1 })\n                .accounts({\n                    optionalAccKey: optionalAccount,\n                    signer: payer,\n                })\n                .instruction();\n\n            await ctx.sendInstruction(ix1, [payer]);\n\n            const ix2 = await programClient.methods\n                .updateOptionalAccount({ id: 2 })\n                .accounts({\n                    optionalAccKey: null,\n                    signer: payer,\n                })\n                .instruction();\n\n            await ctx.sendInstruction(ix2, [payer]);\n        });\n    });\n\n    describe('noArguments', () => {\n        test('should execute instruction with no arguments', async () => {\n            const account = await ctx.createAccount();\n\n            const ix = await programClient.methods\n                .noArguments()\n                .accounts({\n                    acc: account,\n                    signer: payer,\n                })\n                .instruction();\n\n            await ctx.sendInstruction(ix, [payer, account]);\n        });\n    });\n\n    test('ExternalProgramsWithPdaIx: should resolve dependent pda and external program addresses', async () => {\n        const mint = await ctx.createAccount();\n        const addressEncoder = getAddressEncoder();\n        const [expectedAta] = await getProgramDerivedAddress({\n            programAddress: ctx.ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n            seeds: [\n                addressEncoder.encode(payer),\n                addressEncoder.encode(ctx.TOKEN_PROGRAM_ADDRESS),\n                addressEncoder.encode(mint),\n            ],\n        });\n\n        const [expectedDependentPda] = await getProgramDerivedAddress({\n            programAddress: programClient.programAddress,\n            seeds: ['signer_and_ata', addressEncoder.encode(payer), addressEncoder.encode(expectedAta)],\n        });\n\n        const ix = await programClient.methods\n            .externalProgramsWithPda()\n            .accounts({\n                mint,\n                signer: payer,\n            })\n            .instruction();\n\n        expect(ix.accounts).toBeDefined();\n        if (!ix.accounts) throw new Error('Expected instruction accounts to be defined');\n\n        expect(ix.accounts.length).eq(8);\n\n        const expectedAccounts = [\n            [payer, \"signer doesn't match\"],\n            [mint, \"mint doesn't match\"],\n            [expectedAta, \"token_account doesn't match\"],\n            [expectedDependentPda, \"dependent_account doesn't match\"],\n            [ctx.SYSTEM_PROGRAM_ADDRESS, \"system_program doesn't match\"],\n            [ctx.TOKEN_PROGRAM_ADDRESS, \"token_program doesn't match\"],\n            [ctx.ASSOCIATED_TOKEN_PROGRAM_ADDRESS, \"associated_token_program doesn't match\"],\n            [ctx.SYSVAR_RENT_ADDRESS, \"rent_sysvar doesn't match\"],\n        ];\n\n        expectedAccounts.forEach((expected, i) => {\n            if (!ix?.accounts?.[i]) {\n                throw new Error(`Expected instruction accounts to be defined at index ${i}`);\n            }\n            expect(ix.accounts[i].address, expected[1]).eq(expected[0]);\n        });\n\n        // Send transaction to verify it executes on-chain\n        await ctx.sendInstruction(ix, [payer, mint]);\n    });\n\n    test('FourLevelPdaIx: should resolve four-level dependent PDA', async () => {\n        const ix = await programClient.methods\n            .fourLevelPda()\n            .accounts({\n                signer: payer,\n            })\n            .instruction();\n\n        expect(ix.accounts).toBeDefined();\n        if (!ix.accounts) throw new Error('Expected instruction accounts to be defined');\n        expect(ix.accounts.length).eq(6);\n\n        const addressEncoder = getAddressEncoder();\n\n        const [expectedLevel1] = await getProgramDerivedAddress({\n            programAddress: programClient.programAddress,\n            seeds: ['level1', addressEncoder.encode(payer)],\n        });\n\n        const [expectedLevel2] = await getProgramDerivedAddress({\n            programAddress: programClient.programAddress,\n            seeds: ['level2', addressEncoder.encode(expectedLevel1)],\n        });\n\n        const [expectedLevel3] = await getProgramDerivedAddress({\n            programAddress: programClient.programAddress,\n            seeds: ['level3', addressEncoder.encode(expectedLevel2)],\n        });\n\n        const [expectedLevel4] = await getProgramDerivedAddress({\n            programAddress: programClient.programAddress,\n            seeds: ['level4', addressEncoder.encode(expectedLevel3)],\n        });\n\n        const expectedAccounts = [\n            [payer, \"signer doesn't match\"],\n            [expectedLevel1, \"level1 doesn't match\"],\n            [expectedLevel2, \"level2 doesn't match\"],\n            [expectedLevel3, \"level3 doesn't match\"],\n            [expectedLevel4, \"level4 doesn't match\"],\n            [ctx.SYSTEM_PROGRAM_ADDRESS, \"system_program doesn't match\"],\n        ];\n\n        expectedAccounts.forEach((expected, i) => {\n            if (!ix?.accounts?.[i]) {\n                throw new Error(`Expected instruction accounts to be defined at index ${i}`);\n            }\n            expect(ix.accounts[i].address, expected[1]).eq(expected[0]);\n        });\n\n        await ctx.sendInstruction(ix, [payer]);\n    });\n\n    describe('stringSeedPda', () => {\n        test('should derive PDA using raw string seed bytes (not size-prefixed)', async () => {\n            const name = 'hello';\n            const id = 7;\n\n            const ix = await programClient.methods\n                .stringSeedPda({ id, name })\n                .accounts({ signer: payer })\n                .instruction();\n\n            await ctx.sendInstruction(ix, [payer]);\n\n            const [expectedPda] = await getProgramDerivedAddress({\n                programAddress: programClient.programAddress,\n                seeds: [getU64Encoder().encode(id), name],\n            });\n\n            const account = ctx.requireEncodedAccount(expectedPda);\n            expect(account.owner).toBe(programClient.programAddress);\n\n            const decoded = decodeDataAccount1(programClient.root, account.data);\n            expect(decoded.input).toBe(7n);\n        });\n    });\n\n    describe('Circular Dependency Detection', () => {\n        test('SelfReferencePdaIx: should throw AccountError for A->A cycle', async () => {\n            await expect(\n                programClient.methods.selfReferencePda().accounts({ signer: payer }).instruction(),\n            ).rejects.toThrow(/Circular dependency detected: \\[recursive -> recursive\\]/);\n        });\n\n        test('TwoNodeCyclePdaIx: should throw AccountError for A->B->A pattern in two-node cycle', async () => {\n            await expect(\n                programClient.methods.twoNodeCyclePda().accounts({ signer: payer }).instruction(),\n            ).rejects.toThrow(/Circular dependency detected: \\[pda[AB] -> pda[AB] -> pda[AB]\\]/);\n        });\n    });\n\n    describe('Standalone PDA derivation — pdaNode.programId', () => {\n        const addressEncoder = getAddressEncoder();\n\n        test('should derive cross-program PDA using pdaNode.programId, not root program', async () => {\n            const signer = await SvmTestContext.generateAddress();\n            const mint = await SvmTestContext.generateAddress();\n\n            const [actualPda] = await programClient.pdas.tokenAccount({ mint, signer });\n\n            const [expectedPda] = await getProgramDerivedAddress({\n                programAddress: ctx.ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n                seeds: [\n                    addressEncoder.encode(signer),\n                    addressEncoder.encode(ctx.TOKEN_PROGRAM_ADDRESS),\n                    addressEncoder.encode(mint),\n                ],\n            });\n            expect(actualPda).toBe(expectedPda);\n        });\n\n        test('should not be affected by programId option override and still use pdaNode.programId', async () => {\n            const signer = await SvmTestContext.generateAddress();\n            const mint = await SvmTestContext.generateAddress();\n\n            const overrideProgramId = await SvmTestContext.generateAddress();\n            const overrideClient = createProgramClient<ExampleProgramClient>(idl, { programId: overrideProgramId });\n            // double-check that the override took effect\n            expect(overrideClient.programAddress).toBe(overrideProgramId);\n\n            const [pdaFromOriginal] = await programClient.pdas.tokenAccount({ mint, signer });\n            const [pdaFromOverride] = await overrideClient.pdas.tokenAccount({ mint, signer });\n\n            expect(pdaFromOverride).toBe(pdaFromOriginal);\n        });\n\n        test('should fall back to root program when pdaNode has no programId', async () => {\n            const signer = await SvmTestContext.generateAddress();\n\n            const [actualPda] = await programClient.pdas.level1({ signer });\n\n            const [expectedPda] = await getProgramDerivedAddress({\n                programAddress: programClient.programAddress,\n                seeds: ['level1', addressEncoder.encode(signer)],\n            });\n            expect(actualPda).toBe(expectedPda);\n        });\n    });\n});\n\nfunction decodeDataAccount1(\n    root: RootNode,\n    data: Uint8Array,\n): { bump: number; input: bigint; optionalInput: string | null } {\n    const accountNode = root.program.accounts.find(a => a.name === 'dataAccount1');\n    if (!accountNode) {\n        throw new Error('Could not find account node \"dataAccount1\" in IDL');\n    }\n\n    const codec = getNodeCodec([root, root.program, accountNode]);\n    const decoded = codec.decode(Uint8Array.from(data)) as {\n        bump: number;\n        input: bigint;\n        optionalInput: Option<string>;\n    };\n\n    return {\n        bump: decoded.bump,\n        input: decoded.input,\n        optionalInput: unwrapOption<string>(decoded.optionalInput),\n    };\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/anchor/tests/helpers.ts",
    "content": "import path from 'node:path';\n\nimport { createProgramClient } from '../../../../src';\nimport type { ExampleProgramClient } from '../../generated/example-idl-types';\nimport { loadIdl, SvmTestContext } from '../../test-utils';\n\nexport const idl = loadIdl('example-idl.json');\nexport const programClient = createProgramClient<ExampleProgramClient>(idl);\nexport const programSoPath = path.resolve(__dirname, '..', 'target', 'deploy', 'example.so');\n\nexport async function createTestContext() {\n    const ctx = new SvmTestContext({ defaultPrograms: true });\n    ctx.loadProgram(programClient.programAddress, programSoPath);\n    const payer = await ctx.createFundedAccount();\n\n    return { ctx, payer };\n}\n\n/**\n * Encodes and returns a value in base16 codama dynamic-codecs format.\n * To match bytes decoded by getNodeCodec.\n */\nexport function bytesToBase16CodecFormat(bytes: Uint8Array) {\n    return ['base16', Buffer.from(bytes).toString('hex')] as const;\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/anchor/tests/nested-example-ix.test.ts",
    "content": "import { getNodeCodec } from '@codama/dynamic-codecs';\nimport { type Address, getAddressEncoder, getProgramDerivedAddress } from '@solana/addresses';\nimport { none, some } from '@solana/codecs';\nimport type { RootNode } from 'codama';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport type { NestedExampleArgs } from '../../generated/example-idl-types';\nimport { SvmTestContext } from '../../test-utils';\nimport { bytesToBase16CodecFormat, createTestContext, programClient } from './helpers';\n\ndescribe('anchor-example: nestedExampleIx', () => {\n    let ctx: SvmTestContext;\n    let payer: Address;\n\n    beforeEach(async () => {\n        ({ ctx, payer } = await createTestContext());\n    });\n\n    test('should encode nested struct with scalar enums, bytes, fixed array, and none inner enum', async () => {\n        const pubkeyArg = await ctx.createAccount();\n        const nestedExampleAccount = await deriveNestedExamplePda(\n            programClient.programAddress,\n            pubkeyArg,\n            'arm',\n            'bar',\n        );\n\n        const ix = await programClient.methods\n            .nestedExample({\n                input: {\n                    header: { command: { __kind: 'start', fields: [42n] }, version: 1 },\n                    innerEnum: { __kind: 'none' },\n                    innerStruct: {\n                        bytes: new Uint8Array([1, 2, 3]),\n                        enumsArray: ['arm', 'car'],\n                        name: 'hello',\n                        optionalPubkey: null,\n                        seedEnum: 'bar',\n                        value: BigInt(100),\n                    },\n                    pubkey: pubkeyArg,\n                    seedEnum: 'arm',\n                },\n            })\n            .accounts({ nestedExampleAccount, signer: payer })\n            .instruction();\n\n        await ctx.sendInstruction(ix, [payer]);\n\n        expect(ix.data?.length).toBeGreaterThan(0);\n        const exampleAccountData = ctx.requireEncodedAccount(nestedExampleAccount).data;\n\n        const exampleAccount = decodeNestedExampleAccount(programClient.root, exampleAccountData);\n        expect(exampleAccount.input).toEqual({\n            header: { command: { __kind: 'Start', fields: [42n] }, version: 1 },\n            innerEnum: { __kind: 'None' },\n            innerStruct: {\n                bytes: bytesToBase16CodecFormat(new Uint8Array([1, 2, 3])),\n                enumsArray: [seedEnumToNumber('arm'), seedEnumToNumber('car')],\n                name: 'hello',\n                optionalPubkey: none(),\n                seedEnum: seedEnumToNumber('bar'),\n                value: 100n,\n            },\n            pubkey: pubkeyArg,\n            seedEnum: seedEnumToNumber('arm'),\n        });\n    });\n\n    test('should encode Command::Continue with reason string [enumStructVariantTypeNode]', async () => {\n        const pubkeyArg = await ctx.createAccount();\n        const nestedExampleAccount = await deriveNestedExamplePda(\n            programClient.programAddress,\n            pubkeyArg,\n            'bar',\n            'arm',\n        );\n\n        const ix = await programClient.methods\n            .nestedExample({\n                input: {\n                    header: { command: { __kind: 'continue', reason: 'keep going' }, version: 2 },\n                    innerEnum: { __kind: 'none' },\n                    innerStruct: {\n                        bytes: new Uint8Array([]),\n                        enumsArray: ['bar', 'bar'],\n                        name: 'test',\n                        optionalPubkey: null,\n                        seedEnum: 'arm',\n                        value: BigInt(0),\n                    },\n                    pubkey: pubkeyArg,\n                    seedEnum: 'bar',\n                },\n            })\n            .accounts({ nestedExampleAccount, signer: payer })\n            .instruction();\n\n        await ctx.sendInstruction(ix, [payer]);\n        expect(ix.data?.length).toBeGreaterThan(0);\n        const exampleAccountData = ctx.requireEncodedAccount(nestedExampleAccount).data;\n        const exampleAccount = decodeNestedExampleAccount(programClient.root, exampleAccountData);\n\n        expect(exampleAccount.input).toEqual({\n            header: {\n                command: {\n                    __kind: 'Continue',\n                    reason: 'keep going',\n                },\n                version: 2,\n            },\n            innerEnum: { __kind: 'None' },\n            innerStruct: {\n                bytes: bytesToBase16CodecFormat(new Uint8Array([])),\n                enumsArray: [seedEnumToNumber('bar'), seedEnumToNumber('bar')],\n                name: 'test',\n                optionalPubkey: none(),\n                seedEnum: seedEnumToNumber('arm'),\n                value: 0n,\n            },\n            pubkey: pubkeyArg,\n            seedEnum: seedEnumToNumber('bar'),\n        });\n    });\n\n    test('should encode InnerEnum::TokenTransfer [enumStructVariantTypeNode->enumEmptyVariantTypeNode]', async () => {\n        const pubkeyArg = await ctx.createAccount();\n        const nestedExampleAccount = await deriveNestedExamplePda(\n            programClient.programAddress,\n            pubkeyArg,\n            'car',\n            'car',\n        );\n\n        const ix = await programClient.methods\n            .nestedExample({\n                input: {\n                    header: { command: { __kind: 'stop' }, version: 1 },\n                    innerEnum: { __kind: 'tokenTransfer', amount: BigInt(500), tokenType: { __kind: 'sPL' } },\n                    innerStruct: {\n                        bytes: new Uint8Array([0xde, 0xad, 0xbe, 0xef]),\n                        enumsArray: ['car', 'arm'],\n                        name: 'transfer',\n                        optionalPubkey: null,\n                        seedEnum: 'car',\n                        value: BigInt(999),\n                    },\n                    pubkey: pubkeyArg,\n                    seedEnum: 'car',\n                },\n            })\n            .accounts({ nestedExampleAccount, signer: payer })\n            .instruction();\n\n        await ctx.sendInstruction(ix, [payer]);\n        expect(ix.data?.length).toBeGreaterThan(0);\n        const exampleAccountData = ctx.requireEncodedAccount(nestedExampleAccount).data;\n        const exampleAccount = decodeNestedExampleAccount(programClient.root, exampleAccountData);\n\n        expect(exampleAccount.input).toEqual({\n            header: {\n                command: {\n                    __kind: 'Stop',\n                },\n                version: 1,\n            },\n            innerEnum: {\n                __kind: 'TokenTransfer',\n                amount: 500n,\n                tokenType: { __kind: 'SPL' },\n            },\n            innerStruct: {\n                bytes: bytesToBase16CodecFormat(new Uint8Array([0xde, 0xad, 0xbe, 0xef])),\n                enumsArray: [seedEnumToNumber('car'), seedEnumToNumber('arm')],\n                name: 'transfer',\n                optionalPubkey: none(),\n                seedEnum: seedEnumToNumber('car'),\n                value: 999n,\n            },\n            pubkey: pubkeyArg,\n            seedEnum: seedEnumToNumber('car'),\n        });\n    });\n\n    test('should encode InnerEnum::TokenTransfer enum (3 levels deep)', async () => {\n        const pubkeyArg = await ctx.createAccount();\n        const nestedExampleAccount = await deriveNestedExamplePda(\n            programClient.programAddress,\n            pubkeyArg,\n            'arm',\n            'arm',\n        );\n\n        const ix = await programClient.methods\n            .nestedExample({\n                input: {\n                    header: { command: { __kind: 'start', fields: [42n] }, version: 1 },\n                    innerEnum: {\n                        __kind: 'tokenTransfer',\n                        amount: BigInt(1),\n                        tokenType: { __kind: 'nFT', collection: 'DegenApes' },\n                    },\n                    innerStruct: {\n                        bytes: new Uint8Array([]),\n                        enumsArray: ['arm', 'arm'],\n                        name: 'nft-test',\n                        optionalPubkey: null,\n                        seedEnum: 'arm',\n                        value: BigInt(1),\n                    },\n                    pubkey: pubkeyArg,\n                    seedEnum: 'arm',\n                },\n            })\n            .accounts({ nestedExampleAccount, signer: payer })\n            .instruction();\n\n        await ctx.sendInstruction(ix, [payer]);\n        expect(ix.data?.length).toBeGreaterThan(0);\n        const exampleAccountData = ctx.requireEncodedAccount(nestedExampleAccount).data;\n        const exampleAccount = decodeNestedExampleAccount(programClient.root, exampleAccountData);\n\n        expect(exampleAccount.input).toEqual({\n            header: {\n                command: {\n                    __kind: 'Start',\n                    fields: [42n],\n                },\n                version: 1,\n            },\n            innerEnum: {\n                __kind: 'TokenTransfer',\n                amount: 1n,\n                tokenType: { __kind: 'NFT', collection: 'DegenApes' },\n            },\n            innerStruct: {\n                bytes: bytesToBase16CodecFormat(new Uint8Array([])),\n                enumsArray: [seedEnumToNumber('arm'), seedEnumToNumber('arm')],\n                name: 'nft-test',\n                optionalPubkey: none(),\n                seedEnum: seedEnumToNumber('arm'),\n                value: 1n,\n            },\n            pubkey: pubkeyArg,\n            seedEnum: seedEnumToNumber('arm'),\n        });\n    });\n\n    test('should encode Stake inner enum and optional pubkey (Some)', async () => {\n        const pubkeyArg = await ctx.createAccount();\n        const optionalPubkey = await ctx.createAccount();\n        const nestedExampleAccount = await deriveNestedExamplePda(\n            programClient.programAddress,\n            pubkeyArg,\n            'bar',\n            'car',\n        );\n\n        const ix = await programClient.methods\n            .nestedExample({\n                input: {\n                    header: { command: { __kind: 'start', fields: [321n] }, version: 3 },\n                    innerEnum: { __kind: 'stake', duration: BigInt(86400) },\n                    innerStruct: {\n                        bytes: new Uint8Array([10, 20]),\n                        enumsArray: ['bar', 'car'],\n                        name: 'staker',\n                        optionalPubkey,\n                        seedEnum: 'car',\n                        value: BigInt(42),\n                    },\n                    pubkey: pubkeyArg,\n                    seedEnum: 'bar',\n                },\n            })\n            .accounts({ nestedExampleAccount, signer: payer })\n            .instruction();\n\n        await ctx.sendInstruction(ix, [payer]);\n        expect(ix.data?.length).toBeGreaterThan(0);\n        const exampleAccountData = ctx.requireEncodedAccount(nestedExampleAccount).data;\n        const exampleAccount = decodeNestedExampleAccount(programClient.root, exampleAccountData);\n\n        expect(exampleAccount.input).toEqual({\n            header: {\n                command: {\n                    __kind: 'Start',\n                    fields: [321n],\n                },\n                version: 3,\n            },\n            innerEnum: {\n                __kind: 'Stake',\n                duration: 86400n,\n            },\n            innerStruct: {\n                bytes: bytesToBase16CodecFormat(new Uint8Array([10, 20])),\n                enumsArray: [seedEnumToNumber('bar'), seedEnumToNumber('car')],\n                name: 'staker',\n                optionalPubkey: some(optionalPubkey),\n                seedEnum: seedEnumToNumber('car'),\n                value: 42n,\n            },\n            pubkey: pubkeyArg,\n            seedEnum: seedEnumToNumber('bar'),\n        });\n    });\n\n    describe('should validate nestedExampleIx arguments', () => {\n        let pubkeyArg: Address;\n        let nestedExampleAccount: Address;\n\n        beforeEach(async () => {\n            pubkeyArg = await ctx.createAccount();\n            nestedExampleAccount = await deriveNestedExamplePda(programClient.programAddress, pubkeyArg, 'arm', 'bar');\n        });\n\n        const makeValidArgs = (pubkey: Address): NestedExampleArgs['input'] => ({\n            header: { command: { __kind: 'start', fields: [123n] }, version: 1 },\n            innerEnum: { __kind: 'none' },\n            innerStruct: {\n                bytes: new Uint8Array([1, 2, 3]),\n                enumsArray: ['arm', 'car'],\n                name: 'hello',\n                optionalPubkey: null,\n                seedEnum: 'bar',\n                value: BigInt(100),\n            },\n            pubkey,\n            seedEnum: 'arm',\n        });\n\n        test('should throw when input is missing', async () => {\n            await expect(\n                programClient.methods\n                    .nestedExample({} as unknown as NestedExampleArgs)\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"input\"/);\n        });\n\n        test('should throw when header is missing', async () => {\n            // eslint-disable-next-line @typescript-eslint/no-unused-vars\n            const { header: _header, ...args } = makeValidArgs(pubkeyArg);\n            await expect(\n                programClient.methods\n                    .nestedExample({\n                        input: args as unknown as NestedExampleArgs['input'],\n                    })\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"input.header\"/);\n        });\n\n        test('should throw when command enum fields tuple payload is missing', async () => {\n            const input = makeValidArgs(pubkeyArg);\n            input.header.command = {\n                __kind: 'start',\n                fields: null,\n            } as unknown as NestedExampleArgs['input']['header']['command'];\n            await expect(\n                programClient.methods\n                    .nestedExample({\n                        input,\n                    })\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"input.header.command\"/);\n        });\n\n        test('should throw when innerEnum payload data is missing', async () => {\n            const input = makeValidArgs(pubkeyArg);\n            input.innerEnum = {\n                __kind: 'tokenTransfer',\n                amount: BigInt(1),\n                tokenType: { __kind: 'nFT', collection: 'Test' },\n            };\n            input.innerEnum.amount = undefined as unknown as bigint; // Force amount to be missing\n            await expect(\n                programClient.methods\n                    .nestedExample({\n                        input,\n                    })\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Enum variant \"tokenTransfer\" has invalid \"amount\"/);\n        });\n\n        test('should throw when tokenTransfer variant is missing all payload fields', async () => {\n            const input = {\n                ...makeValidArgs(pubkeyArg),\n                innerEnum: { __kind: 'tokenTransfer' } as unknown as NestedExampleArgs['input']['innerEnum'],\n            };\n            await expect(\n                programClient.methods\n                    .nestedExample({ input })\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Enum variant \"tokenTransfer\" has invalid \"amount\"/);\n        });\n\n        test('should throw when tokenTransfer variant is missing tokenType', async () => {\n            const input = {\n                ...makeValidArgs(pubkeyArg),\n                innerEnum: {\n                    __kind: 'tokenTransfer',\n                    amount: BigInt(1),\n                } as unknown as NestedExampleArgs['input']['innerEnum'],\n            };\n            await expect(\n                programClient.methods\n                    .nestedExample({ input })\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Enum variant \"tokenTransfer\" has invalid \"tokenType\"/);\n        });\n\n        test('should throw when continue variant is missing reason', async () => {\n            const input = {\n                ...makeValidArgs(pubkeyArg),\n                header: {\n                    command: { __kind: 'continue' } as unknown as NestedExampleArgs['input']['header']['command'],\n                    version: 1,\n                },\n            };\n            await expect(\n                programClient.methods\n                    .nestedExample({ input })\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"input.header.command\".*\"reason\"/);\n        });\n\n        test('should throw when innerStruct is missing', async () => {\n            // eslint-disable-next-line @typescript-eslint/no-unused-vars\n            const { innerStruct: _innerStruct, ...args } = makeValidArgs(pubkeyArg);\n            await expect(\n                programClient.methods\n                    .nestedExample({\n                        input: args as unknown as NestedExampleArgs['input'],\n                    })\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"input.innerStruct\"/);\n        });\n\n        test('should throw when pubkey is missing', async () => {\n            // eslint-disable-next-line @typescript-eslint/no-unused-vars\n            const { pubkey: _pubkey, ...args } = makeValidArgs(pubkeyArg);\n            await expect(\n                programClient.methods\n                    .nestedExample({\n                        input: args as unknown as NestedExampleArgs['input'],\n                    })\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"input.pubkey\"/);\n        });\n\n        test('should throw when header.version is string', async () => {\n            const input = {\n                ...makeValidArgs(pubkeyArg),\n                header: { command: { __kind: 'start' }, version: 'one' as unknown as number },\n            } as unknown as NestedExampleArgs['input'];\n            await expect(\n                programClient.methods\n                    .nestedExample({\n                        input,\n                    })\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"input.header.version\"/);\n        });\n\n        test('should throw when innerStruct.value is string', async () => {\n            const validInput = makeValidArgs(pubkeyArg);\n            const { innerStruct } = validInput;\n            const input = {\n                ...validInput,\n                innerStruct: {\n                    ...innerStruct,\n                    value: 'hundred-of-thousands' as unknown as bigint,\n                },\n            } as unknown as NestedExampleArgs['input'];\n            await expect(\n                programClient.methods\n                    .nestedExample({\n                        input,\n                    })\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"input.innerStruct.value\"/);\n        });\n\n        test('should throw for invalid seedEnum variant', async () => {\n            const input = { ...makeValidArgs(pubkeyArg), seedEnum: 'invalidVariant' as unknown as 'arm' };\n            await expect(\n                programClient.methods\n                    .nestedExample({\n                        input,\n                    })\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"input.seedEnum\"/);\n        });\n\n        test('should throw for invalid innerEnum __kind', async () => {\n            const input = {\n                ...makeValidArgs(pubkeyArg),\n                innerEnum: { __kind: 'nonExistent' } as unknown as NestedExampleArgs['input']['innerEnum'],\n            };\n            await expect(\n                programClient.methods\n                    .nestedExample({\n                        input,\n                    })\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"input.innerEnum\"/);\n        });\n\n        test('should throw for invalid header.command __kind', async () => {\n            const input = {\n                ...makeValidArgs(pubkeyArg),\n                header: {\n                    command: { __kind: 'invalidCommand' } as unknown as NestedExampleArgs['input']['header']['command'],\n                    version: 1,\n                },\n            };\n            await expect(\n                programClient.methods\n                    .nestedExample({ input })\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"input.header.command\"/);\n        });\n\n        test('should throw when enumsArray has wrong size', async () => {\n            const validInput = makeValidArgs(pubkeyArg);\n            const { innerStruct } = validInput;\n            const input = {\n                ...makeValidArgs(pubkeyArg),\n                innerStruct: {\n                    ...innerStruct,\n                    enumsArray: ['arm'] as unknown as ('arm' | 'bar' | 'car')[],\n                },\n            };\n            await expect(\n                programClient.methods\n                    .nestedExample({\n                        input,\n                    })\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"input.innerStruct.enumsArray/);\n        });\n\n        test('should throw when enumsArray has invalid enum value', async () => {\n            const validInput = makeValidArgs(pubkeyArg);\n            const { innerStruct } = validInput;\n            const input = {\n                ...makeValidArgs(pubkeyArg),\n                innerStruct: {\n                    ...innerStruct,\n                    enumsArray: ['arm', 'invalid', 123] as unknown as ('arm' | 'bar' | 'car')[],\n                },\n            };\n            await expect(\n                programClient.methods\n                    .nestedExample({\n                        input,\n                    })\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"input.innerStruct.enumsArray/);\n        });\n\n        test('should throw when bytes is string instead of Uint8Array', async () => {\n            const validInput = makeValidArgs(pubkeyArg);\n            const { innerStruct } = validInput;\n            const input = {\n                ...makeValidArgs(pubkeyArg),\n                innerStruct: { ...innerStruct, bytes: 'notbytes' as unknown as Uint8Array },\n            };\n            await expect(\n                programClient.methods\n                    .nestedExample({\n                        input,\n                    })\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"input.innerStruct.bytes\"/);\n        });\n\n        test('should throw for invalid pubkey string', async () => {\n            const input = { ...makeValidArgs(pubkeyArg), pubkey: 'not-a-valid-address' as unknown as Address };\n            await expect(\n                programClient.methods\n                    .nestedExample({ input })\n                    .accounts({ nestedExampleAccount, signer: payer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"input.pubkey\"/);\n        });\n    });\n});\n\nfunction decodeNestedExampleAccount(root: RootNode, data: Uint8Array) {\n    const accountNode = root.program.accounts.find(a => a.name === 'nestedExampleAccount');\n    if (!accountNode) {\n        throw new Error('Could not find account node \"nestedExampleAccount\" node in IDL');\n    }\n\n    const codec = getNodeCodec([root, root.program, accountNode], {\n        bytesEncoding: 'base16',\n    });\n    const decoded = codec.decode(Uint8Array.from(data));\n    return decoded as { discriminator: unknown; input: unknown };\n}\n\nasync function deriveNestedExamplePda(\n    programAddress: Address,\n    pubkey: Address,\n    seedEnum: 'arm' | 'bar' | 'car',\n    innerSeedEnum: 'arm' | 'bar' | 'car',\n): Promise<Address> {\n    const index: Record<string, number> = { arm: 0, bar: 1, car: 2 };\n    const [pda] = await getProgramDerivedAddress({\n        programAddress,\n        seeds: [\n            'nested_example_account',\n            getAddressEncoder().encode(pubkey),\n            new Uint8Array([index[seedEnum]]),\n            new Uint8Array([index[innerSeedEnum]]),\n        ],\n    });\n    return pda;\n}\n\n/** SeedEnum enum is stored as a number. */\nexport function seedEnumToNumber(enumValue: string) {\n    switch (enumValue.toLowerCase()) {\n        case 'arm':\n            return 0;\n        case 'bar':\n            return 1;\n        case 'car':\n            return 2;\n        default:\n            throw new Error(`Unknown enum value: ${enumValue}`);\n    }\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/associated-token-account/ata-test-utils.ts",
    "content": "import type { Address } from '@solana/addresses';\n\nimport type { SplAssociatedTokenAccountProgramClient } from '../generated/associated-token-account-idl-types';\nimport type { SystemProgramClient } from '../generated/system-program-idl-types';\nimport type { TokenProgramClient } from '../generated/token-idl-types';\nimport { createTestProgramClient, SvmTestContext } from '../test-utils';\n\nexport const ataClient = createTestProgramClient<SplAssociatedTokenAccountProgramClient>(\n    'associated-token-account-idl.json',\n);\nexport const tokenClient = createTestProgramClient<TokenProgramClient>('token-idl.json');\nexport const systemClient = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n\nconst SPL_TOKEN_MINT_SIZE = 82n;\n\nexport async function createMint(\n    ctx: SvmTestContext,\n    payer: Address,\n    mint: Address,\n    mintAuthority: Address,\n): Promise<void> {\n    const lamports = ctx.getMinimumBalanceForRentExemption(SPL_TOKEN_MINT_SIZE);\n    const createMintAccountIx = await systemClient.methods\n        .createAccount({ lamports, programAddress: tokenClient.programAddress, space: SPL_TOKEN_MINT_SIZE })\n        .accounts({ newAccount: mint, payer })\n        .instruction();\n    await ctx.sendInstruction(createMintAccountIx, [payer, mint]);\n\n    const initializeMintIx = await tokenClient.methods\n        .initializeMint({ decimals: 9, freezeAuthority: null, mintAuthority })\n        .accounts({ mint })\n        .instruction();\n    await ctx.sendInstruction(initializeMintIx, [payer]);\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/associated-token-account/create-idempotent.test.ts",
    "content": "import { findAssociatedTokenPda, getTokenDecoder } from '@solana-program/token';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { ataClient, createMint, tokenClient } from './ata-test-utils';\n\ndescribe('Associated Token Account: createIdempotent', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext({ defaultPrograms: true });\n    });\n\n    test('should create an associated token account idempotently', async () => {\n        const payer = await ctx.createFundedAccount();\n        const mintAuthority = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const wallet = await ctx.createFundedAccount();\n\n        await createMint(ctx, payer, mint, mintAuthority);\n\n        const [ataAddress] = await findAssociatedTokenPda({\n            mint,\n            owner: wallet,\n            tokenProgram: tokenClient.programAddress,\n        });\n\n        const ix = await ataClient.methods\n            .createIdempotent()\n            .accounts({\n                associatedAccountAddress: ataAddress,\n                fundingAddress: payer,\n                tokenMintAddress: mint,\n                walletAddress: wallet,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(ix, [payer]);\n\n        const ataAccount = ctx.requireEncodedAccount(ataAddress);\n        const tokenData = getTokenDecoder().decode(ataAccount.data);\n        expect(ataAccount.owner).toBe(tokenClient.programAddress);\n        expect(tokenData.mint).toBe(mint);\n        expect(tokenData.owner).toBe(wallet);\n\n        // Call again — should succeed without error\n        ctx.advanceSlots();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const ataAccountAfter = ctx.requireEncodedAccount(ataAddress);\n        const tokenDataAfter = getTokenDecoder().decode(ataAccountAfter.data);\n        expect(ataAccountAfter.owner).toBe(tokenClient.programAddress);\n        expect(tokenDataAfter.mint).toBe(mint);\n        expect(tokenDataAfter.owner).toBe(wallet);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/associated-token-account/create.test.ts",
    "content": "import { findAssociatedTokenPda, getTokenDecoder } from '@solana-program/token';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { ataClient, createMint, tokenClient } from './ata-test-utils';\n\ndescribe('Associated Token Account: create', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext({ defaultPrograms: true });\n    });\n\n    test('should create an associated token account', async () => {\n        const payer = await ctx.createFundedAccount();\n        const mintAuthority = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const wallet = await ctx.createFundedAccount();\n\n        await createMint(ctx, payer, mint, mintAuthority);\n\n        const [ataAddress] = await findAssociatedTokenPda({\n            mint,\n            owner: wallet,\n            tokenProgram: tokenClient.programAddress,\n        });\n\n        const ix = await ataClient.methods\n            .create()\n            .accounts({\n                associatedAccountAddress: ataAddress,\n                fundingAddress: payer,\n                tokenMintAddress: mint,\n                walletAddress: wallet,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(ix, [payer]);\n\n        const ataAccount = ctx.requireEncodedAccount(ataAddress);\n        const tokenData = getTokenDecoder().decode(ataAccount.data);\n        expect(ataAccount.owner).toBe(tokenClient.programAddress);\n        expect(tokenData.mint).toBe(mint);\n        expect(tokenData.owner).toBe(wallet);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/associated-token-account/recover-nested.test.ts",
    "content": "import { findAssociatedTokenPda, getTokenDecoder } from '@solana-program/token';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { ataClient, createMint, tokenClient } from './ata-test-utils';\n\ndescribe('Associated Token Account: recoverNested', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext({ defaultPrograms: true });\n    });\n\n    test('should recover tokens from a nested associated token account', async () => {\n        const payer = await ctx.createFundedAccount();\n        const mintAuthority = await ctx.createFundedAccount();\n        const ownerMint = await ctx.createAccount();\n        const nestedMint = await ctx.createAccount();\n        const wallet = await ctx.createFundedAccount();\n\n        await createMint(ctx, payer, ownerMint, mintAuthority);\n        await createMint(ctx, payer, nestedMint, mintAuthority);\n\n        // Create owner ATA (wallet → ownerMint)\n        const [ownerAta] = await findAssociatedTokenPda({\n            mint: ownerMint,\n            owner: wallet,\n            tokenProgram: tokenClient.programAddress,\n        });\n        const createOwnerAtaIx = await ataClient.methods\n            .create()\n            .accounts({\n                associatedAccountAddress: ownerAta,\n                fundingAddress: payer,\n                tokenMintAddress: ownerMint,\n                walletAddress: wallet,\n            })\n            .instruction();\n        await ctx.sendInstruction(createOwnerAtaIx, [payer]);\n\n        // Create nested ATA (ownerAta → nestedMint) — tokens sent here accidentally\n        const [nestedAta] = await findAssociatedTokenPda({\n            mint: nestedMint,\n            owner: ownerAta,\n            tokenProgram: tokenClient.programAddress,\n        });\n        const createNestedAtaIx = await ataClient.methods\n            .create()\n            .accounts({\n                associatedAccountAddress: nestedAta,\n                fundingAddress: payer,\n                tokenMintAddress: nestedMint,\n                walletAddress: ownerAta,\n            })\n            .instruction();\n        await ctx.sendInstruction(createNestedAtaIx, [payer]);\n\n        // Mint tokens to nested ATA\n        const amount = BigInt(1_000_000);\n        const mintToIx = await tokenClient.methods\n            .mintTo({ amount })\n            .accounts({ mint: nestedMint, mintAuthority, token: nestedAta })\n            .signers(['mintAuthority'])\n            .instruction();\n        await ctx.sendInstruction(mintToIx, [payer, mintAuthority]);\n\n        // Create destination ATA (wallet → nestedMint)\n        const [destinationAta] = await findAssociatedTokenPda({\n            mint: nestedMint,\n            owner: wallet,\n            tokenProgram: tokenClient.programAddress,\n        });\n        const createDestAtaIx = await ataClient.methods\n            .create()\n            .accounts({\n                associatedAccountAddress: destinationAta,\n                fundingAddress: payer,\n                tokenMintAddress: nestedMint,\n                walletAddress: wallet,\n            })\n            .instruction();\n        await ctx.sendInstruction(createDestAtaIx, [payer]);\n\n        // Recover nested tokens\n        const recoverIx = await ataClient.methods\n            .recoverNested()\n            .accounts({\n                destinationAssociatedAccountAddress: destinationAta,\n                nestedAssociatedAccountAddress: nestedAta,\n                nestedTokenMintAddress: nestedMint,\n                ownerAssociatedAccountAddress: ownerAta,\n                ownerTokenMintAddress: ownerMint,\n                walletAddress: wallet,\n            })\n            .signers(['walletAddress'])\n            .instruction();\n        await ctx.sendInstruction(recoverIx, [payer, wallet]);\n\n        // Verify tokens moved to destination\n        const destAccount = ctx.requireEncodedAccount(destinationAta);\n        const destTokenData = getTokenDecoder().decode(destAccount.data);\n        expect(destTokenData.amount).toBe(amount);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/circular-account-refs/circular-account-refs.test.ts",
    "content": "import { address } from '@solana/addresses';\nimport { describe, expect, test } from 'vitest';\n\nimport type { CircularAccountRefsProgramClient } from '../generated/circular-account-refs-idl-types';\nimport { createTestProgramClient } from '../test-utils';\n\ndescribe('Circular Account References (Without PDA Seeds)', () => {\n    const programClient = createTestProgramClient<CircularAccountRefsProgramClient>('circular-account-refs-idl.json');\n\n    test('should throw AccountError for A->A self-reference', async () => {\n        await expect(programClient.methods.selfReference().accounts({}).instruction()).rejects.toThrow(\n            /Circular dependency detected: \\[accountA -> accountA\\]/,\n        );\n    });\n\n    test('should throw AccountError for A->B->A two-node cycle', async () => {\n        await expect(programClient.methods.twoAccountCycle().accounts({}).instruction()).rejects.toThrow(\n            /Circular dependency detected: \\[account(A|B) -> account(A|B) -> account(A|B)\\]/,\n        );\n    });\n\n    test('should throw AccountError for A->B->C->A three-node cycle', async () => {\n        await expect(programClient.methods.threeAccountCycle().accounts({}).instruction()).rejects.toThrow(\n            /Circular dependency detected: \\[account(A|B|C) -> account(A|B|C) -> account(A|B|C) -> account(A|B|C)\\]/,\n        );\n    });\n\n    test('should succeed when account is provided (A->B->A cycle)', async () => {\n        const testAddress = address('HNvDDMNXFUkJz8fFDVJ2GLrWNWYcFfqjJWJZR7JSxaMv');\n\n        const ixWithA = await programClient.methods.twoAccountCycle().accounts({ accountA: testAddress }).instruction();\n        const ixWithB = await programClient.methods.twoAccountCycle().accounts({ accountB: testAddress }).instruction();\n\n        [ixWithA, ixWithB].forEach(ix => {\n            expect(ix.accounts?.length).toBe(2);\n            ix.accounts?.forEach(account => {\n                expect(account.address).toBe(testAddress);\n            });\n        });\n    });\n\n    test('should succeed when account in three-node cycle (A->B->C->A) is provided', async () => {\n        const testAddress = address('HNvDDMNXFUkJz8fFDVJ2GLrWNWYcFfqjJWJZR7JSxaMv');\n\n        const ixWithA = await programClient.methods\n            .threeAccountCycle()\n            .accounts({ accountA: testAddress })\n            .instruction();\n\n        const ixWithB = await programClient.methods\n            .threeAccountCycle()\n            .accounts({ accountB: testAddress })\n            .instruction();\n\n        const ixWithC = await programClient.methods\n            .threeAccountCycle()\n            .accounts({ accountC: testAddress })\n            .instruction();\n\n        [ixWithA, ixWithB, ixWithC].forEach(ix => {\n            expect(ix.accounts?.length).toBe(3);\n            ix.accounts?.forEach(account => {\n                expect(account.address).toBe(testAddress);\n            });\n        });\n    });\n\n    test('should provide account self-reference', async () => {\n        const testAddress = address('HNvDDMNXFUkJz8fFDVJ2GLrWNWYcFfqjJWJZR7JSxaMv');\n        const ix = await programClient.methods.selfReference().accounts({ accountA: testAddress }).instruction();\n\n        expect(ix.accounts?.length).toBe(1);\n        expect(ix?.accounts?.[0]?.address).toBe(testAddress);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/collection-types/collection-types.test.ts",
    "content": "import { getNodeCodec, type ReadonlyUint8Array } from '@codama/dynamic-codecs';\nimport { type Address } from '@solana/addresses';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport type { CollectionTypesProgramClient } from '../generated/collection-types-idl-types';\nimport { createTestProgramClient, loadRoot, SvmTestContext } from '../test-utils';\n\nconst root = loadRoot('collection-types-idl.json');\n\nfunction decodeInstructionData(instructionName: string, data: ReadonlyUint8Array): unknown {\n    const ix = root.program.instructions.find(i => i.name === instructionName);\n    if (!ix) throw new Error(`Instruction ${instructionName} not found`);\n\n    const codec = getNodeCodec([root, root.program, ix]);\n    return codec.decode(new Uint8Array(data));\n}\n\ndescribe('Collection types: encoding and validation (set, map, tuple)', () => {\n    let ctx: SvmTestContext;\n    let signer: Address;\n    const programClient = createTestProgramClient<CollectionTypesProgramClient>('collection-types-idl.json');\n\n    beforeEach(async () => {\n        ctx = new SvmTestContext({ defaultPrograms: true, sysvars: true });\n        signer = await ctx.createFundedAccount();\n    });\n\n    describe('tupleTypeNode', () => {\n        test('should build instruction with basic tuple [u64, string]', async () => {\n            const ix = await programClient.methods\n                .storeTuple({ data: [42n, 'hello'] })\n                .accounts({ signer })\n                .instruction();\n\n            const decoded = decodeInstructionData('storeTuple', ix.data!);\n            expect(decoded).toMatchObject({\n                data: [42n, 'hello'],\n                discriminator: 0,\n            });\n        });\n\n        test('should build instruction with nested tuple [map, array]', async () => {\n            const ix = await programClient.methods\n                .storeNestedTuple({\n                    data: [{ alice: 100n, bob: 200n }, [1n, 2n, 3n]],\n                })\n                .accounts({ signer })\n                .instruction();\n\n            const decoded = decodeInstructionData('storeNestedTuple', ix.data!);\n            expect(decoded).toMatchObject({\n                data: [{ alice: 100n, bob: 200n }, [1n, 2n, 3n]],\n                discriminator: 6,\n            });\n        });\n\n        test('should reject tuple with wrong length', async () => {\n            await expect(\n                programClient.methods\n                    // @ts-expect-error - testing wrong tuple length\n                    .storeTuple({ data: [42n] })\n                    .accounts({ signer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"data\\[1\\]\", value: undefined/);\n        });\n\n        test('should reject tuple with wrong item type', async () => {\n            await expect(\n                programClient.methods\n                    // @ts-expect-error - testing wrong item type\n                    .storeTuple({ data: [42n, 123] })\n                    .accounts({ signer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"data\\[1\\]\", value: 123/);\n        });\n    });\n\n    describe('mapTypeNode', () => {\n        test('should build instruction with basic map ([string]: u64)', async () => {\n            const ix = await programClient.methods\n                .storeMap({ data: { alice: 100n, bob: 200n, charlie: 300n } })\n                .accounts({ signer })\n                .instruction();\n\n            const decoded = decodeInstructionData('storeMap', ix.data!);\n            expect(decoded).toMatchObject({\n                data: { alice: 100n, bob: 200n, charlie: 300n },\n                discriminator: 1,\n            });\n        });\n\n        test('should build instruction with empty map', async () => {\n            const ix = await programClient.methods.storeMap({ data: {} }).accounts({ signer }).instruction();\n\n            const decoded = decodeInstructionData('storeMap', ix.data!);\n            expect(decoded).toMatchObject({\n                data: {},\n                discriminator: 1,\n            });\n        });\n\n        test('should build instruction with nested map ([string]: array<u64>)', async () => {\n            const ix = await programClient.methods\n                .storeNestedMap({\n                    data: {\n                        list1: [1n, 2n, 3n],\n                        list2: [10n, 20n],\n                        list3: [],\n                    },\n                })\n                .accounts({ signer })\n                .instruction();\n\n            const decoded = decodeInstructionData('storeNestedMap', ix.data!);\n            expect(decoded).toMatchObject({\n                data: {\n                    list1: [1n, 2n, 3n],\n                    list2: [10n, 20n],\n                    list3: [],\n                },\n                discriminator: 7,\n            });\n        });\n\n        test('should reject non-object input', async () => {\n            await expect(\n                programClient.methods\n                    // @ts-expect-error - testing non-object input\n                    .storeMap({ data: [1, 2, 3] })\n                    .accounts({ signer })\n                    .instruction(),\n            ).rejects.toThrow(/Expected \\[object\\] for \\[mapTypeNode\\]/);\n        });\n\n        test('should reject wrong value type', async () => {\n            await expect(\n                programClient.methods\n                    // @ts-expect-error - testing wrong value type\n                    .storeMap({ data: { key: 'wrong' } })\n                    .accounts({ signer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"data\"/);\n        });\n    });\n\n    describe('setTypeNode', () => {\n        test('should build instruction with basic set<u64>', async () => {\n            const ix = await programClient.methods\n                .storeSet({ data: [1n, 2n, 3n] })\n                .accounts({ signer })\n                .instruction();\n\n            const decoded = decodeInstructionData('storeSet', ix.data!);\n            expect(decoded).toMatchObject({\n                data: [1n, 2n, 3n],\n                discriminator: 2,\n            });\n        });\n\n        test('should build instruction with empty set', async () => {\n            const ix = await programClient.methods.storeSet({ data: [] }).accounts({ signer }).instruction();\n\n            const decoded = decodeInstructionData('storeSet', ix.data!);\n            expect(decoded).toMatchObject({\n                data: [],\n                discriminator: 2,\n            });\n        });\n\n        test('should build instruction with nested set<tuple<u64, string>>', async () => {\n            const ix = await programClient.methods\n                .storeNestedSet({\n                    data: [\n                        [1n, 'first'],\n                        [2n, 'second'],\n                        [3n, 'third'],\n                        [3n, 'fifth'],\n                    ],\n                })\n                .accounts({ signer })\n                .instruction();\n\n            const decoded = decodeInstructionData('storeNestedSet', ix.data!);\n            expect(decoded).toMatchObject({\n                data: [\n                    [1n, 'first'],\n                    [2n, 'second'],\n                    [3n, 'third'],\n                    [3n, 'fifth'],\n                ],\n                discriminator: 8,\n            });\n        });\n\n        test('should reject duplicate primitive values in set', async () => {\n            await expect(\n                programClient.methods\n                    .storeSet({ data: [1n, 2n, 1n] })\n                    .accounts({ signer })\n                    .instruction(),\n            ).rejects.toThrow(/Expected all items to be unique/);\n            await expect(\n                programClient.methods\n                    .storeNestedSet({\n                        data: [\n                            [1n, 'first'],\n                            [2n, 'second'],\n                            [1n, 'first'], // duplicate\n                        ],\n                    })\n                    .accounts({ signer })\n                    .instruction(),\n            ).rejects.toThrow(/Expected all items to be unique/);\n        });\n\n        test('should reject non-array input', async () => {\n            await expect(\n                programClient.methods\n                    // @ts-expect-error - testing non-array input\n                    .storeSet({ data: { key: 'value' } })\n                    .accounts({ signer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"data\"/);\n        });\n\n        test('should reject non-serializable input with a helpful validation error', async () => {\n            const invalidData: Record<string, unknown> = { a: 1n, b: {} };\n            invalidData.b = invalidData;\n\n            await expect(\n                programClient.methods\n                    // @ts-expect-error - testing circular reference input\n                    .storeSet({ data: [invalidData, invalidData] })\n                    .accounts({ signer })\n                    .instruction(),\n            ).rejects.toThrow(/Invalid argument \"data\", value: non-serializable array \\(length 2\\)/);\n        });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/custom-resolvers/account-resolver.test.ts",
    "content": "import type { Address } from '@solana/addresses';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { programClient } from './custom-resolvers-test-utils';\n\ndescribe('Custom resolvers: accounts ResolverValueNode', () => {\n    let authority: Address;\n    let ctx: SvmTestContext;\n\n    beforeEach(async () => {\n        ctx = new SvmTestContext();\n        authority = await ctx.createFundedAccount();\n    });\n\n    test('should resolve accounts addresses via resolver', async () => {\n        const destination = await ctx.createFundedAccount();\n        const treasury = await ctx.createFundedAccount();\n\n        const expectedAccounts = [authority, destination, treasury];\n        const ix = await programClient.methods\n            .transferWithResolver({ amount: 100 })\n            .accounts({ authority })\n            .resolvers({\n                resolveDestination: () => Promise.resolve(destination),\n                resolveTreasury: () => Promise.resolve(treasury),\n            })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(3);\n        ix.accounts?.forEach((accountMeta, index) => {\n            expect(accountMeta.address).toBe(expectedAccounts[index]);\n        });\n    });\n\n    test('should throw AccountError when resolver missing for required account', async () => {\n        await expect(\n            programClient.methods.transferWithResolver({ amount: 100 }).accounts({ authority }).instruction(),\n        ).rejects.toThrow(/Resolver \\[resolveDestination\\] not provided for account \\[destination\\]/);\n    });\n\n    test('should throw AccountError when resolver returns null/undefined for required account', async () => {\n        const treasury = await ctx.createAccount();\n        await expect(\n            programClient.methods\n                .transferWithResolver({ amount: 100 })\n                .accounts({ authority, treasury })\n                .resolvers({\n                    resolveDestination: () => Promise.resolve(null),\n                })\n                .instruction(),\n        ).rejects.toThrow(/Invalid account address \\[destination\\]: \\[null\\]/);\n\n        await expect(\n            programClient.methods\n                .transferWithResolver({ amount: 100 })\n                .accounts({ authority, treasury })\n                .resolvers({\n                    resolveDestination: () => Promise.resolve(undefined),\n                })\n                .instruction(),\n        ).rejects.toThrow(/Invalid account address \\[destination\\]: \\[undefined\\]/);\n    });\n\n    test('should propagate error when account resolver rejects', async () => {\n        await expect(\n            programClient.methods\n                .transferWithResolver({ amount: 100 })\n                .accounts({ authority })\n                .resolvers({\n                    resolveDestination: () => Promise.reject(new Error('resolver failed')),\n                    resolveTreasury: () => Promise.resolve(ctx.SYSTEM_PROGRAM_ADDRESS),\n                })\n                .instruction(),\n        ).rejects.toThrow(\n            /Resolver \\[resolveDestination\\] threw an error while resolving \\[instructionAccountNode\\] \\[destination\\]/,\n        );\n    });\n\n    test('should throw when resolver missing for optional undefined account with direct resolverValueNode', async () => {\n        const destination = await ctx.createFundedAccount();\n\n        await expect(\n            programClient.methods\n                .transferWithResolver({ amount: 100 })\n                .accounts({ authority })\n                .resolvers({\n                    resolveDestination: () => Promise.resolve(destination),\n                })\n                .instruction(),\n        ).rejects.toThrow(/Resolver \\[resolveTreasury\\] not provided for account \\[treasury\\]/);\n\n        // double-check: when we provide null, treasury will be resolved into programId even without resolveTreasury resolver.\n        const ix = await programClient.methods\n            .transferWithResolver({ amount: 100 })\n            .accounts({ authority, treasury: null })\n            .resolvers({\n                resolveDestination: () => Promise.resolve(destination),\n            })\n            .instruction();\n        expect(ix.accounts?.[2].address).toBe(programClient.programAddress);\n    });\n\n    test('should bypass resolver when account is explicitly provided', async () => {\n        const destination = await ctx.createAccount();\n        const treasury = await ctx.createAccount();\n\n        const ix = await programClient.methods\n            .transferWithResolver({ amount: 42 })\n            .accounts({ authority, destination, treasury })\n            .resolvers({\n                resolveDestination: () => {\n                    throw new Error('resolveDestination should not be called');\n                },\n                resolveTreasury: () => {\n                    throw new Error('resolveTreasury should not be called');\n                },\n            })\n            .instruction();\n\n        expect(ix.accounts?.[1].address).toBe(destination);\n        expect(ix.accounts?.[2].address).toBe(treasury);\n    });\n\n    test('should resolve to programId when resolver returns null', async () => {\n        const ix = await programClient.methods\n            .conditionalTransfer()\n            .accounts({ authority })\n            .resolvers({\n                resolveIncludeRequired: () => Promise.resolve(true),\n                resolveIncludeTarget: () => Promise.resolve(null),\n            })\n            .instruction();\n\n        expect(ix.accounts?.[1].address).toBe(programClient.programAddress);\n    });\n\n    test('should throw AccountError when omitted required account conditional has no ifFalse and condition is falsy', async () => {\n        await expect(\n            programClient.methods\n                .conditionalTransfer()\n                .accounts({ authority })\n                .resolvers({\n                    resolveIncludeRequired: () => Promise.resolve(false),\n                    resolveIncludeTarget: () => Promise.resolve(true),\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[requiredTarget\\] in \\[conditionalTransfer\\] instruction/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/custom-resolvers/argument-resolvers.test.ts",
    "content": "import type { Address } from '@solana/addresses';\nimport {\n    addEncoderSizePrefix,\n    getOptionEncoder,\n    getU8Encoder,\n    getU32Encoder,\n    getUtf8Encoder,\n    none,\n    some,\n} from '@solana/codecs';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { programClient } from './custom-resolvers-test-utils';\n\nconst utf8Encoder = getUtf8Encoder();\nconst u32Encoder = getU32Encoder();\nconst u8Encoder = getU8Encoder();\nconst stringEncoder = addEncoderSizePrefix(utf8Encoder, u32Encoder);\n\n/**\n * Concat arguments for createItem ix data bytes:\n * [discriminator: u8] + [name: utf8] + [description: optional(utf8)] + [tags: optional(u8)]\n */\nfunction expectedData({\n    name,\n    description,\n    tags,\n}: {\n    description?: string | null;\n    name: string;\n    tags?: number | null;\n}): Uint8Array {\n    const discriminator = new Uint8Array([8]);\n    const nameBytes = stringEncoder.encode(name);\n    const descriptionBytes = getOptionEncoder(stringEncoder).encode(description ? some(description) : none());\n    const tagsBytes = getOptionEncoder(u8Encoder).encode(tags ? some(tags) : none());\n\n    return new Uint8Array([...discriminator, ...nameBytes, ...descriptionBytes, ...tagsBytes]);\n}\n\ndescribe('Custom resolvers: arguments ResolverValueNode', () => {\n    let authority: Address;\n    let ctx: SvmTestContext;\n\n    beforeEach(async () => {\n        ctx = new SvmTestContext();\n        authority = await ctx.createFundedAccount();\n    });\n\n    test('should resolve omitted argument via resolver', async () => {\n        const ix = await programClient.methods\n            .createItem({ name: 'hello' })\n            .accounts({ authority })\n            .resolvers({ resolveDescription: () => Promise.resolve('auto-filled') })\n            .instruction();\n\n        expect(ix.data).toEqual(expectedData({ description: 'auto-filled', name: 'hello', tags: null }));\n    });\n\n    test('should bypass resolver when argument is explicitly provided', async () => {\n        const ix = await programClient.methods\n            .createItem({ description: 'explicit', name: 'hello' })\n            .accounts({ authority })\n            .resolvers({\n                resolveDescription: () => {\n                    throw new Error('should not be called');\n                },\n            })\n            .instruction();\n\n        expect(ix.data).toEqual(expectedData({ description: 'explicit', name: 'hello', tags: null }));\n    });\n\n    test('should call multiple resolvers independently', async () => {\n        const ix = await programClient.methods\n            .createItem({ name: 'multi' })\n            .accounts({ authority })\n            .resolvers({\n                resolveDescription: () => Promise.resolve('desc'),\n                resolveTags: () => Promise.resolve(42),\n            })\n            .instruction();\n\n        expect(ix.data).toEqual(expectedData({ description: 'desc', name: 'multi', tags: 42 }));\n    });\n\n    test('should pass argumentsInput and accountsInput context to resolver', async () => {\n        const expectedArgs = { name: 'context' };\n        const expectedAccounts = { authority };\n        const capturedArgs: Record<string, unknown> = {};\n        const capturedAccounts: Record<string, unknown> = {};\n\n        await programClient.methods\n            .createItem(expectedArgs)\n            .accounts(expectedAccounts)\n            .resolvers({\n                resolveDescription: (args, accounts) => {\n                    Object.assign(capturedArgs, args);\n                    Object.assign(capturedAccounts, accounts);\n                    return Promise.resolve(null);\n                },\n            })\n            .instruction();\n\n        expect(capturedArgs).toEqual(expectedArgs);\n        expect(capturedAccounts).toEqual(expectedAccounts);\n    });\n\n    test('should omit optional argument when no resolver provided', async () => {\n        const ix = await programClient.methods\n            .createItem({ name: 'no-resolver' })\n            .accounts({ authority })\n            .instruction();\n\n        expect(ix.data).toEqual(expectedData({ description: null, name: 'no-resolver', tags: null }));\n    });\n\n    test('should propagate error when argument resolver throws', async () => {\n        await expect(\n            programClient.methods\n                .createItem({ name: 'err' })\n                .accounts({ authority })\n                .resolvers({\n                    resolveDescription: () => {\n                        throw new Error('Error from resolver');\n                    },\n                })\n                .instruction(),\n        ).rejects.toThrow(\n            /Resolver \\[resolveDescription\\] threw an error while resolving \\[instructionArgumentNode\\] \\[description\\]/,\n        );\n\n        await expect(\n            programClient.methods\n                .createItem({ name: 'err' })\n                .accounts({ authority })\n                .resolvers({\n                    resolveDescription: () => Promise.reject(new Error('Async error from resolver')),\n                })\n                .instruction(),\n        ).rejects.toThrow(\n            /Resolver \\[resolveDescription\\] threw an error while resolving \\[instructionArgumentNode\\] \\[description\\]/,\n        );\n    });\n\n    test('should encode optional argument as none when resolver returns undefined or null', async () => {\n        const ix1 = await programClient.methods\n            .createItem({ name: 'hello world 1' })\n            .accounts({ authority })\n            .resolvers({ resolveDescription: () => Promise.resolve(undefined) })\n            .instruction();\n\n        expect(ix1.data).toEqual(expectedData({ description: null, name: 'hello world 1', tags: null }));\n\n        const ix2 = await programClient.methods\n            .createItem({ name: 'hello world 2' })\n            .accounts({ authority })\n            .resolvers({ resolveDescription: () => Promise.resolve(null) })\n            .instruction();\n\n        expect(ix2.data).toEqual(expectedData({ description: null, name: 'hello world 2', tags: null }));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/custom-resolvers/custom-resolvers-test-utils.ts",
    "content": "import { type CustomResolversTestProgramClient } from '../generated/custom-resolvers-test-idl-types';\nimport { createTestProgramClient } from '../test-utils';\n\nexport const programClient = createTestProgramClient<CustomResolversTestProgramClient>(\n    'custom-resolvers-test-idl.json',\n);\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/idls/associated-token-account-idl.json",
    "content": "{\n    \"kind\": \"rootNode\",\n    \"standard\": \"codama\",\n    \"version\": \"1.3.7\",\n    \"program\": {\n        \"kind\": \"programNode\",\n        \"name\": \"splAssociatedTokenAccount\",\n        \"publicKey\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n        \"version\": \"1.1.1\",\n        \"docs\": [],\n        \"accounts\": [],\n        \"instructions\": [\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"create\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"fundingAddress\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"associatedAccountAddress\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"walletAddress\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenMintAddress\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        },\n                        \"defaultValueStrategy\": \"omitted\"\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"createIdempotent\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"fundingAddress\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"associatedAccountAddress\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"walletAddress\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenMintAddress\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        },\n                        \"defaultValueStrategy\": \"omitted\"\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"recoverNested\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"nestedAssociatedAccountAddress\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"nestedTokenMintAddress\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destinationAssociatedAccountAddress\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"ownerAssociatedAccountAddress\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"ownerTokenMintAddress\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"walletAddress\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 2\n                        },\n                        \"defaultValueStrategy\": \"omitted\"\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            }\n        ],\n        \"definedTypes\": [],\n        \"pdas\": [],\n        \"errors\": [\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidOwner\",\n                \"code\": 0,\n                \"message\": \"Associated token account owner does not match address derivation\",\n                \"docs\": [\"InvalidOwner: Associated token account owner does not match address derivation\"]\n            }\n        ]\n    },\n    \"additionalPrograms\": []\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/idls/blog-idl.json",
    "content": "{\n    \"kind\": \"rootNode\",\n    \"standard\": \"codama\",\n    \"version\": \"1.5.1\",\n    \"program\": {\n        \"kind\": \"programNode\",\n        \"name\": \"blog\",\n        \"publicKey\": \"1rAs9KgDjEnMVrU1nJPWVhN4b6W4VEBxzcNJoeJpbVR\",\n        \"version\": \"0.1.0\",\n        \"origin\": \"anchor\",\n        \"docs\": [],\n        \"accounts\": [\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"accessGrant\",\n                \"size\": 45,\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"discriminator\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"fixedSizeTypeNode\",\n                                \"size\": 8,\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                }\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"bytesValueNode\",\n                                \"data\": \"a737b8ed4af2006d\",\n                                \"encoding\": \"base16\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"profile\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"permissions\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"fixedSizeTypeNode\",\n                                \"size\": 4,\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"bump\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"bookmarkList\",\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"discriminator\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"fixedSizeTypeNode\",\n                                \"size\": 8,\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                }\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"bytesValueNode\",\n                                \"data\": \"a166250186ff7035\",\n                                \"encoding\": \"base16\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"owner\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"bookmarks\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"arrayTypeNode\",\n                                \"item\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"count\": {\n                                    \"kind\": \"prefixedCountNode\",\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u32\",\n                                        \"endian\": \"le\"\n                                    }\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"bump\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"category\",\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"discriminator\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"fixedSizeTypeNode\",\n                                \"size\": 8,\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                }\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"bytesValueNode\",\n                                \"data\": \"f223f5e8dde36234\",\n                                \"encoding\": \"base16\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"creator\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"name\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"bump\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"dailyDigest\",\n                \"size\": 46,\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"discriminator\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"fixedSizeTypeNode\",\n                                \"size\": 8,\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                }\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"bytesValueNode\",\n                                \"data\": \"9f7a552333dbba01\",\n                                \"encoding\": \"base16\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"profile\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"year\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u16\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"month\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"day\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"postCount\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"bump\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"post\",\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"discriminator\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"fixedSizeTypeNode\",\n                                \"size\": 8,\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                }\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"bytesValueNode\",\n                                \"data\": \"08935abab938c096\",\n                                \"encoding\": \"base16\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"author\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"id\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"title\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"content\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"bump\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"profile\",\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"discriminator\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"fixedSizeTypeNode\",\n                                \"size\": 8,\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                }\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"bytesValueNode\",\n                                \"data\": \"b865a5bc5f3f7fbc\",\n                                \"encoding\": \"base16\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"authority\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"username\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"postCount\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"bump\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"reaction\",\n                \"size\": 74,\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"discriminator\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"fixedSizeTypeNode\",\n                                \"size\": 8,\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                }\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"bytesValueNode\",\n                                \"data\": \"e23d64bfdfdd8e8b\",\n                                \"encoding\": \"base16\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"post\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"user\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"kind\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"bump\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"subscription\",\n                \"size\": 73,\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"discriminator\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"fixedSizeTypeNode\",\n                                \"size\": 8,\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                }\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"bytesValueNode\",\n                                \"data\": \"40071a8766846221\",\n                                \"encoding\": \"base16\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"follower\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"author\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"bump\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            }\n        ],\n        \"instructions\": [\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"createAccessGrant\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"profile\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"profile\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"authority\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authority\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"accessGrant\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"accessGrant\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"profile\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"profile\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"permissions\",\n                                    \"value\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"permissions\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"systemProgram\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"480b9806c737599e\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"permissions\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 4,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"createBookmarkList\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"bookmarkList\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"bookmarkList\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"owner\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"owner\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"systemProgram\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"778dbfdea33e1da9\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"bookmarks\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"arrayTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            },\n                            \"count\": {\n                                \"kind\": \"prefixedCountNode\",\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"createCategory\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"creator\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"category\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"category\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"name\",\n                                    \"value\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"name\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"systemProgram\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"dcf2ee2fe4dbdfe6\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"name\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"createDailyDigest\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"profile\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"profile\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"authority\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authority\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"dailyDigest\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"dailyDigest\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"profile\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"profile\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"year\",\n                                    \"value\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"year\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"month\",\n                                    \"value\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"month\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"day\",\n                                    \"value\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"day\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"systemProgram\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"39b9aea36467fe8d\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"year\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u16\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"month\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"day\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"createPost\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"profile\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"profile\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"authority\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authority\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"post\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"systemProgram\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"7b5cb81de7180fca\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"title\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"content\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"createProfile\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"profile\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"profile\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"authority\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authority\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"systemProgram\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"e1cdea8f11ba32dc\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"username\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"react\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"user\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"post\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"reaction\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"reaction\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"post\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"post\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"user\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"user\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"kind\",\n                                    \"value\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"kind\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"systemProgram\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"1e3377485425cccf\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"kind\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"subscribe\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"follower\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"author\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"subscription\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"subscription\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"follower\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"follower\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"author\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"author\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"systemProgram\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"fe1cbf8a9cb3b735\",\n                            \"encoding\": \"base16\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"updatePost\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"profile\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"profile\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"authority\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authority\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"post\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"post\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"profile\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"profile\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"postId\",\n                                    \"value\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"postId\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"author\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"9780cf6ba9f6f16b\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"postId\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"title\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"content\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            }\n        ],\n        \"definedTypes\": [],\n        \"pdas\": [\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"profile\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"5G9odWBzmA\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"accessGrant\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"CfvKowZ\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"profile\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"permissions\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 4,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"bookmarkList\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"2Ffw66YXmcbBp\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"owner\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"category\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"Hd7nx8Jz9DA\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"name\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"dailyDigest\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"s186r9EB\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"profile\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"year\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u16\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"month\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"day\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"reaction\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"L8nWcjTPk4d\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"post\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"user\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"kind\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"subscription\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"fnKB\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"follower\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"author\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"post\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"3sh3oZ\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"profile\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"postId\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ]\n            }\n        ],\n        \"events\": [],\n        \"errors\": []\n    },\n    \"additionalPrograms\": []\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/idls/circular-account-refs-idl.json",
    "content": "{\n    \"kind\": \"rootNode\",\n    \"standard\": \"codama\",\n    \"version\": \"1.3.7\",\n    \"program\": {\n        \"kind\": \"programNode\",\n        \"name\": \"circularAccountRefs\",\n        \"publicKey\": \"BkppVYrCXNAr7rt6FRVBJ6ZxfcMLkkWUomuebFVnNAAt\",\n        \"version\": \"0.1.0\",\n        \"origin\": \"custom\",\n        \"docs\": [\"Test program for circular account reference detection\"],\n        \"accounts\": [],\n        \"instructions\": [\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"twoAccountCycle\",\n                \"docs\": [\"Test A->B->A circular reference\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"accountA\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"accountValueNode\",\n                            \"name\": \"accountB\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"accountB\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"accountValueNode\",\n                            \"name\": \"accountA\"\n                        }\n                    }\n                ],\n                \"arguments\": [],\n                \"discriminators\": []\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"selfReference\",\n                \"docs\": [\"Test A->A self-reference cycle\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"accountA\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"accountValueNode\",\n                            \"name\": \"accountA\"\n                        }\n                    }\n                ],\n                \"arguments\": [],\n                \"discriminators\": []\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"threeAccountCycle\",\n                \"docs\": [\"Test A->B->C->A circular reference\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"accountA\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"accountValueNode\",\n                            \"name\": \"accountB\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"accountB\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"accountValueNode\",\n                            \"name\": \"accountC\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"accountC\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"accountValueNode\",\n                            \"name\": \"accountA\"\n                        }\n                    }\n                ],\n                \"arguments\": [],\n                \"discriminators\": []\n            }\n        ],\n        \"definedTypes\": [],\n        \"pdas\": []\n    },\n    \"additionalPrograms\": []\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/idls/collection-types-idl.json",
    "content": "{\n    \"kind\": \"rootNode\",\n    \"standard\": \"codama\",\n    \"version\": \"1.5.1\",\n    \"program\": {\n        \"kind\": \"programNode\",\n        \"name\": \"collectionTypes\",\n        \"publicKey\": \"5YYZqJa7jR51426rhWhydoZJC3GSTtYDQNzJJrZqWxA4\",\n        \"version\": \"0.1.0\",\n        \"docs\": [],\n        \"accounts\": [],\n        \"instructions\": [\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"storeTuple\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"signer\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"data\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"tupleTypeNode\",\n                            \"items\": [\n                                {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                },\n                                {\n                                    \"kind\": \"sizePrefixTypeNode\",\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u32\",\n                                        \"endian\": \"le\"\n                                    },\n                                    \"type\": {\n                                        \"kind\": \"stringTypeNode\",\n                                        \"encoding\": \"utf8\"\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"storeMap\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"signer\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"data\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"mapTypeNode\",\n                            \"key\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                },\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                }\n                            },\n                            \"value\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            },\n                            \"count\": {\n                                \"kind\": \"prefixedCountNode\",\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"storeSet\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"signer\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 2\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"data\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"setTypeNode\",\n                            \"item\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            },\n                            \"count\": {\n                                \"kind\": \"prefixedCountNode\",\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"storeNestedTuple\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"signer\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 6\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"data\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"tupleTypeNode\",\n                            \"items\": [\n                                {\n                                    \"kind\": \"mapTypeNode\",\n                                    \"key\": {\n                                        \"kind\": \"sizePrefixTypeNode\",\n                                        \"prefix\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u32\",\n                                            \"endian\": \"le\"\n                                        },\n                                        \"type\": {\n                                            \"kind\": \"stringTypeNode\",\n                                            \"encoding\": \"utf8\"\n                                        }\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u64\",\n                                        \"endian\": \"le\"\n                                    },\n                                    \"count\": {\n                                        \"kind\": \"prefixedCountNode\",\n                                        \"prefix\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u32\",\n                                            \"endian\": \"le\"\n                                        }\n                                    }\n                                },\n                                {\n                                    \"kind\": \"arrayTypeNode\",\n                                    \"item\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u64\",\n                                        \"endian\": \"le\"\n                                    },\n                                    \"count\": {\n                                        \"kind\": \"prefixedCountNode\",\n                                        \"prefix\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u32\",\n                                            \"endian\": \"le\"\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"storeNestedMap\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"signer\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 7\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"data\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"mapTypeNode\",\n                            \"key\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                },\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                }\n                            },\n                            \"value\": {\n                                \"kind\": \"arrayTypeNode\",\n                                \"item\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                },\n                                \"count\": {\n                                    \"kind\": \"prefixedCountNode\",\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u32\",\n                                        \"endian\": \"le\"\n                                    }\n                                }\n                            },\n                            \"count\": {\n                                \"kind\": \"prefixedCountNode\",\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"storeNestedSet\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"signer\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 8\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"data\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"setTypeNode\",\n                            \"item\": {\n                                \"kind\": \"tupleTypeNode\",\n                                \"items\": [\n                                    {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u64\",\n                                        \"endian\": \"le\"\n                                    },\n                                    {\n                                        \"kind\": \"sizePrefixTypeNode\",\n                                        \"prefix\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u32\",\n                                            \"endian\": \"le\"\n                                        },\n                                        \"type\": {\n                                            \"kind\": \"stringTypeNode\",\n                                            \"encoding\": \"utf8\"\n                                        }\n                                    }\n                                ]\n                            },\n                            \"count\": {\n                                \"kind\": \"prefixedCountNode\",\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    }\n                ]\n            }\n        ],\n        \"definedTypes\": [],\n        \"pdas\": [],\n        \"errors\": []\n    },\n    \"additionalPrograms\": []\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/idls/custom-resolvers-test-idl.json",
    "content": "{\n    \"kind\": \"rootNode\",\n    \"standard\": \"codama\",\n    \"version\": \"1.5.1\",\n    \"program\": {\n        \"kind\": \"programNode\",\n        \"name\": \"customResolversTest\",\n        \"publicKey\": \"9oHr11Q3pmPsAkFNzQS3JjK5RJA9hwvwrSgF2MXvs22C\",\n        \"version\": \"0.1.0\",\n        \"docs\": [\n            \"Manually generated IDL for testing custom resolvers: argument resolvers, direct account resolvers, and conditional account resolvers.\"\n        ],\n        \"pdas\": [],\n        \"accounts\": [],\n        \"definedTypes\": [],\n        \"errors\": [],\n        \"instructions\": [\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"createItem\",\n                \"docs\": [],\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 8\n                        },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"name\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"description\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"fixed\": false,\n                            \"item\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"resolverValueNode\",\n                            \"name\": \"resolveDescription\",\n                            \"docs\": [],\n                            \"dependsOn\": []\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"tags\",\n                        \"docs\": [],\n                        \"defaultValueStrategy\": \"optional\",\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"fixed\": false,\n                            \"item\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"resolverValueNode\",\n                            \"name\": \"resolveTags\",\n                            \"docs\": [],\n                            \"dependsOn\": []\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"transferWithResolver\",\n                \"docs\": [\"Tests direct account resolverValueNode (Pattern 3)\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destination\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"resolverValueNode\",\n                            \"name\": \"resolveDestination\",\n                            \"docs\": [],\n                            \"dependsOn\": []\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"treasury\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"resolverValueNode\",\n                            \"name\": \"resolveTreasury\",\n                            \"docs\": [],\n                            \"dependsOn\": []\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"conditionalTransfer\",\n                \"docs\": [\"Tests conditional resolver edge cases\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"optionalTarget\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"resolverValueNode\",\n                                \"name\": \"resolveIncludeTarget\",\n                                \"docs\": [],\n                                \"dependsOn\": []\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"11111111111111111111111111111111\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"requiredTarget\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"resolverValueNode\",\n                                \"name\": \"resolveIncludeRequired\",\n                                \"docs\": [],\n                                \"dependsOn\": []\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"11111111111111111111111111111111\"\n                            }\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 2\n                        },\n                        \"defaultValueStrategy\": \"omitted\"\n                    }\n                ]\n            }\n        ]\n    },\n    \"additionalPrograms\": []\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/idls/example-idl.json",
    "content": "{\n    \"kind\": \"rootNode\",\n    \"standard\": \"codama\",\n    \"version\": \"1.5.1\",\n    \"program\": {\n        \"kind\": \"programNode\",\n        \"name\": \"example\",\n        \"publicKey\": \"5xjPsgMHuoj4MrAPJVBrTomk5UAZvCxVtAdcWwgheoZs\",\n        \"version\": \"0.1.0\",\n        \"origin\": \"anchor\",\n        \"docs\": [],\n        \"accounts\": [\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"dataAccount1\",\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"discriminator\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"fixedSizeTypeNode\",\n                                \"size\": 8,\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                }\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"bytesValueNode\",\n                                \"data\": \"bd16d2a9c3062624\",\n                                \"encoding\": \"base16\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"input\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"optionalInput\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"bump\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"nestedExampleAccount\",\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"discriminator\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"fixedSizeTypeNode\",\n                                \"size\": 8,\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                }\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"bytesValueNode\",\n                                \"data\": \"199431fafbc64cb8\",\n                                \"encoding\": \"base16\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"input\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"structAndEnumsInput\"\n                            }\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"storeOptionalAccount\",\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"discriminator\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"fixedSizeTypeNode\",\n                                \"size\": 8,\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                }\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"bytesValueNode\",\n                                \"data\": \"cdc23432ff1ff097\",\n                                \"encoding\": \"base16\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"optionalAcc\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            }\n        ],\n        \"instructions\": [\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"externalProgramsWithPda\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"signer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaNode\",\n                                \"name\": \"tokenAccount\",\n                                \"docs\": [],\n                                \"programId\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"variablePdaSeedNode\",\n                                        \"name\": \"signer\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"publicKeyTypeNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"constantPdaSeedNode\",\n                                        \"type\": {\n                                            \"kind\": \"bytesTypeNode\"\n                                        },\n                                        \"value\": {\n                                            \"kind\": \"bytesValueNode\",\n                                            \"data\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                            \"encoding\": \"base58\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"variablePdaSeedNode\",\n                                        \"name\": \"mint\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"publicKeyTypeNode\"\n                                        }\n                                    }\n                                ]\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"signer\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"signer\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"dependentAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"dependentAccount\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"signer\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"signer\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"tokenAccount\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"tokenAccount\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"systemProgram\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"tokenProgram\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"associatedTokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n                            \"identifier\": \"associatedTokenProgram\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"SysvarRent111111111111111111111111111111111\",\n                            \"identifier\": \"rent\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"2d1ba417d532503f\",\n                            \"encoding\": \"base16\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"fourLevelPda\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"signer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"level1\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"level1\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"signer\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"signer\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"level2\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"level2\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"level1\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"level1\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"level3\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"level3\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"level2\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"level2\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"level4\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"level4\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"level3\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"level3\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"systemProgram\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"0a91d0f7e05f68d9\",\n                            \"encoding\": \"base16\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"nestedExample\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"signer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"nestedExampleAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"systemProgram\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"74d1961627e33e2f\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"input\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"structAndEnumsInput\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"noArguments\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"signer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"acc\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"systemProgram\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"d8babc37a02f97b1\",\n                            \"encoding\": \"base16\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"pubkeySeedIx\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"signer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"newAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"newAccount\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"signer\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"signer\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"systemProgram\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"fbe4907a8392e6e1\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"input\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"selfReferencePda\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"signer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"recursive\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"recursive\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"recursive\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"recursive\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"systemProgram\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"5b16377c88fe854e\",\n                            \"encoding\": \"base16\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"stringSeedPda\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"signer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"pdaAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"pdaAccount\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"id\",\n                                    \"value\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"id\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"name\",\n                                    \"value\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"name\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"systemProgram\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"be1f479d57a0852b\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"name\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"id\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"twoNodeCyclePda\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"signer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"pdaA\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"pdaA\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"pdaB\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"pdaB\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"pdaB\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"pdaB\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"pdaA\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"pdaA\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"systemProgram\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"a0c0bcc91ff667be\",\n                            \"encoding\": \"base16\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"updateOptionalAccount\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"signer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"createdOptionalAcc\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"createdOptionalAcc\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"id\",\n                                    \"value\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"id\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"optionalAccKey\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"systemProgram\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"f2c55828eba2993c\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"id\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"updateOptionalInput\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"signer\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"existingAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"newAccount\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"signer\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"signer\"\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"fixedSizeTypeNode\",\n                            \"size\": 8,\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"1f094566b31b79c7\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"input\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"optionalInput\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"fixed\": false,\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            }\n        ],\n        \"definedTypes\": [\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"command\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumTupleVariantTypeNode\",\n                            \"name\": \"start\",\n                            \"tuple\": {\n                                \"kind\": \"tupleTypeNode\",\n                                \"items\": [\n                                    {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u64\",\n                                        \"endian\": \"le\"\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"stop\"\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"continue\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"reason\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"sizePrefixTypeNode\",\n                                            \"type\": {\n                                                \"kind\": \"stringTypeNode\",\n                                                \"encoding\": \"utf8\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u32\",\n                                                \"endian\": \"le\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"innerEnum\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"tokenTransfer\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"amount\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u64\",\n                                            \"endian\": \"le\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"tokenType\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenType\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"stake\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"duration\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u64\",\n                                            \"endian\": \"le\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"none\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"innerHeader\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"version\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"command\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"command\"\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"innerStruct\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"value\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"name\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"seedEnum\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"seedEnum\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"bytes\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"optionalPubkey\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"enumsArray\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"arrayTypeNode\",\n                                \"item\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"seedEnum\"\n                                },\n                                \"count\": {\n                                    \"kind\": \"fixedCountNode\",\n                                    \"value\": 2\n                                }\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"seedEnum\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"arm\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"bar\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"car\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"structAndEnumsInput\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"header\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"innerHeader\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"innerStruct\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"innerStruct\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"innerEnum\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"innerEnum\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"seedEnum\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"seedEnum\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"pubkey\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"tokenType\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"sPL\"\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"nFT\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"collection\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"sizePrefixTypeNode\",\n                                            \"type\": {\n                                                \"kind\": \"stringTypeNode\",\n                                                \"encoding\": \"utf8\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u32\",\n                                                \"endian\": \"le\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            }\n        ],\n        \"pdas\": [\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"dependentAccount\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"jRu685RUxyrTMFKUptY\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"signer\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"tokenAccount\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"level1\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"vyjhaZZA\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"signer\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"level2\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"vyjhaZZB\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"level1\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"level3\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"vyjhaZZC\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"level2\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"level4\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"vyjhaZZD\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"level3\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"newAccount\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"3x5dmD\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"signer\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"recursive\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"2TTMxGdnk9y5E\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"recursive\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"pdaAccount\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"id\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"name\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"pdaA\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"DgTMS8g\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"pdaB\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"pdaB\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"DgTMS8h\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"pdaA\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"createdOptionalAcc\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"36yLnDMJfhTHJWcBU\",\n                            \"encoding\": \"base58\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"id\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ]\n            }\n        ],\n        \"events\": [],\n        \"errors\": []\n    },\n    \"additionalPrograms\": []\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/idls/mpl-token-metadata-idl.json",
    "content": "{\n    \"kind\": \"rootNode\",\n    \"standard\": \"codama\",\n    \"version\": \"1.5.0\",\n    \"program\": {\n        \"kind\": \"programNode\",\n        \"name\": \"mplTokenMetadata\",\n        \"publicKey\": \"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\",\n        \"version\": \"1.14.0\",\n        \"origin\": \"shank\",\n        \"docs\": [],\n        \"accounts\": [\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"collectionAuthorityRecord\",\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"key\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"key\"\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"collectionAuthorityRecord\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"key\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"bump\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"updateAuthority\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    ]\n                },\n                \"pda\": {\n                    \"kind\": \"pdaLinkNode\",\n                    \"name\": \"collectionAuthorityRecord\"\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"key\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"metadataDelegateRecord\",\n                \"size\": 98,\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"key\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"key\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"bump\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"mint\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"delegate\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"updateAuthority\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    ]\n                },\n                \"pda\": {\n                    \"kind\": \"pdaLinkNode\",\n                    \"name\": \"metadataDelegateRecord\"\n                }\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"holderDelegateRecord\",\n                \"size\": 98,\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"key\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"key\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"bump\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"mint\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"delegate\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"updateAuthority\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    ]\n                },\n                \"pda\": {\n                    \"kind\": \"pdaLinkNode\",\n                    \"name\": \"holderDelegateRecord\"\n                }\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"edition\",\n                \"size\": 41,\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"key\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"key\"\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"editionV1\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"key\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"parent\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"edition\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"key\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"editionMarker\",\n                \"size\": 32,\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"key\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"key\"\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"editionMarker\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"key\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"ledger\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"fixedSizeTypeNode\",\n                                \"size\": 31,\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                }\n                            }\n                        }\n                    ]\n                },\n                \"pda\": {\n                    \"kind\": \"pdaLinkNode\",\n                    \"name\": \"editionMarker\"\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"key\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"editionMarkerV2\",\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"key\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"key\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"ledger\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    ]\n                },\n                \"pda\": {\n                    \"kind\": \"pdaLinkNode\",\n                    \"name\": \"editionMarkerV2\"\n                }\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"tokenOwnedEscrow\",\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"key\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"key\"\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"tokenOwnedEscrow\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"key\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"baseToken\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"authority\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"escrowAuthority\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"bump\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"key\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"masterEdition\",\n                \"size\": null,\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"key\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"key\"\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"masterEditionV2\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"key\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"supply\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"maxSupply\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    ]\n                },\n                \"pda\": {\n                    \"kind\": \"pdaLinkNode\",\n                    \"name\": \"masterEdition\"\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"key\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"deprecatedMasterEditionV1\",\n                \"size\": null,\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"key\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"key\"\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"masterEditionV1\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"key\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"supply\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"maxSupply\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"printingMint\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"oneTimePrintingAuthorizationMint\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    ]\n                },\n                \"pda\": {\n                    \"kind\": \"pdaLinkNode\",\n                    \"name\": \"deprecatedMasterEditionV1\"\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"key\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"metadata\",\n                \"size\": null,\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"key\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"key\"\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"metadataV1\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"key\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"updateAuthority\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"mint\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"name\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"symbol\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"uri\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"sellerFeeBasisPoints\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u16\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"creators\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"arrayTypeNode\",\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"creator\"\n                                    },\n                                    \"count\": {\n                                        \"kind\": \"prefixedCountNode\",\n                                        \"prefix\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u32\",\n                                            \"endian\": \"le\"\n                                        }\n                                    }\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"primarySaleHappened\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"booleanTypeNode\",\n                                \"size\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"isMutable\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"booleanTypeNode\",\n                                \"size\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"editionNonce\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"tokenStandard\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"collection\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"collection\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"uses\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"uses\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"collectionDetails\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"collectionDetails\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"programmableConfig\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"programmableConfig\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    ]\n                },\n                \"pda\": {\n                    \"kind\": \"pdaLinkNode\",\n                    \"name\": \"metadata\"\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"key\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"tokenRecord\",\n                \"size\": 80,\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"key\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"key\"\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"tokenRecord\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"key\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"bump\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"state\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"tokenState\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"ruleSetRevision\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"delegate\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"delegateRole\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenDelegateRole\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"lockedTransfer\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    ]\n                },\n                \"pda\": {\n                    \"kind\": \"pdaLinkNode\",\n                    \"name\": \"tokenRecord\"\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"key\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"useAuthorityRecord\",\n                \"size\": 10,\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"key\",\n                            \"defaultValueStrategy\": \"omitted\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"key\"\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"useAuthorityRecord\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"key\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"allowedUses\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"bump\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                },\n                \"pda\": {\n                    \"kind\": \"pdaLinkNode\",\n                    \"name\": \"useAuthorityRecord\"\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"key\",\n                        \"offset\": 0\n                    }\n                ]\n            }\n        ],\n        \"instructions\": [\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"deprecatedMintNewEditionFromMasterEditionViaPrintingToken\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"New Metadata key (pda of ['metadata', program id, mint id])\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"edition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"New Edition V1 (pda of ['metadata', program id, mint id, 'edition'])\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"masterEdition\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterEdition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"Master Record Edition V1 (pda of ['metadata', program id, master metadata mint id, 'edition'])\"\n                        ],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"masterEdition\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of new token - THIS WILL TRANSFER AUTHORITY AWAY FROM THIS KEY\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mintAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint authority of new mint\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"printingMint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Printing Mint of master record edition\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterTokenAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account containing Printing mint token to be transferred\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"editionMarker\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"Edition pda to mark creation - will be checked for pre-existence. (pda of ['metadata', program id, master mint id, edition_number])\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"burnAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Burn authority for this token\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterUpdateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"update authority info for new metadata account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterMetadata\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Master record metadata account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Rent info\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"SysvarRent111111111111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"reservationList\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\n                            \"Reservation List - If present, and you are on this list, you can get an edition number given by your position on the list.\"\n                        ]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 3\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"updatePrimarySaleHappenedViaToken\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata key (pda of ['metadata', program id, mint id])\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Owner on the token account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Account containing tokens from the metadata's mint\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 4\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"signMetadata\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata (pda of ['metadata', program id, mint id])\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"creator\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Creator\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 7\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"mintNewEditionFromMasterEditionViaToken\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"newMetadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"New Metadata key (pda of ['metadata', program id, mint id])\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"newEdition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"New Edition (pda of ['metadata', program id, mint id, 'edition'])\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterEdition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"Master Record Edition V2 (pda of ['metadata', program id, master metadata mint id, 'edition'])\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"newMint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of new token - THIS WILL TRANSFER AUTHORITY AWAY FROM THIS KEY\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"editionMarkPda\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"Edition pda to mark creation - will be checked for pre-existence. (pda of ['metadata', program id, master metadata mint id, 'edition', edition_number]) where edition_number is NOT the edition number you pass in args but actually edition_number = floor(edition/EDITION_MARKER_BIT_SIZE).\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"newMintAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint authority of new mint\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenAccountOwner\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"owner of token account containing master token (#8)\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenAccount\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"token account containing token from master metadata mint\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"newMetadataUpdateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Update authority info for new metadata\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Master record metadata account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Rent info\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 11\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"mintNewEditionFromMasterEditionViaTokenArgs\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"mintNewEditionFromMasterEditionViaTokenArgs\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"convertMasterEditionV1ToV2\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterEdition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"Master Record Edition V1 (pda of ['metadata', program id, master metadata mint id, 'edition'])\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"oneTimeAuth\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"One time authorization mint\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"printingMint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Printing mint\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 12\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"mintNewEditionFromMasterEditionViaVaultProxy\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"newMetadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"New Metadata key (pda of ['metadata', program id, mint id])\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"newEdition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"New Edition (pda of ['metadata', program id, mint id, 'edition'])\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterEdition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"Master Record Edition V2 (pda of ['metadata', program id, master metadata mint id, 'edition']\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"newMint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of new token - THIS WILL TRANSFER AUTHORITY AWAY FROM THIS KEY\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"editionMarkPda\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"Edition pda to mark creation - will be checked for pre-existence. (pda of ['metadata', program id, master metadata mint id, 'edition', edition_number]) where edition_number is NOT the edition number you pass in args but actually edition_number = floor(edition/EDITION_MARKER_BIT_SIZE).\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"newMintAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint authority of new mint\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"vaultAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Vault authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"safetyDepositStore\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Safety deposit token store account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"safetyDepositBox\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Safety deposit box\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"vault\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Vault\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"newMetadataUpdateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Update authority info for new metadata\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Master record metadata account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenVaultProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token vault program\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Rent info\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 13\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"mintNewEditionFromMasterEditionViaTokenArgs\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"mintNewEditionFromMasterEditionViaTokenArgs\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"puffMetadata\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 14\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"updateMetadataAccountV2\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"updateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Update authority key\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 15\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"data\",\n                        \"defaultValueStrategy\": \"optional\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"fixed\": false,\n                            \"item\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"dataV2\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"noneValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"newUpdateAuthority\",\n                        \"defaultValueStrategy\": \"optional\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"fixed\": false,\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"noneValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"primarySaleHappened\",\n                        \"defaultValueStrategy\": \"optional\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"fixed\": false,\n                            \"item\": {\n                                \"kind\": \"booleanTypeNode\",\n                                \"size\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"noneValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"isMutable\",\n                        \"defaultValueStrategy\": \"optional\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"fixed\": false,\n                            \"item\": {\n                                \"kind\": \"booleanTypeNode\",\n                                \"size\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"noneValueNode\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"createMasterEditionV3\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"edition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"Unallocated edition V2 account with address as pda of ['metadata', program id, mint, 'edition']\"\n                        ],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"masterEdition\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata mint\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"updateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Update authority\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mintAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"Mint authority on the metadata's mint - THIS WILL TRANSFER AUTHORITY AWAY FROM THIS KEY\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Rent info\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 17\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"maxSupply\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"fixed\": false,\n                            \"item\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"verifyCollection\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthority\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Collection Update authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collection\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata Account of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMasterEditionAccount\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"MasterEdition2 Account of the Collection Token\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthorityRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Collection Authority Record PDA\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 18\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"utilize\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token Account Of NFT\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of the Metadata\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"useAuthority\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"A Use Authority / Can be the current Owner of the NFT\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Owner\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"ataProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Associated Token program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n                            \"identifier\": \"splAssociatedToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Rent info\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"SysvarRent111111111111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"useAuthorityRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Use Authority Record PDA If present the program Assumes a delegated use authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"burner\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Program As Signer (Burner)\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 19\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"numberOfUses\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"approveUseAuthority\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"useAuthorityRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Use Authority Record PDA\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Owner\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"user\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"A Use Authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"ownerTokenAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Owned Token Account Of Mint\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of Metadata\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"burner\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Program As Signer (Burner)\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Rent info\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 20\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"numberOfUses\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"revokeUseAuthority\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"useAuthorityRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Use Authority Record PDA\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Owner\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"user\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"A Use Authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"ownerTokenAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Owned Token Account Of Mint\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of Metadata\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Rent info\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 21\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"unverifyCollection\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthority\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Collection Authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collection\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata Account of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMasterEditionAccount\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"MasterEdition2 Account of the Collection Token\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthorityRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Collection Authority Record PDA\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 22\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"approveCollectionAuthority\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthorityRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Collection Authority Record PDA\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"newCollectionAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"A Collection Authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"updateAuthority\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Update Authority of Collection NFT\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Collection Metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of Collection Metadata\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Rent info\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 23\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"revokeCollectionAuthority\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthorityRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Collection Authority Record PDA\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"delegateAuthority\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Delegated Collection Authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"revokeAuthority\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Update Authority, or Delegated Authority, of Collection NFT\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of Metadata\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 24\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"setAndVerifyCollection\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthority\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Collection Update authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"updateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Update Authority of Collection NFT and NFT\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collection\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata Account of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMasterEditionAccount\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"MasterEdition2 Account of the Collection Token\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthorityRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Collection Authority Record PDA\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 25\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"freezeDelegatedAccount\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"delegate\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Delegate\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account to freeze\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"edition\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Edition\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"masterEdition\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token mint\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 26\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"thawDelegatedAccount\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"delegate\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Delegate\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account to thaw\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"edition\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Edition\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"masterEdition\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token mint\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 27\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"removeCreatorVerification\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata (pda of ['metadata', program id, mint id])\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"creator\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Creator\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 28\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"burnNft\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata (pda of ['metadata', program id, mint id])\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"NFT owner\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of the NFT\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account to close\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterEditionAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"MasterEdition2 of the NFT\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"splTokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"SPL Token Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMetadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Metadata of the Collection\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 29\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"verifySizedCollectionItem\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Collection Update authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collection\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata Account of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMasterEditionAccount\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"MasterEdition2 Account of the Collection Token\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthorityRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Collection Authority Record PDA\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 30\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"unverifySizedCollectionItem\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Collection Authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collection\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata Account of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMasterEditionAccount\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"MasterEdition2 Account of the Collection Token\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthorityRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Collection Authority Record PDA\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 31\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"setAndVerifySizedCollectionItem\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Collection Update authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"updateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Update Authority of Collection NFT and NFT\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collection\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata Account of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMasterEditionAccount\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"MasterEdition2 Account of the Collection Token\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthorityRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Collection Authority Record PDA\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 32\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"createMetadataAccountV3\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata key (pda of ['metadata', program id, mint id])\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of token asset\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mintAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"updateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"update authority info\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Rent info\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 33\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"data\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"dataV2\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"isMutable\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"booleanTypeNode\",\n                            \"size\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"collectionDetails\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"fixed\": false,\n                            \"item\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"collectionDetails\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"setCollectionSize\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMetadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Collection Metadata account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthority\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Collection Update authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthorityRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Collection Authority Record PDA\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 34\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"setCollectionSizeArgs\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"setCollectionSizeArgs\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"setTokenStandard\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"updateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata update authority\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"edition\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Edition account\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 35\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"bubblegumSetCollectionSize\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMetadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Collection Metadata account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Collection Update authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"bubblegumSigner\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Signing PDA of Bubblegum program\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionAuthorityRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Collection Authority Record PDA\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 36\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"setCollectionSizeArgs\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"setCollectionSizeArgs\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"burnEditionNft\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata (pda of ['metadata', program id, mint id])\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"NFT owner\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"printEditionMint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of the print edition NFT\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterEditionMint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of the original/master NFT\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"printEditionTokenAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account the print edition NFT is in\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterEditionTokenAccount\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account the Master Edition NFT is in\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterEditionAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"MasterEdition2 of the original NFT\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"printEditionAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Print Edition account of the NFT\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"editionMarkerAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Edition Marker PDA of the NFT\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"splTokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"SPL Token Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 37\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"createEscrowAccount\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"escrow\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Escrow account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenAccount\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account of the token\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"edition\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Edition account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"masterEdition\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Wallet paying for the transaction and new account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sysvarInstructions\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Instructions sysvar account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": true,\n                        \"docs\": [\"Authority/creator of the escrow account\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 38\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"closeEscrowAccount\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"escrow\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Escrow account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenAccount\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"edition\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Edition account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"masterEdition\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Wallet paying for the transaction and new account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sysvarInstructions\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Instructions sysvar account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 39\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"transferOutOfEscrow\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"escrow\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Escrow account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Wallet paying for the transaction and new account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"attributeMint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint account for the new attribute\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"attributeSrc\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account source for the new attribute\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"attributeDst\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account, owned by TM, destination for the new attribute\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"escrowMint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint account that the escrow is attached\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"escrowAccount\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account that holds the token the escrow is attached to\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"ataProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Associated Token program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n                            \"identifier\": \"splAssociatedToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sysvarInstructions\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Instructions sysvar account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": true,\n                        \"docs\": [\"Authority/creator of the escrow account\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 40\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"defaultValueStrategy\": \"optional\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"burn\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Asset owner or Utility delegate\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMetadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Metadata of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata (pda of ['metadata', program id, mint id])\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"edition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Edition of the asset\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"resolverValueNode\",\n                                \"name\": \"resolveIsNonFungible\",\n                                \"docs\": [],\n                                \"dependsOn\": [\n                                    {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    }\n                                ]\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"masterEdition\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"mint\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of token asset\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account to close\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"associatedToken\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"owner\",\n                                    \"value\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenOwner\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterEdition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Master edition account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"accountValueNode\",\n                                \"name\": \"masterEditionMint\"\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"masterEdition\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"masterEditionMint\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterEditionMint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Master edition mint of the asset\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterEditionToken\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Master edition token account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"editionMarker\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Edition marker account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token record account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"argumentValueNode\",\n                                \"name\": \"tokenStandard\"\n                            },\n                            \"value\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"programmableNonFungible\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"tokenRecord\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"mint\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"token\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"token\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sysvarInstructions\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Instructions sysvar account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"splTokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"SPL Token Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 41\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"burnArgs\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"burnArgs\"\n                        }\n                    }\n                ],\n                \"extraArguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"tokenOwner\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"tokenStandard\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"tokenStandard\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"subInstructions\": [\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"burnV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Asset owner or Utility delegate\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"collectionMetadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Metadata of the Collection\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata (pda of ['metadata', program id, mint id])\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"edition\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Edition of the asset\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of token asset\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account to close\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"masterEditionMint\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"masterEditionMint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEditionMint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master edition mint of the asset\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEditionToken\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master edition token account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"editionMarker\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Edition marker account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"token\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"SPL Token Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 41\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"burnV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 0\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"amount\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 1\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenOwner\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"create\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"Unallocated metadata account with address as pda of ['metadata', program id, mint id]\"\n                        ],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterEdition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\n                            \"Unallocated edition account with address as pda of ['metadata', program id, mint, 'edition']\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of token asset\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint authority\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"updateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"Update authority for the metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"accountValueNode\",\n                            \"name\": \"authority\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sysvarInstructions\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Instructions sysvar account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"splTokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"SPL Token program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"resolverValueNode\",\n                                \"name\": \"resolveIsNonFungibleOrIsMintSigner\",\n                                \"docs\": [],\n                                \"dependsOn\": [\n                                    {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    },\n                                    {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    }\n                                ]\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                \"identifier\": \"splToken\"\n                            }\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 42\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"createArgs\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"createArgs\"\n                        }\n                    }\n                ],\n                \"byteDeltas\": [\n                    {\n                        \"kind\": \"instructionByteDeltaNode\",\n                        \"withHeader\": false,\n                        \"value\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1427\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"subInstructions\": [\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"createV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\n                                    \"Unallocated metadata account with address as pda of ['metadata', program id, mint id]\"\n                                ],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\n                                    \"Unallocated edition account with address as pda of ['metadata', program id, mint, 'edition']\"\n                                ],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": true,\n                                \"isSigner\": \"either\",\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of token asset\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint authority\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"updateAuthority\",\n                                \"isWritable\": false,\n                                \"isSigner\": \"either\",\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority for the metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"authority\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungibleOrIsMintSigner\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            },\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                        \"identifier\": \"splToken\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 42\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"createV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 0\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"name\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"sizePrefixTypeNode\",\n                                    \"type\": {\n                                        \"kind\": \"stringTypeNode\",\n                                        \"encoding\": \"utf8\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u32\",\n                                        \"endian\": \"le\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"symbol\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"sizePrefixTypeNode\",\n                                    \"type\": {\n                                        \"kind\": \"stringTypeNode\",\n                                        \"encoding\": \"utf8\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u32\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"stringValueNode\",\n                                    \"string\": \"\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"uri\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"sizePrefixTypeNode\",\n                                    \"type\": {\n                                        \"kind\": \"stringTypeNode\",\n                                        \"encoding\": \"utf8\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u32\",\n                                        \"endian\": \"le\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"sellerFeeBasisPoints\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"amountTypeNode\",\n                                    \"decimals\": 2,\n                                    \"unit\": \"%\",\n                                    \"number\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u16\",\n                                        \"endian\": \"le\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"creators\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"arrayTypeNode\",\n                                        \"item\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"creator\"\n                                        },\n                                        \"count\": {\n                                            \"kind\": \"prefixedCountNode\",\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u32\",\n                                                \"endian\": \"le\"\n                                            }\n                                        }\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"resolverValueNode\",\n                                    \"name\": \"resolveCreators\",\n                                    \"docs\": [],\n                                    \"dependsOn\": [\n                                        {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"authority\"\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"primarySaleHappened\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"booleanTypeNode\",\n                                    \"size\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"booleanValueNode\",\n                                    \"boolean\": false\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"isMutable\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"booleanTypeNode\",\n                                    \"size\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"booleanValueNode\",\n                                    \"boolean\": true\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"enumValueNode\",\n                                    \"variant\": \"nonFungible\",\n                                    \"enum\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"tokenStandard\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"collection\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"collection\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"uses\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"uses\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"collectionDetails\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"collectionDetails\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"resolverValueNode\",\n                                    \"name\": \"resolveCollectionDetails\",\n                                    \"docs\": [],\n                                    \"dependsOn\": [\n                                        {\n                                            \"kind\": \"argumentValueNode\",\n                                            \"name\": \"isCollection\"\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"ruleSet\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"publicKeyTypeNode\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"decimals\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"resolverValueNode\",\n                                    \"name\": \"resolveDecimals\",\n                                    \"docs\": [],\n                                    \"dependsOn\": [\n                                        {\n                                            \"kind\": \"argumentValueNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"printSupply\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"printSupply\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"resolverValueNode\",\n                                    \"name\": \"resolvePrintSupply\",\n                                    \"docs\": [],\n                                    \"dependsOn\": [\n                                        {\n                                            \"kind\": \"argumentValueNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    ]\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"isCollection\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"booleanTypeNode\",\n                                    \"size\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"booleanValueNode\",\n                                    \"boolean\": false\n                                }\n                            }\n                        ],\n                        \"byteDeltas\": [\n                            {\n                                \"kind\": \"instructionByteDeltaNode\",\n                                \"withHeader\": false,\n                                \"value\": {\n                                    \"kind\": \"resolverValueNode\",\n                                    \"name\": \"resolveCreateV1Bytes\",\n                                    \"docs\": []\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"mint\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token or Associated Token account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"associatedToken\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"owner\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"tokenOwner\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenOwner\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Owner of the token account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"resolverValueNode\",\n                            \"name\": \"resolveOptionalTokenOwner\",\n                            \"docs\": []\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account (pda of ['metadata', program id, mint id])\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterEdition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Master Edition account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"resolverValueNode\",\n                                \"name\": \"resolveIsNonFungible\",\n                                \"docs\": [],\n                                \"dependsOn\": [\n                                    {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    }\n                                ]\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"masterEdition\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"mint\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token record account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"argumentValueNode\",\n                                \"name\": \"tokenStandard\"\n                            },\n                            \"value\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"programmableNonFungible\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"tokenRecord\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"mint\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"token\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"token\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of token asset\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"(Mint or Update) authority\"],\n                        \"defaultValue\": {\n                            \"kind\": \"accountValueNode\",\n                            \"name\": \"payer\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"delegateRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Metadata delegate record\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sysvarInstructions\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Instructions sysvar account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"splTokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"SPL Token program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"splAtaProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"SPL Associated Token Account program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n                            \"identifier\": \"splAssociatedToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRulesProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"accountValueNode\",\n                                \"name\": \"authorizationRules\"\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                \"identifier\": \"mplTokenAuthRules\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRules\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules account\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 43\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"mintArgs\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"mintArgs\"\n                        }\n                    }\n                ],\n                \"extraArguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"tokenStandard\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"tokenStandard\"\n                        }\n                    }\n                ],\n                \"byteDeltas\": [\n                    {\n                        \"kind\": \"instructionByteDeltaNode\",\n                        \"withHeader\": false,\n                        \"value\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 468\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"subInstructions\": [\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"mintV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token or Associated Token account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenOwner\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Owner of the token account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"resolverValueNode\",\n                                    \"name\": \"resolveOptionalTokenOwner\",\n                                    \"docs\": []\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account (pda of ['metadata', program id, mint id])\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"token\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of token asset\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"(Mint or Update) authority\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Metadata delegate record\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"SPL Token program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splAtaProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"SPL Associated Token Account program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n                                    \"identifier\": \"splAssociatedToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 43\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"mintV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 0\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"amount\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 1\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            }\n                        ],\n                        \"byteDeltas\": [\n                            {\n                                \"kind\": \"instructionByteDeltaNode\",\n                                \"withHeader\": false,\n                                \"value\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 468\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"delegate\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"delegateRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Delegate record account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"delegate\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Owner of the delegated account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterEdition\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Master Edition account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"resolverValueNode\",\n                                \"name\": \"resolveIsNonFungible\",\n                                \"docs\": [],\n                                \"dependsOn\": [\n                                    {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    }\n                                ]\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"masterEdition\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"mint\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token record account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of metadata\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token account of mint\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Update authority or token owner\"],\n                        \"defaultValue\": {\n                            \"kind\": \"accountValueNode\",\n                            \"name\": \"payer\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sysvarInstructions\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Instructions sysvar account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"splTokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"SPL Token Program\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRulesProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"accountValueNode\",\n                                \"name\": \"authorizationRules\"\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                \"identifier\": \"mplTokenAuthRules\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRules\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules account\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 44\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"delegateArgs\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"delegateArgs\"\n                        }\n                    }\n                ],\n                \"extraArguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"tokenStandard\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"tokenStandard\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"subInstructions\": [\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"delegateCollectionV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"collection\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"delegate\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account of mint\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 44\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateCollectionV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 0\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"authority\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"delegateSaleV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"tokenRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"token\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"token\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"token\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account of mint\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 44\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateSaleV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 1\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"amount\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 1\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenOwner\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"delegateTransferV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"tokenRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"token\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"token\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"token\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account of mint\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 44\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateTransferV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 2\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"amount\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 1\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenOwner\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"delegateDataV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"data\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"delegate\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account of mint\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 44\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateDataV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 3\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"authority\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"delegateUtilityV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"tokenRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"token\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"token\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"token\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account of mint\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 44\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateUtilityV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 4\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"amount\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 1\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenOwner\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"delegateStakingV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"tokenRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"token\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"token\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"token\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account of mint\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 44\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateStakingV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 5\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"amount\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 1\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenOwner\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"delegateStandardV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"tokenRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"token\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"token\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"programIdValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account of mint\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 44\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateStandardV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 6\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"amount\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 1\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenOwner\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"delegateLockedTransferV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"tokenRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"token\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"token\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"token\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account of mint\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 44\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateLockedTransferV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 7\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"amount\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 1\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"lockedAddress\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenOwner\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"delegateProgrammableConfigV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"programmableConfig\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"delegate\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account of mint\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 44\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateProgrammableConfigV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 8\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"authority\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"delegateAuthorityItemV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"authorityItem\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"delegate\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account of mint\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 44\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateAuthorityItemV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 9\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"authority\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"delegateDataItemV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"dataItem\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"delegate\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account of mint\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 44\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateDataItemV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 10\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"authority\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"delegateCollectionItemV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"collectionItem\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"delegate\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account of mint\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 44\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateCollectionItemV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 11\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"authority\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"delegateProgrammableConfigItemV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"programmableConfigItem\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"delegate\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account of mint\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 44\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateProgrammableConfigItemV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 12\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"authority\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"delegatePrintDelegateV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account of mint\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 44\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegatePrintDelegateV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 13\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"revoke\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"delegateRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Delegate record account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"delegate\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Owner of the delegated account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterEdition\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Master Edition account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"resolverValueNode\",\n                                \"name\": \"resolveIsNonFungible\",\n                                \"docs\": [],\n                                \"dependsOn\": [\n                                    {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    }\n                                ]\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"masterEdition\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"mint\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token record account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of metadata\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token account of mint\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Update authority or token owner\"],\n                        \"defaultValue\": {\n                            \"kind\": \"accountValueNode\",\n                            \"name\": \"payer\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sysvarInstructions\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Instructions sysvar account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"splTokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"SPL Token Program\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRulesProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"accountValueNode\",\n                                \"name\": \"authorizationRules\"\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                \"identifier\": \"mplTokenAuthRules\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRules\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules account\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 45\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"revokeArgs\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"revokeArgs\"\n                        }\n                    }\n                ],\n                \"extraArguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"tokenStandard\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"tokenStandard\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"subInstructions\": [\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"revokeCollectionV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"collection\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"delegate\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account of mint\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 45\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"revokeCollectionV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 0\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"authority\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"revokeSaleV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"tokenRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"token\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"token\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"token\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account of mint\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 45\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"revokeSaleV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 1\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenOwner\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"revokeTransferV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"tokenRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"token\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"token\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"token\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account of mint\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 45\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"revokeTransferV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 2\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenOwner\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"revokeDataV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"data\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"delegate\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account of mint\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 45\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"revokeDataV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 3\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"authority\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"revokeUtilityV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"tokenRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"token\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"token\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"token\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account of mint\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 45\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"revokeUtilityV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 4\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenOwner\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"revokeStakingV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"tokenRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"token\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"token\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"token\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account of mint\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 45\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"revokeStakingV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 5\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenOwner\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"revokeStandardV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"tokenRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"token\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"token\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"programIdValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account of mint\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 45\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"revokeStandardV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 6\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenOwner\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"revokeLockedTransferV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"tokenRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"token\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"token\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"token\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account of mint\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 45\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"revokeLockedTransferV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 7\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenOwner\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"revokeProgrammableConfigV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"programmableConfig\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"delegate\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account of mint\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 45\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"revokeProgrammableConfigV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 8\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"authority\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"revokeMigrationV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"tokenRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"token\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"token\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"token\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account of mint\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 45\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"revokeMigrationV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 9\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenOwner\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"revokeAuthorityItemV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"authorityItem\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"delegate\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account of mint\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 45\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"revokeAuthorityItemV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 10\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"authority\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"revokeDataItemV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"dataItem\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"delegate\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account of mint\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 45\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"revokeDataItemV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 11\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"authority\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"revokeCollectionItemV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"collectionItem\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"delegate\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account of mint\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 45\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"revokeCollectionItemV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 12\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"authority\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"revokeProgrammableConfigItemV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"programmableConfigItem\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"delegate\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account of mint\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 45\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"revokeProgrammableConfigItemV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 13\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"authority\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"revokePrintDelegateV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the delegated account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of metadata\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account of mint\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or token owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 45\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"revokePrintDelegateV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 14\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"lock\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Delegate or freeze authority\"],\n                        \"defaultValue\": {\n                            \"kind\": \"accountValueNode\",\n                            \"name\": \"payer\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenOwner\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token owner account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"resolverValueNode\",\n                            \"name\": \"resolveOptionalTokenOwner\",\n                            \"docs\": []\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"associatedToken\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"owner\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"tokenOwner\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"edition\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Edition account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"resolverValueNode\",\n                                \"name\": \"resolveIsNonFungible\",\n                                \"docs\": [],\n                                \"dependsOn\": [\n                                    {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    }\n                                ]\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"masterEdition\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"mint\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token record account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"argumentValueNode\",\n                                \"name\": \"tokenStandard\"\n                            },\n                            \"value\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"programmableNonFungible\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"tokenRecord\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"mint\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"token\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"token\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sysvarInstructions\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"splTokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"SPL Token Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"argumentValueNode\",\n                                \"name\": \"tokenStandard\"\n                            },\n                            \"value\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"programmableNonFungible\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            \"ifFalse\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                \"identifier\": \"splToken\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRulesProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"accountValueNode\",\n                                \"name\": \"authorizationRules\"\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                \"identifier\": \"mplTokenAuthRules\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRules\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules account\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 46\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"lockArgs\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"lockArgs\"\n                        }\n                    }\n                ],\n                \"extraArguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"tokenStandard\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"tokenStandard\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"subInstructions\": [\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"lockV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Delegate or freeze authority\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenOwner\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token owner account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"resolverValueNode\",\n                                    \"name\": \"resolveOptionalTokenOwner\",\n                                    \"docs\": []\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"edition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"token\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"SPL Token Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifFalse\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                        \"identifier\": \"splToken\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 46\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"lockV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 0\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"unlock\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Delegate or freeze authority\"],\n                        \"defaultValue\": {\n                            \"kind\": \"accountValueNode\",\n                            \"name\": \"payer\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenOwner\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token owner account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"resolverValueNode\",\n                            \"name\": \"resolveOptionalTokenOwner\",\n                            \"docs\": []\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"associatedToken\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"owner\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"tokenOwner\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"edition\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Edition account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"resolverValueNode\",\n                                \"name\": \"resolveIsNonFungible\",\n                                \"docs\": [],\n                                \"dependsOn\": [\n                                    {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    }\n                                ]\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"masterEdition\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"mint\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token record account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"argumentValueNode\",\n                                \"name\": \"tokenStandard\"\n                            },\n                            \"value\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"programmableNonFungible\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"tokenRecord\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"mint\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"token\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"token\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sysvarInstructions\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"splTokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"SPL Token Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"argumentValueNode\",\n                                \"name\": \"tokenStandard\"\n                            },\n                            \"value\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"programmableNonFungible\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            \"ifFalse\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                \"identifier\": \"splToken\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRulesProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"accountValueNode\",\n                                \"name\": \"authorizationRules\"\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                \"identifier\": \"mplTokenAuthRules\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRules\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules account\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 47\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"unlockArgs\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"unlockArgs\"\n                        }\n                    }\n                ],\n                \"extraArguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"tokenStandard\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"tokenStandard\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"subInstructions\": [\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"unlockV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Delegate or freeze authority\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenOwner\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token owner account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"resolverValueNode\",\n                                    \"name\": \"resolveOptionalTokenOwner\",\n                                    \"docs\": []\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"edition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Edition account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"resolverValueNode\",\n                                        \"name\": \"resolveIsNonFungible\",\n                                        \"docs\": [],\n                                        \"dependsOn\": [\n                                            {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"tokenStandard\"\n                                            }\n                                        ]\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"token\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"SPL Token Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifFalse\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                        \"identifier\": \"splToken\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 47\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"unlockV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 0\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"migrate\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"edition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Edition account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"masterEdition\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenOwner\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account owner\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Update authority\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMetadata\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Collection metadata account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"delegateRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Delegate record account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token record account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"tokenRecord\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"token\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"token\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sysvarInstructions\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Instruction sysvar account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"splTokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"SPL Token Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRulesProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"accountValueNode\",\n                                \"name\": \"authorizationRules\"\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                \"identifier\": \"mplTokenAuthRules\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRules\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules account\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 48\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"transfer\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"associatedToken\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"owner\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"tokenOwner\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenOwner\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account owner\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destinationToken\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Destination token account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"associatedToken\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"owner\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"destinationOwner\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destinationOwner\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Destination token account owner\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of token asset\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata (pda of ['metadata', program id, mint id])\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"edition\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Edition of token asset\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"argumentValueNode\",\n                                \"name\": \"tokenStandard\"\n                            },\n                            \"value\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"programmableNonFungible\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"masterEdition\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"mint\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Owner token record account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"argumentValueNode\",\n                                \"name\": \"tokenStandard\"\n                            },\n                            \"value\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"programmableNonFungible\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"tokenRecord\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"mint\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"token\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"token\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destinationTokenRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Destination token record account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"argumentValueNode\",\n                                \"name\": \"tokenStandard\"\n                            },\n                            \"value\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"programmableNonFungible\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"tokenRecord\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"token\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"destinationToken\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"mint\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Transfer authority (token owner or delegate)\"],\n                        \"defaultValue\": {\n                            \"kind\": \"accountValueNode\",\n                            \"name\": \"payer\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sysvarInstructions\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Instructions sysvar account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"splTokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"SPL Token Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"splAtaProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"SPL Associated Token Account program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n                            \"identifier\": \"splAssociatedToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRulesProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"accountValueNode\",\n                                \"name\": \"authorizationRules\"\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                \"identifier\": \"mplTokenAuthRules\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRules\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules account\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 49\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"transferArgs\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"transferArgs\"\n                        }\n                    }\n                ],\n                \"extraArguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"tokenStandard\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"tokenStandard\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"subInstructions\": [\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"transferV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"tokenOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenOwner\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account owner\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"destinationToken\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Destination token account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"destinationOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"destinationOwner\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Destination token account owner\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of token asset\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata (pda of ['metadata', program id, mint id])\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"edition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Edition of token asset\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"masterEdition\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"tokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Owner token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"token\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"destinationTokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Destination token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"destinationToken\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"mint\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Transfer authority (token owner or delegate)\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"SPL Token Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splAtaProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"SPL Associated Token Account program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n                                    \"identifier\": \"splAssociatedToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 49\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"transferV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 0\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"amount\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 1\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"update\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Update authority or delegate\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"delegateRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Delegate record PDA\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"edition\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Edition account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sysvarInstructions\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Instructions sysvar account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRulesProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"accountValueNode\",\n                                \"name\": \"authorizationRules\"\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                \"identifier\": \"mplTokenAuthRules\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRules\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules account\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 50\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"updateArgs\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"updateArgs\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"subInstructions\": [\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"updateV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or delegate\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record PDA\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"edition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Edition account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 50\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 0\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"newUpdateAuthority\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"publicKeyTypeNode\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"data\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"data\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"primarySaleHappened\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"booleanTypeNode\",\n                                        \"size\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u8\",\n                                            \"endian\": \"le\"\n                                        }\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"isMutable\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"booleanTypeNode\",\n                                        \"size\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u8\",\n                                            \"endian\": \"le\"\n                                        }\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"collection\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"collectionToggle\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"enumValueNode\",\n                                    \"variant\": \"none\",\n                                    \"enum\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"collectionToggle\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"collectionDetails\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"collectionDetailsToggle\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"enumValueNode\",\n                                    \"variant\": \"none\",\n                                    \"enum\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"collectionDetailsToggle\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"uses\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"usesToggle\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"enumValueNode\",\n                                    \"variant\": \"none\",\n                                    \"enum\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"usesToggle\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"ruleSet\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"ruleSetToggle\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"enumValueNode\",\n                                    \"variant\": \"none\",\n                                    \"enum\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"ruleSetToggle\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"updateAsUpdateAuthorityV2\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or delegate\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record PDA\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"edition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Edition account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 50\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAsUpdateAuthorityV2Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 1\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"newUpdateAuthority\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"publicKeyTypeNode\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"data\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"data\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"primarySaleHappened\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"booleanTypeNode\",\n                                        \"size\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u8\",\n                                            \"endian\": \"le\"\n                                        }\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"isMutable\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"booleanTypeNode\",\n                                        \"size\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u8\",\n                                            \"endian\": \"le\"\n                                        }\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"collection\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"collectionToggle\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"enumValueNode\",\n                                    \"variant\": \"none\",\n                                    \"enum\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"collectionToggle\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"collectionDetails\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"collectionDetailsToggle\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"enumValueNode\",\n                                    \"variant\": \"none\",\n                                    \"enum\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"collectionDetailsToggle\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"uses\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"usesToggle\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"enumValueNode\",\n                                    \"variant\": \"none\",\n                                    \"enum\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"usesToggle\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"ruleSet\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"ruleSetToggle\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"enumValueNode\",\n                                    \"variant\": \"none\",\n                                    \"enum\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"ruleSetToggle\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"updateAsAuthorityItemDelegateV2\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or delegate\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record PDA\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"authorityItem\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"authority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"edition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Edition account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 50\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAsAuthorityItemDelegateV2Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 2\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"newUpdateAuthority\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"publicKeyTypeNode\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"primarySaleHappened\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"booleanTypeNode\",\n                                        \"size\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u8\",\n                                            \"endian\": \"le\"\n                                        }\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"isMutable\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"booleanTypeNode\",\n                                        \"size\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u8\",\n                                            \"endian\": \"le\"\n                                        }\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"updateAsCollectionDelegateV2\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or delegate\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record PDA\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"delegateMint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"collection\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"delegateUpdateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"authority\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"edition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Edition account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 50\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAsCollectionDelegateV2Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 3\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"collection\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"collectionToggle\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"enumValueNode\",\n                                    \"variant\": \"none\",\n                                    \"enum\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"collectionToggle\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateMint\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"mint\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateUpdateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"updateAsDataDelegateV2\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or delegate\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record PDA\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"delegateMint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"data\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"delegateUpdateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"authority\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"edition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Edition account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 50\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAsDataDelegateV2Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 4\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"data\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"data\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateMint\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"mint\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateUpdateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"updateAsProgrammableConfigDelegateV2\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or delegate\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record PDA\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"delegateMint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"programmableConfig\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"delegateUpdateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"authority\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"edition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Edition account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 50\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAsProgrammableConfigDelegateV2Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 5\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"ruleSet\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"ruleSetToggle\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"enumValueNode\",\n                                    \"variant\": \"none\",\n                                    \"enum\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"ruleSetToggle\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateMint\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"mint\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"delegateUpdateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"updateAsDataItemDelegateV2\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or delegate\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record PDA\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"dataItem\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"authority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"edition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Edition account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 50\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAsDataItemDelegateV2Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 6\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"data\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"data\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"updateAsCollectionItemDelegateV2\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or delegate\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record PDA\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"collectionItem\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"authority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"edition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Edition account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 50\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAsCollectionItemDelegateV2Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 7\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"collection\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"collectionToggle\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"enumValueNode\",\n                                    \"variant\": \"none\",\n                                    \"enum\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"collectionToggle\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"updateAsProgrammableConfigItemDelegateV2\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Update authority or delegate\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"payer\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record PDA\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadataDelegateRecord\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegateRole\",\n                                            \"value\": {\n                                                \"kind\": \"enumValueNode\",\n                                                \"variant\": \"programmableConfigItem\",\n                                                \"enum\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"metadataDelegateRole\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"updateAuthority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"delegate\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"authority\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"edition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Edition account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 50\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAsProgrammableConfigItemDelegateV2Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 8\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"ruleSet\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"ruleSetToggle\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"enumValueNode\",\n                                    \"variant\": \"none\",\n                                    \"enum\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"ruleSetToggle\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"updateAuthority\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"use\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token owner or delegate\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"delegateRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Delegate record PDA\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"edition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Edition account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sysvarInstructions\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"splTokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"SPL Token Program\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRulesProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules Program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"accountValueNode\",\n                                \"name\": \"authorizationRules\"\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                \"identifier\": \"mplTokenAuthRules\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authorizationRules\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token Authorization Rules account\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 51\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"useArgs\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"useArgs\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"subInstructions\": [\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"useV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token owner or delegate\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record PDA\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"token\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"mint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"mint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"edition\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Edition account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"SPL Token Program\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRulesProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules Program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"authorizationRules\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"publicKeyValueNode\",\n                                        \"publicKey\": \"auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg\",\n                                        \"identifier\": \"mplTokenAuthRules\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authorizationRules\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token Authorization Rules account\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 51\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"useV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 0\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"authorizationData\",\n                                \"defaultValueStrategy\": \"optional\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"optionTypeNode\",\n                                    \"fixed\": false,\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"authorizationData\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u8\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"noneValueNode\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"verify\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Creator to verify, collection update authority or delegate\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"delegateRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Delegate record PDA\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Mint of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMetadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Metadata Account of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMasterEdition\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Master Edition Account of the Collection Token\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sysvarInstructions\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Instructions sysvar account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 52\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"verificationArgs\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"verificationArgs\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"subInstructions\": [\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"verifyCreatorV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Creator to verify, collection update authority or delegate\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record PDA\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"collectionMint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Mint of the Collection\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"collectionMetadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Metadata Account of the Collection\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"collectionMasterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition Account of the Collection Token\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 52\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"verifyCreatorV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 0\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"verifyCollectionV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Creator to verify, collection update authority or delegate\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record PDA\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"collectionMint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of the Collection\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"collectionMetadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Metadata Account of the Collection\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"collectionMint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"collectionMasterEdition\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Master Edition Account of the Collection Token\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"masterEdition\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"collectionMint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 52\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"verifyCollectionV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 1\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"unverify\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"Creator to verify, collection (or metadata if parent burned) update authority or delegate\"\n                        ],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"delegateRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Delegate record PDA\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Mint of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"collectionMetadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Metadata Account of the Collection\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sysvarInstructions\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Instructions sysvar account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 53\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"verificationArgs\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"verificationArgs\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"subInstructions\": [\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"unverifyCreatorV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\n                                    \"Creator to verify, collection (or metadata if parent burned) update authority or delegate\"\n                                ],\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record PDA\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"collectionMint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Mint of the Collection\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"collectionMetadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Metadata Account of the Collection\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 53\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"unverifyCreatorV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 0\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"unverifyCollectionV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"authority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\n                                    \"Creator to verify, collection (or metadata if parent burned) update authority or delegate\"\n                                ],\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegateRecord\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Delegate record PDA\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"metadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Metadata account\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"collectionMint\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of the Collection\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"collectionMetadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Metadata Account of the Collection\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"collectionMint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 53\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"unverifyCollectionV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 1\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"collect\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Authority to collect fees\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"recipient\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to transfer collected fees to\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 54\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"print\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"editionMetadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"New Metadata key (pda of ['metadata', program id, mint id])\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"editionMint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"edition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"New Edition (pda of ['metadata', program id, mint id, 'edition'])\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"masterEdition\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"editionMint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"editionMint\",\n                        \"isWritable\": true,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of new token - THIS WILL TRANSFER AUTHORITY AWAY FROM THIS KEY\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"editionTokenAccountOwner\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Owner of the token account of new token\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"editionTokenAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token account of new token\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"associatedToken\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"editionMint\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"owner\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"editionTokenAccountOwner\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"editionMintAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint authority of new mint\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"editionTokenRecord\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token record account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"argumentValueNode\",\n                                \"name\": \"tokenStandard\"\n                            },\n                            \"value\": {\n                                \"kind\": \"enumValueNode\",\n                                \"variant\": \"programmableNonFungible\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"tokenRecord\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"editionMint\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"token\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"editionTokenAccount\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterEdition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"Master Record Edition V2 (pda of ['metadata', program id, master metadata mint id, 'edition'])\"\n                        ],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"masterEdition\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"masterEditionMint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"editionMarkerPda\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"Edition pda to mark creation - will be checked for pre-existence. (pda of ['metadata', program id, master metadata mint id, 'edition', edition_number]) where edition_number is NOT the edition number you pass in args but actually edition_number = floor(edition/EDITION_MARKER_BIT_SIZE).\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"payer\"],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterTokenAccountOwner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"owner of token account containing master token\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterTokenAccount\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"token account containing token from master metadata mint\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"associatedToken\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"masterEditionMint\"\n                                    }\n                                },\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"owner\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"masterTokenAccountOwner\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"masterMetadata\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Master record metadata account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"masterEditionMint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"updateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The update authority of the master edition.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"splTokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"splAtaProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"SPL Associated Token Account program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n                            \"identifier\": \"splAssociatedToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sysvarInstructions\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Instructions sysvar account\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 55\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"printArgs\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"printArgs\"\n                        }\n                    }\n                ],\n                \"extraArguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"masterEditionMint\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"tokenStandard\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"tokenStandard\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"subInstructions\": [\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"printV1\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"editionMetadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"New Metadata key (pda of ['metadata', program id, mint id])\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"editionMint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"edition\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"New Edition (pda of ['metadata', program id, mint id, 'edition'])\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"masterEdition\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"editionMint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"editionMint\",\n                                \"isWritable\": true,\n                                \"isSigner\": \"either\",\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of new token - THIS WILL TRANSFER AUTHORITY AWAY FROM THIS KEY\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"editionTokenAccountOwner\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the token account of new token\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"editionTokenAccount\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account of new token\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"editionMint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"editionTokenAccountOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"editionMintAuthority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint authority of new mint\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"accountValueNode\",\n                                    \"name\": \"masterTokenAccountOwner\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"editionTokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"editionMint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"editionTokenAccount\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\n                                    \"Master Record Edition V2 (pda of ['metadata', program id, master metadata mint id, 'edition'])\"\n                                ],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"masterEdition\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"masterEditionMint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"editionMarkerPda\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\n                                    \"Edition pda to mark creation - will be checked for pre-existence. (pda of ['metadata', program id, master metadata mint id, 'edition', edition_number]) where edition_number is NOT the edition number you pass in args but actually edition_number = floor(edition/EDITION_MARKER_BIT_SIZE).\"\n                                ],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"editionMarkerV2\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"argumentValueNode\",\n                                                    \"name\": \"masterEditionMint\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    \"ifFalse\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"editionMarkerFromEditionNumber\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"argumentValueNode\",\n                                                    \"name\": \"masterEditionMint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"editionNumber\",\n                                                \"value\": {\n                                                    \"kind\": \"argumentValueNode\",\n                                                    \"name\": \"editionNumber\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterTokenAccountOwner\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"owner of token account containing master token\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterTokenAccount\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"token account containing token from master metadata mint\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"masterEditionMint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"masterTokenAccountOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterMetadata\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Master record metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"masterEditionMint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"updateAuthority\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"The update authority of the master edition.\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splAtaProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"SPL Associated Token Account program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n                                    \"identifier\": \"splAssociatedToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 55\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"printV1Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 0\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"editionNumber\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"masterEditionMint\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionNode\",\n                        \"name\": \"printV2\",\n                        \"docs\": [],\n                        \"optionalAccountStrategy\": \"programId\",\n                        \"accounts\": [\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"editionMetadata\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"New Metadata key (pda of ['metadata', program id, mint id])\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"editionMint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"edition\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"New Edition (pda of ['metadata', program id, mint id, 'edition'])\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"masterEdition\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"editionMint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"editionMint\",\n                                \"isWritable\": true,\n                                \"isSigner\": \"either\",\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint of new token - THIS WILL TRANSFER AUTHORITY AWAY FROM THIS KEY\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"editionTokenAccountOwner\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Owner of the token account of new token\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"editionTokenAccount\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token account of new token\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"editionMint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"editionTokenAccountOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"editionMintAuthority\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"Mint authority of new mint\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"holderDelegateRecord\"\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"conditionalValueNode\",\n                                        \"condition\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"delegate\"\n                                        },\n                                        \"ifTrue\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"delegate\"\n                                        },\n                                        \"ifFalse\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"payer\"\n                                        }\n                                    },\n                                    \"ifFalse\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"masterTokenAccountOwner\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"editionTokenRecord\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"Token record account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"tokenRecord\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"editionMint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"token\",\n                                                \"value\": {\n                                                    \"kind\": \"accountValueNode\",\n                                                    \"name\": \"editionTokenAccount\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterEdition\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\n                                    \"Master Record Edition V2 (pda of ['metadata', program id, master metadata mint id, 'edition'])\"\n                                ],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"masterEdition\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"masterEditionMint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"editionMarkerPda\",\n                                \"isWritable\": true,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\n                                    \"Edition pda to mark creation - will be checked for pre-existence. (pda of ['metadata', program id, master metadata mint id, 'edition', edition_number]) where edition_number is NOT the edition number you pass in args but actually edition_number = floor(edition/EDITION_MARKER_BIT_SIZE).\"\n                                ],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"argumentValueNode\",\n                                        \"name\": \"tokenStandard\"\n                                    },\n                                    \"value\": {\n                                        \"kind\": \"enumValueNode\",\n                                        \"variant\": \"programmableNonFungible\",\n                                        \"enum\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    \"ifTrue\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"editionMarkerV2\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"argumentValueNode\",\n                                                    \"name\": \"masterEditionMint\"\n                                                }\n                                            }\n                                        ]\n                                    },\n                                    \"ifFalse\": {\n                                        \"kind\": \"pdaValueNode\",\n                                        \"pda\": {\n                                            \"kind\": \"pdaLinkNode\",\n                                            \"name\": \"editionMarkerFromEditionNumber\"\n                                        },\n                                        \"seeds\": [\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"mint\",\n                                                \"value\": {\n                                                    \"kind\": \"argumentValueNode\",\n                                                    \"name\": \"masterEditionMint\"\n                                                }\n                                            },\n                                            {\n                                                \"kind\": \"pdaSeedValueNode\",\n                                                \"name\": \"editionNumber\",\n                                                \"value\": {\n                                                    \"kind\": \"argumentValueNode\",\n                                                    \"name\": \"editionNumber\"\n                                                }\n                                            }\n                                        ]\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"payer\",\n                                \"isWritable\": true,\n                                \"isSigner\": true,\n                                \"isOptional\": false,\n                                \"docs\": [\"payer\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"payerValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterTokenAccountOwner\",\n                                \"isWritable\": false,\n                                \"isSigner\": \"either\",\n                                \"isOptional\": false,\n                                \"docs\": [\"owner of token account containing master token\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"conditionalValueNode\",\n                                    \"condition\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"holderDelegateRecord\"\n                                    },\n                                    \"ifFalse\": {\n                                        \"kind\": \"identityValueNode\"\n                                    }\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterTokenAccount\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"token account containing token from master metadata mint\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"associatedToken\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"masterEditionMint\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"owner\",\n                                            \"value\": {\n                                                \"kind\": \"accountValueNode\",\n                                                \"name\": \"masterTokenAccountOwner\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"masterMetadata\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Master record metadata account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"pdaValueNode\",\n                                    \"pda\": {\n                                        \"kind\": \"pdaLinkNode\",\n                                        \"name\": \"metadata\"\n                                    },\n                                    \"seeds\": [\n                                        {\n                                            \"kind\": \"pdaSeedValueNode\",\n                                            \"name\": \"mint\",\n                                            \"value\": {\n                                                \"kind\": \"argumentValueNode\",\n                                                \"name\": \"masterEditionMint\"\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"updateAuthority\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"The update authority of the master edition.\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"identityValueNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splTokenProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Token program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                                    \"identifier\": \"splToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"splAtaProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"SPL Associated Token Account program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n                                    \"identifier\": \"splAssociatedToken\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"sysvarInstructions\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"Instructions sysvar account\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"systemProgram\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": false,\n                                \"docs\": [\"System program\"],\n                                \"defaultValue\": {\n                                    \"kind\": \"publicKeyValueNode\",\n                                    \"publicKey\": \"11111111111111111111111111111111\",\n                                    \"identifier\": \"splSystem\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"holderDelegateRecord\",\n                                \"isWritable\": false,\n                                \"isSigner\": false,\n                                \"isOptional\": true,\n                                \"docs\": [\"The Delegate Record authorizing escrowless edition printing\"]\n                            },\n                            {\n                                \"kind\": \"instructionAccountNode\",\n                                \"name\": \"delegate\",\n                                \"isWritable\": false,\n                                \"isSigner\": true,\n                                \"isOptional\": true,\n                                \"docs\": [\"The authority printing the edition for a delegated print\"]\n                            }\n                        ],\n                        \"arguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 55\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"printV2Discriminator\",\n                                \"defaultValueStrategy\": \"omitted\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                },\n                                \"defaultValue\": {\n                                    \"kind\": \"numberValueNode\",\n                                    \"number\": 1\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"editionNumber\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        ],\n                        \"extraArguments\": [\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"masterEditionMint\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                }\n                            },\n                            {\n                                \"kind\": \"instructionArgumentNode\",\n                                \"name\": \"tokenStandard\",\n                                \"docs\": [],\n                                \"type\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"tokenStandard\"\n                                }\n                            }\n                        ],\n                        \"discriminators\": [\n                            {\n                                \"kind\": \"fieldDiscriminatorNode\",\n                                \"name\": \"discriminator\",\n                                \"offset\": 0\n                            }\n                        ]\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"resize\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The metadata account of the digital asset\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"edition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"The master edition or edition account of the digital asset, an uninitialized account for fungible assets\"\n                        ],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"masterEdition\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of token asset\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"The recipient of the excess rent and authority if the authority account is not present\"\n                        ],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": true,\n                        \"docs\": [\n                            \"Owner of the asset for (p)NFTs, or mint authority for fungible assets, if different from the payer\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Token or Associated Token account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 56\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"closeAccounts\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Metadata (pda of ['metadata', program id, mint id])\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"metadata\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"edition\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Edition of the asset\"],\n                        \"defaultValue\": {\n                            \"kind\": \"pdaValueNode\",\n                            \"pda\": {\n                                \"kind\": \"pdaLinkNode\",\n                                \"name\": \"masterEdition\"\n                            },\n                            \"seeds\": [\n                                {\n                                    \"kind\": \"pdaSeedValueNode\",\n                                    \"name\": \"mint\",\n                                    \"value\": {\n                                        \"kind\": \"accountValueNode\",\n                                        \"name\": \"mint\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of token asset\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Authority to close ownerless accounts\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destination\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The destination account that will receive the rent.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 57\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            }\n        ],\n        \"definedTypes\": [\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"setCollectionSizeArgs\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"size\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"mintNewEditionFromMasterEditionViaTokenArgs\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"edition\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"authorizationData\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"payload\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"payload\"\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"collection\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"verified\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"booleanTypeNode\",\n                                \"size\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"key\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"creator\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"address\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"verified\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"booleanTypeNode\",\n                                \"size\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"share\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"data\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"name\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"symbol\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"uri\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"sellerFeeBasisPoints\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u16\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"creators\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"arrayTypeNode\",\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"creator\"\n                                    },\n                                    \"count\": {\n                                        \"kind\": \"prefixedCountNode\",\n                                        \"prefix\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u32\",\n                                            \"endian\": \"le\"\n                                        }\n                                    }\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"dataV2\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"name\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"symbol\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"uri\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"sellerFeeBasisPoints\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u16\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"creators\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"arrayTypeNode\",\n                                    \"item\": {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"creator\"\n                                    },\n                                    \"count\": {\n                                        \"kind\": \"prefixedCountNode\",\n                                        \"prefix\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u32\",\n                                            \"endian\": \"le\"\n                                        }\n                                    }\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"collection\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"collection\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"uses\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": false,\n                                \"item\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"uses\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"reservation\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"address\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"spotsRemaining\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"totalSpots\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"reservationV1\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"address\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"spotsRemaining\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"totalSpots\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"seedsVec\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"seeds\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"arrayTypeNode\",\n                                \"item\": {\n                                    \"kind\": \"sizePrefixTypeNode\",\n                                    \"type\": {\n                                        \"kind\": \"bytesTypeNode\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u32\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"count\": {\n                                    \"kind\": \"prefixedCountNode\",\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u32\",\n                                        \"endian\": \"le\"\n                                    }\n                                }\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"proofInfo\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"proof\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"arrayTypeNode\",\n                                \"item\": {\n                                    \"kind\": \"fixedSizeTypeNode\",\n                                    \"size\": 32,\n                                    \"type\": {\n                                        \"kind\": \"bytesTypeNode\"\n                                    }\n                                },\n                                \"count\": {\n                                    \"kind\": \"prefixedCountNode\",\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u32\",\n                                        \"endian\": \"le\"\n                                    }\n                                }\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"payload\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"map\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"mapTypeNode\",\n                                \"key\": {\n                                    \"kind\": \"sizePrefixTypeNode\",\n                                    \"type\": {\n                                        \"kind\": \"stringTypeNode\",\n                                        \"encoding\": \"utf8\"\n                                    },\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u32\",\n                                        \"endian\": \"le\"\n                                    }\n                                },\n                                \"value\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"payloadType\"\n                                },\n                                \"count\": {\n                                    \"kind\": \"prefixedCountNode\",\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u32\",\n                                        \"endian\": \"le\"\n                                    }\n                                }\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"uses\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"useMethod\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"useMethod\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"remaining\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"total\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"burnArgs\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"v1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"amount\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u64\",\n                                            \"endian\": \"le\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"numberValueNode\",\n                                            \"number\": 1\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"delegateArgs\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"collectionV1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"saleV1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"amount\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u64\",\n                                            \"endian\": \"le\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"numberValueNode\",\n                                            \"number\": 1\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"transferV1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"amount\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u64\",\n                                            \"endian\": \"le\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"numberValueNode\",\n                                            \"number\": 1\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"dataV1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"utilityV1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"amount\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u64\",\n                                            \"endian\": \"le\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"numberValueNode\",\n                                            \"number\": 1\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"stakingV1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"amount\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u64\",\n                                            \"endian\": \"le\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"numberValueNode\",\n                                            \"number\": 1\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"standardV1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"amount\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u64\",\n                                            \"endian\": \"le\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"numberValueNode\",\n                                            \"number\": 1\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"lockedTransferV1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"amount\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u64\",\n                                            \"endian\": \"le\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"numberValueNode\",\n                                            \"number\": 1\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"lockedAddress\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"publicKeyTypeNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"programmableConfigV1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"authorityItemV1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"dataItemV1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"collectionItemV1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"programmableConfigItemV1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"printDelegateV1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"revokeArgs\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"collectionV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"saleV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"transferV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"dataV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"utilityV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"stakingV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"standardV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"lockedTransferV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"programmableConfigV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"migrationV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"authorityItemV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"dataItemV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"collectionItemV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"programmableConfigItemV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"printDelegateV1\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"metadataDelegateRole\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"authorityItem\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"collection\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"use\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"data\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"programmableConfig\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"dataItem\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"collectionItem\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"programmableConfigItem\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"holderDelegateRole\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"printDelegate\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"createArgs\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"v1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"name\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"sizePrefixTypeNode\",\n                                            \"type\": {\n                                                \"kind\": \"stringTypeNode\",\n                                                \"encoding\": \"utf8\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u32\",\n                                                \"endian\": \"le\"\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"symbol\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"sizePrefixTypeNode\",\n                                            \"type\": {\n                                                \"kind\": \"stringTypeNode\",\n                                                \"encoding\": \"utf8\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u32\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"stringValueNode\",\n                                            \"string\": \"\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"uri\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"sizePrefixTypeNode\",\n                                            \"type\": {\n                                                \"kind\": \"stringTypeNode\",\n                                                \"encoding\": \"utf8\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u32\",\n                                                \"endian\": \"le\"\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"sellerFeeBasisPoints\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"amountTypeNode\",\n                                            \"decimals\": 2,\n                                            \"unit\": \"%\",\n                                            \"number\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u16\",\n                                                \"endian\": \"le\"\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"creators\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"arrayTypeNode\",\n                                                \"item\": {\n                                                    \"kind\": \"definedTypeLinkNode\",\n                                                    \"name\": \"creator\"\n                                                },\n                                                \"count\": {\n                                                    \"kind\": \"prefixedCountNode\",\n                                                    \"prefix\": {\n                                                        \"kind\": \"numberTypeNode\",\n                                                        \"format\": \"u32\",\n                                                        \"endian\": \"le\"\n                                                    }\n                                                }\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"primarySaleHappened\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"booleanTypeNode\",\n                                            \"size\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"booleanValueNode\",\n                                            \"boolean\": false\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"isMutable\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"booleanTypeNode\",\n                                            \"size\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"booleanValueNode\",\n                                            \"boolean\": true\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"tokenStandard\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"tokenStandard\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"collection\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"collection\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"uses\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"uses\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"collectionDetails\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"collectionDetails\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"ruleSet\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"decimals\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"printSupply\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"printSupply\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"mintArgs\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"v1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"amount\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u64\",\n                                            \"endian\": \"le\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"numberValueNode\",\n                                            \"number\": 1\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"transferArgs\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"v1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"amount\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u64\",\n                                            \"endian\": \"le\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"numberValueNode\",\n                                            \"number\": 1\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"updateArgs\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"v1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"newUpdateAuthority\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"data\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"data\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"primarySaleHappened\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"booleanTypeNode\",\n                                                \"size\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u8\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"isMutable\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"booleanTypeNode\",\n                                                \"size\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u8\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"collection\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"collectionToggle\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"enumValueNode\",\n                                            \"variant\": \"none\",\n                                            \"enum\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"collectionToggle\"\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"collectionDetails\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"collectionDetailsToggle\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"enumValueNode\",\n                                            \"variant\": \"none\",\n                                            \"enum\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"collectionDetailsToggle\"\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"uses\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"usesToggle\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"enumValueNode\",\n                                            \"variant\": \"none\",\n                                            \"enum\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"usesToggle\"\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"ruleSet\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"ruleSetToggle\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"enumValueNode\",\n                                            \"variant\": \"none\",\n                                            \"enum\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"ruleSetToggle\"\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"asUpdateAuthorityV2\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"newUpdateAuthority\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"data\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"data\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"primarySaleHappened\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"booleanTypeNode\",\n                                                \"size\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u8\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"isMutable\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"booleanTypeNode\",\n                                                \"size\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u8\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"collection\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"collectionToggle\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"enumValueNode\",\n                                            \"variant\": \"none\",\n                                            \"enum\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"collectionToggle\"\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"collectionDetails\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"collectionDetailsToggle\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"enumValueNode\",\n                                            \"variant\": \"none\",\n                                            \"enum\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"collectionDetailsToggle\"\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"uses\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"usesToggle\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"enumValueNode\",\n                                            \"variant\": \"none\",\n                                            \"enum\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"usesToggle\"\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"ruleSet\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"ruleSetToggle\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"enumValueNode\",\n                                            \"variant\": \"none\",\n                                            \"enum\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"ruleSetToggle\"\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"tokenStandard\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"tokenStandard\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"asAuthorityItemDelegateV2\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"newUpdateAuthority\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"primarySaleHappened\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"booleanTypeNode\",\n                                                \"size\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u8\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"isMutable\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"booleanTypeNode\",\n                                                \"size\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u8\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"tokenStandard\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"tokenStandard\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"asCollectionDelegateV2\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"collection\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"collectionToggle\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"enumValueNode\",\n                                            \"variant\": \"none\",\n                                            \"enum\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"collectionToggle\"\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"asDataDelegateV2\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"data\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"data\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"asProgrammableConfigDelegateV2\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"ruleSet\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"ruleSetToggle\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"enumValueNode\",\n                                            \"variant\": \"none\",\n                                            \"enum\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"ruleSetToggle\"\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"asDataItemDelegateV2\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"data\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"data\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"asCollectionItemDelegateV2\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"collection\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"collectionToggle\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"enumValueNode\",\n                                            \"variant\": \"none\",\n                                            \"enum\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"collectionToggle\"\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"asProgrammableConfigItemDelegateV2\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"ruleSet\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"ruleSetToggle\"\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"enumValueNode\",\n                                            \"variant\": \"none\",\n                                            \"enum\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"ruleSetToggle\"\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"collectionToggle\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"none\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"clear\"\n                        },\n                        {\n                            \"kind\": \"enumTupleVariantTypeNode\",\n                            \"name\": \"set\",\n                            \"tuple\": {\n                                \"kind\": \"tupleTypeNode\",\n                                \"items\": [\n                                    {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"collection\"\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"usesToggle\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"none\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"clear\"\n                        },\n                        {\n                            \"kind\": \"enumTupleVariantTypeNode\",\n                            \"name\": \"set\",\n                            \"tuple\": {\n                                \"kind\": \"tupleTypeNode\",\n                                \"items\": [\n                                    {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"uses\"\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"collectionDetailsToggle\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"none\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"clear\"\n                        },\n                        {\n                            \"kind\": \"enumTupleVariantTypeNode\",\n                            \"name\": \"set\",\n                            \"tuple\": {\n                                \"kind\": \"tupleTypeNode\",\n                                \"items\": [\n                                    {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"collectionDetails\"\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"ruleSetToggle\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"none\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"clear\"\n                        },\n                        {\n                            \"kind\": \"enumTupleVariantTypeNode\",\n                            \"name\": \"set\",\n                            \"tuple\": {\n                                \"kind\": \"tupleTypeNode\",\n                                \"items\": [\n                                    {\n                                        \"kind\": \"publicKeyTypeNode\"\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"printArgs\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"v1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"edition\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u64\",\n                                            \"endian\": \"le\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"v2\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"edition\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u64\",\n                                            \"endian\": \"le\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"lockArgs\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"v1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"unlockArgs\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"v1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"useArgs\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"v1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"authorizationData\",\n                                        \"defaultValueStrategy\": \"optional\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"authorizationData\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        \"defaultValue\": {\n                                            \"kind\": \"noneValueNode\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"verificationArgs\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"creatorV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"collectionV1\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"tokenStandard\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"nonFungible\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"fungibleAsset\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"fungible\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"nonFungibleEdition\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"programmableNonFungible\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"programmableNonFungibleEdition\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"key\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"uninitialized\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"editionV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"masterEditionV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"reservationListV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"metadataV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"reservationListV2\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"masterEditionV2\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"editionMarker\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"useAuthorityRecord\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"collectionAuthorityRecord\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"tokenOwnedEscrow\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"tokenRecord\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"metadataDelegate\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"editionMarkerV2\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"holderDelegate\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"collectionDetails\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"v1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"size\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u64\",\n                                            \"endian\": \"le\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"v2\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"padding\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"fixedSizeTypeNode\",\n                                            \"size\": 8,\n                                            \"type\": {\n                                                \"kind\": \"bytesTypeNode\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"escrowAuthority\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"tokenOwner\"\n                        },\n                        {\n                            \"kind\": \"enumTupleVariantTypeNode\",\n                            \"name\": \"creator\",\n                            \"tuple\": {\n                                \"kind\": \"tupleTypeNode\",\n                                \"items\": [\n                                    {\n                                        \"kind\": \"publicKeyTypeNode\"\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"printSupply\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"zero\"\n                        },\n                        {\n                            \"kind\": \"enumTupleVariantTypeNode\",\n                            \"name\": \"limited\",\n                            \"tuple\": {\n                                \"kind\": \"tupleTypeNode\",\n                                \"items\": [\n                                    {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u64\",\n                                        \"endian\": \"le\"\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"unlimited\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"programmableConfig\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"v1\",\n                            \"struct\": {\n                                \"kind\": \"structTypeNode\",\n                                \"fields\": [\n                                    {\n                                        \"kind\": \"structFieldTypeNode\",\n                                        \"name\": \"ruleSet\",\n                                        \"docs\": [],\n                                        \"type\": {\n                                            \"kind\": \"optionTypeNode\",\n                                            \"fixed\": false,\n                                            \"item\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            },\n                                            \"prefix\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"migrationType\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"collectionV1\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"programmableV1\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"tokenState\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"unlocked\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"locked\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"listed\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"tokenDelegateRole\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"sale\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"transfer\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"utility\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"staking\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"standard\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"lockedTransfer\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"migration\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"authorityType\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"none\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"metadata\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"holder\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"metadataDelegate\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"tokenDelegate\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"payloadKey\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"amount\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"authority\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"authoritySeeds\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"delegate\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"delegateSeeds\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"destination\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"destinationSeeds\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"holder\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"source\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"sourceSeeds\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"payloadType\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumTupleVariantTypeNode\",\n                            \"name\": \"pubkey\",\n                            \"tuple\": {\n                                \"kind\": \"tupleTypeNode\",\n                                \"items\": [\n                                    {\n                                        \"kind\": \"publicKeyTypeNode\"\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumTupleVariantTypeNode\",\n                            \"name\": \"seeds\",\n                            \"tuple\": {\n                                \"kind\": \"tupleTypeNode\",\n                                \"items\": [\n                                    {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"seedsVec\"\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumTupleVariantTypeNode\",\n                            \"name\": \"merkleProof\",\n                            \"tuple\": {\n                                \"kind\": \"tupleTypeNode\",\n                                \"items\": [\n                                    {\n                                        \"kind\": \"definedTypeLinkNode\",\n                                        \"name\": \"proofInfo\"\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"enumTupleVariantTypeNode\",\n                            \"name\": \"number\",\n                            \"tuple\": {\n                                \"kind\": \"tupleTypeNode\",\n                                \"items\": [\n                                    {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u64\",\n                                        \"endian\": \"le\"\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"useMethod\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"burn\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"multiple\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"single\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            }\n        ],\n        \"pdas\": [\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"metadata\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"metadata\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"programIdValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"mint\",\n                        \"docs\": [\"The address of the mint account\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"deprecatedMasterEditionV1\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"metadata\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"programIdValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"mint\",\n                        \"docs\": [\"The address of the mint account\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"edition\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"masterEdition\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"metadata\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"programIdValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"mint\",\n                        \"docs\": [\"The address of the mint account\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"edition\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"editionMarker\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"metadata\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"programIdValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"mint\",\n                        \"docs\": [\"The address of the mint account\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"edition\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"editionMarker\",\n                        \"docs\": [\"The floor of the edition number divided by 248 as a string. I.e. ⌊edition/248⌋.\"],\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"editionMarkerV2\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"metadata\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"programIdValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"mint\",\n                        \"docs\": [\"The address of the mint account\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"edition\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"marker\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"tokenRecord\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"metadata\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"programIdValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"mint\",\n                        \"docs\": [\"The address of the mint account\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"token_record\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"token\",\n                        \"docs\": [\"The address of the token account (ata or not)\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"metadataDelegateRecord\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"metadata\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"programIdValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"mint\",\n                        \"docs\": [\"The address of the mint account\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"delegateRole\",\n                        \"docs\": [\"The role of the metadata delegate\"],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"metadataDelegateRoleSeed\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"updateAuthority\",\n                        \"docs\": [\"The address of the metadata's update authority\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"delegate\",\n                        \"docs\": [\"The address of the delegate authority\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"collectionAuthorityRecord\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"metadata\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"programIdValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"mint\",\n                        \"docs\": [\"The address of the mint account\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"collection_authority\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"collectionAuthority\",\n                        \"docs\": [\"The address of the collection authority\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"holderDelegateRecord\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"metadata\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"programIdValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"mint\",\n                        \"docs\": [\"The address of the mint account\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"delegateRole\",\n                        \"docs\": [\"The role of the holder delegate\"],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"holderDelegateRoleSeed\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"owner\",\n                        \"docs\": [\"The address of the owner of the token\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"delegate\",\n                        \"docs\": [\"The address of the delegate authority\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"useAuthorityRecord\",\n                \"docs\": [],\n                \"seeds\": [\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"metadata\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        },\n                        \"value\": {\n                            \"kind\": \"programIdValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"mint\",\n                        \"docs\": [\"The address of the mint account\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"constantPdaSeedNode\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"value\": {\n                            \"kind\": \"stringValueNode\",\n                            \"string\": \"user\"\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"useAuthority\",\n                        \"docs\": [\"The address of the use authority\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ]\n            }\n        ],\n        \"errors\": [\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"instructionUnpackError\",\n                \"code\": 0,\n                \"message\": \"\",\n                \"docs\": [\"InstructionUnpackError\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"instructionPackError\",\n                \"code\": 1,\n                \"message\": \"\",\n                \"docs\": [\"InstructionPackError\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"notRentExempt\",\n                \"code\": 2,\n                \"message\": \"Lamport balance below rent-exempt threshold\",\n                \"docs\": [\"NotRentExempt: Lamport balance below rent-exempt threshold\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"alreadyInitialized\",\n                \"code\": 3,\n                \"message\": \"Already initialized\",\n                \"docs\": [\"AlreadyInitialized: Already initialized\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"uninitialized\",\n                \"code\": 4,\n                \"message\": \"Uninitialized\",\n                \"docs\": [\"Uninitialized: Uninitialized\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidMetadataKey\",\n                \"code\": 5,\n                \"message\": \" Metadata's key must match seed of ['metadata', program id, mint] provided\",\n                \"docs\": [\n                    \"InvalidMetadataKey:  Metadata's key must match seed of ['metadata', program id, mint] provided\"\n                ]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidEditionKey\",\n                \"code\": 6,\n                \"message\": \"Edition's key must match seed of ['metadata', program id, name, 'edition'] provided\",\n                \"docs\": [\n                    \"InvalidEditionKey: Edition's key must match seed of ['metadata', program id, name, 'edition'] provided\"\n                ]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"updateAuthorityIncorrect\",\n                \"code\": 7,\n                \"message\": \"Update Authority given does not match\",\n                \"docs\": [\"UpdateAuthorityIncorrect: Update Authority given does not match\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"updateAuthorityIsNotSigner\",\n                \"code\": 8,\n                \"message\": \"Update Authority needs to be signer to update metadata\",\n                \"docs\": [\"UpdateAuthorityIsNotSigner: Update Authority needs to be signer to update metadata\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"notMintAuthority\",\n                \"code\": 9,\n                \"message\": \"You must be the mint authority and signer on this transaction\",\n                \"docs\": [\"NotMintAuthority: You must be the mint authority and signer on this transaction\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidMintAuthority\",\n                \"code\": 10,\n                \"message\": \"Mint authority provided does not match the authority on the mint\",\n                \"docs\": [\"InvalidMintAuthority: Mint authority provided does not match the authority on the mint\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"nameTooLong\",\n                \"code\": 11,\n                \"message\": \"Name too long\",\n                \"docs\": [\"NameTooLong: Name too long\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"symbolTooLong\",\n                \"code\": 12,\n                \"message\": \"Symbol too long\",\n                \"docs\": [\"SymbolTooLong: Symbol too long\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"uriTooLong\",\n                \"code\": 13,\n                \"message\": \"URI too long\",\n                \"docs\": [\"UriTooLong: URI too long\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"updateAuthorityMustBeEqualToMetadataAuthorityAndSigner\",\n                \"code\": 14,\n                \"message\": \"\",\n                \"docs\": [\"UpdateAuthorityMustBeEqualToMetadataAuthorityAndSigner\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"mintMismatch\",\n                \"code\": 15,\n                \"message\": \"Mint given does not match mint on Metadata\",\n                \"docs\": [\"MintMismatch: Mint given does not match mint on Metadata\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"editionsMustHaveExactlyOneToken\",\n                \"code\": 16,\n                \"message\": \"Editions must have exactly one token\",\n                \"docs\": [\"EditionsMustHaveExactlyOneToken: Editions must have exactly one token\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"maxEditionsMintedAlready\",\n                \"code\": 17,\n                \"message\": \"\",\n                \"docs\": [\"MaxEditionsMintedAlready\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"tokenMintToFailed\",\n                \"code\": 18,\n                \"message\": \"\",\n                \"docs\": [\"TokenMintToFailed\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"masterRecordMismatch\",\n                \"code\": 19,\n                \"message\": \"\",\n                \"docs\": [\"MasterRecordMismatch\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"destinationMintMismatch\",\n                \"code\": 20,\n                \"message\": \"\",\n                \"docs\": [\"DestinationMintMismatch\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"editionAlreadyMinted\",\n                \"code\": 21,\n                \"message\": \"\",\n                \"docs\": [\"EditionAlreadyMinted\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"printingMintDecimalsShouldBeZero\",\n                \"code\": 22,\n                \"message\": \"\",\n                \"docs\": [\"PrintingMintDecimalsShouldBeZero\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"oneTimePrintingAuthorizationMintDecimalsShouldBeZero\",\n                \"code\": 23,\n                \"message\": \"\",\n                \"docs\": [\"OneTimePrintingAuthorizationMintDecimalsShouldBeZero\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"editionMintDecimalsShouldBeZero\",\n                \"code\": 24,\n                \"message\": \"EditionMintDecimalsShouldBeZero\",\n                \"docs\": [\"EditionMintDecimalsShouldBeZero: EditionMintDecimalsShouldBeZero\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"tokenBurnFailed\",\n                \"code\": 25,\n                \"message\": \"\",\n                \"docs\": [\"TokenBurnFailed\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"tokenAccountOneTimeAuthMintMismatch\",\n                \"code\": 26,\n                \"message\": \"\",\n                \"docs\": [\"TokenAccountOneTimeAuthMintMismatch\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"derivedKeyInvalid\",\n                \"code\": 27,\n                \"message\": \"Derived key invalid\",\n                \"docs\": [\"DerivedKeyInvalid: Derived key invalid\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"printingMintMismatch\",\n                \"code\": 28,\n                \"message\": \"The Printing mint does not match that on the master edition!\",\n                \"docs\": [\"PrintingMintMismatch: The Printing mint does not match that on the master edition!\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"oneTimePrintingAuthMintMismatch\",\n                \"code\": 29,\n                \"message\": \"The One Time Printing Auth mint does not match that on the master edition!\",\n                \"docs\": [\n                    \"OneTimePrintingAuthMintMismatch: The One Time Printing Auth mint does not match that on the master edition!\"\n                ]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"tokenAccountMintMismatch\",\n                \"code\": 30,\n                \"message\": \"The mint of the token account does not match the Printing mint!\",\n                \"docs\": [\"TokenAccountMintMismatch: The mint of the token account does not match the Printing mint!\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"tokenAccountMintMismatchV2\",\n                \"code\": 31,\n                \"message\": \"The mint of the token account does not match the master metadata mint!\",\n                \"docs\": [\n                    \"TokenAccountMintMismatchV2: The mint of the token account does not match the master metadata mint!\"\n                ]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"notEnoughTokens\",\n                \"code\": 32,\n                \"message\": \"Not enough tokens to mint a limited edition\",\n                \"docs\": [\"NotEnoughTokens: Not enough tokens to mint a limited edition\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"printingMintAuthorizationAccountMismatch\",\n                \"code\": 33,\n                \"message\": \"\",\n                \"docs\": [\"PrintingMintAuthorizationAccountMismatch\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"authorizationTokenAccountOwnerMismatch\",\n                \"code\": 34,\n                \"message\": \"\",\n                \"docs\": [\"AuthorizationTokenAccountOwnerMismatch\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"disabled\",\n                \"code\": 35,\n                \"message\": \"\",\n                \"docs\": [\"Disabled\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"creatorsTooLong\",\n                \"code\": 36,\n                \"message\": \"Creators list too long\",\n                \"docs\": [\"CreatorsTooLong: Creators list too long\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"creatorsMustBeAtleastOne\",\n                \"code\": 37,\n                \"message\": \"Creators must be at least one if set\",\n                \"docs\": [\"CreatorsMustBeAtleastOne: Creators must be at least one if set\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"mustBeOneOfCreators\",\n                \"code\": 38,\n                \"message\": \"\",\n                \"docs\": [\"MustBeOneOfCreators\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"noCreatorsPresentOnMetadata\",\n                \"code\": 39,\n                \"message\": \"This metadata does not have creators\",\n                \"docs\": [\"NoCreatorsPresentOnMetadata: This metadata does not have creators\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"creatorNotFound\",\n                \"code\": 40,\n                \"message\": \"This creator address was not found\",\n                \"docs\": [\"CreatorNotFound: This creator address was not found\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidBasisPoints\",\n                \"code\": 41,\n                \"message\": \"Basis points cannot be more than 10000\",\n                \"docs\": [\"InvalidBasisPoints: Basis points cannot be more than 10000\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"primarySaleCanOnlyBeFlippedToTrue\",\n                \"code\": 42,\n                \"message\": \"Primary sale can only be flipped to true and is immutable\",\n                \"docs\": [\"PrimarySaleCanOnlyBeFlippedToTrue: Primary sale can only be flipped to true and is immutable\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"ownerMismatch\",\n                \"code\": 43,\n                \"message\": \"Owner does not match that on the account given\",\n                \"docs\": [\"OwnerMismatch: Owner does not match that on the account given\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"noBalanceInAccountForAuthorization\",\n                \"code\": 44,\n                \"message\": \"This account has no tokens to be used for authorization\",\n                \"docs\": [\"NoBalanceInAccountForAuthorization: This account has no tokens to be used for authorization\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"shareTotalMustBe100\",\n                \"code\": 45,\n                \"message\": \"Share total must equal 100 for creator array\",\n                \"docs\": [\"ShareTotalMustBe100: Share total must equal 100 for creator array\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"reservationExists\",\n                \"code\": 46,\n                \"message\": \"\",\n                \"docs\": [\"ReservationExists\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"reservationDoesNotExist\",\n                \"code\": 47,\n                \"message\": \"\",\n                \"docs\": [\"ReservationDoesNotExist\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"reservationNotSet\",\n                \"code\": 48,\n                \"message\": \"\",\n                \"docs\": [\"ReservationNotSet\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"reservationAlreadyMade\",\n                \"code\": 49,\n                \"message\": \"\",\n                \"docs\": [\"ReservationAlreadyMade\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"beyondMaxAddressSize\",\n                \"code\": 50,\n                \"message\": \"\",\n                \"docs\": [\"BeyondMaxAddressSize\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"numericalOverflowError\",\n                \"code\": 51,\n                \"message\": \"NumericalOverflowError\",\n                \"docs\": [\"NumericalOverflowError: NumericalOverflowError\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"reservationBreachesMaximumSupply\",\n                \"code\": 52,\n                \"message\": \"\",\n                \"docs\": [\"ReservationBreachesMaximumSupply\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"addressNotInReservation\",\n                \"code\": 53,\n                \"message\": \"\",\n                \"docs\": [\"AddressNotInReservation\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"cannotVerifyAnotherCreator\",\n                \"code\": 54,\n                \"message\": \"You cannot unilaterally verify another creator, they must sign\",\n                \"docs\": [\"CannotVerifyAnotherCreator: You cannot unilaterally verify another creator, they must sign\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"cannotUnverifyAnotherCreator\",\n                \"code\": 55,\n                \"message\": \"You cannot unilaterally unverify another creator\",\n                \"docs\": [\"CannotUnverifyAnotherCreator: You cannot unilaterally unverify another creator\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"spotMismatch\",\n                \"code\": 56,\n                \"message\": \"\",\n                \"docs\": [\"SpotMismatch\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"incorrectOwner\",\n                \"code\": 57,\n                \"message\": \"Incorrect account owner\",\n                \"docs\": [\"IncorrectOwner: Incorrect account owner\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"printingWouldBreachMaximumSupply\",\n                \"code\": 58,\n                \"message\": \"\",\n                \"docs\": [\"PrintingWouldBreachMaximumSupply\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"dataIsImmutable\",\n                \"code\": 59,\n                \"message\": \"Data is immutable\",\n                \"docs\": [\"DataIsImmutable: Data is immutable\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"duplicateCreatorAddress\",\n                \"code\": 60,\n                \"message\": \"No duplicate creator addresses\",\n                \"docs\": [\"DuplicateCreatorAddress: No duplicate creator addresses\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"reservationSpotsRemainingShouldMatchTotalSpotsAtStart\",\n                \"code\": 61,\n                \"message\": \"\",\n                \"docs\": [\"ReservationSpotsRemainingShouldMatchTotalSpotsAtStart\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidTokenProgram\",\n                \"code\": 62,\n                \"message\": \"Invalid token program\",\n                \"docs\": [\"InvalidTokenProgram: Invalid token program\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"dataTypeMismatch\",\n                \"code\": 63,\n                \"message\": \"Data type mismatch\",\n                \"docs\": [\"DataTypeMismatch: Data type mismatch\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"beyondAlottedAddressSize\",\n                \"code\": 64,\n                \"message\": \"\",\n                \"docs\": [\"BeyondAlottedAddressSize\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"reservationNotComplete\",\n                \"code\": 65,\n                \"message\": \"\",\n                \"docs\": [\"ReservationNotComplete\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"triedToReplaceAnExistingReservation\",\n                \"code\": 66,\n                \"message\": \"\",\n                \"docs\": [\"TriedToReplaceAnExistingReservation\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidOperation\",\n                \"code\": 67,\n                \"message\": \"Invalid operation\",\n                \"docs\": [\"InvalidOperation: Invalid operation\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidOwner\",\n                \"code\": 68,\n                \"message\": \"Invalid Owner\",\n                \"docs\": [\"InvalidOwner: Invalid Owner\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"printingMintSupplyMustBeZeroForConversion\",\n                \"code\": 69,\n                \"message\": \"Printing mint supply must be zero for conversion\",\n                \"docs\": [\"PrintingMintSupplyMustBeZeroForConversion: Printing mint supply must be zero for conversion\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"oneTimeAuthMintSupplyMustBeZeroForConversion\",\n                \"code\": 70,\n                \"message\": \"One Time Auth mint supply must be zero for conversion\",\n                \"docs\": [\n                    \"OneTimeAuthMintSupplyMustBeZeroForConversion: One Time Auth mint supply must be zero for conversion\"\n                ]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidEditionIndex\",\n                \"code\": 71,\n                \"message\": \"You tried to insert one edition too many into an edition mark pda\",\n                \"docs\": [\"InvalidEditionIndex: You tried to insert one edition too many into an edition mark pda\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"reservationArrayShouldBeSizeOne\",\n                \"code\": 72,\n                \"message\": \"\",\n                \"docs\": [\"ReservationArrayShouldBeSizeOne\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"isMutableCanOnlyBeFlippedToFalse\",\n                \"code\": 73,\n                \"message\": \"Is Mutable can only be flipped to false\",\n                \"docs\": [\"IsMutableCanOnlyBeFlippedToFalse: Is Mutable can only be flipped to false\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"collectionCannotBeVerifiedInThisInstruction\",\n                \"code\": 74,\n                \"message\": \"Collection cannot be verified in this instruction\",\n                \"docs\": [\n                    \"CollectionCannotBeVerifiedInThisInstruction: Collection cannot be verified in this instruction\"\n                ]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"removed\",\n                \"code\": 75,\n                \"message\": \"This instruction was deprecated in a previous release and is now removed\",\n                \"docs\": [\"Removed: This instruction was deprecated in a previous release and is now removed\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"mustBeBurned\",\n                \"code\": 76,\n                \"message\": \"\",\n                \"docs\": [\"MustBeBurned\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidUseMethod\",\n                \"code\": 77,\n                \"message\": \"This use method is invalid\",\n                \"docs\": [\"InvalidUseMethod: This use method is invalid\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"cannotChangeUseMethodAfterFirstUse\",\n                \"code\": 78,\n                \"message\": \"Cannot Change Use Method after the first use\",\n                \"docs\": [\"CannotChangeUseMethodAfterFirstUse: Cannot Change Use Method after the first use\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"cannotChangeUsesAfterFirstUse\",\n                \"code\": 79,\n                \"message\": \"Cannot Change Remaining or Available uses after the first use\",\n                \"docs\": [\"CannotChangeUsesAfterFirstUse: Cannot Change Remaining or Available uses after the first use\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"collectionNotFound\",\n                \"code\": 80,\n                \"message\": \"Collection Not Found on Metadata\",\n                \"docs\": [\"CollectionNotFound: Collection Not Found on Metadata\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidCollectionUpdateAuthority\",\n                \"code\": 81,\n                \"message\": \"Collection Update Authority is invalid\",\n                \"docs\": [\"InvalidCollectionUpdateAuthority: Collection Update Authority is invalid\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"collectionMustBeAUniqueMasterEdition\",\n                \"code\": 82,\n                \"message\": \"Collection Must Be a Unique Master Edition v2\",\n                \"docs\": [\"CollectionMustBeAUniqueMasterEdition: Collection Must Be a Unique Master Edition v2\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"useAuthorityRecordAlreadyExists\",\n                \"code\": 83,\n                \"message\": \"The Use Authority Record Already Exists, to modify it Revoke, then Approve\",\n                \"docs\": [\n                    \"UseAuthorityRecordAlreadyExists: The Use Authority Record Already Exists, to modify it Revoke, then Approve\"\n                ]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"useAuthorityRecordAlreadyRevoked\",\n                \"code\": 84,\n                \"message\": \"The Use Authority Record is empty or already revoked\",\n                \"docs\": [\"UseAuthorityRecordAlreadyRevoked: The Use Authority Record is empty or already revoked\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"unusable\",\n                \"code\": 85,\n                \"message\": \"This token has no uses\",\n                \"docs\": [\"Unusable: This token has no uses\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"notEnoughUses\",\n                \"code\": 86,\n                \"message\": \"There are not enough Uses left on this token.\",\n                \"docs\": [\"NotEnoughUses: There are not enough Uses left on this token.\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"collectionAuthorityRecordAlreadyExists\",\n                \"code\": 87,\n                \"message\": \"This Collection Authority Record Already Exists.\",\n                \"docs\": [\"CollectionAuthorityRecordAlreadyExists: This Collection Authority Record Already Exists.\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"collectionAuthorityDoesNotExist\",\n                \"code\": 88,\n                \"message\": \"This Collection Authority Record Does Not Exist.\",\n                \"docs\": [\"CollectionAuthorityDoesNotExist: This Collection Authority Record Does Not Exist.\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidUseAuthorityRecord\",\n                \"code\": 89,\n                \"message\": \"This Use Authority Record is invalid.\",\n                \"docs\": [\"InvalidUseAuthorityRecord: This Use Authority Record is invalid.\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidCollectionAuthorityRecord\",\n                \"code\": 90,\n                \"message\": \"\",\n                \"docs\": [\"InvalidCollectionAuthorityRecord\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidFreezeAuthority\",\n                \"code\": 91,\n                \"message\": \"Metadata does not match the freeze authority on the mint\",\n                \"docs\": [\"InvalidFreezeAuthority: Metadata does not match the freeze authority on the mint\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidDelegate\",\n                \"code\": 92,\n                \"message\": \"All tokens in this account have not been delegated to this user.\",\n                \"docs\": [\"InvalidDelegate: All tokens in this account have not been delegated to this user.\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"cannotAdjustVerifiedCreator\",\n                \"code\": 93,\n                \"message\": \"\",\n                \"docs\": [\"CannotAdjustVerifiedCreator\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"cannotRemoveVerifiedCreator\",\n                \"code\": 94,\n                \"message\": \"Verified creators cannot be removed.\",\n                \"docs\": [\"CannotRemoveVerifiedCreator: Verified creators cannot be removed.\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"cannotWipeVerifiedCreators\",\n                \"code\": 95,\n                \"message\": \"\",\n                \"docs\": [\"CannotWipeVerifiedCreators\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"notAllowedToChangeSellerFeeBasisPoints\",\n                \"code\": 96,\n                \"message\": \"\",\n                \"docs\": [\"NotAllowedToChangeSellerFeeBasisPoints\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"editionOverrideCannotBeZero\",\n                \"code\": 97,\n                \"message\": \"Edition override cannot be zero\",\n                \"docs\": [\"EditionOverrideCannotBeZero: Edition override cannot be zero\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidUser\",\n                \"code\": 98,\n                \"message\": \"Invalid User\",\n                \"docs\": [\"InvalidUser: Invalid User\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"revokeCollectionAuthoritySignerIncorrect\",\n                \"code\": 99,\n                \"message\": \"Revoke Collection Authority signer is incorrect\",\n                \"docs\": [\"RevokeCollectionAuthoritySignerIncorrect: Revoke Collection Authority signer is incorrect\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"tokenCloseFailed\",\n                \"code\": 100,\n                \"message\": \"\",\n                \"docs\": [\"TokenCloseFailed\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"unsizedCollection\",\n                \"code\": 101,\n                \"message\": \"Can't use this function on unsized collection\",\n                \"docs\": [\"UnsizedCollection: Can't use this function on unsized collection\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"sizedCollection\",\n                \"code\": 102,\n                \"message\": \"Can't use this function on a sized collection\",\n                \"docs\": [\"SizedCollection: Can't use this function on a sized collection\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingCollectionMetadata\",\n                \"code\": 103,\n                \"message\": \"Missing collection metadata account\",\n                \"docs\": [\"MissingCollectionMetadata: Missing collection metadata account\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"notAMemberOfCollection\",\n                \"code\": 104,\n                \"message\": \"This NFT is not a member of the specified collection.\",\n                \"docs\": [\"NotAMemberOfCollection: This NFT is not a member of the specified collection.\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"notVerifiedMemberOfCollection\",\n                \"code\": 105,\n                \"message\": \"This NFT is not a verified member of the specified collection.\",\n                \"docs\": [\n                    \"NotVerifiedMemberOfCollection: This NFT is not a verified member of the specified collection.\"\n                ]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"notACollectionParent\",\n                \"code\": 106,\n                \"message\": \"This NFT is not a collection parent NFT.\",\n                \"docs\": [\"NotACollectionParent: This NFT is not a collection parent NFT.\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"couldNotDetermineTokenStandard\",\n                \"code\": 107,\n                \"message\": \"Could not determine a TokenStandard type.\",\n                \"docs\": [\"CouldNotDetermineTokenStandard: Could not determine a TokenStandard type.\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingEditionAccount\",\n                \"code\": 108,\n                \"message\": \"This mint account has an edition but none was provided.\",\n                \"docs\": [\"MissingEditionAccount: This mint account has an edition but none was provided.\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"notAMasterEdition\",\n                \"code\": 109,\n                \"message\": \"This edition is not a Master Edition\",\n                \"docs\": [\"NotAMasterEdition: This edition is not a Master Edition\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"masterEditionHasPrints\",\n                \"code\": 110,\n                \"message\": \"This Master Edition has existing prints\",\n                \"docs\": [\"MasterEditionHasPrints: This Master Edition has existing prints\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"borshDeserializationError\",\n                \"code\": 111,\n                \"message\": \"\",\n                \"docs\": [\"BorshDeserializationError\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"cannotUpdateVerifiedCollection\",\n                \"code\": 112,\n                \"message\": \"Cannot update a verified collection in this command\",\n                \"docs\": [\"CannotUpdateVerifiedCollection: Cannot update a verified collection in this command\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"collectionMasterEditionAccountInvalid\",\n                \"code\": 113,\n                \"message\": \"Edition account doesnt match collection \",\n                \"docs\": [\"CollectionMasterEditionAccountInvalid: Edition account doesnt match collection \"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"alreadyVerified\",\n                \"code\": 114,\n                \"message\": \"Item is already verified.\",\n                \"docs\": [\"AlreadyVerified: Item is already verified.\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"alreadyUnverified\",\n                \"code\": 115,\n                \"message\": \"\",\n                \"docs\": [\"AlreadyUnverified\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"notAPrintEdition\",\n                \"code\": 116,\n                \"message\": \"This edition is not a Print Edition\",\n                \"docs\": [\"NotAPrintEdition: This edition is not a Print Edition\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidMasterEdition\",\n                \"code\": 117,\n                \"message\": \"Invalid Master Edition\",\n                \"docs\": [\"InvalidMasterEdition: Invalid Master Edition\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidPrintEdition\",\n                \"code\": 118,\n                \"message\": \"Invalid Print Edition\",\n                \"docs\": [\"InvalidPrintEdition: Invalid Print Edition\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidEditionMarker\",\n                \"code\": 119,\n                \"message\": \"Invalid Edition Marker\",\n                \"docs\": [\"InvalidEditionMarker: Invalid Edition Marker\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"reservationListDeprecated\",\n                \"code\": 120,\n                \"message\": \"Reservation List is Deprecated\",\n                \"docs\": [\"ReservationListDeprecated: Reservation List is Deprecated\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"printEditionDoesNotMatchMasterEdition\",\n                \"code\": 121,\n                \"message\": \"Print Edition does not match Master Edition\",\n                \"docs\": [\"PrintEditionDoesNotMatchMasterEdition: Print Edition does not match Master Edition\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"editionNumberGreaterThanMaxSupply\",\n                \"code\": 122,\n                \"message\": \"Edition Number greater than max supply\",\n                \"docs\": [\"EditionNumberGreaterThanMaxSupply: Edition Number greater than max supply\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"mustUnverify\",\n                \"code\": 123,\n                \"message\": \"Must unverify before migrating collections.\",\n                \"docs\": [\"MustUnverify: Must unverify before migrating collections.\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidEscrowBumpSeed\",\n                \"code\": 124,\n                \"message\": \"Invalid Escrow Account Bump Seed\",\n                \"docs\": [\"InvalidEscrowBumpSeed: Invalid Escrow Account Bump Seed\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"mustBeEscrowAuthority\",\n                \"code\": 125,\n                \"message\": \"Must Escrow Authority\",\n                \"docs\": [\"MustBeEscrowAuthority: Must Escrow Authority\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidSystemProgram\",\n                \"code\": 126,\n                \"message\": \"Invalid System Program\",\n                \"docs\": [\"InvalidSystemProgram: Invalid System Program\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"mustBeNonFungible\",\n                \"code\": 127,\n                \"message\": \"Must be a Non Fungible Token\",\n                \"docs\": [\"MustBeNonFungible: Must be a Non Fungible Token\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"insufficientTokens\",\n                \"code\": 128,\n                \"message\": \"Insufficient tokens for transfer\",\n                \"docs\": [\"InsufficientTokens: Insufficient tokens for transfer\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"borshSerializationError\",\n                \"code\": 129,\n                \"message\": \"Borsh Serialization Error\",\n                \"docs\": [\"BorshSerializationError: Borsh Serialization Error\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"noFreezeAuthoritySet\",\n                \"code\": 130,\n                \"message\": \"Cannot create NFT with no Freeze Authority.\",\n                \"docs\": [\"NoFreezeAuthoritySet: Cannot create NFT with no Freeze Authority.\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidCollectionSizeChange\",\n                \"code\": 131,\n                \"message\": \"Invalid collection size change\",\n                \"docs\": [\"InvalidCollectionSizeChange: Invalid collection size change\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidBubblegumSigner\",\n                \"code\": 132,\n                \"message\": \"Invalid bubblegum signer\",\n                \"docs\": [\"InvalidBubblegumSigner: Invalid bubblegum signer\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"escrowParentHasDelegate\",\n                \"code\": 133,\n                \"message\": \"Escrow parent cannot have a delegate\",\n                \"docs\": [\"EscrowParentHasDelegate: Escrow parent cannot have a delegate\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"mintIsNotSigner\",\n                \"code\": 134,\n                \"message\": \"Mint needs to be signer to initialize the account\",\n                \"docs\": [\"MintIsNotSigner: Mint needs to be signer to initialize the account\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidTokenStandard\",\n                \"code\": 135,\n                \"message\": \"Invalid token standard\",\n                \"docs\": [\"InvalidTokenStandard: Invalid token standard\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidMintForTokenStandard\",\n                \"code\": 136,\n                \"message\": \"Invalid mint account for specified token standard\",\n                \"docs\": [\"InvalidMintForTokenStandard: Invalid mint account for specified token standard\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidAuthorizationRules\",\n                \"code\": 137,\n                \"message\": \"Invalid authorization rules account\",\n                \"docs\": [\"InvalidAuthorizationRules: Invalid authorization rules account\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingAuthorizationRules\",\n                \"code\": 138,\n                \"message\": \"Missing authorization rules account\",\n                \"docs\": [\"MissingAuthorizationRules: Missing authorization rules account\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingProgrammableConfig\",\n                \"code\": 139,\n                \"message\": \"Missing programmable configuration\",\n                \"docs\": [\"MissingProgrammableConfig: Missing programmable configuration\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidProgrammableConfig\",\n                \"code\": 140,\n                \"message\": \"Invalid programmable configuration\",\n                \"docs\": [\"InvalidProgrammableConfig: Invalid programmable configuration\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"delegateAlreadyExists\",\n                \"code\": 141,\n                \"message\": \"Delegate already exists\",\n                \"docs\": [\"DelegateAlreadyExists: Delegate already exists\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"delegateNotFound\",\n                \"code\": 142,\n                \"message\": \"Delegate not found\",\n                \"docs\": [\"DelegateNotFound: Delegate not found\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingAccountInBuilder\",\n                \"code\": 143,\n                \"message\": \"Required account not set in instruction builder\",\n                \"docs\": [\"MissingAccountInBuilder: Required account not set in instruction builder\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingArgumentInBuilder\",\n                \"code\": 144,\n                \"message\": \"Required argument not set in instruction builder\",\n                \"docs\": [\"MissingArgumentInBuilder: Required argument not set in instruction builder\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"featureNotSupported\",\n                \"code\": 145,\n                \"message\": \"Feature not supported currently\",\n                \"docs\": [\"FeatureNotSupported: Feature not supported currently\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidSystemWallet\",\n                \"code\": 146,\n                \"message\": \"Invalid system wallet\",\n                \"docs\": [\"InvalidSystemWallet: Invalid system wallet\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"onlySaleDelegateCanTransfer\",\n                \"code\": 147,\n                \"message\": \"Only the sale delegate can transfer while its set\",\n                \"docs\": [\"OnlySaleDelegateCanTransfer: Only the sale delegate can transfer while its set\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingTokenAccount\",\n                \"code\": 148,\n                \"message\": \"Missing token account\",\n                \"docs\": [\"MissingTokenAccount: Missing token account\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingSplTokenProgram\",\n                \"code\": 149,\n                \"message\": \"Missing SPL token program\",\n                \"docs\": [\"MissingSplTokenProgram: Missing SPL token program\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingAuthorizationRulesProgram\",\n                \"code\": 150,\n                \"message\": \"Missing authorization rules program\",\n                \"docs\": [\"MissingAuthorizationRulesProgram: Missing authorization rules program\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidDelegateRoleForTransfer\",\n                \"code\": 151,\n                \"message\": \"Invalid delegate role for transfer\",\n                \"docs\": [\"InvalidDelegateRoleForTransfer: Invalid delegate role for transfer\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidTransferAuthority\",\n                \"code\": 152,\n                \"message\": \"Invalid transfer authority\",\n                \"docs\": [\"InvalidTransferAuthority: Invalid transfer authority\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"instructionNotSupported\",\n                \"code\": 153,\n                \"message\": \"Instruction not supported for ProgrammableNonFungible assets\",\n                \"docs\": [\"InstructionNotSupported: Instruction not supported for ProgrammableNonFungible assets\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"keyMismatch\",\n                \"code\": 154,\n                \"message\": \"Public key does not match expected value\",\n                \"docs\": [\"KeyMismatch: Public key does not match expected value\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"lockedToken\",\n                \"code\": 155,\n                \"message\": \"Token is locked\",\n                \"docs\": [\"LockedToken: Token is locked\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"unlockedToken\",\n                \"code\": 156,\n                \"message\": \"Token is unlocked\",\n                \"docs\": [\"UnlockedToken: Token is unlocked\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingDelegateRole\",\n                \"code\": 157,\n                \"message\": \"Missing delegate role\",\n                \"docs\": [\"MissingDelegateRole: Missing delegate role\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidAuthorityType\",\n                \"code\": 158,\n                \"message\": \"Invalid authority type\",\n                \"docs\": [\"InvalidAuthorityType: Invalid authority type\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingTokenRecord\",\n                \"code\": 159,\n                \"message\": \"Missing token record account\",\n                \"docs\": [\"MissingTokenRecord: Missing token record account\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"mintSupplyMustBeZero\",\n                \"code\": 160,\n                \"message\": \"Mint supply must be zero for programmable assets\",\n                \"docs\": [\"MintSupplyMustBeZero: Mint supply must be zero for programmable assets\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"dataIsEmptyOrZeroed\",\n                \"code\": 161,\n                \"message\": \"Data is empty or zeroed\",\n                \"docs\": [\"DataIsEmptyOrZeroed: Data is empty or zeroed\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingTokenOwnerAccount\",\n                \"code\": 162,\n                \"message\": \"Missing token owner\",\n                \"docs\": [\"MissingTokenOwnerAccount: Missing token owner\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidMasterEditionAccountLength\",\n                \"code\": 163,\n                \"message\": \"Master edition account has an invalid length\",\n                \"docs\": [\"InvalidMasterEditionAccountLength: Master edition account has an invalid length\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"incorrectTokenState\",\n                \"code\": 164,\n                \"message\": \"Incorrect token state\",\n                \"docs\": [\"IncorrectTokenState: Incorrect token state\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidDelegateRole\",\n                \"code\": 165,\n                \"message\": \"Invalid delegate role\",\n                \"docs\": [\"InvalidDelegateRole: Invalid delegate role\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingPrintSupply\",\n                \"code\": 166,\n                \"message\": \"Print supply is required for non-fungibles\",\n                \"docs\": [\"MissingPrintSupply: Print supply is required for non-fungibles\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingMasterEditionAccount\",\n                \"code\": 167,\n                \"message\": \"Missing master edition account\",\n                \"docs\": [\"MissingMasterEditionAccount: Missing master edition account\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"amountMustBeGreaterThanZero\",\n                \"code\": 168,\n                \"message\": \"Amount must be greater than zero\",\n                \"docs\": [\"AmountMustBeGreaterThanZero: Amount must be greater than zero\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidDelegateArgs\",\n                \"code\": 169,\n                \"message\": \"Invalid delegate args\",\n                \"docs\": [\"InvalidDelegateArgs: Invalid delegate args\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingLockedTransferAddress\",\n                \"code\": 170,\n                \"message\": \"Missing address for locked transfer\",\n                \"docs\": [\"MissingLockedTransferAddress: Missing address for locked transfer\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidLockedTransferAddress\",\n                \"code\": 171,\n                \"message\": \"Invalid destination address for locked transfer\",\n                \"docs\": [\"InvalidLockedTransferAddress: Invalid destination address for locked transfer\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"dataIncrementLimitExceeded\",\n                \"code\": 172,\n                \"message\": \"Exceeded account realloc increase limit\",\n                \"docs\": [\"DataIncrementLimitExceeded: Exceeded account realloc increase limit\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"cannotUpdateAssetWithDelegate\",\n                \"code\": 173,\n                \"message\": \"Cannot update the rule set of a programmable asset that has a delegate\",\n                \"docs\": [\n                    \"CannotUpdateAssetWithDelegate: Cannot update the rule set of a programmable asset that has a delegate\"\n                ]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidAmount\",\n                \"code\": 174,\n                \"message\": \"Invalid token amount for this operation or token standard\",\n                \"docs\": [\"InvalidAmount: Invalid token amount for this operation or token standard\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingMasterEditionMintAccount\",\n                \"code\": 175,\n                \"message\": \"Missing master edition mint account\",\n                \"docs\": [\"MissingMasterEditionMintAccount: Missing master edition mint account\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingMasterEditionTokenAccount\",\n                \"code\": 176,\n                \"message\": \"Missing master edition token account\",\n                \"docs\": [\"MissingMasterEditionTokenAccount: Missing master edition token account\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingEditionMarkerAccount\",\n                \"code\": 177,\n                \"message\": \"Missing edition marker account\",\n                \"docs\": [\"MissingEditionMarkerAccount: Missing edition marker account\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"cannotBurnWithDelegate\",\n                \"code\": 178,\n                \"message\": \"Cannot burn while persistent delegate is set\",\n                \"docs\": [\"CannotBurnWithDelegate: Cannot burn while persistent delegate is set\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingEdition\",\n                \"code\": 179,\n                \"message\": \"Missing edition account\",\n                \"docs\": [\"MissingEdition: Missing edition account\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidAssociatedTokenAccountProgram\",\n                \"code\": 180,\n                \"message\": \"Invalid Associated Token Account Program\",\n                \"docs\": [\"InvalidAssociatedTokenAccountProgram: Invalid Associated Token Account Program\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidInstructionsSysvar\",\n                \"code\": 181,\n                \"message\": \"Invalid InstructionsSysvar\",\n                \"docs\": [\"InvalidInstructionsSysvar: Invalid InstructionsSysvar\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidParentAccounts\",\n                \"code\": 182,\n                \"message\": \"Invalid or Unneeded parent accounts\",\n                \"docs\": [\"InvalidParentAccounts: Invalid or Unneeded parent accounts\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidUpdateArgs\",\n                \"code\": 183,\n                \"message\": \"Authority cannot apply all update args\",\n                \"docs\": [\"InvalidUpdateArgs: Authority cannot apply all update args\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"insufficientTokenBalance\",\n                \"code\": 184,\n                \"message\": \"Token account does not have enough tokens\",\n                \"docs\": [\"InsufficientTokenBalance: Token account does not have enough tokens\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingCollectionMint\",\n                \"code\": 185,\n                \"message\": \"Missing collection account\",\n                \"docs\": [\"MissingCollectionMint: Missing collection account\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingCollectionMasterEdition\",\n                \"code\": 186,\n                \"message\": \"Missing collection master edition account\",\n                \"docs\": [\"MissingCollectionMasterEdition: Missing collection master edition account\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidTokenRecord\",\n                \"code\": 187,\n                \"message\": \"Invalid token record account\",\n                \"docs\": [\"InvalidTokenRecord: Invalid token record account\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidCloseAuthority\",\n                \"code\": 188,\n                \"message\": \"The close authority needs to be revoked by the Utility Delegate\",\n                \"docs\": [\"InvalidCloseAuthority: The close authority needs to be revoked by the Utility Delegate\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidInstruction\",\n                \"code\": 189,\n                \"message\": \"Invalid or removed instruction\",\n                \"docs\": [\"InvalidInstruction: Invalid or removed instruction\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingDelegateRecord\",\n                \"code\": 190,\n                \"message\": \"Missing delegate record\",\n                \"docs\": [\"MissingDelegateRecord: Missing delegate record\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidFeeAccount\",\n                \"code\": 191,\n                \"message\": \"\",\n                \"docs\": [\"InvalidFeeAccount\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidMetadataFlags\",\n                \"code\": 192,\n                \"message\": \"\",\n                \"docs\": [\"InvalidMetadataFlags\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"cannotChangeUpdateAuthorityWithDelegate\",\n                \"code\": 193,\n                \"message\": \"Cannot change the update authority with a delegate\",\n                \"docs\": [\"CannotChangeUpdateAuthorityWithDelegate: Cannot change the update authority with a delegate\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidMintExtensionType\",\n                \"code\": 194,\n                \"message\": \"Invalid mint extension type\",\n                \"docs\": [\"InvalidMintExtensionType: Invalid mint extension type\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidMintCloseAuthority\",\n                \"code\": 195,\n                \"message\": \"Invalid mint close authority\",\n                \"docs\": [\"InvalidMintCloseAuthority: Invalid mint close authority\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidMetadataPointer\",\n                \"code\": 196,\n                \"message\": \"Invalid metadata pointer\",\n                \"docs\": [\"InvalidMetadataPointer: Invalid metadata pointer\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidTokenExtensionType\",\n                \"code\": 197,\n                \"message\": \"Invalid token extension type\",\n                \"docs\": [\"InvalidTokenExtensionType: Invalid token extension type\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"missingImmutableOwnerExtension\",\n                \"code\": 198,\n                \"message\": \"Missing immutable owner extension\",\n                \"docs\": [\"MissingImmutableOwnerExtension: Missing immutable owner extension\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"expectedUninitializedAccount\",\n                \"code\": 199,\n                \"message\": \"Expected account to be uninitialized\",\n                \"docs\": [\"ExpectedUninitializedAccount: Expected account to be uninitialized\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidEditionAccountLength\",\n                \"code\": 200,\n                \"message\": \"Edition account has an invalid length\",\n                \"docs\": [\"InvalidEditionAccountLength: Edition account has an invalid length\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"accountAlreadyResized\",\n                \"code\": 201,\n                \"message\": \"Account has already been resized\",\n                \"docs\": [\"AccountAlreadyResized: Account has already been resized\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"conditionsForClosingNotMet\",\n                \"code\": 202,\n                \"message\": \"Conditions for closing not met\",\n                \"docs\": [\"ConditionsForClosingNotMet: Conditions for closing not met\"]\n            }\n        ]\n    },\n    \"additionalPrograms\": []\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/idls/pmp-idl.json",
    "content": "{\n    \"kind\": \"rootNode\",\n    \"standard\": \"codama\",\n    \"version\": \"1.0.0\",\n    \"program\": {\n        \"kind\": \"programNode\",\n        \"name\": \"programMetadata\",\n        \"publicKey\": \"ProgM6JCCvbYkfKqJYHePx4xxSUSqJp7rh8Lyv7nk7S\",\n        \"version\": \"0.0.0\",\n        \"pdas\": [\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"canonical\",\n                \"docs\": [\"The canonical derivation for metadata accounts managed by the program authority itself.\"],\n                \"seeds\": [\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"program\",\n                        \"docs\": [\"The program to which the metadata belongs.\"],\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"seed\",\n                        \"docs\": [\"The seed deriving the metadata account.\"],\n                        \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"seed\" }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"nonCanonical\",\n                \"docs\": [\"The derivation for metadata accounts managed by third-party authorities.\"],\n                \"seeds\": [\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"program\",\n                        \"docs\": [\"The program to which the metadata belongs.\"],\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"The third-party authority managing this metadata account.\"],\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"seed\",\n                        \"docs\": [\"The seed deriving the metadata account.\"],\n                        \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"seed\" }\n                    }\n                ]\n            },\n            {\n                \"kind\": \"pdaNode\",\n                \"name\": \"metadata\",\n                \"docs\": [\n                    \"The derivation for metadata accounts, canonical or not, depending if an authority is provided.\"\n                ],\n                \"seeds\": [\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"program\",\n                        \"docs\": [\"The program to which the metadata belongs.\"],\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"The third-party authority managing this metadata account, if non-canonical.\"],\n                        \"type\": {\n                            \"kind\": \"remainderOptionTypeNode\",\n                            \"item\": { \"kind\": \"publicKeyTypeNode\" }\n                        }\n                    },\n                    {\n                        \"kind\": \"variablePdaSeedNode\",\n                        \"name\": \"seed\",\n                        \"docs\": [\"The seed deriving the metadata account.\"],\n                        \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"seed\" }\n                    }\n                ]\n            }\n        ],\n        \"accounts\": [\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"buffer\",\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"discriminator\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"accountDiscriminator\"\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"enumValueNode\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"accountDiscriminator\"\n                                },\n                                \"variant\": \"buffer\"\n                            },\n                            \"defaultValueStrategy\": \"omitted\"\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"program\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"zeroableOptionTypeNode\",\n                                \"item\": { \"kind\": \"publicKeyTypeNode\" }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"authority\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"zeroableOptionTypeNode\",\n                                \"item\": { \"kind\": \"publicKeyTypeNode\" }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"canonical\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"booleanTypeNode\",\n                                \"size\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"seed\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"postOffsetTypeNode\",\n                                \"offset\": 14,\n                                \"strategy\": \"padded\",\n                                \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"seed\" }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"data\",\n                            \"docs\": [],\n                            \"type\": { \"kind\": \"bytesTypeNode\" }\n                        }\n                    ]\n                },\n                \"pda\": { \"kind\": \"pdaLinkNode\", \"name\": \"metadata\" }\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"metadata\",\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"discriminator\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"accountDiscriminator\"\n                            },\n                            \"defaultValue\": {\n                                \"kind\": \"enumValueNode\",\n                                \"enum\": {\n                                    \"kind\": \"definedTypeLinkNode\",\n                                    \"name\": \"accountDiscriminator\"\n                                },\n                                \"variant\": \"metadata\"\n                            },\n                            \"defaultValueStrategy\": \"omitted\"\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"program\",\n                            \"docs\": [],\n                            \"type\": { \"kind\": \"publicKeyTypeNode\" }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"authority\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"zeroableOptionTypeNode\",\n                                \"item\": { \"kind\": \"publicKeyTypeNode\" }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"mutable\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"booleanTypeNode\",\n                                \"size\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"canonical\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"booleanTypeNode\",\n                                \"size\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"seed\",\n                            \"docs\": [],\n                            \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"seed\" }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"encoding\",\n                            \"docs\": [],\n                            \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"encoding\" }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"compression\",\n                            \"docs\": [],\n                            \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"compression\" }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"format\",\n                            \"docs\": [],\n                            \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"format\" }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"dataSource\",\n                            \"docs\": [],\n                            \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"dataSource\" }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"dataLength\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"postOffsetTypeNode\",\n                                \"offset\": 5,\n                                \"strategy\": \"padded\",\n                                \"type\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"data\",\n                            \"docs\": [],\n                            \"type\": { \"kind\": \"bytesTypeNode\" }\n                        }\n                    ]\n                },\n                \"pda\": { \"kind\": \"pdaLinkNode\", \"name\": \"metadata\" }\n            }\n        ],\n        \"instructions\": [\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"write\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"buffer\",\n                        \"docs\": [\"The buffer to write to.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"The authority of the buffer.\"],\n                        \"isSigner\": true,\n                        \"isWritable\": false\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sourceBuffer\",\n                        \"docs\": [\n                            \"Buffer to copy the data from.\",\n                            \"You may use the `data` argument instead of this account to pass data directly.\"\n                        ],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 0 }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"offset\",\n                        \"docs\": [\"The offset to write to.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u32\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"data\",\n                        \"docs\": [\n                            \"The data to write at the provided offset.\",\n                            \"You may use the `source_buffer` account instead of this argument to copy from an existing buffer.\"\n                        ],\n                        \"defaultValue\": { \"kind\": \"noneValueNode\" },\n                        \"type\": {\n                            \"kind\": \"remainderOptionTypeNode\",\n                            \"item\": { \"kind\": \"bytesTypeNode\" }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initialize\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"docs\": [\"Metadata account the initialize.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": true,\n                        \"defaultValue\": {\n                            \"kind\": \"conditionalValueNode\",\n                            \"condition\": {\n                                \"kind\": \"accountValueNode\",\n                                \"name\": \"programData\"\n                            },\n                            \"ifTrue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": { \"kind\": \"pdaLinkNode\", \"name\": \"canonical\" },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"program\",\n                                        \"value\": { \"kind\": \"accountValueNode\", \"name\": \"program\" }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"seed\",\n                                        \"value\": { \"kind\": \"argumentValueNode\", \"name\": \"seed\" }\n                                    }\n                                ]\n                            },\n                            \"ifFalse\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": { \"kind\": \"pdaLinkNode\", \"name\": \"nonCanonical\" },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"program\",\n                                        \"value\": { \"kind\": \"accountValueNode\", \"name\": \"program\" }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"authority\",\n                                        \"value\": { \"kind\": \"accountValueNode\", \"name\": \"authority\" }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"seed\",\n                                        \"value\": { \"kind\": \"argumentValueNode\", \"name\": \"seed\" }\n                                    }\n                                ]\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"Authority (for canonical, must match program upgrade authority).\"],\n                        \"isSigner\": true,\n                        \"isWritable\": false\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"program\",\n                        \"docs\": [\"Program account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"programData\",\n                        \"docs\": [\"Program data account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"system\",\n                        \"docs\": [\"System program.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true,\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 1 }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"seed\",\n                        \"docs\": [],\n                        \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"seed\" }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"encoding\",\n                        \"docs\": [],\n                        \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"encoding\" }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"compression\",\n                        \"docs\": [],\n                        \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"compression\" }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"format\",\n                        \"docs\": [],\n                        \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"format\" }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"dataSource\",\n                        \"docs\": [],\n                        \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"dataSource\" }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"data\",\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"noneValueNode\" },\n                        \"type\": {\n                            \"kind\": \"remainderOptionTypeNode\",\n                            \"item\": { \"kind\": \"bytesTypeNode\" }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"setAuthority\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"docs\": [\"Metadata or buffer account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"Current authority account.\"],\n                        \"isSigner\": true,\n                        \"isWritable\": false\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"program\",\n                        \"docs\": [\"Program account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"programData\",\n                        \"docs\": [\"Program data account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 2 }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"newAuthority\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"item\": { \"kind\": \"publicKeyTypeNode\" },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"setData\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"docs\": [\"Metadata account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"Authority account.\"],\n                        \"isSigner\": true,\n                        \"isWritable\": false\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"buffer\",\n                        \"docs\": [\"Buffer account to copy data from.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": true,\n                        \"isOptional\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"program\",\n                        \"docs\": [\"Program account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"programData\",\n                        \"docs\": [\"Program data account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 3 }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"encoding\",\n                        \"docs\": [],\n                        \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"encoding\" }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"compression\",\n                        \"docs\": [],\n                        \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"compression\" }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"format\",\n                        \"docs\": [],\n                        \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"format\" }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"dataSource\",\n                        \"docs\": [],\n                        \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"dataSource\" }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"data\",\n                        \"defaultValue\": { \"kind\": \"noneValueNode\" },\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"remainderOptionTypeNode\",\n                            \"item\": { \"kind\": \"bytesTypeNode\" }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"setImmutable\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"docs\": [\"Metadata account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"Authority account.\"],\n                        \"isSigner\": true,\n                        \"isWritable\": false\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"program\",\n                        \"docs\": [\"Program account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"programData\",\n                        \"docs\": [\"Program data account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 4 }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"trim\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"docs\": [\"Buffer or metadata account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"Authority account.\"],\n                        \"isSigner\": true,\n                        \"isWritable\": false\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"program\",\n                        \"docs\": [\"Program account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"programData\",\n                        \"docs\": [\"Program data account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destination\",\n                        \"docs\": [\"Destination account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"docs\": [\"Rent sysvar account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"SysvarRent111111111111111111111111111111111\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 5 }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"close\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"docs\": [\"Account to close.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"Authority account.\"],\n                        \"isSigner\": true,\n                        \"isWritable\": false\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"program\",\n                        \"docs\": [\"Program account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"programData\",\n                        \"docs\": [\"Program data account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destination\",\n                        \"docs\": [\"Destination account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": true\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 6 }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"allocate\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"buffer\",\n                        \"docs\": [\"Buffer account to allocate.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"Authority account.\"],\n                        \"isSigner\": true,\n                        \"isWritable\": false\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"program\",\n                        \"docs\": [\"Program account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"programData\",\n                        \"docs\": [\"Program data account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"system\",\n                        \"docs\": [\"System program.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true,\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 7 }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"seed\",\n                        \"docs\": [\"The seed of the metadata for PDA buffers.\"],\n                        \"defaultValue\": { \"kind\": \"noneValueNode\" },\n                        \"type\": {\n                            \"kind\": \"remainderOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"seed\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"extend\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"docs\": [\"Buffer or metadata account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"Authority account.\"],\n                        \"isSigner\": true,\n                        \"isWritable\": false\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"program\",\n                        \"docs\": [\"Program account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"programData\",\n                        \"docs\": [\"Program data account.\"],\n                        \"isSigner\": false,\n                        \"isWritable\": false,\n                        \"isOptional\": true\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 8 }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"length\",\n                        \"docs\": [\"Length (in bytes) to add to the account size.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u16\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            }\n        ],\n        \"definedTypes\": [\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"seed\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"fixedSizeTypeNode\",\n                    \"size\": 16,\n                    \"type\": { \"kind\": \"stringTypeNode\", \"encoding\": \"utf8\" }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"accountDiscriminator\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"empty\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"buffer\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"metadata\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"encoding\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"none\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"utf8\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"base58\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"base64\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"compression\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"none\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"gzip\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"zlib\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"format\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"none\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"json\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"yaml\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"toml\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"dataSource\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"direct\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"url\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"external\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"externalData\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"address\",\n                            \"docs\": [],\n                            \"type\": { \"kind\": \"publicKeyTypeNode\" }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"offset\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"length\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"zeroableOptionTypeNode\",\n                                \"item\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    ]\n                }\n            }\n        ],\n        \"errors\": []\n    },\n    \"additionalPrograms\": []\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/idls/sas-idl.json",
    "content": "{\n    \"kind\": \"rootNode\",\n    \"standard\": \"codama\",\n    \"version\": \"1.3.7\",\n    \"program\": {\n        \"kind\": \"programNode\",\n        \"name\": \"solanaAttestationService\",\n        \"publicKey\": \"22zoJMtdu4tQc2PzL74ZUT7FrwgB1Udec8DdW4yw4BdG\",\n        \"version\": \"0.1.0\",\n        \"origin\": \"shank\",\n        \"docs\": [],\n        \"accounts\": [\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"attestation\",\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"nonce\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"credential\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"schema\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"data\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"signer\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"expiry\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"i64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"tokenAccount\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"credential\",\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"authority\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"name\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"authorizedSigners\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"arrayTypeNode\",\n                                \"item\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"count\": {\n                                    \"kind\": \"prefixedCountNode\",\n                                    \"prefix\": {\n                                        \"kind\": \"numberTypeNode\",\n                                        \"format\": \"u32\",\n                                        \"endian\": \"le\"\n                                    }\n                                }\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"schema\",\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"credential\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"name\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"description\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"layout\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"fieldNames\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"isPaused\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"booleanTypeNode\",\n                                \"size\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"version\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    ]\n                }\n            }\n        ],\n        \"instructions\": [\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"createCredential\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"credential\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"name\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"signers\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"arrayTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            },\n                            \"count\": {\n                                \"kind\": \"prefixedCountNode\",\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"createSchema\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"credential\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Credential the Schema is associated with\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"schema\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"name\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"description\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"layout\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"fieldNames\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"arrayTypeNode\",\n                            \"item\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            },\n                            \"count\": {\n                                \"kind\": \"prefixedCountNode\",\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"changeSchemaStatus\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"credential\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Credential the Schema is associated with\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"schema\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Credential the Schema is associated with\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 2\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"isPaused\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"booleanTypeNode\",\n                            \"size\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"changeAuthorizedSigners\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"credential\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Credential the Schema is associated with\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 3\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"signers\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"arrayTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            },\n                            \"count\": {\n                                \"kind\": \"prefixedCountNode\",\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"changeSchemaDescription\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"credential\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Credential the Schema is associated with\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"schema\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Credential the Schema is associated with\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 4\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"description\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"changeSchemaVersion\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"credential\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Credential the Schema is associated with\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"existingSchema\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"newSchema\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 5\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"layout\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"fieldNames\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"arrayTypeNode\",\n                            \"item\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"stringTypeNode\",\n                                    \"encoding\": \"utf8\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            },\n                            \"count\": {\n                                \"kind\": \"prefixedCountNode\",\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"createAttestation\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Authorized signer of the Schema's Credential\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"credential\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Credential the Schema is associated with\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"schema\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Schema the Attestation is associated with\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"attestation\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 6\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"nonce\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"data\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"expiry\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"closeAttestation\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Authorized signer of the Schema's Credential\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"credential\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"attestation\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"eventAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"attestationProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 7\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"tokenizeSchema\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"credential\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Credential the Schema is associated with\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"schema\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of Schema Token\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sasPda\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Program derived address used as program signer authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 9\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"maxSize\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"createTokenizedAttestation\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Authorized signer of the Schema's Credential\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"credential\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Credential the Schema is associated with\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"schema\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Schema the Attestation is associated with\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"attestation\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"schemaMint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of Schema Token\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"attestationMint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of Attestation Token\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sasPda\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Program derived address used as program signer authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"recipientTokenAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Associated token account of Recipient for Attestation Token\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"recipient\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Wallet to receive Attestation Token\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"associatedTokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 10\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"nonce\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"data\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"bytesTypeNode\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"expiry\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i64\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"name\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"uri\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"symbol\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"mintAccountSpace\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u16\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"closeTokenizedAttestation\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"payerValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Authorized signer of the Schema's Credential\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"credential\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"attestation\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"eventAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\",\n                            \"identifier\": \"splSystem\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"attestationProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"attestationMint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Mint of Attestation Token\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sasPda\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Program derived address used as program signer authority\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"attestationTokenAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Associated token account of the related Attestation Token\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"tokenProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n                            \"identifier\": \"splToken\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 11\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"emitEvent\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"eventAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 228\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            }\n        ],\n        \"definedTypes\": [\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"closeAttestationEvent\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"discriminator\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"schema\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"attestationData\",\n                            \"docs\": [],\n                            \"type\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"bytesTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    ]\n                }\n            }\n        ],\n        \"pdas\": [],\n        \"errors\": []\n    },\n    \"additionalPrograms\": []\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/idls/system-program-idl.json",
    "content": "{\n    \"kind\": \"rootNode\",\n    \"program\": {\n        \"kind\": \"programNode\",\n        \"pdas\": [],\n        \"accounts\": [\n            {\n                \"kind\": \"accountNode\",\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"version\",\n                            \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"nonceVersion\" },\n                            \"docs\": []\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"state\",\n                            \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"nonceState\" },\n                            \"docs\": []\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"authority\",\n                            \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                            \"docs\": []\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"blockhash\",\n                            \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                            \"docs\": []\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"lamportsPerSignature\",\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            },\n                            \"docs\": []\n                        }\n                    ]\n                },\n                \"name\": \"nonce\",\n                \"idlName\": \"Nonce\",\n                \"docs\": [],\n                \"size\": 80\n            }\n        ],\n        \"instructions\": [\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"payerValueNode\" }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"newAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u32\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 0 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"lamports\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"space\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"programAddress\",\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                        \"docs\": []\n                    }\n                ],\n                \"byteDeltas\": [\n                    {\n                        \"kind\": \"instructionByteDeltaNode\",\n                        \"value\": { \"kind\": \"argumentValueNode\", \"name\": \"space\" },\n                        \"withHeader\": true\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"createAccount\",\n                \"idlName\": \"CreateAccount\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u32\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 1 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"programAddress\",\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                        \"docs\": []\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"assign\",\n                \"idlName\": \"Assign\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"source\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destination\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u32\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 2 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": []\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"transferSol\",\n                \"idlName\": \"TransferSol\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"payerValueNode\" }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"newAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"baseAccount\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": true,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u32\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 3 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"base\",\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"seed\",\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": { \"kind\": \"stringTypeNode\", \"encoding\": \"utf8\" },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"space\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"programAddress\",\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                        \"docs\": []\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"createAccountWithSeed\",\n                \"idlName\": \"CreateAccountWithSeed\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"nonceAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"recentBlockhashesSysvar\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"SysvarRecentB1ockHashes11111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"nonceAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u32\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 4 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"advanceNonceAccount\",\n                \"idlName\": \"AdvanceNonceAccount\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"nonceAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"recipientAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"recentBlockhashesSysvar\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"SysvarRecentB1ockHashes11111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rentSysvar\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"SysvarRent111111111111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"nonceAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u32\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 5 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"withdrawAmount\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": []\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"withdrawNonceAccount\",\n                \"idlName\": \"WithdrawNonceAccount\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"nonceAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"recentBlockhashesSysvar\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"SysvarRecentB1ockHashes11111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rentSysvar\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"SysvarRent111111111111111111111111111111111\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u32\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 6 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"nonceAuthority\",\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                        \"docs\": []\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"initializeNonceAccount\",\n                \"idlName\": \"InitializeNonceAccount\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"nonceAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"nonceAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u32\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 7 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"newNonceAuthority\",\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                        \"docs\": []\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"authorizeNonceAccount\",\n                \"idlName\": \"AuthorizeNonceAccount\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"newAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u32\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 8 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"space\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": []\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"allocate\",\n                \"idlName\": \"Allocate\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"newAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"baseAccount\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u32\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 9 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"base\",\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"seed\",\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": { \"kind\": \"stringTypeNode\", \"encoding\": \"utf8\" },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"space\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"programAddress\",\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                        \"docs\": []\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"allocateWithSeed\",\n                \"idlName\": \"AllocateWithSeed\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"baseAccount\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u32\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 10 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"base\",\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"seed\",\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": { \"kind\": \"stringTypeNode\", \"encoding\": \"utf8\" },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"programAddress\",\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                        \"docs\": []\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"assignWithSeed\",\n                \"idlName\": \"AssignWithSeed\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"source\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"baseAccount\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destination\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u32\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 11 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"fromSeed\",\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": { \"kind\": \"stringTypeNode\", \"encoding\": \"utf8\" },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"fromOwner\",\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                        \"docs\": []\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"transferSolWithSeed\",\n                \"idlName\": \"TransferSolWithSeed\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"nonceAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u32\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 12 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"upgradeNonceAccount\",\n                \"idlName\": \"UpgradeNonceAccount\",\n                \"docs\": [],\n                \"optionalAccountStrategy\": \"omitted\"\n            }\n        ],\n        \"definedTypes\": [\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"nonceVersion\",\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        { \"kind\": \"enumEmptyVariantTypeNode\", \"name\": \"legacy\" },\n                        { \"kind\": \"enumEmptyVariantTypeNode\", \"name\": \"current\" }\n                    ],\n                    \"size\": { \"kind\": \"numberTypeNode\", \"format\": \"u32\", \"endian\": \"le\" }\n                },\n                \"idlName\": \"NonceVersion\",\n                \"docs\": []\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"nonceState\",\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        { \"kind\": \"enumEmptyVariantTypeNode\", \"name\": \"uninitialized\" },\n                        { \"kind\": \"enumEmptyVariantTypeNode\", \"name\": \"initialized\" }\n                    ],\n                    \"size\": { \"kind\": \"numberTypeNode\", \"format\": \"u32\", \"endian\": \"le\" }\n                },\n                \"idlName\": \"NonceState\",\n                \"docs\": []\n            }\n        ],\n        \"errors\": [\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"accountAlreadyInUse\",\n                \"idlName\": \"AccountAlreadyInUse\",\n                \"code\": 0,\n                \"message\": \"an account with the same address already exists\",\n                \"docs\": [\"AccountAlreadyInUse: an account with the same address already exists\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"resultWithNegativeLamports\",\n                \"idlName\": \"ResultWithNegativeLamports\",\n                \"code\": 1,\n                \"message\": \"account does not have enough SOL to perform the operation\",\n                \"docs\": [\"ResultWithNegativeLamports: account does not have enough SOL to perform the operation\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidProgramId\",\n                \"idlName\": \"InvalidProgramId\",\n                \"code\": 2,\n                \"message\": \"cannot assign account to this program id\",\n                \"docs\": [\"InvalidProgramId: cannot assign account to this program id\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidAccountDataLength\",\n                \"idlName\": \"InvalidAccountDataLength\",\n                \"code\": 3,\n                \"message\": \"cannot allocate account data of this length\",\n                \"docs\": [\"InvalidAccountDataLength: cannot allocate account data of this length\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"maxSeedLengthExceeded\",\n                \"idlName\": \"MaxSeedLengthExceeded\",\n                \"code\": 4,\n                \"message\": \"length of requested seed is too long\",\n                \"docs\": [\"MaxSeedLengthExceeded: length of requested seed is too long\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"addressWithSeedMismatch\",\n                \"idlName\": \"AddressWithSeedMismatch\",\n                \"code\": 5,\n                \"message\": \"provided address does not match addressed derived from seed\",\n                \"docs\": [\"AddressWithSeedMismatch: provided address does not match addressed derived from seed\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"nonceNoRecentBlockhashes\",\n                \"idlName\": \"NonceNoRecentBlockhashes\",\n                \"code\": 6,\n                \"message\": \"advancing stored nonce requires a populated RecentBlockhashes sysvar\",\n                \"docs\": [\n                    \"NonceNoRecentBlockhashes: advancing stored nonce requires a populated RecentBlockhashes sysvar\"\n                ]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"nonceBlockhashNotExpired\",\n                \"idlName\": \"NonceBlockhashNotExpired\",\n                \"code\": 7,\n                \"message\": \"stored nonce is still in recent_blockhashes\",\n                \"docs\": [\"NonceBlockhashNotExpired: stored nonce is still in recent_blockhashes\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"nonceUnexpectedBlockhashValue\",\n                \"idlName\": \"NonceUnexpectedBlockhashValue\",\n                \"code\": 8,\n                \"message\": \"specified nonce does not match stored nonce\",\n                \"docs\": [\"NonceUnexpectedBlockhashValue: specified nonce does not match stored nonce\"]\n            }\n        ],\n        \"name\": \"system\",\n        \"prefix\": \"\",\n        \"publicKey\": \"11111111111111111111111111111111\",\n        \"version\": \"0.0.1\",\n        \"origin\": \"shank\"\n    },\n    \"additionalPrograms\": [],\n    \"standard\": \"codama\",\n    \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/idls/token-2022-idl.json",
    "content": "{\n    \"kind\": \"rootNode\",\n    \"standard\": \"codama\",\n    \"version\": \"1.0.0\",\n    \"program\": {\n        \"kind\": \"programNode\",\n        \"name\": \"token-2022\",\n        \"publicKey\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\",\n        \"version\": \"3.0.2\",\n        \"origin\": \"shank\",\n        \"docs\": [],\n        \"accounts\": [\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"mint\",\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"mintAuthority\",\n                            \"docs\": [\n                                \"Optional authority used to mint new tokens. The mint authority may only\",\n                                \"be provided during mint creation. If no mint authority is present\",\n                                \"then the mint has a fixed supply and no further tokens may be minted.\"\n                            ],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": true,\n                                \"item\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"supply\",\n                            \"docs\": [\"Total supply of tokens.\"],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"decimals\",\n                            \"docs\": [\"Number of base 10 digits to the right of the decimal place.\"],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"isInitialized\",\n                            \"docs\": [\"Is `true` if this structure has been initialized.\"],\n                            \"type\": {\n                                \"kind\": \"booleanTypeNode\",\n                                \"size\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"freezeAuthority\",\n                            \"docs\": [\"Optional authority to freeze token accounts.\"],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": true,\n                                \"item\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"extensions\",\n                            \"docs\": [\"The extensions activated on the mint account.\"],\n                            \"type\": {\n                                \"kind\": \"remainderOptionTypeNode\",\n                                \"item\": {\n                                    \"kind\": \"hiddenPrefixTypeNode\",\n                                    \"type\": {\n                                        \"kind\": \"arrayTypeNode\",\n                                        \"item\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"extension\"\n                                        },\n                                        \"count\": {\n                                            \"kind\": \"remainderCountNode\"\n                                        }\n                                    },\n                                    \"prefix\": [\n                                        {\n                                            \"kind\": \"constantValueNode\",\n                                            \"type\": {\n                                                \"kind\": \"preOffsetTypeNode\",\n                                                \"offset\": 83,\n                                                \"strategy\": \"padded\",\n                                                \"type\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u8\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            },\n                                            \"value\": {\n                                                \"kind\": \"numberValueNode\",\n                                                \"number\": 1\n                                            }\n                                        }\n                                    ]\n                                }\n                            }\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"sizeDiscriminatorNode\",\n                        \"size\": 82\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"token\",\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"mint\",\n                            \"docs\": [\"The mint associated with this account.\"],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"owner\",\n                            \"docs\": [\"The owner of this account.\"],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"amount\",\n                            \"docs\": [\"The amount of tokens this account holds.\"],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"delegate\",\n                            \"docs\": [\n                                \"If `delegate` is `Some` then `delegated_amount` represents\",\n                                \"the amount authorized by the delegate.\"\n                            ],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": true,\n                                \"item\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"state\",\n                            \"docs\": [\"The account's state.\"],\n                            \"type\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"accountState\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"isNative\",\n                            \"docs\": [\n                                \"If is_native.is_some, this is a native token, and the value logs the\",\n                                \"rent-exempt reserve. An Account is required to be rent-exempt, so\",\n                                \"the value is used by the Processor to ensure that wrapped SOL\",\n                                \"accounts do not drop below this threshold.\"\n                            ],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": true,\n                                \"item\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"delegatedAmount\",\n                            \"docs\": [\"The amount delegated.\"],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"closeAuthority\",\n                            \"docs\": [\"Optional authority to close the account.\"],\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"fixed\": true,\n                                \"item\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"extensions\",\n                            \"docs\": [\"The extensions activated on the token account.\"],\n                            \"type\": {\n                                \"kind\": \"remainderOptionTypeNode\",\n                                \"item\": {\n                                    \"kind\": \"hiddenPrefixTypeNode\",\n                                    \"type\": {\n                                        \"kind\": \"arrayTypeNode\",\n                                        \"item\": {\n                                            \"kind\": \"definedTypeLinkNode\",\n                                            \"name\": \"extension\"\n                                        },\n                                        \"count\": {\n                                            \"kind\": \"remainderCountNode\"\n                                        }\n                                    },\n                                    \"prefix\": [\n                                        {\n                                            \"kind\": \"constantValueNode\",\n                                            \"type\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u8\",\n                                                \"endian\": \"le\"\n                                            },\n                                            \"value\": {\n                                                \"kind\": \"numberValueNode\",\n                                                \"number\": 2\n                                            }\n                                        }\n                                    ]\n                                }\n                            }\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"sizeDiscriminatorNode\",\n                        \"size\": 165\n                    }\n                ]\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"name\": \"multisig\",\n                \"size\": 355,\n                \"docs\": [],\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"m\",\n                            \"docs\": [\"Number of signers required.\"],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"n\",\n                            \"docs\": [\"Number of valid signers.\"],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"isInitialized\",\n                            \"docs\": [\"Is `true` if this structure has been initialized.\"],\n                            \"type\": {\n                                \"kind\": \"booleanTypeNode\",\n                                \"size\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"signers\",\n                            \"docs\": [\"Signer public keys.\"],\n                            \"type\": {\n                                \"kind\": \"arrayTypeNode\",\n                                \"item\": {\n                                    \"kind\": \"publicKeyTypeNode\"\n                                },\n                                \"count\": {\n                                    \"kind\": \"fixedCountNode\",\n                                    \"value\": 11\n                                }\n                            }\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"sizeDiscriminatorNode\",\n                        \"size\": 355\n                    }\n                ]\n            }\n        ],\n        \"instructions\": [\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeMint\",\n                \"docs\": [\n                    \"Initializes a new mint and optionally deposits all the newly minted\",\n                    \"tokens in an account.\",\n                    \"\",\n                    \"The `InitializeMint` instruction requires no signers and MUST be\",\n                    \"included within the same Transaction as the system program's\",\n                    \"`CreateAccount` instruction that creates the account being initialized.\",\n                    \"Otherwise another party can acquire ownership of the uninitialized account.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token mint account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Rent sysvar.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"SysvarRent111111111111111111111111111111111\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"decimals\",\n                        \"docs\": [\"Number of decimals in token account amounts.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"mintAuthority\",\n                        \"docs\": [\"Minting authority.\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"freezeAuthority\",\n                        \"docs\": [\"Optional authority that can freeze token accounts.\"],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"fixed\": false,\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"noneValueNode\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeAccount\",\n                \"docs\": [\n                    \"Initializes a new account to hold tokens. If this account is associated\",\n                    \"with the native mint then the token balance of the initialized account\",\n                    \"will be equal to the amount of SOL in the account. If this account is\",\n                    \"associated with another mint, that mint must be initialized before this\",\n                    \"command can succeed.\",\n                    \"\",\n                    \"The `InitializeAccount` instruction requires no signers and MUST be\",\n                    \"included within the same Transaction as the system program's\",\n                    \"`CreateAccount` instruction that creates the account being initialized.\",\n                    \"Otherwise another party can acquire ownership of the uninitialized account.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to initialize.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint this account will be associated with.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The new account's owner/multisignature.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Rent sysvar.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"SysvarRent111111111111111111111111111111111\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeMultisig\",\n                \"docs\": [\n                    \"Initializes a multisignature account with N provided signers.\",\n                    \"\",\n                    \"Multisignature accounts can used in place of any single owner/delegate\",\n                    \"accounts in any token instruction that require an owner/delegate to be\",\n                    \"present. The variant field represents the number of signers (M)\",\n                    \"required to validate this multisignature account.\",\n                    \"\",\n                    \"The `InitializeMultisig` instruction requires no signers and MUST be\",\n                    \"included within the same Transaction as the system program's\",\n                    \"`CreateAccount` instruction that creates the account being initialized.\",\n                    \"Otherwise another party can acquire ownership of the uninitialized account.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"multisig\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The multisignature account to initialize.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Rent sysvar.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"SysvarRent111111111111111111111111111111111\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 2\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"m\",\n                        \"docs\": [\"The number of signers (M) required to validate this multisignature account.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"signers\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"transfer\",\n                \"docs\": [\n                    \"Transfers tokens from one account to another either directly or via a delegate.\",\n                    \"If this account is associated with the native mint then equal amounts\",\n                    \"of SOL and Tokens will be transferred to the destination account.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"source\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destination\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The destination account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner/delegate or its multisignature account.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 3\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"docs\": [\"The amount of tokens to transfer.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"approve\",\n                \"docs\": [\n                    \"Approves a delegate. A delegate is given the authority over tokens on\",\n                    \"behalf of the source account's owner.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"source\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"delegate\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The delegate.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account owner or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 4\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"docs\": [\"The amount of tokens the delegate is approved for.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"revoke\",\n                \"docs\": [\"Revokes the delegate's authority.\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"source\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account owner or its multisignature.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 5\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"setAuthority\",\n                \"docs\": [\"Sets a new authority of a mint or account.\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owned\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint or account to change the authority of.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"The current authority or the multisignature account of the mint or account to update.\"\n                        ]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 6\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"authorityType\",\n                        \"docs\": [\"The type of authority to update.\"],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"authorityType\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"newAuthority\",\n                        \"docs\": [\"The new authority\"],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"fixed\": false,\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"mintTo\",\n                \"docs\": [\"Mints new tokens to an account. The native mint does not support minting.\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to mint tokens to.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mintAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint's minting authority or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 7\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"docs\": [\"The amount of new tokens to mint.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"burn\",\n                \"docs\": [\n                    \"Burns tokens by removing them from an account. `Burn` does not support\",\n                    \"accounts associated with the native mint, use `CloseAccount` instead.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to burn from.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The account's owner/delegate or its multisignature account.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [\"The amount of tokens to burn.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 8\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"closeAccount\",\n                \"docs\": [\n                    \"Close an account by transferring all its SOL to the destination account.\",\n                    \"Non-native accounts may only be closed if its token amount is zero.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to close.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destination\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The destination account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The account's owner or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 9\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"freezeAccount\",\n                \"docs\": [\"Freeze an Initialized account using the Mint's freeze_authority (if set).\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to freeze.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint freeze authority or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 10\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"thawAccount\",\n                \"docs\": [\"Thaw a Frozen account using the Mint's freeze_authority (if set).\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to thaw.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint freeze authority or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 11\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"transferChecked\",\n                \"docs\": [\n                    \"Transfers tokens from one account to another either directly or via a\",\n                    \"delegate. If this account is associated with the native mint then equal\",\n                    \"amounts of SOL and Tokens will be transferred to the destination account.\",\n                    \"\",\n                    \"This instruction differs from Transfer in that the token mint and\",\n                    \"decimals value is checked by the caller. This may be useful when\",\n                    \"creating transactions offline or within a hardware wallet.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"source\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destination\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The destination account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner/delegate or its multisignature account.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 12\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"docs\": [\"The amount of tokens to transfer.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"decimals\",\n                        \"docs\": [\"Expected number of base 10 digits to the right of the decimal place.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"approveChecked\",\n                \"docs\": [\n                    \"Approves a delegate. A delegate is given the authority over tokens on\",\n                    \"behalf of the source account's owner.\",\n                    \"\",\n                    \"This instruction differs from Approve in that the token mint and\",\n                    \"decimals value is checked by the caller. This may be useful when\",\n                    \"creating transactions offline or within a hardware wallet.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"source\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"delegate\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The delegate.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account owner or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 13\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"docs\": [\"The amount of tokens the delegate is approved for.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"decimals\",\n                        \"docs\": [\"Expected number of base 10 digits to the right of the decimal place.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"mintToChecked\",\n                \"docs\": [\n                    \"Mints new tokens to an account. The native mint does not support minting.\",\n                    \"\",\n                    \"This instruction differs from MintTo in that the decimals value is\",\n                    \"checked by the caller. This may be useful when creating transactions\",\n                    \"offline or within a hardware wallet.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to mint tokens to.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mintAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint's minting authority or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 14\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"docs\": [\"The amount of new tokens to mint.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"decimals\",\n                        \"docs\": [\"Expected number of base 10 digits to the right of the decimal place.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"burnChecked\",\n                \"docs\": [\n                    \"Burns tokens by removing them from an account. `BurnChecked` does not\",\n                    \"support accounts associated with the native mint, use `CloseAccount` instead.\",\n                    \"\",\n                    \"This instruction differs from Burn in that the decimals value is checked\",\n                    \"by the caller. This may be useful when creating transactions offline or\",\n                    \"within a hardware wallet.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to burn from.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The account's owner/delegate or its multisignature account.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 15\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"docs\": [\"The amount of tokens to burn.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"decimals\",\n                        \"docs\": [\"Expected number of base 10 digits to the right of the decimal place.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeAccount2\",\n                \"docs\": [\n                    \"Like InitializeAccount, but the owner pubkey is passed via instruction\",\n                    \"data rather than the accounts list. This variant may be preferable\",\n                    \"when using Cross Program Invocation from an instruction that does\",\n                    \"not need the owner's `AccountInfo` otherwise.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to initialize.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint this account will be associated with.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Rent sysvar.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"SysvarRent111111111111111111111111111111111\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 16\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"owner\",\n                        \"docs\": [\"The new account's owner/multisignature.\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"syncNative\",\n                \"docs\": [\n                    \"Given a wrapped / native token account (a token account containing SOL)\",\n                    \"updates its amount field based on the account's underlying `lamports`.\",\n                    \"This is useful if a non-wrapped SOL account uses\",\n                    \"`system_instruction::transfer` to move lamports to a wrapped token\",\n                    \"account, and needs to have its token `amount` field updated.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The native token account to sync with its underlying lamports.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 17\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeAccount3\",\n                \"docs\": [\"Like InitializeAccount2, but does not require the Rent sysvar to be provided.\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to initialize.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint this account will be associated with.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 18\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"owner\",\n                        \"docs\": [\"The new account's owner/multisignature.\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeMultisig2\",\n                \"docs\": [\"Like InitializeMultisig, but does not require the Rent sysvar to be provided.\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"multisig\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The multisignature account to initialize.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 19\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"m\",\n                        \"docs\": [\"The number of signers (M) required to validate this multisignature account.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"signers\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeMint2\",\n                \"docs\": [\"Like [`InitializeMint`], but does not require the Rent sysvar to be provided.\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to initialize.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 20\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"decimals\",\n                        \"docs\": [\"Number of base 10 digits to the right of the decimal place.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"mintAuthority\",\n                        \"docs\": [\"The authority/multisignature to mint tokens.\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"freezeAuthority\",\n                        \"docs\": [\"The optional freeze authority/multisignature of the mint.\"],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"fixed\": false,\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"noneValueNode\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"getAccountDataSize\",\n                \"docs\": [\n                    \"Gets the required size of an account for the given mint as a\",\n                    \"little-endian `u64`.\",\n                    \"\",\n                    \"Return data can be fetched using `sol_get_return_data` and deserializing\",\n                    \"the return data as a little-endian `u64`.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to calculate for.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 21\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeImmutableOwner\",\n                \"docs\": [\n                    \"Initialize the Immutable Owner extension for the given token account\",\n                    \"\",\n                    \"Fails if the account has already been initialized, so must be called\",\n                    \"before `InitializeAccount`.\",\n                    \"\",\n                    \"No-ops in this version of the program, but is included for compatibility\",\n                    \"with the Associated Token Account program.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to initialize.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 22\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"amountToUiAmount\",\n                \"docs\": [\n                    \"Convert an Amount of tokens to a UiAmount `string`, using the given\",\n                    \"mint. In this version of the program, the mint can only specify the\",\n                    \"number of decimals.\",\n                    \"\",\n                    \"Fails on an invalid mint.\",\n                    \"\",\n                    \"Return data can be fetched using `sol_get_return_data` and deserialized\",\n                    \"with `String::from_utf8`.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to calculate for.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 23\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"docs\": [\"The amount of tokens to reformat.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"uiAmountToAmount\",\n                \"docs\": [\n                    \"Convert a UiAmount of tokens to a little-endian `u64` raw Amount, using\",\n                    \"the given mint. In this version of the program, the mint can only\",\n                    \"specify the number of decimals.\",\n                    \"\",\n                    \"Return data can be fetched using `sol_get_return_data` and deserializing\",\n                    \"the return data as a little-endian `u64`.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to calculate for.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 24\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"uiAmount\",\n                        \"docs\": [\"The ui_amount of tokens to reformat.\"],\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeMintCloseAuthority\",\n                \"docs\": [\n                    \"Initialize the close account authority on a new mint.\",\n                    \"\",\n                    \"Fails if the mint has already been initialized, so must be called before `InitializeMint`.\",\n                    \"\",\n                    \"The mint must have exactly enough space allocated for the base mint (82\",\n                    \"bytes), plus 83 bytes of padding, 1 byte reserved for the account type,\",\n                    \"then space required for this extension, plus any others.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to initialize.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 25\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"closeAuthority\",\n                        \"docs\": [\"Authority that must sign the `CloseAccount` instruction on a mint.\"],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"fixed\": false,\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeTransferFeeConfig\",\n                \"docs\": [\n                    \"Initialize the transfer fee on a new mint.\",\n                    \"\",\n                    \"Fails if the mint has already been initialized, so must be called before `InitializeMint`.\",\n                    \"\",\n                    \"The mint must have exactly enough space allocated for the base mint (82\",\n                    \"bytes), plus 83 bytes of padding, 1 byte reserved for the account type,\",\n                    \"then space required for this extension, plus any others.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to initialize.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 26\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"transferFeeDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"transferFeeConfigAuthority\",\n                        \"docs\": [\"Pubkey that may update the fees.\"],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"fixed\": false,\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"withdrawWithheldAuthority\",\n                        \"docs\": [\"Withdraw instructions must be signed by this key.\"],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"fixed\": false,\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"transferFeeBasisPoints\",\n                        \"docs\": [\n                            \"Amount of transfer collected as fees, expressed as basis points of the transfer amount.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u16\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"maximumFee\",\n                        \"docs\": [\"Maximum fee assessed on transfers.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"transferFeeDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"transferCheckedWithFee\",\n                \"docs\": [\n                    \"Transfer, providing expected mint information and fees.\",\n                    \"\",\n                    \"This instruction succeeds if the mint has no configured transfer fee\",\n                    \"and the provided fee is 0. This allows applications to use\",\n                    \"`TransferCheckedWithFee` with any mint.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"source\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account. May include the `TransferFeeAmount` extension.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint. May include the `TransferFeeConfig` extension.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destination\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The destination account. May include the `TransferFeeAmount` extension.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner/delegate or its multisignature account.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 26\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"transferFeeDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"docs\": [\"The amount of tokens to transfer.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"decimals\",\n                        \"docs\": [\"Expected number of base 10 digits to the right of the decimal place.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"fee\",\n                        \"docs\": [\n                            \"Expected fee assessed on this transfer, calculated off-chain based\",\n                            \"on the transfer_fee_basis_points and maximum_fee of the mint. May\",\n                            \"be 0 for a mint without a configured transfer fee.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"transferFeeDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"withdrawWithheldTokensFromMint\",\n                \"docs\": [\n                    \"Transfer all withheld tokens in the mint to an account. Signed by the\",\n                    \"mint's withdraw withheld tokens authority.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint. Must include the `TransferFeeConfig` extension.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"feeReceiver\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"The fee receiver account. Must include the `TransferFeeAmount`\",\n                            \"extension associated with the provided mint.\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"withdrawWithheldAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint's `withdraw_withheld_authority` or its multisignature account.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 26\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"transferFeeDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 2\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"transferFeeDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"withdrawWithheldTokensFromAccounts\",\n                \"docs\": [\n                    \"Transfer all withheld tokens to an account. Signed by the mint's\",\n                    \"withdraw withheld tokens authority.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint. Must include the `TransferFeeConfig` extension.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"feeReceiver\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"The fee receiver account. Must include the `TransferFeeAmount`\",\n                            \"extension associated with the provided mint.\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"withdrawWithheldAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint's `withdraw_withheld_authority` or its multisignature account.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 26\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"transferFeeDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 3\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"numTokenAccounts\",\n                        \"docs\": [\"Number of token accounts harvested.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": false,\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"docs\": [\"The source accounts to withdraw from.\"],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"sources\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"transferFeeDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"harvestWithheldTokensToMint\",\n                \"docs\": [\n                    \"Permissionless instruction to transfer all withheld tokens to the mint.\",\n                    \"\",\n                    \"Succeeds for frozen accounts.\",\n                    \"\",\n                    \"Accounts provided should include the `TransferFeeAmount` extension.\",\n                    \"If not, the account is skipped.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 26\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"transferFeeDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 4\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": false,\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"docs\": [\"The source accounts to harvest from.\"],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"sources\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"transferFeeDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"setTransferFee\",\n                \"docs\": [\n                    \"Set transfer fee. Only supported for mints that include the\",\n                    \"`TransferFeeConfig` extension.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"transferFeeConfigAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint's fee account owner or its multisignature account.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 26\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"transferFeeDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 5\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"transferFeeBasisPoints\",\n                        \"docs\": [\n                            \"Amount of transfer collected as fees, expressed as basis points of the transfer amount.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u16\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"maximumFee\",\n                        \"docs\": [\"Maximum fee assessed on transfers.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"transferFeeDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeConfidentialTransferMint\",\n                \"docs\": [\n                    \"Initializes confidential transfers for a mint.\",\n                    \"\",\n                    \"The `ConfidentialTransferInstruction::InitializeMint` instruction\",\n                    \"requires no signers and MUST be included within the same Transaction\",\n                    \"as `TokenInstruction::InitializeMint`. Otherwise another party can\",\n                    \"initialize the configuration.\",\n                    \"\",\n                    \"The instruction fails if the `TokenInstruction::InitializeMint`\",\n                    \"instruction has already executed for the mint.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The SPL Token mint.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 27\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\n                            \"Authority to modify the `ConfidentialTransferMint` configuration and to\",\n                            \"approve new accounts.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"autoApproveNewAccounts\",\n                        \"docs\": [\n                            \"Determines if newly configured accounts must be approved by the\",\n                            \"`authority` before they may be used by the user.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"booleanTypeNode\",\n                            \"size\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"auditorElgamalPubkey\",\n                        \"docs\": [\"New authority to decode any transfer amount in a confidential transfer.\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"updateConfidentialTransferMint\",\n                \"docs\": [\n                    \"Updates the confidential transfer mint configuration for a mint.\",\n                    \"\",\n                    \"Use `TokenInstruction::SetAuthority` to update the confidential transfer\",\n                    \"mint authority.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The SPL Token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Confidential transfer mint authority.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 27\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"autoApproveNewAccounts\",\n                        \"docs\": [\n                            \"Determines if newly configured accounts must be approved by the\",\n                            \"`authority` before they may be used by the user.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"booleanTypeNode\",\n                            \"size\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"auditorElgamalPubkey\",\n                        \"docs\": [\"New authority to decode any transfer amount in a confidential transfer.\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"configureConfidentialTransferAccount\",\n                \"docs\": [\n                    \"Configures confidential transfers for a token account.\",\n                    \"\",\n                    \"The instruction fails if the confidential transfers are already\",\n                    \"configured, or if the mint was not initialized with confidential\",\n                    \"transfer support.\",\n                    \"\",\n                    \"The instruction fails if the `TokenInstruction::InitializeAccount`\",\n                    \"instruction has not yet successfully executed for the token account.\",\n                    \"\",\n                    \"Upon success, confidential and non-confidential deposits and transfers\",\n                    \"are enabled. Use the `DisableConfidentialCredits` and\",\n                    \"`DisableNonConfidentialCredits` instructions to disable.\",\n                    \"\",\n                    \"In order for this instruction to be successfully processed, it must be\",\n                    \"accompanied by the `VerifyPubkeyValidity` instruction of the\",\n                    \"`zk_elgamal_proof` program in the same transaction or the address of a\",\n                    \"context state account for the proof must be provided.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The SPL Token account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The corresponding SPL Token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"instructionsSysvarOrContextState\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"Instructions sysvar if `VerifyPubkeyValidity` is included in\",\n                            \"the same transaction or context state account if\",\n                            \"`VerifyPubkeyValidity` is pre-verified into a context state\",\n                            \"account.\"\n                        ],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"record\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\n                            \"(Optional) Record account if the accompanying proof is to be read from a record account.\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner/delegate or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 27\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 2\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"decryptableZeroBalance\",\n                        \"docs\": [\"The decryptable balance (always 0) once the configure account succeeds.\"],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"decryptableBalance\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"maximumPendingBalanceCreditCounter\",\n                        \"docs\": [\n                            \"The maximum number of despots and transfers that an account can receiver\",\n                            \"before the `ApplyPendingBalance` is executed\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"proofInstructionOffset\",\n                        \"docs\": [\n                            \"Relative location of the `ProofInstruction::ZeroCiphertextProof`\",\n                            \"instruction to the `ConfigureAccount` instruction in the\",\n                            \"transaction. If the offset is `0`, then use a context state account\",\n                            \"for the proof.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"approveConfidentialTransferAccount\",\n                \"docs\": [\n                    \"Approves a token account for confidential transfers.\",\n                    \"\",\n                    \"Approval is only required when the\",\n                    \"`ConfidentialTransferMint::approve_new_accounts` field is set in the\",\n                    \"SPL Token mint.  This instruction must be executed after the account\",\n                    \"owner configures their account for confidential transfers with\",\n                    \"`ConfidentialTransferInstruction::ConfigureAccount`.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The SPL Token account to approve.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The corresponding SPL Token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Confidential transfer mint authority.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 27\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 3\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"emptyConfidentialTransferAccount\",\n                \"docs\": [\n                    \"Empty the available balance in a confidential token account.\",\n                    \"\",\n                    \"A token account that is extended for confidential transfers can only be\",\n                    \"closed if the pending and available balance ciphertexts are emptied.\",\n                    \"The pending balance can be emptied\",\n                    \"via the `ConfidentialTransferInstruction::ApplyPendingBalance`\",\n                    \"instruction. Use the `ConfidentialTransferInstruction::EmptyAccount`\",\n                    \"instruction to empty the available balance ciphertext.\",\n                    \"\",\n                    \"Note that a newly configured account is always empty, so this\",\n                    \"instruction is not required prior to account closing if no\",\n                    \"instructions beyond\",\n                    \"`ConfidentialTransferInstruction::ConfigureAccount` have affected the\",\n                    \"token account.\",\n                    \"\",\n                    \"In order for this instruction to be successfully processed, it must be\",\n                    \"accompanied by the `VerifyZeroCiphertext` instruction of the\",\n                    \"`zk_elgamal_proof` program in the same transaction or the address of a\",\n                    \"context state account for the proof must be provided.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The SPL Token account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"instructionsSysvarOrContextState\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"Instructions sysvar if `VerifyZeroCiphertext` is included in\",\n                            \"the same transaction or context state account if\",\n                            \"`VerifyZeroCiphertext` is pre-verified into a context state\",\n                            \"account.\"\n                        ],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"Sysvar1nstructions1111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"record\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\n                            \"(Optional) Record account if the accompanying proof is to be read from a record account.\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner/delegate or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 27\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 4\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"proofInstructionOffset\",\n                        \"docs\": [\n                            \"Relative location of the `ProofInstruction::VerifyCloseAccount`\",\n                            \"instruction to the `EmptyAccount` instruction in the transaction. If\",\n                            \"the offset is `0`, then use a context state account for the proof.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"confidentialDeposit\",\n                \"docs\": [\n                    \"Deposit SPL Tokens into the pending balance of a confidential token\",\n                    \"account.\",\n                    \"\",\n                    \"The account owner can then invoke the `ApplyPendingBalance` instruction\",\n                    \"to roll the deposit into their available balance at a time of their\",\n                    \"choosing.\",\n                    \"\",\n                    \"Fails if the source or destination accounts are frozen.\",\n                    \"Fails if the associated mint is extended as `NonTransferable`.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The SPL Token account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The corresponding SPL Token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner/delegate or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 27\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 5\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"docs\": [\"The amount of tokens to deposit.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"decimals\",\n                        \"docs\": [\"Expected number of base 10 digits to the right of the decimal place.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"confidentialWithdraw\",\n                \"docs\": [\n                    \"Withdraw SPL Tokens from the available balance of a confidential token\",\n                    \"account.\",\n                    \"\",\n                    \"In order for this instruction to be successfully processed, it must be\",\n                    \"accompanied by the following list of `zk_elgamal_proof` program\",\n                    \"instructions:\",\n                    \"- `VerifyCiphertextCommitmentEquality`\",\n                    \"- `VerifyBatchedRangeProofU64`\",\n                    \"These instructions can be accompanied in the same transaction or can be\",\n                    \"pre-verified into a context state account, in which case, only their\",\n                    \"context state account address need to be provided.\",\n                    \"\",\n                    \"Fails if the source or destination accounts are frozen.\",\n                    \"Fails if the associated mint is extended as `NonTransferable`.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The SPL Token account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The corresponding SPL Token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"instructionsSysvar\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\n                            \"Instructions sysvar if at least one of the\",\n                            \"`zk_elgamal_proof` instructions are included in the same\",\n                            \"transaction.\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"equalityRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"(Optional) Equality proof record account or context state account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rangeRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"(Optional) Range proof record account or context state account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner/delegate or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 27\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 6\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"docs\": [\"The amount of tokens to withdraw.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"decimals\",\n                        \"docs\": [\"Expected number of base 10 digits to the right of the decimal place.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"newDecryptableAvailableBalance\",\n                        \"docs\": [\"The new decryptable balance if the withdrawal succeeds.\"],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"decryptableBalance\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"equalityProofInstructionOffset\",\n                        \"docs\": [\n                            \"Relative location of the\",\n                            \"`ProofInstruction::VerifyCiphertextCommitmentEquality` instruction\",\n                            \"to the `Withdraw` instruction in the transaction. If the offset is\",\n                            \"`0`, then use a context state account for the proof.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i8\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"rangeProofInstructionOffset\",\n                        \"docs\": [\n                            \"Relative location of the `ProofInstruction::BatchedRangeProofU64`\",\n                            \"instruction to the `Withdraw` instruction in the transaction. If the\",\n                            \"offset is `0`, then use a context state account for the proof.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"confidentialTransfer\",\n                \"docs\": [\n                    \"Transfer tokens confidentially.\",\n                    \"\",\n                    \"In order for this instruction to be successfully processed, it must be\",\n                    \"accompanied by the following list of `zk_elgamal_proof` program\",\n                    \"instructions:\",\n                    \"- `VerifyCiphertextCommitmentEquality`\",\n                    \"- `VerifyBatchedGroupedCiphertext3HandlesValidity`\",\n                    \"- `VerifyBatchedRangeProofU128`\",\n                    \"These instructions can be accompanied in the same transaction or can be\",\n                    \"pre-verified into a context state account, in which case, only their\",\n                    \"context state account addresses need to be provided.\",\n                    \"\",\n                    \"Fails if the associated mint is extended as `NonTransferable`.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sourceToken\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The source SPL Token account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The corresponding SPL Token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destinationToken\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The destination SPL Token account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"instructionsSysvar\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\n                            \"(Optional) Instructions sysvar if at least one of the\",\n                            \"`zk_elgamal_proof` instructions are included in the same\",\n                            \"transaction.\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"equalityRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"(Optional) Equality proof record account or context state account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"ciphertextValidityRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"(Optional) Ciphertext validity proof record account or context state account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rangeRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"(Optional) Range proof record account or context state account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner/delegate or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 27\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 7\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"newSourceDecryptableAvailableBalance\",\n                        \"docs\": [\"The new source decryptable balance if the transfer succeeds.\"],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"decryptableBalance\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"equalityProofInstructionOffset\",\n                        \"docs\": [\n                            \"Relative location of the\",\n                            \"`ProofInstruction::VerifyCiphertextCommitmentEquality` instruction\",\n                            \"to the `Transfer` instruction in the transaction. If the offset is\",\n                            \"`0`, then use a context state account for the proof.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i8\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"ciphertextValidityProofInstructionOffset\",\n                        \"docs\": [\n                            \"Relative location of the\",\n                            \"`ProofInstruction::VerifyBatchedGroupedCiphertext3HandlesValidity`\",\n                            \"instruction to the `Transfer` instruction in the transaction. If the\",\n                            \"offset is `0`, then use a context state account for the proof.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i8\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"rangeProofInstructionOffset\",\n                        \"docs\": [\n                            \"Relative location of the `ProofInstruction::BatchedRangeProofU128Data`\",\n                            \"instruction to the `Transfer` instruction in the transaction. If the\",\n                            \"offset is `0`, then use a context state account for the proof.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"applyConfidentialPendingBalance\",\n                \"docs\": [\n                    \"Applies the pending balance to the available balance, based on the\",\n                    \"history of `Deposit` and/or `Transfer` instructions.\",\n                    \"\",\n                    \"After submitting `ApplyPendingBalance`, the client should compare\",\n                    \"`ConfidentialTransferAccount::expected_pending_balance_credit_counter`\",\n                    \"with\",\n                    \"`ConfidentialTransferAccount::actual_applied_pending_balance_instructions`.  If they are\",\n                    \"equal then the\",\n                    \"`ConfidentialTransferAccount::decryptable_available_balance` is\",\n                    \"consistent with `ConfidentialTransferAccount::available_balance`. If\",\n                    \"they differ then there is more pending balance to be applied.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The SPL Token account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner/delegate or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 27\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 8\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"expectedPendingBalanceCreditCounter\",\n                        \"docs\": [\n                            \"The expected number of pending balance credits since the last successful\",\n                            \"`ApplyPendingBalance` instruction\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"newDecryptableAvailableBalance\",\n                        \"docs\": [\"The new decryptable balance if the pending balance is applied\", \"successfully\"],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"decryptableBalance\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"enableConfidentialCredits\",\n                \"docs\": [\"Configure a confidential extension account to accept incoming\", \"confidential transfers.\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The SPL Token account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner/delegate or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 27\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 9\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"disableConfidentialCredits\",\n                \"docs\": [\n                    \"Configure a confidential extension account to reject any incoming\",\n                    \"confidential transfers.\",\n                    \"\",\n                    \"If the `allow_non_confidential_credits` field is `true`, then the base\",\n                    \"account can still receive non-confidential transfers.\",\n                    \"\",\n                    \"This instruction can be used to disable confidential payments after a\",\n                    \"token account has already been extended for confidential transfers.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The SPL Token account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner/delegate or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 27\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 10\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"enableNonConfidentialCredits\",\n                \"docs\": [\n                    \"Configure an account with the confidential extension to accept incoming\",\n                    \"non-confidential transfers.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The SPL Token account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner/delegate or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 27\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 11\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"disableNonConfidentialCredits\",\n                \"docs\": [\n                    \"Configure an account with the confidential extension to reject any\",\n                    \"incoming non-confidential transfers.\",\n                    \"\",\n                    \"This instruction can be used to configure a confidential extension\",\n                    \"account to exclusively receive confidential payments.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The SPL Token account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner/delegate or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 27\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 12\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"confidentialTransferWithFee\",\n                \"docs\": [\n                    \"Transfer tokens confidentially with fee.\",\n                    \"\",\n                    \"In order for this instruction to be successfully processed, it must be\",\n                    \"accompanied by the following list of `zk_elgamal_proof` program\",\n                    \"instructions:\",\n                    \"- `VerifyCiphertextCommitmentEquality`\",\n                    \"- `VerifyBatchedGroupedCiphertext3HandlesValidity` (transfer amount\",\n                    \"  ciphertext)\",\n                    \"- `VerifyPercentageWithFee`\",\n                    \"- `VerifyBatchedGroupedCiphertext2HandlesValidity` (fee ciphertext)\",\n                    \"- `VerifyBatchedRangeProofU256`\",\n                    \"These instructions can be accompanied in the same transaction or can be\",\n                    \"pre-verified into a context state account, in which case, only their\",\n                    \"context state account addresses need to be provided.\",\n                    \"\",\n                    \"The same restrictions for the `Transfer` applies to\",\n                    \"`TransferWithFee`. Namely, the instruction fails if the\",\n                    \"associated mint is extended as `NonTransferable`.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sourceToken\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The source SPL Token account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The corresponding SPL Token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destinationToken\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The destination SPL Token account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"instructionsSysvar\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\n                            \"(Optional) Instructions sysvar if at least one of the\",\n                            \"`zk_elgamal_proof` instructions are included in the same\",\n                            \"transaction.\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"equalityRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"(Optional) Equality proof record account or context state account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"transferAmountCiphertextValidityRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\n                            \"(Optional) Transfer amount ciphertext validity proof record\",\n                            \"account or context state account.\"\n                        ]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"feeSigmaRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"(Optional) Fee sigma proof record account or context state account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"feeCiphertextValidityRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"(Optional) Fee ciphertext validity proof record account or context state account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rangeRecord\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"(Optional) Range proof record account or context state account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner/delegate or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 27\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 13\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"newSourceDecryptableAvailableBalance\",\n                        \"docs\": [\"The new source decryptable balance if the transfer succeeds.\"],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"decryptableBalance\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"equalityProofInstructionOffset\",\n                        \"docs\": [\n                            \"Relative location of the\",\n                            \"`ProofInstruction::VerifyCiphertextCommitmentEquality` instruction\",\n                            \"to the `TransferWithFee` instruction in the transaction. If the offset\",\n                            \"is `0`, then use a context state account for the proof.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i8\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"transferAmountCiphertextValidityProofInstructionOffset\",\n                        \"docs\": [\n                            \"Relative location of the\",\n                            \"`ProofInstruction::VerifyBatchedGroupedCiphertext3HandlesValidity`\",\n                            \"instruction to the `TransferWithFee` instruction in the transaction.\",\n                            \"If the offset is `0`, then use a context state account for the\",\n                            \"proof.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i8\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"feeSigmaProofInstructionOffset\",\n                        \"docs\": [\n                            \"Relative location of the `ProofInstruction::VerifyPercentageWithFee`\",\n                            \"instruction to the `TransferWithFee` instruction in the transaction.\",\n                            \"If the offset is `0`, then use a context state account for the\",\n                            \"proof.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i8\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"feeCiphertextValidityProofInstructionOffset\",\n                        \"docs\": [\n                            \"Relative location of the\",\n                            \"`ProofInstruction::VerifyBatchedGroupedCiphertext2HandlesValidity`\",\n                            \"instruction to the `TransferWithFee` instruction in the transaction.\",\n                            \"If the offset is `0`, then use a context state account for the\",\n                            \"proof.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i8\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"rangeProofInstructionOffset\",\n                        \"docs\": [\n                            \"Relative location of the `ProofInstruction::BatchedRangeProofU256Data`\",\n                            \"instruction to the `TransferWithFee` instruction in the transaction.\",\n                            \"If the offset is `0`, then use a context state account for the\",\n                            \"proof.\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeDefaultAccountState\",\n                \"docs\": [\n                    \"Initialize a new mint with the default state for new Accounts.\",\n                    \"\",\n                    \"Fails if the mint has already been initialized, so must be called before\",\n                    \"`InitializeMint`.\",\n                    \"\",\n                    \"The mint must have exactly enough space allocated for the base mint (82\",\n                    \"bytes), plus 83 bytes of padding, 1 byte reserved for the account type,\",\n                    \"then space required for this extension, plus any others.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 28\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"defaultAccountStateDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"state\",\n                        \"docs\": [\"The state each new token account should start with.\"],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"accountState\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"defaultAccountStateDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"updateDefaultAccountState\",\n                \"docs\": [\n                    \"Update the default state for new Accounts. Only supported for mints that\",\n                    \"include the `DefaultAccountState` extension.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"freezeAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint freeze authority or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 28\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"defaultAccountStateDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"state\",\n                        \"docs\": [\"The state each new token account should start with.\"],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"accountState\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"defaultAccountStateDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"reallocate\",\n                \"docs\": [\n                    \"Check to see if a token account is large enough for a list of\",\n                    \"ExtensionTypes, and if not, use reallocation to increase the data\",\n                    \"size.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token account to reallocate.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"The payer account to fund reallocation.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program for reallocation funding.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The account's owner or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 29\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"newExtensionTypes\",\n                        \"docs\": [\"New extension types to include in the reallocated account.\"],\n                        \"type\": {\n                            \"kind\": \"arrayTypeNode\",\n                            \"item\": {\n                                \"kind\": \"definedTypeLinkNode\",\n                                \"name\": \"extensionType\"\n                            },\n                            \"count\": {\n                                \"kind\": \"remainderCountNode\"\n                            }\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"enableMemoTransfers\",\n                \"docs\": [\n                    \"Require memos for transfers into this Account. Adds the MemoTransfer\",\n                    \"extension to the Account, if it doesn't already exist.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token account to update.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The account's owner or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 30\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"memoTransfersDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"memoTransfersDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"disableMemoTransfers\",\n                \"docs\": [\n                    \"Stop requiring memos for transfers into this Account.\",\n                    \"\",\n                    \"Implicitly initializes the extension in the case where it is not\",\n                    \"present.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token account to update.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The account's owner or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 30\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"memoTransfersDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"memoTransfersDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"createNativeMint\",\n                \"docs\": [\n                    \"Creates the native mint.\",\n                    \"\",\n                    \"This instruction only needs to be invoked once after deployment and is\",\n                    \"permissionless. Wrapped SOL (`native_mint::id()`) will not be\",\n                    \"available until this instruction is successfully executed.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"payer\",\n                        \"isWritable\": true,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Funding account (must be a system account)\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"nativeMint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The native mint address\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"systemProgram\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"System program for mint account funding\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"11111111111111111111111111111111\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 31\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeNonTransferableMint\",\n                \"docs\": [\n                    \"Initialize the non transferable extension for the given mint account\",\n                    \"\",\n                    \"Fails if the account has already been initialized, so must be called before `InitializeMint`.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint account to initialize.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 32\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeInterestBearingMint\",\n                \"docs\": [\n                    \"Initialize a new mint with the `InterestBearing` extension.\",\n                    \"\",\n                    \"Fails if the mint has already been initialized, so must be called before\",\n                    \"`InitializeMint`.\",\n                    \"\",\n                    \"The mint must have exactly enough space allocated for the base mint (82\",\n                    \"bytes), plus 83 bytes of padding, 1 byte reserved for the account type,\",\n                    \"then space required for this extension, plus any others.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to initialize.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 33\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"interestBearingMintDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"rateAuthority\",\n                        \"docs\": [\"The public key for the account that can update the rate\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"rate\",\n                        \"docs\": [\"The initial interest rate\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i16\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"interestBearingMintDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"updateRateInterestBearingMint\",\n                \"docs\": [\n                    \"Update the interest rate. Only supported for mints that include the\",\n                    \"`InterestBearingConfig` extension.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rateAuthority\",\n                        \"isWritable\": true,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint rate authority.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 33\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"interestBearingMintDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"rate\",\n                        \"docs\": [\"The interest rate to update.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i16\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"interestBearingMintDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"enableCpiGuard\",\n                \"docs\": [\n                    \"Lock certain token operations from taking place within CPI for this Account, namely:\",\n                    \"* Transfer and Burn must go through a delegate.\",\n                    \"* CloseAccount can only return lamports to owner.\",\n                    \"* SetAuthority can only be used to remove an existing close authority.\",\n                    \"* Approve is disallowed entirely.\",\n                    \"\",\n                    \"In addition, CPI Guard cannot be enabled or disabled via CPI.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token account to update.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The account's owner/delegate or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 34\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"cpiGuardDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"cpiGuardDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"disableCpiGuard\",\n                \"docs\": [\n                    \"Allow all token operations to happen via CPI as normal.\",\n                    \"\",\n                    \"Implicitly initializes the extension in the case where it is not present.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token account to update.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The account's owner/delegate or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 34\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"cpiGuardDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"cpiGuardDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializePermanentDelegate\",\n                \"docs\": [\n                    \"Initialize the permanent delegate on a new mint.\",\n                    \"\",\n                    \"Fails if the mint has already been initialized, so must be called before `InitializeMint`.\",\n                    \"\",\n                    \"The mint must have exactly enough space allocated for the base mint (82 bytes),\",\n                    \"plus 83 bytes of padding, 1 byte reserved for the account type,\",\n                    \"then space required for this extension, plus any others.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to initialize.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 35\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"delegate\",\n                        \"docs\": [\"Authority that may sign for `Transfer`s and `Burn`s on any account\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeTransferHook\",\n                \"docs\": [\n                    \"Initialize a new mint with a transfer hook program.\",\n                    \"\",\n                    \"Fails if the mint has already been initialized, so must be called before `InitializeMint`.\",\n                    \"\",\n                    \"The mint must have exactly enough space allocated for the base mint (82 bytes),\",\n                    \"plus 83 bytes of padding, 1 byte reserved for the account type,\",\n                    \"then space required for this extension, plus any others.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to initialize.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 36\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"transferHookDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"The public key for the account that can update the program id\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"programId\",\n                        \"docs\": [\"The program id that performs logic during transfers\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"transferHookDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"updateTransferHook\",\n                \"docs\": [\n                    \"Update the transfer hook program id. Only supported for mints that\",\n                    \"include the `TransferHook` extension.\",\n                    \"\",\n                    \"Accounts expected by this instruction:\",\n                    \"\",\n                    \"  0. `[writable]` The mint.\",\n                    \"  1. `[signer]` The transfer hook authority.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The transfer hook authority.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 36\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"transferHookDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"programId\",\n                        \"docs\": [\"The program id that performs logic during transfers\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"transferHookDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeConfidentialTransferFee\",\n                \"docs\": [\n                    \"Initializes confidential transfer fees for a mint.\",\n                    \"\",\n                    \"The instruction must be included within the same Transaction as TokenInstruction::InitializeMint.\",\n                    \"Otherwise another party can initialize the configuration.\",\n                    \"\",\n                    \"The instruction fails if TokenInstruction::InitializeMint has already executed for the mint.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The SPL Token mint.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 37\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferFeeDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"Optional authority to set the withdraw withheld authority ElGamal key\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"withdrawWithheldAuthorityElGamalPubkey\",\n                        \"docs\": [\"Withheld fees from accounts must be encrypted with this ElGamal key\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferFeeDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"withdrawWithheldTokensFromMintForConfidentialTransferFee\",\n                \"docs\": [\n                    \"Transfer all withheld confidential tokens in the mint to an account.\",\n                    \"Signed by the mint's withdraw withheld tokens authority.\",\n                    \"\",\n                    \"The withheld confidential tokens are aggregated directly into the destination available balance.\",\n                    \"\",\n                    \"Must be accompanied by the VerifyCiphertextCiphertextEquality instruction\",\n                    \"of the zk_elgamal_proof program in the same transaction or the address of\",\n                    \"a context state account for the proof must be provided.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destination\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The fee receiver account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"instructionsSysvarOrContextState\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Instructions sysvar or context state account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"record\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Optional record account if proof is read from record\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint's withdraw_withheld_authority\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 37\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferFeeDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"proofInstructionOffset\",\n                        \"docs\": [\"Proof instruction offset\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i8\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"newDecryptableAvailableBalance\",\n                        \"docs\": [\"The new decryptable balance in the destination token account\"],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"decryptableBalance\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferFeeDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"withdrawWithheldTokensFromAccountsForConfidentialTransferFee\",\n                \"docs\": [\n                    \"Transfer all withheld tokens to an account. Signed by the mint's withdraw withheld\",\n                    \"tokens authority. This instruction is susceptible to front-running.\",\n                    \"Use `HarvestWithheldTokensToMint` and `WithdrawWithheldTokensFromMint` as alternative.\",\n                    \"\",\n                    \"Must be accompanied by the VerifyWithdrawWithheldTokens instruction.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destination\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The fee receiver account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"instructionsSysvarOrContextState\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Instructions sysvar or context state account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"record\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": true,\n                        \"docs\": [\"Optional record account\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint's withdraw_withheld_authority\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 37\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferFeeDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 2\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"numTokenAccounts\",\n                        \"docs\": [\"Number of token accounts harvested\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"proofInstructionOffset\",\n                        \"docs\": [\"Proof instruction offset\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i8\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"newDecryptableAvailableBalance\",\n                        \"docs\": [\"The new decryptable balance in the destination token account\"],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"decryptableBalance\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferFeeDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"harvestWithheldTokensToMintForConfidentialTransferFee\",\n                \"docs\": [\n                    \"Permissionless instruction to transfer all withheld confidential tokens to the mint.\",\n                    \"\",\n                    \"Succeeds for frozen accounts.\",\n                    \"\",\n                    \"Accounts provided should include both the `TransferFeeAmount` and\",\n                    \"`ConfidentialTransferAccount` extension. If not, the account is skipped.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 37\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferFeeDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 3\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": false,\n                        \"isWritable\": true,\n                        \"docs\": [\"The source accounts to harvest from\"],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"sources\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferFeeDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"enableHarvestToMint\",\n                \"docs\": [\"Configure a confidential transfer fee mint to accept harvested confidential fees.\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The confidential transfer fee authority\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 37\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferFeeDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 4\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferFeeDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"disableHarvestToMint\",\n                \"docs\": [\"Configure a confidential transfer fee mint to reject any harvested confidential fees.\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The confidential transfer fee authority\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 37\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"confidentialTransferFeeDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 5\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"confidentialTransferFeeDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"withdrawExcessLamports\",\n                \"docs\": [\n                    \"This instruction is to be used to rescue SOLs sent to any TokenProgram\",\n                    \"owned account by sending them to any other account, leaving behind only\",\n                    \"lamports for rent exemption.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"sourceAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Account holding excess lamports.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destinationAccount\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Destination account for withdrawn lamports.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner/delegate or its multisignature account.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 38\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeMetadataPointer\",\n                \"docs\": [\n                    \"Initialize a new mint with a metadata pointer\",\n                    \"\",\n                    \"Fails if the mint has already been initialized, so must be called before\",\n                    \"`InitializeMint`.\",\n                    \"\",\n                    \"The mint must have exactly enough space allocated for the base mint (82\",\n                    \"bytes), plus 83 bytes of padding, 1 byte reserved for the account type,\",\n                    \"then space required for this extension, plus any others.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to initialize.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 39\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"metadataPointerDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"The public key for the account that can update the metadata address.\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"metadataAddress\",\n                        \"docs\": [\"The account address that holds the metadata.\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"metadataPointerDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"updateMetadataPointer\",\n                \"docs\": [\n                    \"Update the metadata pointer address. Only supported for mints that\",\n                    \"include the `MetadataPointer` extension.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to initialize.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadataPointerAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The metadata pointer authority or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 39\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"metadataPointerDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"metadataAddress\",\n                        \"docs\": [\"The new account address that holds the metadata.\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"metadataPointerDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeGroupPointer\",\n                \"docs\": [\n                    \"Initialize a new mint with a group pointer\",\n                    \"\",\n                    \"Fails if the mint has already been initialized, so must be called before\",\n                    \"`InitializeMint`.\",\n                    \"\",\n                    \"The mint must have exactly enough space allocated for the base mint (82\",\n                    \"bytes), plus 83 bytes of padding, 1 byte reserved for the account type,\",\n                    \"then space required for this extension, plus any others.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to initialize.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 40\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"groupPointerDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"The public key for the account that can update the group address.\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"groupAddress\",\n                        \"docs\": [\"The account address that holds the group.\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"groupPointerDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"updateGroupPointer\",\n                \"docs\": [\n                    \"Update the group pointer address. Only supported for mints that\",\n                    \"include the `GroupPointer` extension.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to initialize.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"groupPointerAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The group pointer authority or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 40\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"groupPointerDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"groupAddress\",\n                        \"docs\": [\"The new account address that holds the group configurations.\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"groupPointerDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeGroupMemberPointer\",\n                \"docs\": [\n                    \"Initialize a new mint with a group member pointer\",\n                    \"\",\n                    \"Fails if the mint has already been initialized, so must be called before\",\n                    \"`InitializeMint`.\",\n                    \"\",\n                    \"The mint must have exactly enough space allocated for the base mint (82\",\n                    \"bytes), plus 83 bytes of padding, 1 byte reserved for the account type,\",\n                    \"then space required for this extension, plus any others.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to initialize.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 41\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"groupMemberPointerDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"The public key for the account that can update the group member address.\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"memberAddress\",\n                        \"docs\": [\"The account address that holds the member.\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"groupMemberPointerDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"updateGroupMemberPointer\",\n                \"docs\": [\n                    \"Update the group member pointer address. Only supported for mints that\",\n                    \"include the `GroupMemberPointer` extension.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to initialize.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"groupMemberPointerAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The group member pointer authority or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 41\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"groupMemberPointerDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"memberAddress\",\n                        \"docs\": [\"The new account address that holds the member.\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"groupMemberPointerDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeScaledUiAmountMint\",\n                \"docs\": [\n                    \"Initialize a new mint with the `ScaledUiAmount` extension.\",\n                    \"\",\n                    \"Fails if the mint has already been initialized, so must be called before `InitializeMint`.\",\n                    \"\",\n                    \"The mint must have exactly enough space allocated for the base mint (82 bytes),\",\n                    \"plus 83 bytes of padding, 1 byte reserved for the account type,\",\n                    \"then space required for this extension, plus any others.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to initialize.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 43\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"scaledUiAmountMintDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"The authority that can update the multiplier\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"multiplier\",\n                        \"docs\": [\"The initial multiplier for the scaled UI extension\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"f64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"scaledUiAmountMintDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"updateMultiplierScaledUiMint\",\n                \"docs\": [\n                    \"Update the multiplier. Only supported for mints that include the\",\n                    \"`ScaledUiAmountConfig` extension.\",\n                    \"You can set a specific timestamp for the multiplier to take effect.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": true,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The multiplier authority.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 43\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"scaledUiAmountMintDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"multiplier\",\n                        \"docs\": [\"The new multiplier for the scaled UI extension\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"f64\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"effectiveTimestamp\",\n                        \"docs\": [\"The timestamp at which the new multiplier will take effect\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"i64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"scaledUiAmountMintDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializePausableConfig\",\n                \"docs\": [\n                    \"Initialize a new mint with the `Pausable` extension.\",\n                    \"\",\n                    \"Fails if the mint has already been initialized, so must be called before `InitializeMint`.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 44\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"pausableDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"The authority that can pause and resume the mint.\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"pausableDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"pause\",\n                \"docs\": [\"Pause the mint.\", \"\", \"Fails if the mint is not pausable.\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The pausable authority that can pause the mint.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 44\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"pausableDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"pausableDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"resume\",\n                \"docs\": [\"Resume the mint.\", \"\", \"Fails if the mint is not pausable.\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The pausable authority that can resume the mint.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 44\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"pausableDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 2\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"pausableDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeTokenMetadata\",\n                \"docs\": [\n                    \"Initializes a TLV entry with the basic token-metadata fields.\",\n                    \"\",\n                    \"Assumes that the provided mint is an SPL token mint, that the metadata\",\n                    \"account is allocated and assigned to the program, and that the metadata\",\n                    \"account has enough lamports to cover the rent-exempt reserve.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"updateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mintAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"d2e11ea258b84d8d\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"name\",\n                        \"docs\": [\"Longer name of the token.\"],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"symbol\",\n                        \"docs\": [\"Shortened symbol of the token.\"],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"uri\",\n                        \"docs\": [\"URI pointing to more metadata (image, video, etc.).\"],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"updateTokenMetadataField\",\n                \"docs\": [\n                    \"Updates a field in a token-metadata account.\",\n                    \"\",\n                    \"The field can be one of the required fields (name, symbol, URI), or a\",\n                    \"totally new field denoted by a \\\"key\\\" string.\",\n                    \"\",\n                    \"By the end of the instruction, the metadata account must be properly\",\n                    \"resized based on the new size of the TLV entry.\",\n                    \"  * If the new size is larger, the program must first reallocate to\",\n                    \"    avoid\",\n                    \"  overwriting other TLV entries.\",\n                    \"  * If the new size is smaller, the program must reallocate at the end\",\n                    \"  so that it's possible to iterate over TLV entries\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"updateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"dde9312db5cadcc8\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"field\",\n                        \"docs\": [\"Field to update in the metadata.\"],\n                        \"type\": {\n                            \"kind\": \"definedTypeLinkNode\",\n                            \"name\": \"tokenMetadataField\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"value\",\n                        \"docs\": [\"Value to write for the field.\"],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"removeTokenMetadataKey\",\n                \"docs\": [\n                    \"Removes a key-value pair in a token-metadata account.\",\n                    \"\",\n                    \"This only applies to additional fields, and not the base name / symbol /\",\n                    \"URI fields.\",\n                    \"\",\n                    \"By the end of the instruction, the metadata account must be properly\",\n                    \"resized at the end based on the new size of the TLV entry.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"updateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"ea122038598d25b5\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"idempotent\",\n                        \"docs\": [\n                            \"If the idempotent flag is set to true, then the instruction will not\",\n                            \"error if the key does not exist\"\n                        ],\n                        \"type\": {\n                            \"kind\": \"booleanTypeNode\",\n                            \"size\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"booleanValueNode\",\n                            \"boolean\": false\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"key\",\n                        \"docs\": [\"Key to remove in the additional metadata portion.\"],\n                        \"type\": {\n                            \"kind\": \"sizePrefixTypeNode\",\n                            \"type\": {\n                                \"kind\": \"stringTypeNode\",\n                                \"encoding\": \"utf8\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u32\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"updateTokenMetadataUpdateAuthority\",\n                \"docs\": [\"Updates the token-metadata authority.\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"updateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"d7e4a6e45464567b\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"newUpdateAuthority\",\n                        \"docs\": [\"New authority for the token metadata, or unset if `None`\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"emitTokenMetadata\",\n                \"docs\": [\n                    \"Emits the token-metadata as return data\",\n                    \"\",\n                    \"The format of the data emitted follows exactly the `TokenMetadata`\",\n                    \"struct, but it's possible that the account data is stored in another\",\n                    \"format by the program.\",\n                    \"\",\n                    \"With this instruction, a program that implements the token-metadata\",\n                    \"interface can return `TokenMetadata` without adhering to the specific\",\n                    \"byte layout of the `TokenMetadata` struct in any accounts.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"metadata\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"faa6b4fa0d0cb846\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"start\",\n                        \"docs\": [\"Start of range of data to emit\"],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"noneValueNode\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"end\",\n                        \"docs\": [\"End of range of data to emit\"],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"noneValueNode\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeTokenGroup\",\n                \"docs\": [\"Initialize a new `Group`\", \"\", \"Assumes one has already initialized a mint for the group.\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"group\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mintAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"79716c2736330004\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"updateAuthority\",\n                        \"docs\": [\"Update authority for the group\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"maxSize\",\n                        \"docs\": [\"The maximum number of group members\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"updateTokenGroupMaxSize\",\n                \"docs\": [\"Update the max size of a `Group`.\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"group\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"updateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"6c25ab8ff81e126e\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"maxSize\",\n                        \"docs\": [\"New max size for the group\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"updateTokenGroupUpdateAuthority\",\n                \"docs\": [\"Update the authority of a `Group`.\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"group\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"updateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Current update authority\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"a1695801edddd8cb\",\n                            \"encoding\": \"base16\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"newUpdateAuthority\",\n                        \"docs\": [\"New authority for the group, or unset if `None`\"],\n                        \"type\": {\n                            \"kind\": \"zeroableOptionTypeNode\",\n                            \"item\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializeTokenGroupMember\",\n                \"docs\": [\n                    \"Initialize a new `Member` of a `Group`\",\n                    \"\",\n                    \"Assumes the `Group` has already been initialized,\",\n                    \"as well as the mint for the member.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"member\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"memberMint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"memberMintAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"group\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"groupUpdateAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": []\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"bytesTypeNode\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"bytesValueNode\",\n                            \"data\": \"9820deb0dfed7486\",\n                            \"encoding\": \"base16\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"unwrapLamports\",\n                \"docs\": [\"Transfer lamports from a native SOL account to a destination account.\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"source\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destination\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The destination account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner or its multisignature account.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 45\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"docs\": [\"The amount of lamports to transfer.\"],\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"fixed\": false,\n                            \"item\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            }\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"initializePermissionedBurn\",\n                \"docs\": [\n                    \"Require permissioned burn for the given mint account.\",\n                    \"\",\n                    \"Fails if the mint has already been initialized, so must be called before `InitializeMint`.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint account to initialize.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 46\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"permissionedBurnDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 0\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"authority\",\n                        \"docs\": [\"The public key for the account that is required for token burning.\"],\n                        \"type\": {\n                            \"kind\": \"publicKeyTypeNode\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"permissionedBurnDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"permissionedBurn\",\n                \"docs\": [\"Burn tokens when the mint has the permissioned burn extension enabled.\"],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account to burn from.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"permissionedBurnAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Authority configured on the mint that must sign any permissioned burn instruction.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The account's owner/delegate or its multisignature account.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 46\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"permissionedBurnDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 1\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"docs\": [\"The amount of tokens to burn.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"permissionedBurnDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"name\": \"permissionedBurnChecked\",\n                \"docs\": [\n                    \"Burn tokens with expected decimals when the mint has the permissioned burn extension enabled.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account to burn from.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"permissionedBurnAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": true,\n                        \"isOptional\": false,\n                        \"docs\": [\"Authority configured on the mint that must sign any permissioned burn instruction.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The account's owner/delegate or its multisignature account.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"identityValueNode\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 46\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"permissionedBurnDiscriminator\",\n                        \"defaultValueStrategy\": \"omitted\",\n                        \"docs\": [],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"numberValueNode\",\n                            \"number\": 2\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"docs\": [\"The amount of tokens to burn.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        }\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"decimals\",\n                        \"docs\": [\"Expected number of base 10 digits to the right of the decimal place.\"],\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        }\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"isOptional\": true,\n                        \"isSigner\": true,\n                        \"docs\": [],\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        }\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    },\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"permissionedBurnDiscriminator\",\n                        \"offset\": 1\n                    }\n                ]\n            }\n        ],\n        \"definedTypes\": [\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"accountState\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"uninitialized\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"initialized\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"frozen\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"authorityType\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"mintTokens\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"freezeAccount\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"accountOwner\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"closeAccount\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"transferFeeConfig\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"withheldWithdraw\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"closeMint\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"interestRate\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"permanentDelegate\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"confidentialTransferMint\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"transferHookProgramId\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"confidentialTransferFeeConfig\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"metadataPointer\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"groupPointer\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"groupMemberPointer\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"scaledUiAmount\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"pause\"\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"permissionedBurn\"\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"transferFee\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"epoch\",\n                            \"docs\": [\"First epoch where the transfer fee takes effect.\"],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"maximumFee\",\n                            \"docs\": [\"Maximum fee assessed on transfers, expressed as an amount of tokens.\"],\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            }\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"transferFeeBasisPoints\",\n                            \"docs\": [\n                                \"Amount of transfer collected as fees, expressed as basis points of the\",\n                                \"transfer amount, ie. increments of 0.01%.\"\n                            ],\n                            \"type\": {\n                                \"kind\": \"amountTypeNode\",\n                                \"decimals\": 2,\n                                \"unit\": \"%\",\n                                \"number\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    ]\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"encryptedBalance\",\n                \"docs\": [\"ElGamal ciphertext containing an account balance.\"],\n                \"type\": {\n                    \"kind\": \"fixedSizeTypeNode\",\n                    \"size\": 64,\n                    \"type\": {\n                        \"kind\": \"bytesTypeNode\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"decryptableBalance\",\n                \"docs\": [\"Authenticated encryption containing an account balance.\"],\n                \"type\": {\n                    \"kind\": \"fixedSizeTypeNode\",\n                    \"size\": 36,\n                    \"type\": {\n                        \"kind\": \"bytesTypeNode\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"extension\",\n                \"docs\": [],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"uninitialized\"\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"transferFeeConfig\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"transferFeeConfigAuthority\",\n                                            \"docs\": [\"Optional authority to set the fee.\"],\n                                            \"type\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"withdrawWithheldAuthority\",\n                                            \"docs\": [\"Withdraw from mint instructions must be signed by this key.\"],\n                                            \"type\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"withheldAmount\",\n                                            \"docs\": [\n                                                \"Withheld transfer fee tokens that have been moved to the mint for withdrawal.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u64\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"olderTransferFee\",\n                                            \"docs\": [\n                                                \"Older transfer fee, used if the current epoch < newerTransferFee.epoch.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"transferFee\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"newerTransferFee\",\n                                            \"docs\": [\n                                                \"Newer transfer fee, used if the current epoch >= newerTransferFee.epoch.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"transferFee\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"transferFeeAmount\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"withheldAmount\",\n                                            \"docs\": [\n                                                \"Withheld transfer fee tokens that can be claimed by the fee authority.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u64\",\n                                                \"endian\": \"le\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"mintCloseAuthority\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"closeAuthority\",\n                                            \"docs\": [],\n                                            \"type\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"confidentialTransferMint\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"authority\",\n                                            \"docs\": [\n                                                \"Authority to modify the `ConfidentialTransferMint` configuration and to\",\n                                                \"approve new accounts (if `auto_approve_new_accounts` is true).\",\n                                                \"\",\n                                                \"The legacy Token Multisig account is not supported as the authority.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"zeroableOptionTypeNode\",\n                                                \"item\": {\n                                                    \"kind\": \"publicKeyTypeNode\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"autoApproveNewAccounts\",\n                                            \"docs\": [\n                                                \"Indicate if newly configured accounts must be approved by the\",\n                                                \"`authority` before they may be used by the user.\",\n                                                \"\",\n                                                \"* If `true`, no approval is required and new accounts may be used immediately.\",\n                                                \"* If `false`, the authority must approve newly configured accounts (see\",\n                                                \"  `ConfidentialTransferInstruction::ConfigureAccount`).\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"booleanTypeNode\",\n                                                \"size\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u8\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"auditorElgamalPubkey\",\n                                            \"docs\": [\n                                                \"Authority to decode any transfer amount in a confidential transfer.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"zeroableOptionTypeNode\",\n                                                \"item\": {\n                                                    \"kind\": \"publicKeyTypeNode\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"confidentialTransferAccount\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"approved\",\n                                            \"docs\": [\n                                                \"`true` if this account has been approved for use. All confidential\",\n                                                \"transfer operations for the account will fail until approval is granted.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"booleanTypeNode\",\n                                                \"size\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u8\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"elgamalPubkey\",\n                                            \"docs\": [\"The public key associated with ElGamal encryption.\"],\n                                            \"type\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"pendingBalanceLow\",\n                                            \"docs\": [\n                                                \"The low 16 bits of the pending balance (encrypted by `elgamal_pubkey`).\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"encryptedBalance\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"pendingBalanceHigh\",\n                                            \"docs\": [\n                                                \"The high 32 bits of the pending balance (encrypted by `elgamal_pubkey`).\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"encryptedBalance\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"availableBalance\",\n                                            \"docs\": [\"The available balance (encrypted by `encrypiton_pubkey`).\"],\n                                            \"type\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"encryptedBalance\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"decryptableAvailableBalance\",\n                                            \"docs\": [\"The decryptable available balance.\"],\n                                            \"type\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"decryptableBalance\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"allowConfidentialCredits\",\n                                            \"docs\": [\n                                                \"If `false`, the extended account rejects any incoming confidential transfers.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"booleanTypeNode\",\n                                                \"size\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u8\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"allowNonConfidentialCredits\",\n                                            \"docs\": [\"If `false`, the base account rejects any incoming transfers.\"],\n                                            \"type\": {\n                                                \"kind\": \"booleanTypeNode\",\n                                                \"size\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u8\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"pendingBalanceCreditCounter\",\n                                            \"docs\": [\n                                                \"The total number of `Deposit` and `Transfer` instructions that have credited `pending_balance`.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u64\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"maximumPendingBalanceCreditCounter\",\n                                            \"docs\": [\n                                                \"The maximum number of `Deposit` and `Transfer` instructions that can\",\n                                                \"credit `pending_balance` before the `ApplyPendingBalance`\",\n                                                \"instruction is executed.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u64\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"expectedPendingBalanceCreditCounter\",\n                                            \"docs\": [\n                                                \"The `expected_pending_balance_credit_counter` value that was included in\",\n                                                \"the last `ApplyPendingBalance` instruction.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u64\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"actualPendingBalanceCreditCounter\",\n                                            \"docs\": [\n                                                \"The actual `pending_balance_credit_counter` when the last\",\n                                                \"`ApplyPendingBalance` instruction was executed.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u64\",\n                                                \"endian\": \"le\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"defaultAccountState\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"state\",\n                                            \"docs\": [],\n                                            \"type\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"accountState\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"immutableOwner\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": []\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"memoTransfer\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"requireIncomingTransferMemos\",\n                                            \"docs\": [\n                                                \"Require transfers into this account to be accompanied by a memo.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"booleanTypeNode\",\n                                                \"size\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u8\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"nonTransferable\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": []\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"interestBearingConfig\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"rateAuthority\",\n                                            \"docs\": [],\n                                            \"type\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"initializationTimestamp\",\n                                            \"docs\": [],\n                                            \"type\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u64\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"preUpdateAverageRate\",\n                                            \"docs\": [],\n                                            \"type\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"i16\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"lastUpdateTimestamp\",\n                                            \"docs\": [],\n                                            \"type\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u64\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"currentRate\",\n                                            \"docs\": [],\n                                            \"type\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"i16\",\n                                                \"endian\": \"le\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"cpiGuard\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"lockCpi\",\n                                            \"docs\": [\n                                                \"Lock certain token operations from taking place within CPI for this account.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"booleanTypeNode\",\n                                                \"size\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u8\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"permanentDelegate\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"delegate\",\n                                            \"docs\": [],\n                                            \"type\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"nonTransferableAccount\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": []\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"transferHook\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"authority\",\n                                            \"docs\": [\"The transfer hook update authority.\"],\n                                            \"type\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"programId\",\n                                            \"docs\": [\"The transfer hook program account.\"],\n                                            \"type\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"transferHookAccount\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"transferring\",\n                                            \"docs\": [\n                                                \"Whether or not this account is currently transferring tokens\",\n                                                \"True during the transfer hook cpi, otherwise false.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"booleanTypeNode\",\n                                                \"size\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u8\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"confidentialTransferFee\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"authority\",\n                                            \"docs\": [\n                                                \"Optional authority to set the withdraw withheld authority ElGamal key.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"zeroableOptionTypeNode\",\n                                                \"item\": {\n                                                    \"kind\": \"publicKeyTypeNode\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"elgamalPubkey\",\n                                            \"docs\": [\n                                                \"Withheld fees from accounts must be encrypted with this ElGamal key.\",\n                                                \"\",\n                                                \"Note that whoever holds the ElGamal private key for this ElGamal public\",\n                                                \"key has the ability to decode any withheld fee amount that are\",\n                                                \"associated with accounts. When combined with the fee parameters, the\",\n                                                \"withheld fee amounts can reveal information about transfer amounts.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"harvestToMintEnabled\",\n                                            \"docs\": [\"If `false`, the harvest of withheld tokens to mint is rejected.\"],\n                                            \"type\": {\n                                                \"kind\": \"booleanTypeNode\",\n                                                \"size\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u8\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"withheldAmount\",\n                                            \"docs\": [\n                                                \"Withheld confidential transfer fee tokens that have been moved to the\",\n                                                \"mint for withdrawal.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"encryptedBalance\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"confidentialTransferFeeAmount\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"withheldAmount\",\n                                            \"docs\": [\n                                                \"Amount withheld during confidential transfers, to be harvest to the mint.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"definedTypeLinkNode\",\n                                                \"name\": \"encryptedBalance\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"metadataPointer\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"authority\",\n                                            \"docs\": [\"Optional authority that can set the metadata address.\"],\n                                            \"type\": {\n                                                \"kind\": \"zeroableOptionTypeNode\",\n                                                \"item\": {\n                                                    \"kind\": \"publicKeyTypeNode\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"metadataAddress\",\n                                            \"docs\": [\"Optional Account Address that holds the metadata.\"],\n                                            \"type\": {\n                                                \"kind\": \"zeroableOptionTypeNode\",\n                                                \"item\": {\n                                                    \"kind\": \"publicKeyTypeNode\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"tokenMetadata\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"docs\": [\"The authority that can sign to update the metadata.\"],\n                                            \"type\": {\n                                                \"kind\": \"zeroableOptionTypeNode\",\n                                                \"item\": {\n                                                    \"kind\": \"publicKeyTypeNode\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"mint\",\n                                            \"docs\": [\n                                                \"The associated mint, used to counter spoofing to be sure that metadata belongs to a particular mint.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"name\",\n                                            \"docs\": [\"The longer name of the token.\"],\n                                            \"type\": {\n                                                \"kind\": \"sizePrefixTypeNode\",\n                                                \"type\": {\n                                                    \"kind\": \"stringTypeNode\",\n                                                    \"encoding\": \"utf8\"\n                                                },\n                                                \"prefix\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u32\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"symbol\",\n                                            \"docs\": [\"The shortened symbol for the token.\"],\n                                            \"type\": {\n                                                \"kind\": \"sizePrefixTypeNode\",\n                                                \"type\": {\n                                                    \"kind\": \"stringTypeNode\",\n                                                    \"encoding\": \"utf8\"\n                                                },\n                                                \"prefix\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u32\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"uri\",\n                                            \"docs\": [\"The URI pointing to richer metadata.\"],\n                                            \"type\": {\n                                                \"kind\": \"sizePrefixTypeNode\",\n                                                \"type\": {\n                                                    \"kind\": \"stringTypeNode\",\n                                                    \"encoding\": \"utf8\"\n                                                },\n                                                \"prefix\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u32\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"additionalMetadata\",\n                                            \"docs\": [\"Any additional metadata about the token as key-value pairs.\"],\n                                            \"type\": {\n                                                \"kind\": \"mapTypeNode\",\n                                                \"key\": {\n                                                    \"kind\": \"sizePrefixTypeNode\",\n                                                    \"type\": {\n                                                        \"kind\": \"stringTypeNode\",\n                                                        \"encoding\": \"utf8\"\n                                                    },\n                                                    \"prefix\": {\n                                                        \"kind\": \"numberTypeNode\",\n                                                        \"format\": \"u32\",\n                                                        \"endian\": \"le\"\n                                                    }\n                                                },\n                                                \"value\": {\n                                                    \"kind\": \"sizePrefixTypeNode\",\n                                                    \"type\": {\n                                                        \"kind\": \"stringTypeNode\",\n                                                        \"encoding\": \"utf8\"\n                                                    },\n                                                    \"prefix\": {\n                                                        \"kind\": \"numberTypeNode\",\n                                                        \"format\": \"u32\",\n                                                        \"endian\": \"le\"\n                                                    }\n                                                },\n                                                \"count\": {\n                                                    \"kind\": \"prefixedCountNode\",\n                                                    \"prefix\": {\n                                                        \"kind\": \"numberTypeNode\",\n                                                        \"format\": \"u32\",\n                                                        \"endian\": \"le\"\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"groupPointer\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"authority\",\n                                            \"docs\": [\"Optional authority that can set the group address.\"],\n                                            \"type\": {\n                                                \"kind\": \"zeroableOptionTypeNode\",\n                                                \"item\": {\n                                                    \"kind\": \"publicKeyTypeNode\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"groupAddress\",\n                                            \"docs\": [\"Optional account address that holds the group.\"],\n                                            \"type\": {\n                                                \"kind\": \"zeroableOptionTypeNode\",\n                                                \"item\": {\n                                                    \"kind\": \"publicKeyTypeNode\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"tokenGroup\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"updateAuthority\",\n                                            \"docs\": [\"The authority that can sign to update the group.\"],\n                                            \"type\": {\n                                                \"kind\": \"zeroableOptionTypeNode\",\n                                                \"item\": {\n                                                    \"kind\": \"publicKeyTypeNode\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"mint\",\n                                            \"docs\": [\n                                                \"The associated mint, used to counter spoofing to be sure that group belongs to a particular mint.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"size\",\n                                            \"docs\": [\"The current number of group members.\"],\n                                            \"type\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u64\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"maxSize\",\n                                            \"docs\": [\"The maximum number of group members.\"],\n                                            \"type\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u64\",\n                                                \"endian\": \"le\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"groupMemberPointer\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"authority\",\n                                            \"docs\": [\"Optional authority that can set the member address.\"],\n                                            \"type\": {\n                                                \"kind\": \"zeroableOptionTypeNode\",\n                                                \"item\": {\n                                                    \"kind\": \"publicKeyTypeNode\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"memberAddress\",\n                                            \"docs\": [\"Optional account address that holds the member.\"],\n                                            \"type\": {\n                                                \"kind\": \"zeroableOptionTypeNode\",\n                                                \"item\": {\n                                                    \"kind\": \"publicKeyTypeNode\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"tokenGroupMember\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"mint\",\n                                            \"docs\": [\n                                                \"The associated mint, used to counter spoofing to be sure that member belongs to a particular mint.\"\n                                            ],\n                                            \"type\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"group\",\n                                            \"docs\": [\"The pubkey of the `TokenGroup`.\"],\n                                            \"type\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"memberNumber\",\n                                            \"docs\": [\"The member number.\"],\n                                            \"type\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u64\",\n                                                \"endian\": \"le\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"confidentialMintBurn\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": []\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"scaledUiAmountConfig\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"authority\",\n                                            \"docs\": [],\n                                            \"type\": {\n                                                \"kind\": \"publicKeyTypeNode\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"multiplier\",\n                                            \"docs\": [],\n                                            \"type\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"f64\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"newMultiplierEffectiveTimestamp\",\n                                            \"docs\": [],\n                                            \"type\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"u64\",\n                                                \"endian\": \"le\"\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"newMultiplier\",\n                                            \"docs\": [],\n                                            \"type\": {\n                                                \"kind\": \"numberTypeNode\",\n                                                \"format\": \"f64\",\n                                                \"endian\": \"le\"\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"pausableConfig\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"authority\",\n                                            \"docs\": [],\n                                            \"type\": {\n                                                \"kind\": \"zeroableOptionTypeNode\",\n                                                \"item\": {\n                                                    \"kind\": \"publicKeyTypeNode\"\n                                                }\n                                            }\n                                        },\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"paused\",\n                                            \"docs\": [],\n                                            \"type\": {\n                                                \"kind\": \"booleanTypeNode\",\n                                                \"size\": {\n                                                    \"kind\": \"numberTypeNode\",\n                                                    \"format\": \"u8\",\n                                                    \"endian\": \"le\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"pausableAccount\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": []\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        },\n                        {\n                            \"kind\": \"enumStructVariantTypeNode\",\n                            \"name\": \"permissionedBurn\",\n                            \"struct\": {\n                                \"kind\": \"sizePrefixTypeNode\",\n                                \"type\": {\n                                    \"kind\": \"structTypeNode\",\n                                    \"fields\": [\n                                        {\n                                            \"kind\": \"structFieldTypeNode\",\n                                            \"name\": \"authority\",\n                                            \"docs\": [\"Authority that is required for burning\"],\n                                            \"type\": {\n                                                \"kind\": \"zeroableOptionTypeNode\",\n                                                \"item\": {\n                                                    \"kind\": \"publicKeyTypeNode\"\n                                                }\n                                            }\n                                        }\n                                    ]\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u16\",\n                                    \"endian\": \"le\"\n                                }\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u16\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"extensionType\",\n                \"docs\": [\n                    \"Extensions that can be applied to mints or accounts.  Mint extensions must\",\n                    \"only be applied to mint accounts, and account extensions must only be\",\n                    \"applied to token holding accounts.\"\n                ],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"uninitialized\",\n                            \"docs\": [\"Used as padding if the account size would otherwise be 355, same as a multisig\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"transferFeeConfig\",\n                            \"docs\": [\n                                \"Includes transfer fee rate info and accompanying authorities to withdraw\",\n                                \"and set the fee\"\n                            ]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"transferFeeAmount\",\n                            \"docs\": [\"Includes withheld transfer fees\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"mintCloseAuthority\",\n                            \"docs\": [\"Includes an optional mint close authority\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"confidentialTransferMint\",\n                            \"docs\": [\"Auditor configuration for confidential transfers\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"confidentialTransferAccount\",\n                            \"docs\": [\"State for confidential transfers\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"defaultAccountState\",\n                            \"docs\": [\"Specifies the default Account::state for new Accounts\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"immutableOwner\",\n                            \"docs\": [\"Indicates that the Account owner authority cannot be changed\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"memoTransfer\",\n                            \"docs\": [\"Require inbound transfers to have memo\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"nonTransferable\",\n                            \"docs\": [\"Indicates that the tokens from this mint can't be transferred\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"interestBearingConfig\",\n                            \"docs\": [\"Tokens accrue interest over time,\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"cpiGuard\",\n                            \"docs\": [\"Locks privileged token operations from happening via CPI\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"permanentDelegate\",\n                            \"docs\": [\"Includes an optional permanent delegate\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"nonTransferableAccount\",\n                            \"docs\": [\"Indicates that the tokens in this account belong to a non-transferable\", \"mint\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"transferHook\",\n                            \"docs\": [\"Mint requires a CPI to a program implementing the \\\"transfer hook\\\"\", \"interface\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"transferHookAccount\",\n                            \"docs\": [\n                                \"Indicates that the tokens in this account belong to a mint with a\",\n                                \"transfer hook\"\n                            ]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"confidentialTransferFee\",\n                            \"docs\": [\n                                \"Includes encrypted withheld fees and the encryption public that they are\",\n                                \"encrypted under\"\n                            ]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"confidentialTransferFeeAmount\",\n                            \"docs\": [\"Includes confidential withheld transfer fees\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"scaledUiAmountConfig\",\n                            \"docs\": [\"Tokens have a scaled UI amount\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"pausableConfig\",\n                            \"docs\": [\"Mint contains pausable configuration\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"pausableAccount\",\n                            \"docs\": [\"Account contains pausable configuration\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"metadataPointer\",\n                            \"docs\": [\n                                \"Mint contains a pointer to another account (or the same account) that\",\n                                \"holds metadata\"\n                            ]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"tokenMetadata\",\n                            \"docs\": [\"Mint contains token-metadata\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"groupPointer\",\n                            \"docs\": [\n                                \"Mint contains a pointer to another account (or the same account) that\",\n                                \"holds group configurations\"\n                            ]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"tokenGroup\",\n                            \"docs\": [\"Mint contains token group configurations\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"groupMemberPointer\",\n                            \"docs\": [\n                                \"Mint contains a pointer to another account (or the same account) that\",\n                                \"holds group member configurations\"\n                            ]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"tokenGroupMember\",\n                            \"docs\": [\"Mint contains token group member configurations\"]\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u16\",\n                        \"endian\": \"le\"\n                    }\n                }\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"tokenMetadataField\",\n                \"docs\": [\"Fields in the metadata account, used for updating.\"],\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"name\",\n                            \"docs\": [\"The name field, corresponding to `TokenMetadata.name`\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"symbol\",\n                            \"docs\": [\"The symbol field, corresponding to `TokenMetadata.symbol`\"]\n                        },\n                        {\n                            \"kind\": \"enumEmptyVariantTypeNode\",\n                            \"name\": \"uri\",\n                            \"docs\": [\"The uri field, corresponding to `TokenMetadata.uri`\"]\n                        },\n                        {\n                            \"kind\": \"enumTupleVariantTypeNode\",\n                            \"name\": \"key\",\n                            \"docs\": [\"A user field, whose key is given by the associated string\"],\n                            \"tuple\": {\n                                \"kind\": \"tupleTypeNode\",\n                                \"items\": [\n                                    {\n                                        \"kind\": \"sizePrefixTypeNode\",\n                                        \"type\": {\n                                            \"kind\": \"stringTypeNode\",\n                                            \"encoding\": \"utf8\"\n                                        },\n                                        \"prefix\": {\n                                            \"kind\": \"numberTypeNode\",\n                                            \"format\": \"u32\",\n                                            \"endian\": \"le\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    ],\n                    \"size\": {\n                        \"kind\": \"numberTypeNode\",\n                        \"format\": \"u8\",\n                        \"endian\": \"le\"\n                    }\n                }\n            }\n        ],\n        \"pdas\": [],\n        \"errors\": [\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"notRentExempt\",\n                \"code\": 0,\n                \"message\": \"Lamport balance below rent-exempt threshold\",\n                \"docs\": [\"NotRentExempt: Lamport balance below rent-exempt threshold\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"insufficientFunds\",\n                \"code\": 1,\n                \"message\": \"Insufficient funds\",\n                \"docs\": [\"InsufficientFunds: Insufficient funds\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidMint\",\n                \"code\": 2,\n                \"message\": \"Invalid Mint\",\n                \"docs\": [\"InvalidMint: Invalid Mint\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"mintMismatch\",\n                \"code\": 3,\n                \"message\": \"Account not associated with this Mint\",\n                \"docs\": [\"MintMismatch: Account not associated with this Mint\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"ownerMismatch\",\n                \"code\": 4,\n                \"message\": \"Owner does not match\",\n                \"docs\": [\"OwnerMismatch: Owner does not match\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"fixedSupply\",\n                \"code\": 5,\n                \"message\": \"Fixed supply\",\n                \"docs\": [\"FixedSupply: Fixed supply\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"alreadyInUse\",\n                \"code\": 6,\n                \"message\": \"Already in use\",\n                \"docs\": [\"AlreadyInUse: Already in use\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidNumberOfProvidedSigners\",\n                \"code\": 7,\n                \"message\": \"Invalid number of provided signers\",\n                \"docs\": [\"InvalidNumberOfProvidedSigners: Invalid number of provided signers\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidNumberOfRequiredSigners\",\n                \"code\": 8,\n                \"message\": \"Invalid number of required signers\",\n                \"docs\": [\"InvalidNumberOfRequiredSigners: Invalid number of required signers\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"uninitializedState\",\n                \"code\": 9,\n                \"message\": \"State is unititialized\",\n                \"docs\": [\"UninitializedState: State is unititialized\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"nativeNotSupported\",\n                \"code\": 10,\n                \"message\": \"Instruction does not support native tokens\",\n                \"docs\": [\"NativeNotSupported: Instruction does not support native tokens\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"nonNativeHasBalance\",\n                \"code\": 11,\n                \"message\": \"Non-native account can only be closed if its balance is zero\",\n                \"docs\": [\"NonNativeHasBalance: Non-native account can only be closed if its balance is zero\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidInstruction\",\n                \"code\": 12,\n                \"message\": \"Invalid instruction\",\n                \"docs\": [\"InvalidInstruction: Invalid instruction\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidState\",\n                \"code\": 13,\n                \"message\": \"State is invalid for requested operation\",\n                \"docs\": [\"InvalidState: State is invalid for requested operation\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"overflow\",\n                \"code\": 14,\n                \"message\": \"Operation overflowed\",\n                \"docs\": [\"Overflow: Operation overflowed\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"authorityTypeNotSupported\",\n                \"code\": 15,\n                \"message\": \"Account does not support specified authority type\",\n                \"docs\": [\"AuthorityTypeNotSupported: Account does not support specified authority type\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"mintCannotFreeze\",\n                \"code\": 16,\n                \"message\": \"This token mint cannot freeze accounts\",\n                \"docs\": [\"MintCannotFreeze: This token mint cannot freeze accounts\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"accountFrozen\",\n                \"code\": 17,\n                \"message\": \"Account is frozen\",\n                \"docs\": [\"AccountFrozen: Account is frozen\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"mintDecimalsMismatch\",\n                \"code\": 18,\n                \"message\": \"The provided decimals value different from the Mint decimals\",\n                \"docs\": [\"MintDecimalsMismatch: The provided decimals value different from the Mint decimals\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"nonNativeNotSupported\",\n                \"code\": 19,\n                \"message\": \"Instruction does not support non-native tokens\",\n                \"docs\": [\"NonNativeNotSupported: Instruction does not support non-native tokens\"]\n            }\n        ]\n    },\n    \"additionalPrograms\": [\n        {\n            \"kind\": \"programNode\",\n            \"name\": \"associatedToken\",\n            \"publicKey\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n            \"version\": \"1.1.1\",\n            \"origin\": \"shank\",\n            \"docs\": [],\n            \"accounts\": [],\n            \"instructions\": [\n                {\n                    \"kind\": \"instructionNode\",\n                    \"accounts\": [\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"payer\",\n                            \"isWritable\": true,\n                            \"isSigner\": true,\n                            \"isOptional\": false,\n                            \"docs\": [\"Funding account (must be a system account).\"],\n                            \"defaultValue\": { \"kind\": \"payerValueNode\" }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"ata\",\n                            \"isWritable\": true,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"Associated token account address to be created.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"associatedToken\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"owner\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"owner\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"tokenProgram\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"tokenProgram\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"mint\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"owner\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"Wallet address for the new associated token account.\"]\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"mint\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"The token mint for the new associated token account.\"]\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"systemProgram\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"System program.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"11111111111111111111111111111111\"\n                            }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"tokenProgram\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"SPL Token program.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n                            }\n                        }\n                    ],\n                    \"arguments\": [\n                        {\n                            \"kind\": \"instructionArgumentNode\",\n                            \"name\": \"discriminator\",\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            },\n                            \"docs\": [],\n                            \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 0 },\n                            \"defaultValueStrategy\": \"omitted\"\n                        }\n                    ],\n                    \"discriminators\": [\n                        {\n                            \"kind\": \"fieldDiscriminatorNode\",\n                            \"name\": \"discriminator\",\n                            \"offset\": 0\n                        }\n                    ],\n                    \"name\": \"createAssociatedToken\",\n                    \"docs\": [\n                        \"Creates an associated token account for the given wallet address and\",\n                        \"token mint Returns an error if the account exists.\"\n                    ],\n                    \"optionalAccountStrategy\": \"programId\"\n                },\n                {\n                    \"kind\": \"instructionNode\",\n                    \"accounts\": [\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"payer\",\n                            \"isWritable\": true,\n                            \"isSigner\": true,\n                            \"isOptional\": false,\n                            \"docs\": [\"Funding account (must be a system account).\"],\n                            \"defaultValue\": { \"kind\": \"payerValueNode\" }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"ata\",\n                            \"isWritable\": true,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"Associated token account address to be created.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"associatedToken\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"owner\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"owner\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"tokenProgram\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"tokenProgram\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"mint\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"owner\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"Wallet address for the new associated token account.\"]\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"mint\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"The token mint for the new associated token account.\"]\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"systemProgram\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"System program.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"11111111111111111111111111111111\"\n                            }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"tokenProgram\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"SPL Token program.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n                            }\n                        }\n                    ],\n                    \"arguments\": [\n                        {\n                            \"kind\": \"instructionArgumentNode\",\n                            \"name\": \"discriminator\",\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            },\n                            \"docs\": [],\n                            \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 1 },\n                            \"defaultValueStrategy\": \"omitted\"\n                        }\n                    ],\n                    \"discriminators\": [\n                        {\n                            \"kind\": \"fieldDiscriminatorNode\",\n                            \"name\": \"discriminator\",\n                            \"offset\": 0\n                        }\n                    ],\n                    \"name\": \"createAssociatedTokenIdempotent\",\n                    \"docs\": [\n                        \"Creates an associated token account for the given wallet address and\",\n                        \"token mint, if it doesn't already exist. Returns an error if the\",\n                        \"account exists, but with a different owner.\"\n                    ],\n                    \"optionalAccountStrategy\": \"programId\"\n                },\n                {\n                    \"kind\": \"instructionNode\",\n                    \"accounts\": [\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"nestedAssociatedAccountAddress\",\n                            \"isWritable\": true,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\n                                \"Nested associated token account, must be owned by `ownerAssociatedAccountAddress`.\"\n                            ],\n                            \"defaultValue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"associatedToken\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"owner\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"ownerAssociatedAccountAddress\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"tokenProgram\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"tokenProgram\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"nestedTokenMintAddress\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"nestedTokenMintAddress\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"Token mint for the nested associated token account.\"]\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"destinationAssociatedAccountAddress\",\n                            \"isWritable\": true,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"Wallet's associated token account.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"associatedToken\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"owner\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"walletAddress\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"tokenProgram\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"tokenProgram\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"nestedTokenMintAddress\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"ownerAssociatedAccountAddress\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"Owner associated token account address, must be owned by `walletAddress`.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"associatedToken\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"owner\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"walletAddress\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"tokenProgram\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"tokenProgram\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"ownerTokenMintAddress\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"ownerTokenMintAddress\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"Token mint for the owner associated token account.\"]\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"walletAddress\",\n                            \"isWritable\": true,\n                            \"isSigner\": true,\n                            \"isOptional\": false,\n                            \"docs\": [\"Wallet address for the owner associated token account.\"]\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"tokenProgram\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"SPL Token program.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n                            }\n                        }\n                    ],\n                    \"arguments\": [\n                        {\n                            \"kind\": \"instructionArgumentNode\",\n                            \"name\": \"discriminator\",\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            },\n                            \"docs\": [],\n                            \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 2 },\n                            \"defaultValueStrategy\": \"omitted\"\n                        }\n                    ],\n                    \"discriminators\": [\n                        {\n                            \"kind\": \"fieldDiscriminatorNode\",\n                            \"name\": \"discriminator\",\n                            \"offset\": 0\n                        }\n                    ],\n                    \"name\": \"recoverNestedAssociatedToken\",\n                    \"docs\": [\n                        \"Transfers from and closes a nested associated token account: an\",\n                        \"associated token account owned by an associated token account.\",\n                        \"\",\n                        \"The tokens are moved from the nested associated token account to the\",\n                        \"wallet's associated token account, and the nested account lamports are\",\n                        \"moved to the wallet.\",\n                        \"\",\n                        \"Note: Nested token accounts are an anti-pattern, and almost always\",\n                        \"created unintentionally, so this instruction should only be used to\",\n                        \"recover from errors.\"\n                    ],\n                    \"optionalAccountStrategy\": \"programId\"\n                }\n            ],\n            \"definedTypes\": [],\n            \"pdas\": [\n                {\n                    \"kind\": \"pdaNode\",\n                    \"name\": \"associatedToken\",\n                    \"docs\": [],\n                    \"seeds\": [\n                        {\n                            \"kind\": \"variablePdaSeedNode\",\n                            \"name\": \"owner\",\n                            \"docs\": [\"The wallet address of the associated token account.\"],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"variablePdaSeedNode\",\n                            \"name\": \"tokenProgram\",\n                            \"docs\": [\"The address of the token program to use.\"],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"variablePdaSeedNode\",\n                            \"name\": \"mint\",\n                            \"docs\": [\"The mint address of the associated token account.\"],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"errors\": [\n                {\n                    \"kind\": \"errorNode\",\n                    \"name\": \"invalidOwner\",\n                    \"code\": 0,\n                    \"message\": \"Associated token account owner does not match address derivation\",\n                    \"docs\": [\"InvalidOwner: Associated token account owner does not match address derivation\"]\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/idls/token-idl.json",
    "content": "{\n    \"kind\": \"rootNode\",\n    \"program\": {\n        \"kind\": \"programNode\",\n        \"pdas\": [],\n        \"accounts\": [\n            {\n                \"kind\": \"accountNode\",\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"mintAuthority\",\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"item\": { \"kind\": \"publicKeyTypeNode\" },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                },\n                                \"fixed\": true\n                            },\n                            \"docs\": [\n                                \"Optional authority used to mint new tokens. The mint authority may only\",\n                                \"be provided during mint creation. If no mint authority is present\",\n                                \"then the mint has a fixed supply and no further tokens may be minted.\"\n                            ]\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"supply\",\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            },\n                            \"docs\": [\"Total supply of tokens.\"]\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"decimals\",\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            },\n                            \"docs\": [\"Number of base 10 digits to the right of the decimal place.\"]\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"isInitialized\",\n                            \"type\": {\n                                \"kind\": \"booleanTypeNode\",\n                                \"size\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            },\n                            \"docs\": [\"Is `true` if this structure has been initialized.\"]\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"freezeAuthority\",\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"item\": { \"kind\": \"publicKeyTypeNode\" },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                },\n                                \"fixed\": true\n                            },\n                            \"docs\": [\"Optional authority to freeze token accounts.\"]\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"sizeDiscriminatorNode\",\n                        \"size\": 82\n                    }\n                ],\n                \"name\": \"mint\",\n                \"docs\": [],\n                \"size\": 82\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"mint\",\n                            \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                            \"docs\": [\"The mint associated with this account.\"]\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"owner\",\n                            \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                            \"docs\": [\"The owner of this account.\"]\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"amount\",\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            },\n                            \"docs\": [\"The amount of tokens this account holds.\"]\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"delegate\",\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"item\": { \"kind\": \"publicKeyTypeNode\" },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                },\n                                \"fixed\": true\n                            },\n                            \"docs\": [\n                                \"If `delegate` is `Some` then `delegated_amount` represents\",\n                                \"the amount authorized by the delegate.\"\n                            ]\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"state\",\n                            \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"accountState\" },\n                            \"docs\": [\"The account's state.\"]\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"isNative\",\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"item\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u64\",\n                                    \"endian\": \"le\"\n                                },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                },\n                                \"fixed\": true\n                            },\n                            \"docs\": [\n                                \"If is_native.is_some, this is a native token, and the value logs the\",\n                                \"rent-exempt reserve. An Account is required to be rent-exempt, so\",\n                                \"the value is used by the Processor to ensure that wrapped SOL\",\n                                \"accounts do not drop below this threshold.\"\n                            ]\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"delegatedAmount\",\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u64\",\n                                \"endian\": \"le\"\n                            },\n                            \"docs\": [\"The amount delegated.\"]\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"closeAuthority\",\n                            \"type\": {\n                                \"kind\": \"optionTypeNode\",\n                                \"item\": { \"kind\": \"publicKeyTypeNode\" },\n                                \"prefix\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u32\",\n                                    \"endian\": \"le\"\n                                },\n                                \"fixed\": true\n                            },\n                            \"docs\": [\"Optional authority to close the account.\"]\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"sizeDiscriminatorNode\",\n                        \"size\": 165\n                    }\n                ],\n                \"name\": \"token\",\n                \"docs\": [],\n                \"size\": 165\n            },\n            {\n                \"kind\": \"accountNode\",\n                \"data\": {\n                    \"kind\": \"structTypeNode\",\n                    \"fields\": [\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"m\",\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            },\n                            \"docs\": [\"Number of signers required.\"]\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"n\",\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            },\n                            \"docs\": [\"Number of valid signers.\"]\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"isInitialized\",\n                            \"type\": {\n                                \"kind\": \"booleanTypeNode\",\n                                \"size\": {\n                                    \"kind\": \"numberTypeNode\",\n                                    \"format\": \"u8\",\n                                    \"endian\": \"le\"\n                                }\n                            },\n                            \"docs\": [\"Is `true` if this structure has been initialized.\"]\n                        },\n                        {\n                            \"kind\": \"structFieldTypeNode\",\n                            \"name\": \"signers\",\n                            \"type\": {\n                                \"kind\": \"arrayTypeNode\",\n                                \"item\": { \"kind\": \"publicKeyTypeNode\" },\n                                \"count\": { \"kind\": \"fixedCountNode\", \"value\": 11 }\n                            },\n                            \"docs\": [\"Signer public keys.\"]\n                        }\n                    ]\n                },\n                \"discriminators\": [\n                    {\n                        \"kind\": \"sizeDiscriminatorNode\",\n                        \"size\": 355\n                    }\n                ],\n                \"name\": \"multisig\",\n                \"docs\": [],\n                \"size\": 355\n            }\n        ],\n        \"instructions\": [\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Token mint account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Rent sysvar.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"SysvarRent111111111111111111111111111111111\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 0 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"decimals\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [\"Number of decimals in token account amounts.\"]\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"mintAuthority\",\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                        \"docs\": [\"Minting authority.\"]\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"freezeAuthority\",\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"item\": { \"kind\": \"publicKeyTypeNode\" },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            },\n                            \"fixed\": false\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"noneValueNode\"\n                        },\n                        \"docs\": [\"Optional authority that can freeze token accounts.\"]\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"initializeMint\",\n                \"docs\": [\n                    \"Initializes a new mint and optionally deposits all the newly minted\",\n                    \"tokens in an account.\",\n                    \"\",\n                    \"The `InitializeMint` instruction requires no signers and MUST be\",\n                    \"included within the same Transaction as the system program's\",\n                    \"`CreateAccount` instruction that creates the account being initialized.\",\n                    \"Otherwise another party can acquire ownership of the uninitialized account.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to initialize.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint this account will be associated with.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The new account's owner/multisignature.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Rent sysvar.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"SysvarRent111111111111111111111111111111111\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 1 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"initializeAccount\",\n                \"docs\": [\n                    \"Initializes a new account to hold tokens. If this account is associated\",\n                    \"with the native mint then the token balance of the initialized account\",\n                    \"will be equal to the amount of SOL in the account. If this account is\",\n                    \"associated with another mint, that mint must be initialized before this\",\n                    \"command can succeed.\",\n                    \"\",\n                    \"The `InitializeAccount` instruction requires no signers and MUST be\",\n                    \"included within the same Transaction as the system program's\",\n                    \"`CreateAccount` instruction that creates the account being initialized.\",\n                    \"Otherwise another party can acquire ownership of the uninitialized account.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"multisig\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The multisignature account to initialize.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Rent sysvar.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"SysvarRent111111111111111111111111111111111\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 2 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"m\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [\"The number of signers (M) required to validate this multisignature account.\"]\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"signers\"\n                        }\n                    }\n                ],\n                \"name\": \"initializeMultisig\",\n                \"docs\": [\n                    \"Initializes a multisignature account with N provided signers.\",\n                    \"\",\n                    \"Multisignature accounts can used in place of any single owner/delegate\",\n                    \"accounts in any token instruction that require an owner/delegate to be\",\n                    \"present. The variant field represents the number of signers (M)\",\n                    \"required to validate this multisignature account.\",\n                    \"\",\n                    \"The `InitializeMultisig` instruction requires no signers and MUST be\",\n                    \"included within the same Transaction as the system program's\",\n                    \"`CreateAccount` instruction that creates the account being initialized.\",\n                    \"Otherwise another party can acquire ownership of the uninitialized account.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"source\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destination\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The destination account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner/delegate or its multisignature account.\"],\n                        \"defaultValue\": { \"kind\": \"identityValueNode\" }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 3 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [\"The amount of tokens to transfer.\"]\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        },\n                        \"isOptional\": true,\n                        \"isSigner\": true\n                    }\n                ],\n                \"name\": \"transfer\",\n                \"docs\": [\n                    \"Transfers tokens from one account to another either directly or via a delegate.\",\n                    \"If this account is associated with the native mint then equal amounts\",\n                    \"of SOL and Tokens will be transferred to the destination account.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"source\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"delegate\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The delegate.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account owner or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 4 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [\"The amount of tokens the delegate is approved for.\"]\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        },\n                        \"isOptional\": true,\n                        \"isSigner\": true\n                    }\n                ],\n                \"name\": \"approve\",\n                \"docs\": [\n                    \"Approves a delegate. A delegate is given the authority over tokens on\",\n                    \"behalf of the source account's owner.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"source\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account owner or its multisignature.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 5 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        },\n                        \"isOptional\": true,\n                        \"isSigner\": true\n                    }\n                ],\n                \"name\": \"revoke\",\n                \"docs\": [\"Revokes the delegate's authority.\"],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owned\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint or account to change the authority of.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\n                            \"The current authority or the multisignature account of the mint or account to update.\"\n                        ]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 6 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"authorityType\",\n                        \"type\": { \"kind\": \"definedTypeLinkNode\", \"name\": \"authorityType\" },\n                        \"docs\": [\"The type of authority to update.\"]\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"newAuthority\",\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"item\": { \"kind\": \"publicKeyTypeNode\" },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            },\n                            \"fixed\": false\n                        },\n                        \"docs\": [\"The new authority\"]\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        },\n                        \"isOptional\": true,\n                        \"isSigner\": true\n                    }\n                ],\n                \"name\": \"setAuthority\",\n                \"docs\": [\"Sets a new authority of a mint or account.\"],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to mint tokens to.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mintAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint's minting authority or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 7 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [\"The amount of new tokens to mint.\"]\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        },\n                        \"isOptional\": true,\n                        \"isSigner\": true\n                    }\n                ],\n                \"name\": \"mintTo\",\n                \"docs\": [\"Mints new tokens to an account. The native mint does not support minting.\"],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to burn from.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The account's owner/delegate or its multisignature account.\"],\n                        \"defaultValue\": { \"kind\": \"identityValueNode\" }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [\"The amount of tokens to burn.\"],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 8 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": []\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        },\n                        \"isOptional\": true,\n                        \"isSigner\": true\n                    }\n                ],\n                \"name\": \"burn\",\n                \"docs\": [\n                    \"Burns tokens by removing them from an account. `Burn` does not support\",\n                    \"accounts associated with the native mint, use `CloseAccount` instead.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to close.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destination\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The destination account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The account's owner or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 9 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        },\n                        \"isOptional\": true,\n                        \"isSigner\": true\n                    }\n                ],\n                \"name\": \"closeAccount\",\n                \"docs\": [\n                    \"Close an account by transferring all its SOL to the destination account.\",\n                    \"Non-native accounts may only be closed if its token amount is zero.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to freeze.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint freeze authority or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 10 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        },\n                        \"isOptional\": true,\n                        \"isSigner\": true\n                    }\n                ],\n                \"name\": \"freezeAccount\",\n                \"docs\": [\"Freeze an Initialized account using the Mint's freeze_authority (if set).\"],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to thaw.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint freeze authority or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 11 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        },\n                        \"isOptional\": true,\n                        \"isSigner\": true\n                    }\n                ],\n                \"name\": \"thawAccount\",\n                \"docs\": [\"Thaw a Frozen account using the Mint's freeze_authority (if set).\"],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"source\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"destination\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The destination account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account's owner/delegate or its multisignature account.\"],\n                        \"defaultValue\": { \"kind\": \"identityValueNode\" }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 12 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [\"The amount of tokens to transfer.\"]\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"decimals\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [\"Expected number of base 10 digits to the right of the decimal place.\"]\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        },\n                        \"isOptional\": true,\n                        \"isSigner\": true\n                    }\n                ],\n                \"name\": \"transferChecked\",\n                \"docs\": [\n                    \"Transfers tokens from one account to another either directly or via a\",\n                    \"delegate. If this account is associated with the native mint then equal\",\n                    \"amounts of SOL and Tokens will be transferred to the destination account.\",\n                    \"\",\n                    \"This instruction differs from Transfer in that the token mint and\",\n                    \"decimals value is checked by the caller. This may be useful when\",\n                    \"creating transactions offline or within a hardware wallet.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"source\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"delegate\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The delegate.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"owner\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The source account owner or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 13 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [\"The amount of tokens the delegate is approved for.\"]\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"decimals\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [\"Expected number of base 10 digits to the right of the decimal place.\"]\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        },\n                        \"isOptional\": true,\n                        \"isSigner\": true\n                    }\n                ],\n                \"name\": \"approveChecked\",\n                \"docs\": [\n                    \"Approves a delegate. A delegate is given the authority over tokens on\",\n                    \"behalf of the source account's owner.\",\n                    \"\",\n                    \"This instruction differs from Approve in that the token mint and\",\n                    \"decimals value is checked by the caller. This may be useful when\",\n                    \"creating transactions offline or within a hardware wallet.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"token\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to mint tokens to.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mintAuthority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint's minting authority or its multisignature account.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 14 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [\"The amount of new tokens to mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"decimals\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [\"Expected number of base 10 digits to the right of the decimal place.\"]\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        },\n                        \"isOptional\": true,\n                        \"isSigner\": true\n                    }\n                ],\n                \"name\": \"mintToChecked\",\n                \"docs\": [\n                    \"Mints new tokens to an account. The native mint does not support minting.\",\n                    \"\",\n                    \"This instruction differs from MintTo in that the decimals value is\",\n                    \"checked by the caller. This may be useful when creating transactions\",\n                    \"offline or within a hardware wallet.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to burn from.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The token mint.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"authority\",\n                        \"isWritable\": false,\n                        \"isSigner\": \"either\",\n                        \"isOptional\": false,\n                        \"docs\": [\"The account's owner/delegate or its multisignature account.\"],\n                        \"defaultValue\": { \"kind\": \"identityValueNode\" }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 15 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [\"The amount of tokens to burn.\"]\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"decimals\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [\"Expected number of base 10 digits to the right of the decimal place.\"]\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"multiSigners\"\n                        },\n                        \"isOptional\": true,\n                        \"isSigner\": true\n                    }\n                ],\n                \"name\": \"burnChecked\",\n                \"docs\": [\n                    \"Burns tokens by removing them from an account. `BurnChecked` does not\",\n                    \"support accounts associated with the native mint, use `CloseAccount` instead.\",\n                    \"\",\n                    \"This instruction differs from Burn in that the decimals value is checked\",\n                    \"by the caller. This may be useful when creating transactions offline or\",\n                    \"within a hardware wallet.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to initialize.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint this account will be associated with.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"rent\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"Rent sysvar.\"],\n                        \"defaultValue\": {\n                            \"kind\": \"publicKeyValueNode\",\n                            \"publicKey\": \"SysvarRent111111111111111111111111111111111\"\n                        }\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 16 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"owner\",\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                        \"docs\": [\"The new account's owner/multisignature.\"]\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"initializeAccount2\",\n                \"docs\": [\n                    \"Like InitializeAccount, but the owner pubkey is passed via instruction\",\n                    \"data rather than the accounts list. This variant may be preferable\",\n                    \"when using Cross Program Invocation from an instruction that does\",\n                    \"not need the owner's `AccountInfo` otherwise.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The native token account to sync with its underlying lamports.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 17 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"syncNative\",\n                \"docs\": [\n                    \"Given a wrapped / native token account (a token account containing SOL)\",\n                    \"updates its amount field based on the account's underlying `lamports`.\",\n                    \"This is useful if a non-wrapped SOL account uses\",\n                    \"`system_instruction::transfer` to move lamports to a wrapped token\",\n                    \"account, and needs to have its token `amount` field updated.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to initialize.\"]\n                    },\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint this account will be associated with.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 18 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"owner\",\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                        \"docs\": [\"The new account's owner/multisignature.\"]\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"initializeAccount3\",\n                \"docs\": [\"Like InitializeAccount2, but does not require the Rent sysvar to be provided.\"],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"multisig\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The multisignature account to initialize.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 19 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"m\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [\"The number of signers (M) required to validate this multisignature account.\"]\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"remainingAccounts\": [\n                    {\n                        \"kind\": \"instructionRemainingAccountsNode\",\n                        \"value\": {\n                            \"kind\": \"argumentValueNode\",\n                            \"name\": \"signers\"\n                        }\n                    }\n                ],\n                \"name\": \"initializeMultisig2\",\n                \"docs\": [\"Like InitializeMultisig, but does not require the Rent sysvar to be provided.\"],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to initialize.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 20 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"decimals\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [\"Number of base 10 digits to the right of the decimal place.\"]\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"mintAuthority\",\n                        \"type\": { \"kind\": \"publicKeyTypeNode\" },\n                        \"docs\": [\"The authority/multisignature to mint tokens.\"]\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"freezeAuthority\",\n                        \"type\": {\n                            \"kind\": \"optionTypeNode\",\n                            \"item\": { \"kind\": \"publicKeyTypeNode\" },\n                            \"prefix\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            },\n                            \"fixed\": false\n                        },\n                        \"defaultValue\": {\n                            \"kind\": \"noneValueNode\"\n                        },\n                        \"docs\": [\"The optional freeze authority/multisignature of the mint.\"]\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"initializeMint2\",\n                \"docs\": [\"Like [`InitializeMint`], but does not require the Rent sysvar to be provided.\"],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to calculate for.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 21 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"getAccountDataSize\",\n                \"docs\": [\n                    \"Gets the required size of an account for the given mint as a\",\n                    \"little-endian `u64`.\",\n                    \"\",\n                    \"Return data can be fetched using `sol_get_return_data` and deserializing\",\n                    \"the return data as a little-endian `u64`.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"account\",\n                        \"isWritable\": true,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The account to initialize.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 22 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"initializeImmutableOwner\",\n                \"docs\": [\n                    \"Initialize the Immutable Owner extension for the given token account\",\n                    \"\",\n                    \"Fails if the account has already been initialized, so must be called\",\n                    \"before `InitializeAccount`.\",\n                    \"\",\n                    \"No-ops in this version of the program, but is included for compatibility\",\n                    \"with the Associated Token Account program.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to calculate for.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 23 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"amount\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u64\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [\"The amount of tokens to reformat.\"]\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"amountToUiAmount\",\n                \"docs\": [\n                    \"Convert an Amount of tokens to a UiAmount `string`, using the given\",\n                    \"mint. In this version of the program, the mint can only specify the\",\n                    \"number of decimals.\",\n                    \"\",\n                    \"Fails on an invalid mint.\",\n                    \"\",\n                    \"Return data can be fetched using `sol_get_return_data` and deserialized\",\n                    \"with `String::from_utf8`.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\"\n            },\n            {\n                \"kind\": \"instructionNode\",\n                \"accounts\": [\n                    {\n                        \"kind\": \"instructionAccountNode\",\n                        \"name\": \"mint\",\n                        \"isWritable\": false,\n                        \"isSigner\": false,\n                        \"isOptional\": false,\n                        \"docs\": [\"The mint to calculate for.\"]\n                    }\n                ],\n                \"arguments\": [\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"discriminator\",\n                        \"type\": {\n                            \"kind\": \"numberTypeNode\",\n                            \"format\": \"u8\",\n                            \"endian\": \"le\"\n                        },\n                        \"docs\": [],\n                        \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 24 },\n                        \"defaultValueStrategy\": \"omitted\"\n                    },\n                    {\n                        \"kind\": \"instructionArgumentNode\",\n                        \"name\": \"uiAmount\",\n                        \"type\": {\n                            \"kind\": \"stringTypeNode\",\n                            \"encoding\": \"utf8\"\n                        },\n                        \"docs\": [\"The ui_amount of tokens to reformat.\"]\n                    }\n                ],\n                \"discriminators\": [\n                    {\n                        \"kind\": \"fieldDiscriminatorNode\",\n                        \"name\": \"discriminator\",\n                        \"offset\": 0\n                    }\n                ],\n                \"name\": \"uiAmountToAmount\",\n                \"docs\": [\n                    \"Convert a UiAmount of tokens to a little-endian `u64` raw Amount, using\",\n                    \"the given mint. In this version of the program, the mint can only\",\n                    \"specify the number of decimals.\",\n                    \"\",\n                    \"Return data can be fetched using `sol_get_return_data` and deserializing\",\n                    \"the return data as a little-endian `u64`.\"\n                ],\n                \"optionalAccountStrategy\": \"programId\"\n            }\n        ],\n        \"definedTypes\": [\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"accountState\",\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        { \"kind\": \"enumEmptyVariantTypeNode\", \"name\": \"uninitialized\" },\n                        { \"kind\": \"enumEmptyVariantTypeNode\", \"name\": \"initialized\" },\n                        { \"kind\": \"enumEmptyVariantTypeNode\", \"name\": \"frozen\" }\n                    ],\n                    \"size\": { \"kind\": \"numberTypeNode\", \"format\": \"u8\", \"endian\": \"le\" }\n                },\n                \"docs\": []\n            },\n            {\n                \"kind\": \"definedTypeNode\",\n                \"name\": \"authorityType\",\n                \"type\": {\n                    \"kind\": \"enumTypeNode\",\n                    \"variants\": [\n                        { \"kind\": \"enumEmptyVariantTypeNode\", \"name\": \"mintTokens\" },\n                        { \"kind\": \"enumEmptyVariantTypeNode\", \"name\": \"freezeAccount\" },\n                        { \"kind\": \"enumEmptyVariantTypeNode\", \"name\": \"accountOwner\" },\n                        { \"kind\": \"enumEmptyVariantTypeNode\", \"name\": \"closeAccount\" }\n                    ],\n                    \"size\": { \"kind\": \"numberTypeNode\", \"format\": \"u8\", \"endian\": \"le\" }\n                },\n                \"docs\": []\n            }\n        ],\n        \"errors\": [\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"notRentExempt\",\n                \"code\": 0,\n                \"message\": \"Lamport balance below rent-exempt threshold\",\n                \"docs\": [\"NotRentExempt: Lamport balance below rent-exempt threshold\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"insufficientFunds\",\n                \"code\": 1,\n                \"message\": \"Insufficient funds\",\n                \"docs\": [\"InsufficientFunds: Insufficient funds\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidMint\",\n                \"code\": 2,\n                \"message\": \"Invalid Mint\",\n                \"docs\": [\"InvalidMint: Invalid Mint\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"mintMismatch\",\n                \"code\": 3,\n                \"message\": \"Account not associated with this Mint\",\n                \"docs\": [\"MintMismatch: Account not associated with this Mint\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"ownerMismatch\",\n                \"code\": 4,\n                \"message\": \"Owner does not match\",\n                \"docs\": [\"OwnerMismatch: Owner does not match\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"fixedSupply\",\n                \"code\": 5,\n                \"message\": \"Fixed supply\",\n                \"docs\": [\"FixedSupply: Fixed supply\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"alreadyInUse\",\n                \"code\": 6,\n                \"message\": \"Already in use\",\n                \"docs\": [\"AlreadyInUse: Already in use\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidNumberOfProvidedSigners\",\n                \"code\": 7,\n                \"message\": \"Invalid number of provided signers\",\n                \"docs\": [\"InvalidNumberOfProvidedSigners: Invalid number of provided signers\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidNumberOfRequiredSigners\",\n                \"code\": 8,\n                \"message\": \"Invalid number of required signers\",\n                \"docs\": [\"InvalidNumberOfRequiredSigners: Invalid number of required signers\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"uninitializedState\",\n                \"code\": 9,\n                \"message\": \"State is unititialized\",\n                \"docs\": [\"UninitializedState: State is unititialized\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"nativeNotSupported\",\n                \"code\": 10,\n                \"message\": \"Instruction does not support native tokens\",\n                \"docs\": [\"NativeNotSupported: Instruction does not support native tokens\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"nonNativeHasBalance\",\n                \"code\": 11,\n                \"message\": \"Non-native account can only be closed if its balance is zero\",\n                \"docs\": [\"NonNativeHasBalance: Non-native account can only be closed if its balance is zero\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidInstruction\",\n                \"code\": 12,\n                \"message\": \"Invalid instruction\",\n                \"docs\": [\"InvalidInstruction: Invalid instruction\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"invalidState\",\n                \"code\": 13,\n                \"message\": \"State is invalid for requested operation\",\n                \"docs\": [\"InvalidState: State is invalid for requested operation\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"overflow\",\n                \"code\": 14,\n                \"message\": \"Operation overflowed\",\n                \"docs\": [\"Overflow: Operation overflowed\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"authorityTypeNotSupported\",\n                \"code\": 15,\n                \"message\": \"Account does not support specified authority type\",\n                \"docs\": [\"AuthorityTypeNotSupported: Account does not support specified authority type\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"mintCannotFreeze\",\n                \"code\": 16,\n                \"message\": \"This token mint cannot freeze accounts\",\n                \"docs\": [\"MintCannotFreeze: This token mint cannot freeze accounts\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"accountFrozen\",\n                \"code\": 17,\n                \"message\": \"Account is frozen\",\n                \"docs\": [\"AccountFrozen: Account is frozen\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"mintDecimalsMismatch\",\n                \"code\": 18,\n                \"message\": \"The provided decimals value different from the Mint decimals\",\n                \"docs\": [\"MintDecimalsMismatch: The provided decimals value different from the Mint decimals\"]\n            },\n            {\n                \"kind\": \"errorNode\",\n                \"name\": \"nonNativeNotSupported\",\n                \"code\": 19,\n                \"message\": \"Instruction does not support non-native tokens\",\n                \"docs\": [\"NonNativeNotSupported: Instruction does not support non-native tokens\"]\n            }\n        ],\n        \"name\": \"token\",\n        \"prefix\": \"\",\n        \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n        \"version\": \"3.3.0\",\n        \"origin\": \"shank\"\n    },\n    \"additionalPrograms\": [\n        {\n            \"kind\": \"programNode\",\n            \"pdas\": [\n                {\n                    \"kind\": \"pdaNode\",\n                    \"name\": \"associatedToken\",\n                    \"seeds\": [\n                        {\n                            \"kind\": \"variablePdaSeedNode\",\n                            \"name\": \"owner\",\n                            \"docs\": [\"The wallet address of the associated token account.\"],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"variablePdaSeedNode\",\n                            \"name\": \"tokenProgram\",\n                            \"docs\": [\"The address of the token program to use.\"],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        },\n                        {\n                            \"kind\": \"variablePdaSeedNode\",\n                            \"name\": \"mint\",\n                            \"docs\": [\"The mint address of the associated token account.\"],\n                            \"type\": {\n                                \"kind\": \"publicKeyTypeNode\"\n                            }\n                        }\n                    ]\n                }\n            ],\n            \"accounts\": [],\n            \"instructions\": [\n                {\n                    \"kind\": \"instructionNode\",\n                    \"accounts\": [\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"payer\",\n                            \"isWritable\": true,\n                            \"isSigner\": true,\n                            \"isOptional\": false,\n                            \"docs\": [\"Funding account (must be a system account).\"],\n                            \"defaultValue\": { \"kind\": \"payerValueNode\" }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"ata\",\n                            \"isWritable\": true,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"Associated token account address to be created.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"associatedToken\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"owner\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"owner\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"tokenProgram\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"tokenProgram\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"mint\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"owner\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"Wallet address for the new associated token account.\"]\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"mint\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"The token mint for the new associated token account.\"]\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"systemProgram\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"System program.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"11111111111111111111111111111111\"\n                            }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"tokenProgram\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"SPL Token program.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"\n                            }\n                        }\n                    ],\n                    \"arguments\": [\n                        {\n                            \"kind\": \"instructionArgumentNode\",\n                            \"name\": \"discriminator\",\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            },\n                            \"docs\": [],\n                            \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 0 },\n                            \"defaultValueStrategy\": \"omitted\"\n                        }\n                    ],\n                    \"discriminators\": [\n                        {\n                            \"kind\": \"fieldDiscriminatorNode\",\n                            \"name\": \"discriminator\",\n                            \"offset\": 0\n                        }\n                    ],\n                    \"name\": \"createAssociatedToken\",\n                    \"docs\": [\n                        \"Creates an associated token account for the given wallet address and\",\n                        \"token mint Returns an error if the account exists.\"\n                    ],\n                    \"optionalAccountStrategy\": \"programId\"\n                },\n                {\n                    \"kind\": \"instructionNode\",\n                    \"accounts\": [\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"payer\",\n                            \"isWritable\": true,\n                            \"isSigner\": true,\n                            \"isOptional\": false,\n                            \"docs\": [\"Funding account (must be a system account).\"],\n                            \"defaultValue\": { \"kind\": \"payerValueNode\" }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"ata\",\n                            \"isWritable\": true,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"Associated token account address to be created.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"associatedToken\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"owner\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"owner\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"tokenProgram\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"tokenProgram\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"mint\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"owner\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"Wallet address for the new associated token account.\"]\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"mint\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"The token mint for the new associated token account.\"]\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"systemProgram\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"System program.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"11111111111111111111111111111111\"\n                            }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"tokenProgram\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"SPL Token program.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"\n                            }\n                        }\n                    ],\n                    \"arguments\": [\n                        {\n                            \"kind\": \"instructionArgumentNode\",\n                            \"name\": \"discriminator\",\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            },\n                            \"docs\": [],\n                            \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 1 },\n                            \"defaultValueStrategy\": \"omitted\"\n                        }\n                    ],\n                    \"discriminators\": [\n                        {\n                            \"kind\": \"fieldDiscriminatorNode\",\n                            \"name\": \"discriminator\",\n                            \"offset\": 0\n                        }\n                    ],\n                    \"name\": \"createAssociatedTokenIdempotent\",\n                    \"docs\": [\n                        \"Creates an associated token account for the given wallet address and\",\n                        \"token mint, if it doesn't already exist. Returns an error if the\",\n                        \"account exists, but with a different owner.\"\n                    ],\n                    \"optionalAccountStrategy\": \"programId\"\n                },\n                {\n                    \"kind\": \"instructionNode\",\n                    \"accounts\": [\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"nestedAssociatedAccountAddress\",\n                            \"isWritable\": true,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\n                                \"Nested associated token account, must be owned by `ownerAssociatedAccountAddress`.\"\n                            ],\n                            \"defaultValue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"associatedToken\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"owner\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"ownerAssociatedAccountAddress\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"tokenProgram\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"tokenProgram\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"nestedTokenMintAddress\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"nestedTokenMintAddress\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"Token mint for the nested associated token account.\"]\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"destinationAssociatedAccountAddress\",\n                            \"isWritable\": true,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"Wallet's associated token account.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"associatedToken\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"owner\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"walletAddress\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"tokenProgram\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"tokenProgram\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"nestedTokenMintAddress\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"ownerAssociatedAccountAddress\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"Owner associated token account address, must be owned by `walletAddress`.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"pdaValueNode\",\n                                \"pda\": {\n                                    \"kind\": \"pdaLinkNode\",\n                                    \"name\": \"associatedToken\"\n                                },\n                                \"seeds\": [\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"owner\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"walletAddress\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"tokenProgram\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"tokenProgram\"\n                                        }\n                                    },\n                                    {\n                                        \"kind\": \"pdaSeedValueNode\",\n                                        \"name\": \"mint\",\n                                        \"value\": {\n                                            \"kind\": \"accountValueNode\",\n                                            \"name\": \"ownerTokenMintAddress\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"ownerTokenMintAddress\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"Token mint for the owner associated token account.\"]\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"walletAddress\",\n                            \"isWritable\": true,\n                            \"isSigner\": true,\n                            \"isOptional\": false,\n                            \"docs\": [\"Wallet address for the owner associated token account.\"]\n                        },\n                        {\n                            \"kind\": \"instructionAccountNode\",\n                            \"name\": \"tokenProgram\",\n                            \"isWritable\": false,\n                            \"isSigner\": false,\n                            \"isOptional\": false,\n                            \"docs\": [\"SPL Token program.\"],\n                            \"defaultValue\": {\n                                \"kind\": \"publicKeyValueNode\",\n                                \"publicKey\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"\n                            }\n                        }\n                    ],\n                    \"arguments\": [\n                        {\n                            \"kind\": \"instructionArgumentNode\",\n                            \"name\": \"discriminator\",\n                            \"type\": {\n                                \"kind\": \"numberTypeNode\",\n                                \"format\": \"u8\",\n                                \"endian\": \"le\"\n                            },\n                            \"docs\": [],\n                            \"defaultValue\": { \"kind\": \"numberValueNode\", \"number\": 2 },\n                            \"defaultValueStrategy\": \"omitted\"\n                        }\n                    ],\n                    \"discriminators\": [\n                        {\n                            \"kind\": \"fieldDiscriminatorNode\",\n                            \"name\": \"discriminator\",\n                            \"offset\": 0\n                        }\n                    ],\n                    \"name\": \"recoverNestedAssociatedToken\",\n                    \"docs\": [\n                        \"Transfers from and closes a nested associated token account: an\",\n                        \"associated token account owned by an associated token account.\",\n                        \"\",\n                        \"The tokens are moved from the nested associated token account to the\",\n                        \"wallet's associated token account, and the nested account lamports are\",\n                        \"moved to the wallet.\",\n                        \"\",\n                        \"Note: Nested token accounts are an anti-pattern, and almost always\",\n                        \"created unintentionally, so this instruction should only be used to\",\n                        \"recover from errors.\"\n                    ],\n                    \"optionalAccountStrategy\": \"programId\"\n                }\n            ],\n            \"definedTypes\": [],\n            \"errors\": [\n                {\n                    \"kind\": \"errorNode\",\n                    \"name\": \"invalidOwner\",\n                    \"code\": 0,\n                    \"message\": \"Associated token account owner does not match address derivation\",\n                    \"docs\": [\"InvalidOwner: Associated token account owner does not match address derivation\"]\n                }\n            ],\n            \"name\": \"associatedToken\",\n            \"prefix\": \"\",\n            \"publicKey\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n            \"version\": \"1.1.1\",\n            \"origin\": \"shank\"\n        }\n    ],\n    \"standard\": \"codama\",\n    \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/mpl-token-metadata/create-with-resolvers.test.ts",
    "content": "import {\n    findMasterEditionPda,\n    findMetadataPda,\n    getMetadataDecoder,\n    TokenStandard,\n} from '@metaplex-foundation/mpl-token-metadata-kit';\nimport { address } from '@solana/addresses';\nimport { some } from '@solana/codecs';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport type { CreateArgs } from '../generated/mpl-token-metadata-idl-types';\nimport { SvmTestContext } from '../test-utils';\nimport { createMint } from '../token/token-test-utils';\nimport { loadMplProgram, programClient } from './helpers';\n\nfunction buildFungibleArgs(): CreateArgs {\n    return {\n        createArgs: {\n            __kind: 'v1',\n            collection: null,\n            collectionDetails: null,\n            creators: null,\n            decimals: null,\n            isMutable: true,\n            name: 'Test NFT',\n            primarySaleHappened: false,\n            printSupply: null,\n            ruleSet: null,\n            sellerFeeBasisPoints: 500,\n            symbol: 'TST',\n            tokenStandard: 'fungible',\n            uri: 'https://example.com/metadata.json',\n            uses: null,\n        },\n    };\n}\n\ndescribe('MPL Token Metadata: create with resolvers', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext({ defaultPrograms: true, sysvars: true });\n        loadMplProgram(ctx, programClient.programAddress);\n    });\n\n    test('should auto-resolve splTokenProgram when resolveIsNonFungibleOrIsMintSigner returns true', async () => {\n        const payer = await ctx.createFundedAccount();\n        const mintAuthority = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        await createMint(ctx, payer, mint, mintAuthority);\n\n        const [metadataPda] = await findMetadataPda({ mint });\n        const [masterEditionPda] = await findMasterEditionPda({ mint });\n\n        const expectedAccounts = [\n            metadataPda,\n            masterEditionPda,\n            mint,\n            mintAuthority,\n            payer,\n            mintAuthority,\n            ctx.SYSTEM_PROGRAM_ADDRESS,\n            ctx.SYSVAR_INSTRUCTIONS_ADDRESS,\n            address('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'), // from ifTrue branch\n        ];\n\n        const ix = await programClient.methods\n            .create(buildFungibleArgs())\n            .accounts({\n                authority: mintAuthority,\n                masterEdition: masterEditionPda,\n                mint,\n                payer,\n                // splTokenProgram omitted — should be auto-resolved via defaultValue resolver\n            })\n            .signers(['mint'])\n            .resolvers({\n                // conditionalValueNode -> resolveIsNonFungibleOrIsMintSigner -> ifTrue branch -> publicKeyValueNode\n                resolveIsNonFungibleOrIsMintSigner: async () => await Promise.resolve(true),\n            })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(9);\n        expectedAccounts.forEach((expected, i) => {\n            expect(expected, `Account mismatch at index ${i}`).toBe(ix.accounts?.[i].address);\n        });\n\n        await ctx.sendInstruction(ix, [payer, mintAuthority, mint]);\n\n        const metadataAccountInfo = ctx.requireEncodedAccount(metadataPda);\n        const metadata = getMetadataDecoder().decode(metadataAccountInfo.data);\n        expect(metadata.tokenStandard).toEqual(some(TokenStandard.Fungible));\n    });\n\n    test('should resolve splTokenProgram to programId when resolver returns false (optionalAccountStrategy=programId)', async () => {\n        const payer = await ctx.createFundedAccount();\n        const mintAuthority = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        await createMint(ctx, payer, mint, mintAuthority);\n\n        const [masterEditionPda] = await findMasterEditionPda({ mint });\n\n        const ix = await programClient.methods\n            .create(buildFungibleArgs())\n            .accounts({\n                authority: mintAuthority,\n                masterEdition: masterEditionPda,\n                mint,\n                payer,\n            })\n            .signers(['mint'])\n            .resolvers({\n                resolveIsNonFungibleOrIsMintSigner: async () => await Promise.resolve(false),\n            })\n            .instruction();\n\n        // resolver returns false -> ifFalse is undefined -> conditional returns null\n        // optional optionalAccountStrategy=programId resolves to program ID\n        expect(ix.accounts?.length).toBe(9);\n        expect(ix.accounts?.[ix.accounts.length - 1].address).toBe(programClient.programAddress);\n\n        await ctx.sendInstruction(ix, [payer, mintAuthority, mint]);\n        const [metadataPda] = await findMetadataPda({ mint });\n        const metadataAccountInfo = ctx.requireEncodedAccount(metadataPda);\n        const metadata = getMetadataDecoder().decode(metadataAccountInfo.data);\n        expect(metadata.tokenStandard).toEqual(some(TokenStandard.Fungible));\n    });\n\n    test('should use user-provided account and bypass resolver', async () => {\n        const payer = await ctx.createFundedAccount();\n        const splTokenProgramMock = await ctx.createAccount();\n        const mintAuthority = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        await createMint(ctx, payer, mint, mintAuthority);\n\n        const [masterEditionPda] = await findMasterEditionPda({ mint });\n\n        const ix = await programClient.methods\n            .create(buildFungibleArgs())\n            .accounts({\n                authority: mintAuthority,\n                masterEdition: masterEditionPda,\n                mint,\n                payer,\n                splTokenProgram: splTokenProgramMock,\n            })\n            .signers(['mint'])\n            .resolvers({\n                // This resolver should not be called since splTokenProgram is explicitly provided\n                resolveIsNonFungibleOrIsMintSigner: async () => {\n                    return await Promise.reject(\n                        new Error('Resolver should not be called for explicitly provided account'),\n                    );\n                },\n            })\n            .instruction();\n\n        expect(ix.accounts?.[ix.accounts.length - 1].address).toBe(splTokenProgramMock);\n\n        await ctx.sendInstruction(ix, [payer, mintAuthority, mint]);\n        const [metadataPda] = await findMetadataPda({ mint });\n        const metadataAccountInfo = ctx.requireEncodedAccount(metadataPda);\n        const metadata = getMetadataDecoder().decode(metadataAccountInfo.data);\n        expect(metadata.tokenStandard).toEqual(some(TokenStandard.Fungible));\n    });\n\n    test('should work without calling .resolvers()', async () => {\n        const payer = await ctx.createFundedAccount();\n        const mintAuthority = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        await createMint(ctx, payer, mint, mintAuthority);\n\n        const [masterEditionPda] = await findMasterEditionPda({ mint });\n\n        const ix = await programClient.methods\n            .create(buildFungibleArgs())\n            .accounts({\n                authority: mintAuthority,\n                masterEdition: masterEditionPda,\n                mint,\n                payer,\n                splTokenProgram: null, // auto resolution via optionalAccountStrategy into programId\n            })\n            .signers(['mint'])\n            .instruction();\n\n        expect(ix.programAddress).toBe(programClient.programAddress);\n        expect(ix.accounts?.length).toBe(9);\n        expect(ix.accounts?.[ix.accounts.length - 1].address).toBe(programClient.programAddress);\n\n        await ctx.sendInstruction(ix, [payer, mintAuthority, mint]);\n        const [metadataPda] = await findMetadataPda({ mint });\n        const metadataAccountInfo = ctx.requireEncodedAccount(metadataPda);\n        const metadata = getMetadataDecoder().decode(metadataAccountInfo.data);\n        expect(metadata.tokenStandard).toEqual(some(TokenStandard.Fungible));\n    });\n\n    test('should fallback to optionalAccountStrategy when no resolver and no account provided', async () => {\n        const payer = await ctx.createFundedAccount();\n        const mintAuthority = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        await createMint(ctx, payer, mint, mintAuthority);\n\n        const [masterEditionPda] = await findMasterEditionPda({ mint });\n\n        // undefined splTokenProgram triggers defaultValue auto-resolution.\n        // defaultValue is conditionalValueNode with undefined ifFalse branch\n        // Without resolvers provided, condition should choose ifFalse branch\n        // Optional account should be resolved into programId via optionalAccountStrategy\n        const ix = await programClient.methods\n            .create(buildFungibleArgs())\n            .accounts({\n                authority: mintAuthority,\n                masterEdition: masterEditionPda,\n                mint,\n                payer,\n            })\n            .signers(['mint'])\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(9);\n        expect(ix.accounts?.[ix.accounts.length - 1].address).toBe(programClient.programAddress);\n\n        await ctx.sendInstruction(ix, [payer, mintAuthority, mint]);\n        const [metadataPda] = await findMetadataPda({ mint });\n        const metadataAccountInfo = ctx.requireEncodedAccount(metadataPda);\n        const metadata = getMetadataDecoder().decode(metadataAccountInfo.data);\n        expect(metadata.tokenStandard).toEqual(some(TokenStandard.Fungible));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/mpl-token-metadata/create.test.ts",
    "content": "import {\n    findMasterEditionPda,\n    findMetadataPda,\n    getMetadataDecoder,\n    TokenStandard,\n} from '@metaplex-foundation/mpl-token-metadata-kit';\nimport { none, some } from '@solana/codecs';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport type { CreateArgs } from '../generated/mpl-token-metadata-idl-types';\nimport { SvmTestContext } from '../test-utils';\nimport { createMint } from '../token/token-test-utils';\nimport { loadMplProgram, programClient } from './helpers';\n\ndescribe('MPL Token Metadata: create', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext({ defaultPrograms: true, sysvars: true });\n        loadMplProgram(ctx, programClient.programAddress);\n    });\n\n    test('should construct a valid create instruction', async () => {\n        const payer = await ctx.createFundedAccount();\n        const mintAuthority = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        await createMint(ctx, payer, mint, mintAuthority);\n\n        const [metadataPda] = await findMetadataPda({ mint });\n        const [masterEditionPda] = await findMasterEditionPda({ mint });\n\n        const expectedAccounts = [\n            metadataPda,\n            masterEditionPda,\n            mint,\n            mintAuthority,\n            payer,\n            mintAuthority,\n            ctx.SYSTEM_PROGRAM_ADDRESS,\n            ctx.SYSVAR_INSTRUCTIONS_ADDRESS,\n            programClient.programAddress,\n        ];\n\n        const args: CreateArgs = {\n            createArgs: {\n                __kind: 'v1',\n                collection: null,\n                collectionDetails: null,\n                creators: null,\n                decimals: null,\n                isMutable: true,\n                name: 'Test NFT',\n                primarySaleHappened: false,\n                printSupply: null,\n                ruleSet: null,\n                sellerFeeBasisPoints: 500,\n                symbol: 'TST',\n                tokenStandard: 'fungible',\n                uri: 'https://example.com/metadata.json',\n                uses: null,\n            },\n        };\n        const ix = await programClient.methods\n            .create(args)\n            .accounts({\n                authority: mintAuthority,\n                masterEdition: masterEditionPda,\n                mint,\n                payer,\n                splTokenProgram: null, // auto-derived via optionalAccountStrategy into programClient.programAddress\n                // metadata: metadataPda, // auto-derived pda, can be omitted\n                // updateAuthority: mintAuthority, // auto-derived into \"authority\" , can be omitted\n            })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(9);\n        expectedAccounts.forEach((expected, i) => {\n            expect(expected, `Account mismatch at index ${i}`).toBe(ix.accounts?.[i].address);\n        });\n\n        await ctx.sendInstruction(ix, [payer, mintAuthority]);\n\n        const metadataAccountInfo = ctx.requireEncodedAccount(metadataPda);\n        const metadata = getMetadataDecoder().decode(metadataAccountInfo.data);\n\n        expect(metadata.name).toBe(args.createArgs.name);\n        expect(metadata.symbol).toBe(args.createArgs.symbol);\n        expect(metadata.uri).toBe(args.createArgs.uri);\n        expect(metadata.sellerFeeBasisPoints).toBe(args.createArgs.sellerFeeBasisPoints);\n        expect(metadata.primarySaleHappened).toBe(args.createArgs.primarySaleHappened);\n        expect(metadata.isMutable).toBe(args.createArgs.isMutable);\n        expect(metadata.tokenStandard).toEqual(some(TokenStandard.Fungible));\n        expect(metadata.collection).toEqual(none());\n        expect(metadata.collectionDetails).toEqual(none());\n        expect(metadata.creators).toEqual(none());\n        expect(metadata.uses).toEqual(none());\n    });\n\n    test('should throw ValidationError for invalid sellerFeeBasisPoints [amountValueNode]', async () => {\n        const payer = await ctx.createFundedAccount();\n        const mintAuthority = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        await createMint(ctx, payer, mint, mintAuthority);\n        const [masterEditionPda] = await findMasterEditionPda({ mint });\n\n        const args: CreateArgs = {\n            createArgs: {\n                __kind: 'v1',\n                collection: null,\n                collectionDetails: null,\n                creators: null,\n                decimals: null,\n                isMutable: true,\n                name: 'Test NFT',\n                primarySaleHappened: false,\n                printSupply: null,\n                ruleSet: null,\n                sellerFeeBasisPoints: 'not a number' as unknown as number, // invalid value for amountValueNode\n                symbol: 'TST',\n                tokenStandard: 'fungible',\n                uri: 'https://example.com/metadata.json',\n                uses: null,\n            },\n        };\n\n        await expect(\n            programClient.methods\n                .create(args)\n                .accounts({\n                    authority: mintAuthority,\n                    masterEdition: masterEditionPda,\n                    mint,\n                    payer,\n                    splTokenProgram: null,\n                })\n                .instruction(),\n        ).rejects.toThrowError(/Invalid argument \"createArgs\"/);\n    });\n\n    test('should construct a create instruction with mint as signer and provided TokenProgram', async () => {\n        const payer = await ctx.createFundedAccount();\n        const mintAuthority = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        await createMint(ctx, payer, mint, mintAuthority);\n\n        const [metadataPda] = await findMetadataPda({ mint });\n        const [masterEditionPda] = await findMasterEditionPda({ mint });\n\n        const expectedAccounts = [\n            metadataPda,\n            masterEditionPda,\n            mint,\n            mintAuthority,\n            payer,\n            mintAuthority,\n            ctx.SYSTEM_PROGRAM_ADDRESS,\n            ctx.SYSVAR_INSTRUCTIONS_ADDRESS,\n            ctx.TOKEN_PROGRAM_ADDRESS,\n        ];\n\n        const args: CreateArgs = {\n            createArgs: {\n                __kind: 'v1',\n                collection: null,\n                collectionDetails: null,\n                creators: null,\n                decimals: null,\n                isMutable: true,\n                name: 'Test NFT',\n                primarySaleHappened: false,\n                printSupply: null,\n                ruleSet: null,\n                sellerFeeBasisPoints: 500n,\n                symbol: 'TST',\n                tokenStandard: 'fungible',\n                uri: 'https://example.com/metadata.json',\n                uses: null,\n            },\n        };\n\n        const ix = await programClient.methods\n            .create(args)\n            .accounts({\n                authority: mintAuthority,\n                masterEdition: masterEditionPda,\n                mint,\n                payer,\n                splTokenProgram: ctx.TOKEN_PROGRAM_ADDRESS, // explicitly provide to skip auto-derivation with ResolverValueNode which is not supported yet\n            })\n            .signers(['mint'])\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(9);\n        expectedAccounts.forEach((expected, i) => {\n            expect(expected, `Account mismatch at index ${i}`).toBe(ix.accounts?.[i].address);\n        });\n\n        await ctx.sendInstruction(ix, [payer, mintAuthority, mint]);\n\n        const metadataAccountInfo = ctx.requireEncodedAccount(metadataPda);\n        const metadata = getMetadataDecoder().decode(metadataAccountInfo.data);\n\n        expect(metadata.name).toBe(args.createArgs.name);\n        expect(metadata.symbol).toBe(args.createArgs.symbol);\n        expect(metadata.uri).toBe(args.createArgs.uri);\n        expect(metadata.sellerFeeBasisPoints).toBe(Number(args.createArgs.sellerFeeBasisPoints));\n        expect(metadata.primarySaleHappened).toBe(args.createArgs.primarySaleHappened);\n        expect(metadata.isMutable).toBe(args.createArgs.isMutable);\n        expect(metadata.tokenStandard).toEqual(some(TokenStandard.Fungible));\n        expect(metadata.collection).toEqual(none());\n        expect(metadata.collectionDetails).toEqual(none());\n        expect(metadata.creators).toEqual(none());\n        expect(metadata.uses).toEqual(none());\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/mpl-token-metadata/helpers.ts",
    "content": "import path from 'node:path';\n\nimport { type Address } from '@solana/addresses';\n\nimport type { MplTokenMetadataProgramClient } from '../generated/mpl-token-metadata-idl-types';\nimport { createTestProgramClient, SvmTestContext } from '../test-utils';\n\nexport const programClient = createTestProgramClient<MplTokenMetadataProgramClient>('mpl-token-metadata-idl.json');\n\n/**\n * Loads compiled MPL program binary located at '../dumps/mpl-token-metadata.so' into the test context at the specified program address.\n */\nexport function loadMplProgram(ctx: SvmTestContext, programAddress: Address): void {\n    const programPath = path.resolve(__dirname, '..', 'dumps', 'mpl-token-metadata.so');\n    ctx.loadProgram(programAddress, programPath);\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/pmp/allocate.test.ts",
    "content": "import { type Address } from '@solana/addresses';\nimport type { Some } from '@solana/codecs';\nimport { AccountDiscriminator } from '@solana-program/program-metadata';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { decodeBufferAccount, loadPmpProgram, programClient, setupCanonicalPda, setupNonCanonicalPda } from './helpers';\n\ndescribe('Program Metadata: allocate', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n        loadPmpProgram(ctx, programClient.programAddress);\n    });\n\n    test('should allocate with seed null', async () => {\n        const bufferAndAuthority = await ctx.createFundedAccount();\n\n        const ix = await programClient.methods\n            .allocate({ seed: null })\n            .accounts({\n                authority: bufferAndAuthority,\n                buffer: bufferAndAuthority,\n                program: null,\n                programData: null,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(ix, [bufferAndAuthority]);\n\n        const account = ctx.requireEncodedAccount(bufferAndAuthority);\n\n        const buffer = decodeBufferAccount(account.data);\n        expect(buffer.discriminator).toBe(AccountDiscriminator.Buffer);\n        expect(buffer.canonical).toBe(false);\n        expect(buffer.program).toEqual({ __option: 'None' });\n        expect((buffer.authority as Some<Address>).value).toBe(bufferAndAuthority);\n    });\n\n    test('should allocate canonical PDA buffer', async () => {\n        const seed = 'idl';\n        const { authority, programAddress, programDataAddress, pda: bufferPda } = await setupCanonicalPda(ctx, seed);\n\n        const ix = await programClient.methods\n            .allocate({ seed })\n            .accounts({\n                authority,\n                buffer: bufferPda,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(ix, [authority]);\n\n        const account = ctx.requireEncodedAccount(bufferPda);\n        expect(account.owner).toBe(programClient.programAddress);\n        expect(account.data.length).gt(0);\n\n        const buffer = decodeBufferAccount(account.data);\n        expect(buffer.discriminator).toBe(AccountDiscriminator.Buffer);\n        expect(buffer.canonical).toBe(true);\n        expect(buffer.program).toEqual({ __option: 'Some', value: programAddress });\n        expect(buffer.authority).toEqual({ __option: 'Some', value: authority });\n        expect(buffer.seed).toBe(seed);\n    });\n\n    test('should allocate non-canonical PDA buffer', async () => {\n        const seed = 'idl';\n        const { authority, programAddress, programDataAddress, pda: bufferPda } = await setupNonCanonicalPda(ctx, seed);\n\n        const ix = await programClient.methods\n            .allocate({ seed })\n            .accounts({\n                authority,\n                buffer: bufferPda,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(ix, [authority]);\n\n        const account = ctx.requireEncodedAccount(bufferPda);\n        expect(account.owner).toBe(programClient.programAddress);\n        expect(account.data.length).gt(0);\n\n        const buffer = decodeBufferAccount(account.data);\n        expect(buffer.discriminator).toBe(AccountDiscriminator.Buffer);\n        expect(buffer.canonical).toBe(false);\n        expect(buffer.program).toEqual({ __option: 'Some', value: programAddress });\n        expect(buffer.authority).toEqual({ __option: 'Some', value: authority });\n        expect(buffer.seed).toBe(seed);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/pmp/close.test.ts",
    "content": "import { type Address } from '@solana/addresses';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport {\n    allocateBufferAccount,\n    decodeBufferAccount,\n    initializeCanonicalMetadata,\n    loadPmpProgram,\n    programClient,\n    setupCanonicalPda,\n} from './helpers';\n\ndescribe('Program Metadata: close', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n        loadPmpProgram(ctx, programClient.programAddress);\n    });\n\n    test('should close canonical PDA buffer', async () => {\n        const destination = await ctx.createFundedAccount();\n        const { authority, programAddress, programDataAddress, pda: bufferPda } = await setupCanonicalPda(ctx);\n\n        const allocateIx = await programClient.methods\n            .allocate({ seed: 'idl' })\n            .accounts({\n                authority,\n                buffer: bufferPda,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(allocateIx, [authority]);\n\n        const bufferAccount = ctx.requireEncodedAccount(bufferPda);\n        expect(bufferAccount).not.toBeNull();\n\n        const destinationBalanceBefore = ctx.getBalanceOrZero(destination);\n\n        const closeIx = await programClient.methods\n            .close()\n            .accounts({\n                account: bufferPda,\n                authority,\n                destination,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(closeIx, [authority]);\n\n        const closedAccount = ctx.fetchEncodedAccount(bufferPda);\n        expect(closedAccount).toBeNull();\n\n        const destinationBalanceAfter = ctx.getBalanceOrZero(destination);\n        expect(destinationBalanceAfter).toBeGreaterThan(destinationBalanceBefore);\n    });\n\n    test('should close mutable metadata', async () => {\n        const destination = await ctx.createFundedAccount();\n        const {\n            authority,\n            programAddress,\n            programDataAddress,\n            pda: metadataPda,\n        } = await initializeCanonicalMetadata(ctx);\n\n        const destinationBalanceBefore = ctx.getBalanceOrZero(destination);\n\n        const closeIx = await programClient.methods\n            .close()\n            .accounts({\n                account: metadataPda,\n                authority,\n                destination,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(closeIx, [authority]);\n\n        const closedAccount = ctx.fetchEncodedAccount(metadataPda);\n        expect(closedAccount).toBeNull();\n\n        const destinationBalanceAfter = ctx.getBalanceOrZero(destination);\n        expect(destinationBalanceAfter).toBeGreaterThan(destinationBalanceBefore);\n    });\n\n    test('should close buffer account', async () => {\n        const feePayer = await ctx.createFundedAccount();\n        const destination = await ctx.createFundedAccount();\n        const { bufferAccount } = await allocateBufferAccount(ctx);\n\n        const buffer = ctx.requireEncodedAccount(bufferAccount);\n        const decoded = decodeBufferAccount(buffer.data);\n        expect(decoded.canonical).toBe(false);\n\n        const destinationBalanceBefore = ctx.getBalanceOrZero(destination);\n\n        const closeIx = await programClient.methods\n            .close()\n            .accounts({\n                account: bufferAccount,\n                authority: bufferAccount,\n                destination,\n                program: null,\n                programData: null,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(closeIx, [feePayer, bufferAccount]);\n\n        const destinationBalanceAfter = ctx.getBalanceOrZero(destination);\n        expect(destinationBalanceAfter).toBeGreaterThan(destinationBalanceBefore);\n\n        const closedAccount = ctx.fetchEncodedAccount(bufferAccount);\n        expect(closedAccount).toBeNull();\n    });\n\n    test('should throw AccountError when destination is missing', async () => {\n        const authority = await ctx.createFundedAccount();\n\n        await expect(\n            programClient.methods\n                .close()\n                .accounts({\n                    account: authority,\n                    authority,\n                    destination: undefined as unknown as Address,\n                    program: null,\n                    programData: null,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[destination\\]/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/pmp/extend.test.ts",
    "content": "import { type Address } from '@solana/addresses';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport {\n    allocateBufferAccount,\n    decodeMetadataAccount,\n    initializeCanonicalMetadata,\n    loadPmpProgram,\n    programClient,\n} from './helpers';\n\ndescribe('Program Metadata: extend', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n        loadPmpProgram(ctx, programClient.programAddress);\n    });\n\n    test('should extend buffer capacity', async () => {\n        const feePayer = await ctx.createFundedAccount();\n        const { bufferAccount } = await allocateBufferAccount(ctx);\n\n        const accountBefore = ctx.requireEncodedAccount(bufferAccount);\n        const sizeBefore = accountBefore.data.length;\n\n        const extendLength = 500;\n        const extendIx = await programClient.methods\n            .extend({ length: extendLength })\n            .accounts({\n                account: bufferAccount,\n                authority: bufferAccount,\n                program: null,\n                programData: null,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(extendIx, [feePayer, bufferAccount]);\n\n        const accountAfter = ctx.requireEncodedAccount(bufferAccount);\n        expect(accountAfter.data.length).toBe(sizeBefore + extendLength);\n    });\n\n    test('should extend canonical metadata capacity', async () => {\n        const {\n            authority,\n            programAddress,\n            programDataAddress,\n            pda: metadataPda,\n        } = await initializeCanonicalMetadata(ctx);\n\n        const accountBefore = ctx.requireEncodedAccount(metadataPda);\n        const sizeBefore = accountBefore.data.length;\n\n        const extendLength = 500;\n        const extendIx = await programClient.methods\n            .extend({ length: extendLength })\n            .accounts({\n                account: metadataPda,\n                authority,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(extendIx, [authority]);\n\n        const accountAfter = ctx.requireEncodedAccount(metadataPda);\n        expect(accountAfter.data.length).toBe(sizeBefore + extendLength);\n\n        const metadata = decodeMetadataAccount(accountAfter.data);\n        expect(metadata.canonical).toBe(true);\n    });\n\n    test('should throw ArgumentError when length argument is missing', async () => {\n        const authority = await ctx.createFundedAccount();\n\n        await expect(\n            programClient.methods\n                .extend({ length: undefined as unknown as number })\n                .accounts({\n                    account: authority,\n                    authority,\n                    program: null,\n                    programData: null,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Invalid argument \"length\"/);\n    });\n\n    test('should throw AccountError when required account is missing', async () => {\n        await expect(\n            programClient.methods\n                .extend({ length: 100 })\n                .accounts({\n                    account: undefined as unknown as Address,\n                    authority: undefined as unknown as Address,\n                    program: null,\n                    programData: null,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[account\\]/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/pmp/helpers.ts",
    "content": "import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { type Address, getAddressEncoder, getProgramDerivedAddress } from '@solana/addresses';\nimport { getOptionEncoder, getStructEncoder, getU32Encoder, getU64Encoder, none, some } from '@solana/codecs';\nimport {\n    type Buffer as PmpBuffer,\n    getBufferDecoder,\n    getMetadataDecoder,\n    type Metadata as PmpMetadata,\n} from '@solana-program/program-metadata';\n\nimport type { SvmTestContext } from '../../svm-test-context';\nimport type { ProgramMetadataProgramClient } from '../generated/pmp-idl-types';\nimport { createTestProgramClient } from '../test-utils';\n\nexport const programClient = createTestProgramClient<ProgramMetadataProgramClient>('pmp-idl.json');\nexport const PMP_PROGRAM_ID = programClient.programAddress;\nexport const exampleProgramPath = path.join(__dirname, '../dumps/pmp.so');\n\n/**\n * Creates a 16-byte seed buffer from a string for PDA derivation.\n *\n * PMP seeds are fixed-size 16-byte UTF-8 strings. If the input string is shorter\n * than 16 bytes, then we want to pad it with zeros. If longer, it's truncated.\n *\n * @param seed - The seed string (max 16 bytes UTF-8)\n * @returns A 16-byte Uint8Array\n */\nexport function encodeSeedForPda(seed: string): Uint8Array {\n    const seedBytes = new TextEncoder().encode(seed);\n    const buffer = new Uint8Array(16);\n    buffer.set(seedBytes.slice(0, 16)); // Copy up to 16 bytes\n    return buffer;\n}\n\nexport function decodeBufferAccount(data: Uint8Array): PmpBuffer {\n    const decoder = getBufferDecoder();\n    return decoder.decode(data);\n}\n\nexport function decodeMetadataAccount(data: Uint8Array): PmpMetadata {\n    const decoder = getMetadataDecoder();\n    return decoder.decode(data);\n}\n\n/**\n * Loads compiled PMP program binary located at '../dumps/pmp.so' into the test context at the specified program address.\n */\nexport function loadPmpProgram(ctx: SvmTestContext, programAddress: Address): void {\n    const programPath = path.resolve(__dirname, '..', 'dumps', 'pmp.so');\n    ctx.loadProgram(programAddress, programPath);\n}\n\n/** Helper for creating canonical Metadata. */\nexport async function initializeCanonicalMetadata(ctx: SvmTestContext, options?: { data?: Uint8Array; seed?: string }) {\n    const seed = options?.seed ?? 'idl';\n    const data = options?.data ?? new TextEncoder().encode('{\"name\":\"test\"}');\n    const result = await setupCanonicalPda(ctx, seed);\n\n    const initIx = await programClient.methods\n        .initialize({\n            compression: 'none',\n            data,\n            dataSource: 'direct',\n            encoding: 'utf8',\n            format: 'json',\n            seed,\n        })\n        .accounts({\n            authority: result.authority,\n            program: result.programAddress,\n            programData: result.programDataAddress,\n        })\n        .instruction();\n    await ctx.sendInstruction(initIx, [result.authority]);\n\n    return result;\n}\n\n/** Helper for creating non-canonical Metadata. */\nexport async function initializeNonCanonicalMetadata(\n    ctx: SvmTestContext,\n    options?: { data?: Uint8Array; seed?: string },\n) {\n    const seed = options?.seed ?? 'idl';\n    const data = options?.data ?? new TextEncoder().encode('non-canonical data');\n    const result = await setupNonCanonicalPda(ctx, seed);\n\n    const initIx = await programClient.methods\n        .initialize({\n            compression: 'none',\n            data,\n            dataSource: 'direct',\n            encoding: 'utf8',\n            format: 'json',\n            seed,\n        })\n        .accounts({\n            authority: result.authority,\n            program: result.programAddress,\n            programData: null,\n        })\n        .instruction();\n    await ctx.sendInstruction(initIx, [result.authority]);\n\n    return result;\n}\n\n/**\n * Helper to create common required accounts for canonical PMP use cases.\n * - Creates Upgradable Program Accounts for LiteSVM.\n * - Creates a canonical PDA (program upgradeAuthority), i.e [programAddress, seed].\n */\nexport async function setupCanonicalPda(ctx: SvmTestContext, seed = 'idl') {\n    const authority = await ctx.createFundedAccount();\n    const testProgramAddress = await ctx.createAccount();\n\n    const { programAddress, programDataAddress } = await setUpgradeableProgramAccounts(\n        ctx,\n        exampleProgramPath,\n        testProgramAddress,\n        authority,\n    );\n\n    const pda = await deriveCanonicalPda(programAddress, seed);\n    ctx.airdropToAddress(pda, BigInt(10_000_000_000));\n\n    return { authority, pda, programAddress, programDataAddress };\n}\n\n/**\n * Helper to create common required accounts for non-canonical PMP use cases.\n * - Creates Upgradable Program Accounts for LiteSVM.\n * - Creates a non-canonical PDA (arbitrary authority), i.e [programAddress, authority, seed].\n */\nexport async function setupNonCanonicalPda(ctx: SvmTestContext, seed = 'idl') {\n    const authority = await ctx.createFundedAccount();\n    const programDataAuthority = await ctx.createFundedAccount();\n    const testProgramAddress = await ctx.createAccount();\n\n    const { programAddress, programDataAddress } = await setUpgradeableProgramAccounts(\n        ctx,\n        exampleProgramPath,\n        testProgramAddress,\n        programDataAuthority,\n    );\n\n    const pda = await deriveNonCanonicalPda(programAddress, authority, seed);\n    ctx.airdropToAddress(pda, BigInt(10_000_000_000));\n\n    return { authority, pda, programAddress, programDataAddress, programDataAuthority };\n}\n\n/**\n * Manually creates BPF Loader Upgradeable accounts for a program in LiteSVM.\n * since LiteSVM's loadProgram() doesn't create ProgramData accounts\n *\n * This allows testing canonical vs non-canonical scenarios:\n * - Canonical: authority matches ProgramData.upgrade_authority\n * - Non-canonical: authority does NOT match ProgramData.upgrade_authority\n *\n * How it works:\n * - Derives the ProgramData address (PDA with seeds: [program_address])\n * - Reads the program bytecode from file\n * - Creates ProgramData account with custom authority + bytecode\n * - Creates Program account pointing to ProgramData\n * - Both accounts are owned by BPF Loader Upgradeable\n *\n * @param ctx - Test context\n * @param programBinaryPath - Path to program .so file\n * @param programAddress - Address of the program\n * @param upgradeAuthority - Authority to set in ProgramData account\n * @returns { programAddress, programDataAddress }\n */\nexport async function setUpgradeableProgramAccounts(\n    ctx: SvmTestContext,\n    programBinaryPath: string,\n    programAddress: Address,\n    upgradeAuthority: Address,\n): Promise<{ programAddress: Address; programDataAddress: Address }> {\n    const addressEncoder = getAddressEncoder();\n    const [programDataAddress] = await getProgramDerivedAddress({\n        programAddress: ctx.BPF_LOADER_UPGRADEABLE,\n        seeds: [addressEncoder.encode(programAddress)],\n    });\n\n    const programDataAccountBytes = encodeProgramDataAccount(upgradeAuthority);\n    const programBytes = fs.readFileSync(programBinaryPath);\n    const programDataAccountData = new Uint8Array([...programDataAccountBytes, ...programBytes]);\n\n    const rentExemptBalance = ctx.getMinimumBalanceForRentExemption(BigInt(programDataAccountData.length));\n    ctx.setAccount(programDataAddress, {\n        data: programDataAccountData,\n        executable: false,\n        lamports: rentExemptBalance,\n        owner: ctx.BPF_LOADER_UPGRADEABLE,\n    });\n\n    const programAccountBytes = encodeProgramAccount(programDataAddress);\n    ctx.setAccount(programAddress, {\n        data: Uint8Array.from(programAccountBytes),\n        executable: true,\n        lamports: rentExemptBalance,\n        owner: ctx.BPF_LOADER_UPGRADEABLE,\n    });\n\n    return { programAddress, programDataAddress };\n}\n\n/** Creates ProgramData Account for BPF Loader Upgradeable. */\nfunction encodeProgramDataAccount(authority: Address | null) {\n    const encoder = getStructEncoder([\n        ['discriminator', getU32Encoder()],\n        ['slot', getU64Encoder()],\n        ['authority', getOptionEncoder(getAddressEncoder())],\n    ]);\n\n    return encoder.encode({\n        authority: authority ? some(authority) : none(),\n        discriminator: 3,\n        slot: 0n,\n    });\n}\n\n/** Creates a Program Account for BPF Loader Upgradeable. */\nfunction encodeProgramAccount(programDataAddress: Address) {\n    const encoder = getStructEncoder([\n        ['discriminator', getU32Encoder()],\n        ['programData', getAddressEncoder()],\n    ]);\n\n    return encoder.encode({\n        discriminator: 2,\n        programData: programDataAddress,\n    });\n}\n\n/** Helper for allocating Buffer. Used for extending, closing or adding data */\nexport async function allocateBufferAccount(ctx: SvmTestContext) {\n    const bufferAccount = await ctx.createFundedAccount();\n\n    const allocateIx = await programClient.methods\n        .allocate({ seed: null })\n        .accounts({\n            authority: bufferAccount,\n            buffer: bufferAccount,\n            program: null,\n            programData: null,\n        })\n        .instruction();\n    await ctx.sendInstruction(allocateIx, [bufferAccount]);\n\n    return { bufferAccount };\n}\n\n/** Derives a canonical PDA (upgradeAuthority), i.e [programAddress, seed]. */\nexport async function deriveCanonicalPda(programAddress: Address, seed: string) {\n    const seed16Bytes = encodeSeedForPda(seed);\n    const addressEncoder = getAddressEncoder();\n    const [pda] = await getProgramDerivedAddress({\n        programAddress: programClient.programAddress,\n        seeds: [addressEncoder.encode(programAddress), seed16Bytes],\n    });\n\n    return pda;\n}\n\n/** Derives a non-canonical PDA (arbitrary authority), i.e [programAddress, authority, seed]. */\nexport async function deriveNonCanonicalPda(programAddress: Address, authority: Address, seed: string) {\n    const seed16Bytes = encodeSeedForPda(seed);\n    const addressEncoder = getAddressEncoder();\n    const [pda] = await getProgramDerivedAddress({\n        programAddress: programClient.programAddress,\n        seeds: [addressEncoder.encode(programAddress), addressEncoder.encode(authority), seed16Bytes],\n    });\n\n    return pda;\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/pmp/initialize.test.ts",
    "content": "import { type Address } from '@solana/addresses';\nimport type { Some } from '@solana/codecs';\nimport { AccountDiscriminator, Compression, DataSource, Encoding, Format } from '@solana-program/program-metadata';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport {\n    decodeBufferAccount,\n    decodeMetadataAccount,\n    loadPmpProgram,\n    PMP_PROGRAM_ID,\n    programClient,\n    setupCanonicalPda,\n    setupNonCanonicalPda,\n} from './helpers';\n\ndescribe('Program Metadata: initialize', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n        loadPmpProgram(ctx, programClient.programAddress);\n    });\n\n    test('should initialize canonical metadata with direct data (ifTrue condition branch)', async () => {\n        const seed = 'idl';\n        const { authority, programAddress, programDataAddress, pda: metadataPda } = await setupCanonicalPda(ctx, seed);\n\n        const testData = new TextEncoder().encode('{\"name\":\"test\"}');\n\n        const expectedAccounts = [\n            metadataPda,\n            authority,\n            programAddress,\n            programDataAddress,\n            ctx.SYSTEM_PROGRAM_ADDRESS,\n        ];\n\n        const ix = await programClient.methods\n            .initialize({\n                compression: 'none',\n                data: testData,\n                dataSource: 'direct',\n                encoding: 'utf8',\n                format: 'json',\n                seed,\n            })\n            .accounts({\n                authority,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(5);\n        ix.accounts?.forEach((ixAccount, i) => {\n            expect(expectedAccounts[i], `Invalid account: [${i}]`).toBe(ixAccount.address);\n        });\n\n        await ctx.sendInstruction(ix, [authority]);\n\n        const account = ctx.requireEncodedAccount(metadataPda);\n        expect(account.owner).toBe(PMP_PROGRAM_ID);\n\n        const metadata = decodeMetadataAccount(account.data);\n        expect(metadata.canonical).toBe(true);\n        expect(metadata.program).toBe(programAddress);\n        // Canonical metadata stores authority as zero (None)\n        expect(metadata.authority).toEqual({ __option: 'None' });\n        expect(metadata.seed).toBe(seed);\n\n        const writtenData = metadata.data.slice(0, testData.length);\n        expect(writtenData).toEqual(testData);\n    });\n\n    test('should initialize non-canonical metadata (ifFalse condition branch)', async () => {\n        const seed = 'idl';\n        const { authority, programAddress, pda: metadataPda } = await setupNonCanonicalPda(ctx, seed);\n\n        const testData = new TextEncoder().encode('non-canonical data');\n\n        const expectedAccounts = [\n            metadataPda,\n            authority,\n            programAddress,\n            programClient.programAddress, // with \"programId\" optionalAccountStrategy address is resolved to root.programId\n            ctx.SYSTEM_PROGRAM_ADDRESS,\n        ];\n\n        const ix = await programClient.methods\n            .initialize({\n                compression: 'none',\n                data: testData,\n                dataSource: 'direct',\n                encoding: 'utf8',\n                format: 'json',\n                seed,\n            })\n            .accounts({\n                authority,\n                program: programAddress,\n                programData: null, // this should use ifFalse branch in conditionalValueNode\n            })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(5);\n        ix.accounts?.forEach((ixAccount, i) => {\n            expect(expectedAccounts[i], `Invalid account: [${i}]`).toBe(ixAccount.address);\n        });\n\n        await ctx.sendInstruction(ix, [authority]);\n\n        const account = ctx.requireEncodedAccount(metadataPda);\n        expect(account.owner).toBe(PMP_PROGRAM_ID);\n\n        const metadata = decodeMetadataAccount(account.data);\n        expect(metadata.discriminator).toBe(AccountDiscriminator.Metadata);\n        expect(metadata.canonical).toBe(false);\n        expect(metadata.program).toBe(programAddress);\n        expect((metadata.authority as Some<Address>).value).toBe(authority);\n        expect(metadata.seed).toBe(seed);\n\n        const writtenData = metadata.data.slice(0, testData.length);\n        expect(writtenData).toEqual(testData);\n    });\n\n    test('should resolve optional null system_program account according on optionalAccountStrategy', async () => {\n        const seed = 'idl';\n        const { authority, programAddress, programDataAddress, pda: metadataPda } = await setupCanonicalPda(ctx, seed);\n\n        const testData = new TextEncoder().encode('{\"name\":\"test\"}');\n\n        const expectedAccounts = [\n            metadataPda,\n            authority,\n            programAddress,\n            programDataAddress,\n            programClient.programAddress, // expect root.programAddress based on optionalAccountStrategy\n        ];\n\n        const ix = await programClient.methods\n            .initialize({\n                compression: 'none',\n                data: testData,\n                dataSource: 'direct',\n                encoding: 'utf8',\n                format: 'json',\n                seed,\n            })\n            .accounts({\n                authority,\n                program: programAddress,\n                programData: programDataAddress,\n                system: null, // explicit null should resolve to root.programAddress\n            })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(5);\n        ix.accounts?.forEach((ixAccount, i) => {\n            expect(expectedAccounts[i], `Invalid account: [${i}]`).toBe(ixAccount.address);\n        });\n    });\n\n    test('should initialize metadata from pre-allocated buffer', async () => {\n        const seed = 'idl';\n        const { authority, programAddress, programDataAddress, pda: metadataPda } = await setupCanonicalPda(ctx, seed);\n\n        // Allocate the metadata PDA as a canonical buffer\n        const allocateIx = await programClient.methods\n            .allocate({ seed })\n            .accounts({\n                authority,\n                buffer: metadataPda,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n\n        // Write data to the buffer at the metadata PDA address\n        const testData = new TextEncoder().encode('{\"from\":\"buffer\"}');\n        const writeIx = await programClient.methods\n            .write({ data: testData, offset: 0 })\n            .accounts({\n                authority,\n                buffer: metadataPda,\n                sourceBuffer: null,\n            })\n            .instruction();\n\n        await ctx.sendInstructions([allocateIx, writeIx], [authority]);\n\n        // Verify the buffer was written at the metadata PDA\n        const bufferAccount = ctx.requireEncodedAccount(metadataPda);\n        const buffer = decodeBufferAccount(bufferAccount.data);\n        expect(buffer.discriminator).toBe(AccountDiscriminator.Buffer);\n\n        // Now initialize — the program sees the Buffer discriminator and uses existing data\n        const initializeIx = await programClient.methods\n            .initialize({\n                compression: 'none',\n                data: null,\n                dataSource: 'direct',\n                encoding: 'utf8',\n                format: 'json',\n                seed,\n            })\n            .accounts({\n                authority,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(initializeIx, [authority]);\n\n        const account = ctx.requireEncodedAccount(metadataPda);\n        expect(account.owner).toBe(PMP_PROGRAM_ID);\n\n        const metadata = decodeMetadataAccount(account.data);\n        expect(metadata.discriminator).toBe(AccountDiscriminator.Metadata);\n        expect(metadata.canonical).toBe(true);\n        expect(metadata.program).toBe(programAddress);\n        expect(metadata.authority).toEqual({ __option: 'None' });\n        const writtenData = metadata.data.slice(0, testData.length);\n        expect(writtenData).toEqual(testData);\n    });\n\n    test('should initialize with different encoding and format', async () => {\n        const seed = 'config';\n        const { authority, programAddress, programDataAddress, pda: metadataPda } = await setupCanonicalPda(ctx, seed);\n\n        const testData = new TextEncoder().encode('dG9tbCBkYXRh');\n\n        const ix = await programClient.methods\n            .initialize({\n                compression: 'zlib',\n                data: testData,\n                dataSource: 'url',\n                encoding: 'base64',\n                format: 'toml',\n                seed,\n            })\n            .accounts({\n                authority,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(ix, [authority]);\n\n        const account = ctx.requireEncodedAccount(metadataPda);\n        expect(account.owner).toBe(PMP_PROGRAM_ID);\n\n        const metadata = decodeMetadataAccount(account.data);\n        expect(metadata.discriminator).toBe(AccountDiscriminator.Metadata);\n        expect(metadata.canonical).toBe(true);\n        expect(metadata.encoding).toBe(Encoding.Base64);\n        expect(metadata.compression).toBe(Compression.Zlib);\n        expect(metadata.format).toBe(Format.Toml);\n        expect(metadata.dataSource).toBe(DataSource.Url);\n\n        const writtenData = metadata.data.slice(0, testData.length);\n        expect(writtenData).toEqual(testData);\n    });\n\n    test('should throw AccountError when authority is missing for non-canonical metadata', async () => {\n        const testProgramAddress = await ctx.createAccount();\n        await expect(\n            programClient.methods\n                .initialize({\n                    compression: 'none',\n                    data: null,\n                    dataSource: 'direct',\n                    encoding: 'utf8',\n                    format: 'json',\n                    seed: 'idl',\n                })\n                .accounts({\n                    // Simulate invalid required authority account\n                    authority: undefined as unknown as Address,\n                    program: testProgramAddress,\n                    programData: null,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[authority\\]/);\n    });\n\n    test('should throw AccountError when required program account is missing', async () => {\n        const authority = await ctx.createFundedAccount();\n\n        await expect(\n            programClient.methods\n                .initialize({\n                    compression: 'none',\n                    data: null,\n                    dataSource: 'direct',\n                    encoding: 'utf8',\n                    format: 'json',\n                    seed: 'idl',\n                })\n                .accounts({\n                    authority,\n                    // Simulate invalid required program account\n                    program: undefined as unknown as Address,\n                    programData: null,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[program\\]/);\n    });\n\n    test('should throw ArgumentError when missing required seed argument', async () => {\n        const authority = await ctx.createFundedAccount();\n        const testProgramAddress = await ctx.createAccount();\n\n        await expect(\n            programClient.methods\n                .initialize({\n                    compression: 'none',\n                    data: null,\n                    dataSource: 'direct',\n                    encoding: 'utf8',\n                    format: 'json',\n                    // Simulate invalid seed\n                    seed: undefined as unknown as string,\n                })\n                .accounts({\n                    authority,\n                    program: testProgramAddress,\n                    programData: null,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Invalid argument \"seed\", value: undefined/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/pmp/pdas.test.ts",
    "content": "import { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport {\n    deriveCanonicalPda,\n    deriveNonCanonicalPda,\n    loadPmpProgram,\n    programClient,\n    setupCanonicalPda,\n    setupNonCanonicalPda,\n} from './helpers';\n\ndescribe('Program Metadata: pdas', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n        loadPmpProgram(ctx, programClient.programAddress);\n    });\n\n    describe('canonical', () => {\n        test('should derive canonical PDA matching manual derivation', async () => {\n            const programAddress = await ctx.createAccount();\n            const seed = 'idl';\n\n            const [pdaFromHelper] = await programClient.pdas.canonical({ program: programAddress, seed });\n            const manualPda = await deriveCanonicalPda(programAddress, seed);\n\n            expect(pdaFromHelper).toBe(manualPda);\n        });\n\n        test('should derive different PDAs for different seeds', async () => {\n            const programAddress = await ctx.createAccount();\n\n            const [pda1] = await programClient.pdas.canonical({ program: programAddress, seed: 'idl' });\n            const [pda2] = await programClient.pdas.canonical({ program: programAddress, seed: 'config' });\n\n            expect(pda1).not.toBe(pda2);\n        });\n\n        test('should derive different PDAs for different programs', async () => {\n            const program1 = await ctx.createAccount();\n            const program2 = await ctx.createAccount();\n\n            const [pda1] = await programClient.pdas.canonical({ program: program1, seed: 'idl' });\n            const [pda2] = await programClient.pdas.canonical({ program: program2, seed: 'idl' });\n\n            expect(pda1).not.toBe(pda2);\n        });\n\n        test('should match instruction-resolved metadata PDA', async () => {\n            const seed = 'idl';\n            const { authority, programAddress, programDataAddress } = await setupCanonicalPda(ctx, seed);\n\n            const ix = await programClient.methods\n                .initialize({\n                    compression: 'none',\n                    data: new TextEncoder().encode('test'),\n                    dataSource: 'direct',\n                    encoding: 'utf8',\n                    format: 'json',\n                    seed,\n                })\n                .accounts({\n                    authority,\n                    program: programAddress,\n                    programData: programDataAddress,\n                })\n                .instruction();\n\n            const [pdaFromHelper] = await programClient.pdas.canonical({ program: programAddress, seed });\n            // The instruction's 1st account (index 0) is the metadata PDA\n            const pdaFromIx = ix.accounts?.[0]?.address;\n\n            expect(pdaFromHelper).toBe(pdaFromIx);\n        });\n    });\n\n    describe('nonCanonical', () => {\n        test('should derive non-canonical PDA matching manual derivation', async () => {\n            const programAddress = await ctx.createAccount();\n            const authority = await ctx.createAccount();\n            const seed = 'idl';\n\n            const [pdaFromHelper] = await programClient.pdas.nonCanonical({ authority, program: programAddress, seed });\n            const manualPda = await deriveNonCanonicalPda(programAddress, authority, seed);\n\n            expect(pdaFromHelper).toBe(manualPda);\n        });\n\n        test('should derive different PDAs for different authorities', async () => {\n            const programAddress = await ctx.createAccount();\n            const authority1 = await ctx.createAccount();\n            const authority2 = await ctx.createAccount();\n\n            const [pda1] = await programClient.pdas.nonCanonical({\n                authority: authority1,\n                program: programAddress,\n                seed: 'idl',\n            });\n            const [pda2] = await programClient.pdas.nonCanonical({\n                authority: authority2,\n                program: programAddress,\n                seed: 'idl',\n            });\n\n            expect(pda1).not.toBe(pda2);\n        });\n\n        test('should match instruction-resolved metadata PDA', async () => {\n            const seed = 'idl';\n            const { authority, programAddress } = await setupNonCanonicalPda(ctx, seed);\n\n            const ix = await programClient.methods\n                .initialize({\n                    compression: 'none',\n                    data: new TextEncoder().encode('test'),\n                    dataSource: 'direct',\n                    encoding: 'utf8',\n                    format: 'json',\n                    seed,\n                })\n                .accounts({\n                    authority,\n                    program: programAddress,\n                    programData: null,\n                })\n                .instruction();\n\n            const [pdaFromHelper] = await programClient.pdas.nonCanonical({ authority, program: programAddress, seed });\n            const pdaFromIx = ix.accounts?.[0]?.address;\n\n            expect(pdaFromHelper).toBe(pdaFromIx);\n        });\n    });\n\n    describe('metadata', () => {\n        test('should derive canonical PDA when authority is null', async () => {\n            const programAddress = await ctx.createAccount();\n            const seed = 'idl';\n\n            const [metadataPda] = await programClient.pdas.metadata({ authority: null, program: programAddress, seed });\n            const [canonicalPda] = await programClient.pdas.canonical({ program: programAddress, seed });\n\n            expect(metadataPda).toBe(canonicalPda);\n        });\n\n        test('should derive non-canonical PDA when authority is provided', async () => {\n            const programAddress = await ctx.createAccount();\n            const authority = await ctx.createAccount();\n            const seed = 'idl';\n\n            const [metadataPda] = await programClient.pdas.metadata({ authority, program: programAddress, seed });\n            const [nonCanonicalPda] = await programClient.pdas.nonCanonical({\n                authority,\n                program: programAddress,\n                seed,\n            });\n\n            expect(metadataPda).toBe(nonCanonicalPda);\n        });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/pmp/set-authority.test.ts",
    "content": "import type { Address } from '@solana/addresses';\nimport type { Some } from '@solana/codecs';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { decodeMetadataAccount, initializeCanonicalMetadata, loadPmpProgram, programClient } from './helpers';\n\ndescribe('Program Metadata: setAuthority', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n        loadPmpProgram(ctx, programClient.programAddress);\n    });\n\n    test('should set new authority on canonical metadata', async () => {\n        const {\n            authority,\n            programAddress,\n            programDataAddress,\n            pda: metadataPda,\n        } = await initializeCanonicalMetadata(ctx);\n\n        const accountBefore = ctx.requireEncodedAccount(metadataPda);\n        const metadataBefore = decodeMetadataAccount(accountBefore.data);\n        expect(metadataBefore.authority).toEqual({ __option: 'None' });\n        expect(metadataBefore.canonical).toBe(true);\n\n        // Set new authority\n        const newAuthority = await ctx.createAccount();\n        const expectedAccounts = [metadataPda, authority, programAddress, programDataAddress];\n        const setAuthorityIx = await programClient.methods\n            .setAuthority({ newAuthority })\n            .accounts({\n                account: metadataPda,\n                authority,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n\n        expect(setAuthorityIx.accounts?.length).toBe(4);\n        setAuthorityIx.accounts?.forEach((ixAccount, i) => {\n            expect(expectedAccounts[i], `Invalid account: [${i}]`).toBe(ixAccount.address);\n        });\n\n        await ctx.sendInstruction(setAuthorityIx, [authority]);\n        const accountAfter = ctx.requireEncodedAccount(metadataPda);\n        const metadataAfter = decodeMetadataAccount(accountAfter.data);\n        expect((metadataAfter.authority as Some<Address>).value).toBe(newAuthority);\n    });\n\n    test('should remove authority from canonical metadata', async () => {\n        const {\n            authority,\n            programAddress,\n            programDataAddress,\n            pda: metadataPda,\n        } = await initializeCanonicalMetadata(ctx);\n\n        // Set authority\n        const someAuthority = await ctx.createAccount();\n        const setAuthorityIx = await programClient.methods\n            .setAuthority({ newAuthority: someAuthority })\n            .accounts({\n                account: metadataPda,\n                authority,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(setAuthorityIx, [authority]);\n        const accountWithAuthority = ctx.requireEncodedAccount(metadataPda);\n        const metadataWithAuthority = decodeMetadataAccount(accountWithAuthority.data);\n        expect((metadataWithAuthority.authority as Some<Address>).value).toBe(someAuthority);\n\n        // Remove the authority\n        const expectedAccounts = [metadataPda, authority, programAddress, programDataAddress];\n        const removeAuthorityIx = await programClient.methods\n            .setAuthority({ newAuthority: null })\n            .accounts({\n                account: metadataPda,\n                authority,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n\n        expect(removeAuthorityIx.accounts?.length).toBe(4);\n        removeAuthorityIx.accounts?.forEach((ixAccount, i) => {\n            expect(expectedAccounts[i], `Invalid account: [${i}]`).toBe(ixAccount.address);\n        });\n\n        await ctx.sendInstruction(removeAuthorityIx, [authority]);\n        const accountAfter = ctx.requireEncodedAccount(metadataPda);\n        const metadataAfter = decodeMetadataAccount(accountAfter.data);\n        expect(metadataAfter.authority).toEqual({ __option: 'None' });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/pmp/set-data.test.ts",
    "content": "import type { Address } from '@solana/addresses';\nimport type { Some } from '@solana/codecs';\nimport { Compression, DataSource, Encoding, Format } from '@solana-program/program-metadata';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport {\n    allocateBufferAccount,\n    decodeMetadataAccount,\n    initializeCanonicalMetadata,\n    initializeNonCanonicalMetadata,\n    loadPmpProgram,\n    PMP_PROGRAM_ID,\n    programClient,\n} from './helpers';\n\ndescribe('Program Metadata: setData', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n        loadPmpProgram(ctx, programClient.programAddress);\n    });\n\n    test('should update canonical metadata with inline data', async () => {\n        const {\n            authority,\n            programAddress,\n            programDataAddress,\n            pda: metadataPda,\n        } = await initializeCanonicalMetadata(ctx, { data: new TextEncoder().encode('{\"name\":\"initial\"}') });\n\n        // Verify initial state\n        const accountBefore = ctx.requireEncodedAccount(metadataPda);\n        const metadataBefore = decodeMetadataAccount(accountBefore.data);\n        expect(metadataBefore.encoding).toBe(Encoding.Utf8);\n        expect(metadataBefore.format).toBe(Format.Json);\n\n        // Update metadata with new data and properties\n        const newData = new TextEncoder().encode('{\"name\":\"updated\"}');\n        const expectedAccounts = [metadataPda, authority, PMP_PROGRAM_ID, programAddress, programDataAddress];\n\n        const setDataIx = await programClient.methods\n            .setData({\n                compression: 'zlib',\n                data: newData,\n                dataSource: 'direct',\n                encoding: 'utf8',\n                format: 'json',\n            })\n            .accounts({\n                authority,\n                buffer: null,\n                metadata: metadataPda,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n\n        expect(setDataIx.accounts?.length).toBe(5);\n        setDataIx.accounts?.forEach((ixAccount, i) => {\n            expect(expectedAccounts[i], `Invalid account: [${i}]`).toBe(ixAccount.address);\n        });\n\n        await ctx.sendInstruction(setDataIx, [authority]);\n\n        // Verify metadata updated\n        const accountAfter = ctx.requireEncodedAccount(metadataPda);\n        const metadataAfter = decodeMetadataAccount(accountAfter.data);\n\n        const writtenData = metadataAfter.data.slice(0, newData.length);\n        expect(writtenData).toEqual(newData);\n        expect(metadataAfter.encoding).toBe(Encoding.Utf8);\n        expect(metadataAfter.compression).toBe(Compression.Zlib);\n        expect(metadataAfter.format).toBe(Format.Json);\n        expect(metadataAfter.dataSource).toBe(DataSource.Direct);\n\n        // Unchanged fields\n        expect(metadataAfter.canonical).toBe(true);\n        expect(metadataAfter.program).toBe(programAddress);\n        expect(metadataAfter.authority).toEqual({ __option: 'None' });\n        expect(metadataAfter.seed).toBe('idl');\n        expect(metadataAfter.mutable).toBe(true);\n    });\n\n    test('should update canonical metadata from buffer', async () => {\n        const feePayer = await ctx.createFundedAccount();\n        const {\n            authority,\n            programAddress,\n            programDataAddress,\n            pda: metadataPda,\n        } = await initializeCanonicalMetadata(ctx, { data: new TextEncoder().encode('{\"name\":\"initial\"}') });\n\n        const { bufferAccount } = await allocateBufferAccount(ctx);\n\n        const bufferData = new TextEncoder().encode('{\"from\":\"buffer\"}');\n        const writeBufferIx = await programClient.methods\n            .write({ data: bufferData, offset: 0 })\n            .accounts({\n                authority: bufferAccount,\n                buffer: bufferAccount,\n                sourceBuffer: null,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(writeBufferIx, [feePayer, bufferAccount]);\n\n        // Update metadata from buffer\n        const expectedAccounts = [metadataPda, authority, bufferAccount, programAddress, programDataAddress];\n\n        const setDataIx = await programClient.methods\n            .setData({\n                compression: 'none',\n                data: null,\n                dataSource: 'direct',\n                encoding: 'utf8',\n                format: 'json',\n            })\n            .accounts({\n                authority,\n                buffer: bufferAccount,\n                metadata: metadataPda,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n\n        expect(setDataIx.accounts?.length).toBe(5);\n        setDataIx.accounts?.forEach((ixAccount, i) => {\n            expect(expectedAccounts[i], `Invalid account: [${i}]`).toBe(ixAccount.address);\n        });\n\n        await ctx.sendInstruction(setDataIx, [authority]);\n\n        // Verify metadata data matches buffer\n        const accountAfter = ctx.requireEncodedAccount(metadataPda);\n        const metadataAfter = decodeMetadataAccount(accountAfter.data);\n\n        const writtenData = metadataAfter.data.slice(0, bufferData.length);\n        expect(writtenData).toEqual(bufferData);\n    });\n\n    test('should update non-canonical metadata with inline data', async () => {\n        const {\n            authority,\n            programAddress,\n            pda: metadataPda,\n        } = await initializeNonCanonicalMetadata(ctx, {\n            data: new TextEncoder().encode('non-canonical initial'),\n        });\n\n        // Verify non-canonical\n        const accountBefore = ctx.requireEncodedAccount(metadataPda);\n        const metadataBefore = decodeMetadataAccount(accountBefore.data);\n        expect(metadataBefore.canonical).toBe(false);\n        expect((metadataBefore.authority as Some<Address>).value).toBe(authority);\n\n        // Update non-canonical metadata\n        const newData = new TextEncoder().encode('non-canonical updated');\n        const expectedAccounts = [metadataPda, authority, PMP_PROGRAM_ID, programAddress, PMP_PROGRAM_ID];\n\n        const setDataIx = await programClient.methods\n            .setData({\n                compression: 'gzip',\n                data: newData,\n                dataSource: 'direct',\n                encoding: 'utf8',\n                format: 'json',\n            })\n            .accounts({\n                authority,\n                buffer: null,\n                metadata: metadataPda,\n                program: programAddress,\n                programData: null,\n            })\n            .instruction();\n\n        expect(setDataIx.accounts?.length).toBe(5);\n        setDataIx.accounts?.forEach((ixAccount, i) => {\n            expect(expectedAccounts[i], `Invalid account: [${i}]`).toBe(ixAccount.address);\n        });\n\n        await ctx.sendInstruction(setDataIx, [authority]);\n\n        const accountAfter = ctx.requireEncodedAccount(metadataPda);\n        const metadataAfter = decodeMetadataAccount(accountAfter.data);\n\n        const writtenData = metadataAfter.data.slice(0, newData.length);\n        expect(writtenData).toEqual(newData);\n        expect(metadataAfter.encoding).toBe(Encoding.Utf8);\n        expect(metadataAfter.compression).toBe(Compression.Gzip);\n        expect(metadataAfter.format).toBe(Format.Json);\n        expect(metadataAfter.dataSource).toBe(DataSource.Direct);\n        expect((metadataAfter.authority as Some<Address>).value).toBe(authority);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/pmp/set-immutable.test.ts",
    "content": "import type { Address } from '@solana/addresses';\nimport type { Some } from '@solana/codecs';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport {\n    decodeMetadataAccount,\n    initializeCanonicalMetadata,\n    initializeNonCanonicalMetadata,\n    loadPmpProgram,\n    PMP_PROGRAM_ID,\n    programClient,\n} from './helpers';\n\ndescribe('Program Metadata: setImmutable', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n        loadPmpProgram(ctx, programClient.programAddress);\n    });\n\n    test('should make canonical metadata immutable', async () => {\n        const {\n            authority,\n            programAddress,\n            programDataAddress,\n            pda: metadataPda,\n        } = await initializeCanonicalMetadata(ctx);\n\n        const accountBefore = ctx.requireEncodedAccount(metadataPda);\n        const metadataBefore = decodeMetadataAccount(accountBefore.data);\n        expect(metadataBefore.mutable).toBe(true);\n        expect(metadataBefore.canonical).toBe(true);\n\n        // Make immutable\n        const expectedAccounts = [metadataPda, authority, programAddress, programDataAddress];\n\n        const setImmutableIx = await programClient.methods\n            .setImmutable()\n            .accounts({\n                authority,\n                metadata: metadataPda,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n\n        expect(setImmutableIx.accounts?.length).toBe(4);\n        setImmutableIx.accounts?.forEach((ixAccount, i) => {\n            expect(expectedAccounts[i], `Invalid account: [${i}]`).toBe(ixAccount.address);\n        });\n\n        await ctx.sendInstruction(setImmutableIx, [authority]);\n\n        const accountAfter = ctx.requireEncodedAccount(metadataPda);\n        const metadataAfter = decodeMetadataAccount(accountAfter.data);\n        expect(metadataAfter.mutable).toBe(false);\n    });\n\n    test('should make non-canonical metadata immutable', async () => {\n        const { authority, pda: metadataPda } = await initializeNonCanonicalMetadata(ctx);\n\n        // Verify non-canonical and mutable\n        const accountBefore = ctx.requireEncodedAccount(metadataPda);\n        const metadataBefore = decodeMetadataAccount(accountBefore.data);\n        expect(metadataBefore.canonical).toBe(false);\n        expect(metadataBefore.mutable).toBe(true);\n        expect((metadataBefore.authority as Some<Address>).value).toBe(authority);\n\n        // Make immutable\n        const expectedAccounts = [metadataPda, authority, PMP_PROGRAM_ID, PMP_PROGRAM_ID];\n\n        const setImmutableIx = await programClient.methods\n            .setImmutable()\n            .accounts({\n                authority,\n                metadata: metadataPda,\n                program: null,\n                programData: null,\n            })\n            .instruction();\n\n        expect(setImmutableIx.accounts?.length).toBe(4);\n        setImmutableIx.accounts?.forEach((ixAccount, i) => {\n            expect(expectedAccounts[i], `Invalid account: [${i}]`).toBe(ixAccount.address);\n        });\n\n        await ctx.sendInstruction(setImmutableIx, [authority]);\n\n        const accountAfter = ctx.requireEncodedAccount(metadataPda);\n        const metadataAfter = decodeMetadataAccount(accountAfter.data);\n        expect(metadataAfter.mutable).toBe(false);\n        expect(metadataAfter.canonical).toBe(false);\n        expect((metadataAfter.authority as Some<Address>).value).toBe(authority);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/pmp/trim.test.ts",
    "content": "import { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { decodeMetadataAccount, initializeCanonicalMetadata, loadPmpProgram, programClient } from './helpers';\n\ndescribe('Program Metadata: trim', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext({ defaultPrograms: true, sysvars: true });\n        loadPmpProgram(ctx, programClient.programAddress);\n    });\n\n    test('should trim metadata to reduced size', async () => {\n        const destination = await ctx.createAccount();\n        const {\n            authority,\n            programAddress,\n            programDataAddress,\n            pda: metadataPda,\n        } = await initializeCanonicalMetadata(ctx, { data: new TextEncoder().encode('x'.repeat(200)) });\n\n        const reducedData = new TextEncoder().encode('x'.repeat(100));\n        const setDataIx = await programClient.methods\n            .setData({\n                compression: 'none',\n                data: reducedData,\n                dataSource: 'direct',\n                encoding: 'utf8',\n                format: 'json',\n            })\n            .accounts({\n                authority,\n                buffer: null,\n                metadata: metadataPda,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n        await ctx.sendInstruction(setDataIx, [authority]);\n\n        const balanceBefore = ctx.getBalanceOrZero(destination);\n        expect(balanceBefore).toBe(0n);\n\n        const expectedAccounts = [\n            metadataPda,\n            authority,\n            programAddress,\n            programDataAddress,\n            destination,\n            ctx.SYSVAR_RENT_ADDRESS,\n        ];\n\n        const trimIx = await programClient.methods\n            .trim()\n            .accounts({\n                account: metadataPda,\n                authority,\n                destination,\n                program: programAddress,\n                programData: programDataAddress,\n            })\n            .instruction();\n        expect(trimIx.accounts?.length).toBe(6);\n        trimIx.accounts?.forEach((ixAccount, i) => {\n            expect(expectedAccounts[i], `Invalid account: [${i}]`).toBe(ixAccount.address);\n        });\n        await ctx.sendInstruction(trimIx, [authority]);\n\n        const account = ctx.requireEncodedAccount(metadataPda);\n        const metadata = decodeMetadataAccount(account.data);\n        expect(metadata.data).toEqual(reducedData);\n\n        const balanceAfter = ctx.getBalanceOrZero(destination);\n        expect(balanceAfter).toBeGreaterThan(0n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/pmp/write.test.ts",
    "content": "import { AccountDiscriminator } from '@solana-program/program-metadata';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { allocateBufferAccount, decodeBufferAccount, loadPmpProgram, programClient } from './helpers';\n\ndescribe('Program Metadata: write', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n        loadPmpProgram(ctx, programClient.programAddress);\n    });\n\n    test('should write inline data to buffer', async () => {\n        const feePayer = await ctx.createFundedAccount();\n        const { bufferAccount } = await allocateBufferAccount(ctx);\n\n        const testData = new TextEncoder().encode('Hello, PMP!');\n        const writeIx = await programClient.methods\n            .write({ data: testData, offset: 0 })\n            .accounts({\n                authority: bufferAccount,\n                buffer: bufferAccount,\n                sourceBuffer: null,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(writeIx, [feePayer, bufferAccount]);\n\n        const account = ctx.requireEncodedAccount(bufferAccount);\n        const buffer = decodeBufferAccount(account.data);\n\n        expect(buffer.discriminator).toBe(AccountDiscriminator.Buffer);\n        expect(buffer.canonical).toBe(false);\n\n        const writtenData = buffer.data.slice(0, testData.length);\n        expect(writtenData).toEqual(testData);\n    });\n\n    test('should write data at offset', async () => {\n        const feePayer = await ctx.createFundedAccount();\n        const { bufferAccount } = await allocateBufferAccount(ctx);\n\n        const dataA = new TextEncoder().encode('AAAA');\n        const writeIxA = await programClient.methods\n            .write({ data: dataA, offset: 0 })\n            .accounts({\n                authority: bufferAccount,\n                buffer: bufferAccount,\n                sourceBuffer: null,\n            })\n            .instruction();\n\n        const dataB = new TextEncoder().encode('BBBB');\n        const dataBoffset = 10;\n        const writeIxB = await programClient.methods\n            .write({ data: dataB, offset: dataBoffset })\n            .accounts({\n                authority: bufferAccount,\n                buffer: bufferAccount,\n                sourceBuffer: null,\n            })\n            .instruction();\n\n        await ctx.sendInstructions([writeIxA, writeIxB], [feePayer, bufferAccount]);\n\n        const account = ctx.requireEncodedAccount(bufferAccount);\n        const buffer = decodeBufferAccount(account.data);\n\n        expect(buffer.discriminator).toBe(AccountDiscriminator.Buffer);\n\n        const writtenDataA = buffer.data.slice(0, dataA.length);\n        expect(writtenDataA).toEqual(dataA);\n\n        const writtenDataB = buffer.data.slice(dataBoffset, dataBoffset + dataB.length);\n        expect(writtenDataB).toEqual(dataB);\n\n        const untouchedBytes = buffer.data.slice(dataA.length, dataBoffset);\n        expect(untouchedBytes).toEqual(new Uint8Array([0, 0, 0, 0, 0, 0]));\n    });\n\n    test('should write data in chunks', async () => {\n        const feePayer = await ctx.createFundedAccount();\n        const { bufferAccount } = await allocateBufferAccount(ctx);\n\n        const chunk1 = new TextEncoder().encode('Hello');\n        const writeIx1 = await programClient.methods\n            .write({ data: chunk1, offset: 0 })\n            .accounts({\n                authority: bufferAccount,\n                buffer: bufferAccount,\n                sourceBuffer: null,\n            })\n            .instruction();\n\n        const chunk2 = new TextEncoder().encode('World');\n        const chunk2Offset = chunk1.length;\n        const writeIx2 = await programClient.methods\n            .write({ data: chunk2, offset: chunk2Offset })\n            .accounts({\n                authority: bufferAccount,\n                buffer: bufferAccount,\n                sourceBuffer: null,\n            })\n            .instruction();\n\n        await ctx.sendInstructions([writeIx1, writeIx2], [feePayer, bufferAccount]);\n\n        const account = ctx.requireEncodedAccount(bufferAccount);\n        const buffer = decodeBufferAccount(account.data);\n\n        expect(buffer.discriminator).toBe(AccountDiscriminator.Buffer);\n\n        const combinedData = buffer.data.slice(0, chunk1.length + chunk2.length);\n        const expectedData = new TextEncoder().encode('HelloWorld');\n        expect(combinedData).toEqual(expectedData);\n\n        const resultString = new TextDecoder().decode(combinedData);\n        expect(resultString).toBe('HelloWorld');\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/sas/change-authorized-signers.test.ts",
    "content": "import { type Address } from '@solana/addresses';\nimport { getCredentialDecoder } from 'sas-lib';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createCredential, loadSasProgram, programClient } from './sas-test-utils';\n\ndescribe('SAS: changeAuthorizedSigners', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n        loadSasProgram(ctx);\n    });\n\n    test('should replace authorized signers with a new set', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const newSigner1 = await ctx.createAccount();\n        const newSigner2 = await ctx.createAccount();\n\n        const expectedAccounts = [authority, authority, credentialPda, ctx.SYSTEM_PROGRAM_ADDRESS];\n        const ix = await programClient.methods\n            .changeAuthorizedSigners({ signers: [newSigner1, newSigner2] })\n            .accounts({ authority, credential: credentialPda, payer: authority })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(4);\n        expectedAccounts.forEach((expected, i) => {\n            expect(ix.accounts?.[i].address).eq(expected);\n        });\n        await ctx.sendInstruction(ix, [authority]);\n\n        const account = ctx.requireEncodedAccount(credentialPda);\n        const credential = getCredentialDecoder().decode(account.data);\n        expect(credential.authorizedSigners).toEqual([newSigner1, newSigner2]);\n    });\n\n    test('should throw AccountError when credential is missing', async () => {\n        const { authority } = await createCredential(ctx);\n\n        await expect(\n            programClient.methods\n                .changeAuthorizedSigners({ signers: [authority] })\n                .accounts({ authority, credential: undefined as unknown as Address, payer: authority })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[credential\\]/);\n    });\n\n    test('should throw ValidationError when signers arg is invalid', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n\n        await expect(\n            programClient.methods\n                .changeAuthorizedSigners({ signers: { a: 42 } as unknown as Address[] })\n                .accounts({ authority, credential: credentialPda, payer: authority })\n                .instruction(),\n        ).rejects.toThrow(/Invalid argument \"signers\"/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/sas/change-schema-description.test.ts",
    "content": "import { type Address } from '@solana/addresses';\nimport { getSchemaDecoder } from 'sas-lib';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createCredential, createSchema, loadSasProgram, programClient } from './sas-test-utils';\n\ndescribe('SAS: changeSchemaDescription', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n        loadSasProgram(ctx);\n    });\n\n    test('should update schema description', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda } = await createSchema(ctx, authority, credentialPda);\n\n        const expectedAccounts = [authority, authority, credentialPda, schemaPda, ctx.SYSTEM_PROGRAM_ADDRESS];\n        const ix = await programClient.methods\n            .changeSchemaDescription({ description: 'Updated description' })\n            .accounts({ authority, credential: credentialPda, payer: authority, schema: schemaPda })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(5);\n        expectedAccounts.forEach((expected, i) => {\n            expect(ix.accounts?.[i].address).eq(expected);\n        });\n        await ctx.sendInstruction(ix, [authority]);\n\n        const account = ctx.requireEncodedAccount(schemaPda);\n        const schema = getSchemaDecoder().decode(account.data);\n        expect(schema.description).toEqual(new TextEncoder().encode('Updated description'));\n    });\n\n    test('should throw AccountError when schema is missing', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n\n        await expect(\n            programClient.methods\n                .changeSchemaDescription({ description: 'New description' })\n                .accounts({\n                    authority,\n                    credential: credentialPda,\n                    payer: authority,\n                    schema: undefined as unknown as Address,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[schema\\]/);\n    });\n\n    test('should throw ValidationError when description is invalid', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda } = await createSchema(ctx, authority, credentialPda);\n\n        await expect(\n            programClient.methods\n                .changeSchemaDescription({ description: BigInt(42) as unknown as string })\n                .accounts({\n                    authority,\n                    credential: credentialPda,\n                    payer: authority,\n                    schema: schemaPda,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Invalid argument \"description\"/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/sas/change-schema-status.test.ts",
    "content": "import { type Address } from '@solana/addresses';\nimport { getSchemaDecoder } from 'sas-lib';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createCredential, createSchema, loadSasProgram, programClient } from './sas-test-utils';\n\ndescribe('SAS: changeSchemaStatus', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n        loadSasProgram(ctx);\n    });\n\n    test('should pause a schema', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda } = await createSchema(ctx, authority, credentialPda);\n\n        const expectedAccounts = [authority, credentialPda, schemaPda];\n        const ix = await programClient.methods\n            .changeSchemaStatus({ isPaused: true })\n            .accounts({ authority, credential: credentialPda, schema: schemaPda })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(3);\n        expectedAccounts.forEach((expected, i) => {\n            expect(ix.accounts?.[i].address).eq(expected);\n        });\n        await ctx.sendInstruction(ix, [authority]);\n\n        const account = ctx.requireEncodedAccount(schemaPda);\n        const schema = getSchemaDecoder().decode(account.data);\n        expect(schema.isPaused).toBe(true);\n    });\n\n    test('should unpause a schema', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda } = await createSchema(ctx, authority, credentialPda);\n\n        const pauseIx = await programClient.methods\n            .changeSchemaStatus({ isPaused: true })\n            .accounts({ authority, credential: credentialPda, schema: schemaPda })\n            .instruction();\n\n        await ctx.sendInstruction(pauseIx, [authority]);\n\n        const unpauseIx = await programClient.methods\n            .changeSchemaStatus({ isPaused: false })\n            .accounts({ authority, credential: credentialPda, schema: schemaPda })\n            .instruction();\n\n        await ctx.sendInstruction(unpauseIx, [authority]);\n\n        const account = ctx.requireEncodedAccount(schemaPda);\n        const schema = getSchemaDecoder().decode(account.data);\n        expect(schema.isPaused).toBe(false);\n    });\n\n    test('should build correct instruction with 3 accounts', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda } = await createSchema(ctx, authority, credentialPda);\n\n        const ix = await programClient.methods\n            .changeSchemaStatus({ isPaused: true })\n            .accounts({ authority, credential: credentialPda, schema: schemaPda })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(3);\n    });\n\n    test('should throw AccountError when credential is missing', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda } = await createSchema(ctx, authority, credentialPda);\n\n        await expect(\n            programClient.methods\n                .changeSchemaStatus({ isPaused: true })\n                .accounts({ authority, credential: undefined as unknown as Address, schema: schemaPda })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[credential\\]/);\n    });\n\n    test('should throw ArgumentError when isPaused is invalid', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda } = await createSchema(ctx, authority, credentialPda);\n\n        await expect(\n            programClient.methods\n                .changeSchemaStatus({ isPaused: 'yes' as unknown as boolean })\n                .accounts({ authority, credential: credentialPda, schema: schemaPda })\n                .instruction(),\n        ).rejects.toThrow(/Invalid argument \"isPaused\"/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/sas/change-schema-version.test.ts",
    "content": "import { type Address } from '@solana/addresses';\nimport { deriveSchemaPda, getSchemaDecoder } from 'sas-lib';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport {\n    createCredential,\n    createSchema,\n    loadSasProgram,\n    programClient,\n    SCHEMA_DATA_STRING_TYPE,\n    SCHEMA_DATA_U8_TYPE,\n} from './sas-test-utils';\n\ndescribe('SAS: changeSchemaVersion', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n        loadSasProgram(ctx);\n    });\n\n    test('should create a new version of a schema', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { name, schemaPda: existingSchemaPda } = await createSchema(ctx, authority, credentialPda);\n\n        const [newSchemaPda] = await deriveSchemaPda({ credential: credentialPda, name, version: 2 });\n\n        const expectedAccounts = [\n            authority,\n            authority,\n            credentialPda,\n            existingSchemaPda,\n            newSchemaPda,\n            ctx.SYSTEM_PROGRAM_ADDRESS,\n        ];\n        const ix = await programClient.methods\n            .changeSchemaVersion({\n                fieldNames: ['fullName', 'age'],\n                layout: new Uint8Array([SCHEMA_DATA_STRING_TYPE, SCHEMA_DATA_U8_TYPE]),\n            })\n            .accounts({\n                authority,\n                credential: credentialPda,\n                existingSchema: existingSchemaPda,\n                newSchema: newSchemaPda,\n                payer: authority,\n            })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(6);\n        expectedAccounts.forEach((expected, i) => {\n            expect(ix.accounts?.[i].address).eq(expected);\n        });\n        await ctx.sendInstruction(ix, [authority]);\n\n        const account = ctx.requireEncodedAccount(newSchemaPda);\n        const schema = getSchemaDecoder().decode(account.data);\n        expect(schema.layout).toEqual(new Uint8Array([SCHEMA_DATA_STRING_TYPE, SCHEMA_DATA_U8_TYPE]));\n        expect(schema.version).toBe(2);\n    });\n\n    test('should throw AccountError when existingSchema is missing', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { name, schemaPda: existingSchemaPda } = await createSchema(ctx, authority, credentialPda);\n        const [newSchemaPda] = await deriveSchemaPda({ credential: credentialPda, name, version: 2 });\n\n        await expect(\n            programClient.methods\n                .changeSchemaVersion({ fieldNames: ['field123'], layout: new Uint8Array([12]) })\n                .accounts({\n                    authority,\n                    credential: credentialPda,\n                    existingSchema: undefined as unknown as Address,\n                    newSchema: newSchemaPda,\n                    payer: authority,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[existingSchema\\]/);\n\n        await expect(\n            programClient.methods\n                .changeSchemaVersion({ fieldNames: ['field123'], layout: new Uint8Array([12]) })\n                .accounts({\n                    authority,\n                    credential: credentialPda,\n                    existingSchema: existingSchemaPda,\n                    newSchema: undefined as unknown as Address,\n                    payer: authority,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[newSchema\\]/);\n    });\n\n    test('should throw ValidationError when argument is invalid', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { name, schemaPda: existingSchemaPda } = await createSchema(ctx, authority, credentialPda);\n\n        const [newSchemaPda] = await deriveSchemaPda({ credential: credentialPda, name, version: 2 });\n\n        await expect(\n            programClient.methods\n                .changeSchemaVersion({\n                    fieldNames: undefined as unknown as string[],\n                    layout: new Uint8Array([SCHEMA_DATA_STRING_TYPE, SCHEMA_DATA_U8_TYPE]),\n                })\n                .accounts({\n                    authority,\n                    credential: credentialPda,\n                    existingSchema: existingSchemaPda,\n                    newSchema: newSchemaPda,\n                    payer: authority,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Invalid argument \"fieldNames\"/);\n\n        await expect(\n            programClient.methods\n                .changeSchemaVersion({\n                    fieldNames: ['test1', 'test2'],\n                    layout: 123 as unknown as Uint8Array,\n                })\n                .accounts({\n                    authority,\n                    credential: credentialPda,\n                    existingSchema: existingSchemaPda,\n                    newSchema: newSchemaPda,\n                    payer: authority,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Invalid argument \"layout\"/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/sas/close-attestation.test.ts",
    "content": "import { type Address } from '@solana/addresses';\nimport { deriveEventAuthorityAddress } from 'sas-lib';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createAttestation, createCredential, createSchema, loadSasProgram, programClient } from './sas-test-utils';\n\ndescribe('SAS: closeAttestation', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n        loadSasProgram(ctx);\n    });\n\n    test('should close an attestation', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda } = await createSchema(ctx, authority, credentialPda);\n        const { attestationPda } = await createAttestation(ctx, authority, credentialPda, schemaPda);\n        const eventAuthority = await deriveEventAuthorityAddress();\n\n        const expectedAccounts = [\n            authority,\n            authority,\n            credentialPda,\n            attestationPda,\n            eventAuthority,\n            ctx.SYSTEM_PROGRAM_ADDRESS,\n            programClient.programAddress,\n        ];\n        const ix = await programClient.methods\n            .closeAttestation()\n            .accounts({\n                attestation: attestationPda,\n                attestationProgram: programClient.programAddress,\n                authority,\n                credential: credentialPda,\n                eventAuthority,\n                payer: authority,\n            })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(7);\n        expectedAccounts.forEach((expected, i) => {\n            expect(ix.accounts?.[i].address).eq(expected);\n        });\n        await ctx.sendInstruction(ix, [authority]);\n\n        const account = ctx.fetchEncodedAccount(attestationPda);\n        expect(account).toBeNull();\n    });\n\n    test('should throw AccountError when required account is missing', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda } = await createSchema(ctx, authority, credentialPda);\n        const { attestationPda } = await createAttestation(ctx, authority, credentialPda, schemaPda);\n        const eventAuthority = await deriveEventAuthorityAddress();\n\n        await expect(\n            programClient.methods\n                .closeAttestation()\n                .accounts({\n                    attestation: attestationPda,\n                    attestationProgram: programClient.programAddress,\n                    authority,\n                    credential: credentialPda,\n                    eventAuthority: undefined as unknown as Address,\n                    payer: authority,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[eventAuthority\\]/);\n\n        await expect(\n            programClient.methods\n                .closeAttestation()\n                .accounts({\n                    attestation: attestationPda,\n                    attestationProgram: programClient.programAddress,\n                    authority,\n                    credential: undefined as unknown as Address,\n                    eventAuthority: eventAuthority,\n                    payer: authority,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[credential\\]/);\n\n        await expect(\n            programClient.methods\n                .closeAttestation()\n                .accounts({\n                    attestation: attestationPda,\n                    attestationProgram: undefined as unknown as Address,\n                    authority,\n                    credential: credentialPda,\n                    eventAuthority: eventAuthority,\n                    payer: authority,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[attestationProgram\\]/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/sas/close-tokenized-attestation.test.ts",
    "content": "import { type Address } from '@solana/addresses';\nimport { findAssociatedTokenPda } from '@solana-program/token';\nimport {\n    deriveAttestationMintPda,\n    deriveAttestationPda,\n    deriveEventAuthorityAddress,\n    serializeAttestationData,\n} from 'sas-lib';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport {\n    createCredential,\n    createSchema,\n    getAttestationMintSize,\n    loadSasProgram,\n    programClient,\n    tokenizeSchema,\n} from './sas-test-utils';\n\nconst NFT_NAME = 'Test NFT';\nconst NFT_SYMBOL = 'TEST';\nconst NFT_URI = 'https://example.com/metadata.json';\n\nasync function createTokenizedAttestationSetup(ctx: SvmTestContext) {\n    const { authority, credentialPda } = await createCredential(ctx);\n    const { schemaPda, schema } = await createSchema(ctx, authority, credentialPda);\n    const attestationData = serializeAttestationData(schema, { field1: 'test' });\n    const { sasPda, schemaMintPda } = await tokenizeSchema(ctx, authority, credentialPda, schemaPda);\n\n    const nonce = await ctx.createAccount();\n    const recipient = await ctx.createFundedAccount();\n    const [attestationPda] = await deriveAttestationPda({ credential: credentialPda, nonce, schema: schemaPda });\n    const [attestationMintPda] = await deriveAttestationMintPda({ attestation: attestationPda });\n\n    const [recipientTokenAccount] = await findAssociatedTokenPda({\n        mint: attestationMintPda,\n        owner: recipient,\n        tokenProgram: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n    });\n\n    const mintAccountSpace = getAttestationMintSize({\n        attestationMint: attestationMintPda,\n        attestationPda,\n        name: NFT_NAME,\n        sasPda,\n        schemaMint: schemaMintPda,\n        schemaPda,\n        symbol: NFT_SYMBOL,\n        uri: NFT_URI,\n    });\n\n    const createIx = await programClient.methods\n        .createTokenizedAttestation({\n            data: attestationData,\n            expiry: 0n,\n            mintAccountSpace,\n            name: NFT_NAME,\n            nonce,\n            symbol: NFT_SYMBOL,\n            uri: NFT_URI,\n        })\n        .accounts({\n            associatedTokenProgram: ctx.ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n            attestation: attestationPda,\n            attestationMint: attestationMintPda,\n            authority,\n            credential: credentialPda,\n            payer: authority,\n            recipient,\n            recipientTokenAccount,\n            sasPda,\n            schema: schemaPda,\n            schemaMint: schemaMintPda,\n            tokenProgram: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n        })\n        .instruction();\n\n    await ctx.sendInstruction(createIx, [authority]);\n\n    return { attestationMintPda, attestationPda, authority, credentialPda, recipientTokenAccount, sasPda };\n}\n\ndescribe('SAS: closeTokenizedAttestation', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext({ defaultPrograms: true });\n        loadSasProgram(ctx);\n    });\n\n    test('should close a tokenized attestation', async () => {\n        const { attestationMintPda, attestationPda, authority, credentialPda, recipientTokenAccount, sasPda } =\n            await createTokenizedAttestationSetup(ctx);\n        const eventAuthority = await deriveEventAuthorityAddress();\n\n        const expectedAccounts = [\n            authority,\n            authority,\n            credentialPda,\n            attestationPda,\n            eventAuthority,\n            ctx.SYSTEM_PROGRAM_ADDRESS,\n            programClient.programAddress,\n            attestationMintPda,\n            sasPda,\n            recipientTokenAccount,\n            ctx.TOKEN_2022_PROGRAM_ADDRESS,\n        ];\n\n        const ix = await programClient.methods\n            .closeTokenizedAttestation()\n            .accounts({\n                attestation: attestationPda,\n                attestationMint: attestationMintPda,\n                attestationProgram: programClient.programAddress,\n                attestationTokenAccount: recipientTokenAccount,\n                authority,\n                credential: credentialPda,\n                eventAuthority,\n                payer: authority,\n                sasPda,\n                tokenProgram: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n            })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(11);\n        expectedAccounts.forEach((expected, i) => {\n            expect(ix.accounts?.[i].address).eq(expected);\n        });\n        await ctx.sendInstruction(ix, [authority]);\n\n        const account = ctx.fetchEncodedAccount(attestationPda);\n        expect(account).toBeNull();\n    });\n\n    test('should throw AccountError when required account is missing', async () => {\n        const { attestationMintPda, attestationPda, authority, credentialPda, recipientTokenAccount, sasPda } =\n            await createTokenizedAttestationSetup(ctx);\n\n        const eventAuthority = await deriveEventAuthorityAddress();\n\n        await expect(\n            programClient.methods\n                .closeTokenizedAttestation()\n                .accounts({\n                    attestation: attestationPda,\n                    attestationMint: undefined as unknown as Address,\n                    attestationProgram: programClient.programAddress,\n                    attestationTokenAccount: recipientTokenAccount,\n                    authority,\n                    credential: credentialPda,\n                    eventAuthority,\n                    payer: authority,\n                    sasPda,\n                    tokenProgram: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[attestationMint\\]/);\n\n        await expect(\n            programClient.methods\n                .closeTokenizedAttestation()\n                .accounts({\n                    attestation: attestationPda,\n                    attestationMint: attestationMintPda,\n                    attestationProgram: programClient.programAddress,\n                    attestationTokenAccount: undefined as unknown as Address,\n                    authority,\n                    credential: credentialPda,\n                    eventAuthority,\n                    payer: authority,\n                    sasPda,\n                    tokenProgram: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[attestationTokenAccount\\]/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/sas/create-attestation.test.ts",
    "content": "import { type Address } from '@solana/addresses';\nimport { deriveAttestationPda, getAttestationDecoder, serializeAttestationData } from 'sas-lib';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createAttestation, createCredential, createSchema, loadSasProgram, programClient } from './sas-test-utils';\n\ndescribe('SAS: createAttestation', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n        loadSasProgram(ctx);\n    });\n\n    test('should create an attestation with no expiry', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda } = await createSchema(ctx, authority, credentialPda);\n        const nonce = await ctx.createAccount();\n\n        const [attestationPda] = await deriveAttestationPda({ credential: credentialPda, nonce, schema: schemaPda });\n\n        const expectedAccounts = [\n            authority,\n            authority,\n            credentialPda,\n            schemaPda,\n            attestationPda,\n            ctx.SYSTEM_PROGRAM_ADDRESS,\n        ];\n        const ix = await programClient.methods\n            .createAttestation({ data: new Uint8Array([0, 0, 0, 0]), expiry: 0, nonce })\n            .accounts({\n                attestation: attestationPda,\n                authority,\n                credential: credentialPda,\n                payer: authority,\n                schema: schemaPda,\n            })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(6);\n        expectedAccounts.forEach((expected, i) => {\n            expect(ix.accounts?.[i].address).eq(expected);\n        });\n        await ctx.sendInstruction(ix, [authority]);\n\n        const account = ctx.requireEncodedAccount(attestationPda);\n        const attestation = getAttestationDecoder().decode(account.data);\n        expect(attestation.data).toEqual(new Uint8Array([0, 0, 0, 0]));\n        expect(attestation.expiry).toBe(0n);\n    });\n\n    test('should create an attestation with binary data', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda, schema } = await createSchema(ctx, authority, credentialPda);\n        const attestationData = serializeAttestationData(schema, { field1: 'test' });\n\n        const { attestationPda } = await createAttestation(ctx, authority, credentialPda, schemaPda, {\n            data: attestationData,\n        });\n\n        const account = ctx.requireEncodedAccount(attestationPda);\n        const attestation = getAttestationDecoder().decode(account.data);\n        expect(attestation.data).toEqual(new Uint8Array(attestationData));\n        expect(attestation.expiry).toBe(0n);\n    });\n\n    test('should throw AccountError when attestation is missing', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda } = await createSchema(ctx, authority, credentialPda);\n        const nonce = await ctx.createAccount();\n\n        await expect(\n            programClient.methods\n                .createAttestation({ data: new Uint8Array([]), expiry: 0n, nonce })\n                .accounts({\n                    attestation: undefined as unknown as Address,\n                    authority,\n                    credential: credentialPda,\n                    payer: authority,\n                    schema: schemaPda,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[attestation\\]/);\n    });\n\n    test('should throw ArgumentError when nonce is invalid', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda } = await createSchema(ctx, authority, credentialPda);\n        const nonce = await ctx.createAccount();\n        const [attestationPda] = await deriveAttestationPda({ credential: credentialPda, nonce, schema: schemaPda });\n\n        await expect(\n            programClient.methods\n                .createAttestation({\n                    data: new Uint8Array([]),\n                    expiry: 0n,\n                    nonce: 'not-a-valid-address' as unknown as Address,\n                })\n                .accounts({\n                    attestation: attestationPda,\n                    authority,\n                    credential: credentialPda,\n                    payer: authority,\n                    schema: schemaPda,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Invalid argument \"nonce\"/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/sas/create-credential.test.ts",
    "content": "import { type Address } from '@solana/addresses';\nimport { deriveCredentialPda, getCredentialDecoder } from 'sas-lib';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { loadSasProgram, programClient } from './sas-test-utils';\n\ndescribe('SAS: createCredential', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n        loadSasProgram(ctx);\n    });\n\n    test('should create a credential with multiple signers', async () => {\n        const authority = await ctx.createFundedAccount();\n        const signer2 = await ctx.createAccount();\n        const signer3 = await ctx.createAccount();\n        const name = 'MultiSignerCredential';\n\n        const [credentialPda] = await deriveCredentialPda({ authority, name });\n\n        const expectedAccounts = [authority, credentialPda, authority, ctx.SYSTEM_PROGRAM_ADDRESS];\n        const ix = await programClient.methods\n            .createCredential({ name, signers: [authority, signer2, signer3] })\n            .accounts({ authority, credential: credentialPda, payer: authority })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(4);\n        expectedAccounts.forEach((expected, i) => {\n            expect(ix.accounts?.[i].address).eq(expected);\n        });\n        await ctx.sendInstruction(ix, [authority]);\n\n        const account = ctx.requireEncodedAccount(credentialPda);\n        const credential = getCredentialDecoder().decode(account.data);\n\n        expect(credential).toMatchObject({\n            authority,\n            authorizedSigners: [authority, signer2, signer3],\n            name: new Uint8Array(Buffer.from(name)),\n        });\n    });\n\n    test('should throw AccountError when credential is missing', async () => {\n        const authority = await ctx.createFundedAccount();\n\n        await expect(\n            programClient.methods\n                .createCredential({ name: 'Test', signers: [authority] })\n                .accounts({ authority, credential: undefined as unknown as Address, payer: authority })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[credential\\]/);\n    });\n\n    test('should throw ArgumentError when name is missing', async () => {\n        const authority = await ctx.createFundedAccount();\n        const [credentialPda] = await deriveCredentialPda({ authority, name: 'dummy' });\n\n        await expect(\n            programClient.methods\n                .createCredential({ name: undefined as unknown as string, signers: [authority] })\n                .accounts({ authority, credential: credentialPda, payer: authority })\n                .instruction(),\n        ).rejects.toThrow(/Invalid argument \"name\"/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/sas/create-schema.test.ts",
    "content": "import { type Address } from '@solana/addresses';\nimport { getU32Encoder } from '@solana/codecs';\nimport { deriveSchemaPda, getSchemaDecoder } from 'sas-lib';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport {\n    createCredential,\n    loadSasProgram,\n    programClient,\n    SCHEMA_DATA_STRING_TYPE,\n    SCHEMA_DATA_U8_TYPE,\n} from './sas-test-utils';\n\ndescribe('SAS: createSchema', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n        loadSasProgram(ctx);\n    });\n\n    test('should create a schema', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const name = 'FullNameSchema';\n        const [schemaPda] = await deriveSchemaPda({ credential: credentialPda, name, version: 1 });\n\n        const expectedAccounts = [authority, authority, credentialPda, schemaPda, ctx.SYSTEM_PROGRAM_ADDRESS];\n        const ix = await programClient.methods\n            .createSchema({\n                description: 'This is description',\n                fieldNames: ['firstName', 'age', 'lastName'],\n                layout: new Uint8Array([SCHEMA_DATA_STRING_TYPE, SCHEMA_DATA_U8_TYPE, SCHEMA_DATA_STRING_TYPE]),\n                name,\n            })\n            .accounts({ authority, credential: credentialPda, payer: authority, schema: schemaPda })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(5);\n        expectedAccounts.forEach((acc, idx) => {\n            expect(ix.accounts?.[idx].address).toBe(acc);\n        });\n        await ctx.sendInstruction(ix, [authority]);\n\n        const textEncoder = new TextEncoder();\n        const account = ctx.requireEncodedAccount(schemaPda);\n        const schema = getSchemaDecoder().decode(account.data);\n        expect(schema.description).toEqual(textEncoder.encode('This is description'));\n\n        const sizePrefixEncoder = getU32Encoder();\n        expect(schema.fieldNames).toEqual(\n            new Uint8Array([\n                ...sizePrefixEncoder.encode('firstName'.length),\n                ...textEncoder.encode('firstName'),\n                ...sizePrefixEncoder.encode('age'.length),\n                ...textEncoder.encode('age'),\n                ...sizePrefixEncoder.encode('lastName'.length),\n                ...textEncoder.encode('lastName'),\n            ]),\n        );\n        expect(schema.layout).toEqual(\n            new Uint8Array([SCHEMA_DATA_STRING_TYPE, SCHEMA_DATA_U8_TYPE, SCHEMA_DATA_STRING_TYPE]),\n        );\n    });\n\n    test('should throw AccountError when credential is missing', async () => {\n        const authority = await ctx.createFundedAccount();\n        const [schemaPda] = await deriveSchemaPda({ credential: authority, name: 'dummy', version: 1 });\n\n        await expect(\n            programClient.methods\n                .createSchema({ description: '', fieldNames: ['field1'], layout: new Uint8Array([12]), name: 'Test' })\n                .accounts({\n                    authority,\n                    credential: undefined as unknown as Address,\n                    payer: authority,\n                    schema: schemaPda,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[credential\\]/);\n    });\n\n    test('should throw AccountError when schema is missing', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n\n        await expect(\n            programClient.methods\n                .createSchema({ description: '', fieldNames: ['field1'], layout: new Uint8Array([12]), name: 'Test' })\n                .accounts({\n                    authority,\n                    credential: credentialPda,\n                    payer: authority,\n                    schema: undefined as unknown as Address,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[schema\\]/);\n    });\n\n    test('should throw ArgumentError when argument is invalid', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const [schemaPda] = await deriveSchemaPda({ credential: credentialPda, name: 'dummy', version: 1 });\n\n        await expect(\n            programClient.methods\n                .createSchema({\n                    description: '',\n                    fieldNames: ['field1'],\n                    layout: new Uint8Array([12]),\n                    name: undefined as unknown as string,\n                })\n                .accounts({ authority, credential: credentialPda, payer: authority, schema: schemaPda })\n                .instruction(),\n        ).rejects.toThrow(/Invalid argument \"name\"/);\n\n        await expect(\n            programClient.methods\n                .createSchema({\n                    description: '',\n                    fieldNames: { a: 42 } as unknown as string[],\n                    layout: new Uint8Array([12]),\n                    name: '234',\n                })\n                .accounts({ authority, credential: credentialPda, payer: authority, schema: schemaPda })\n                .instruction(),\n        ).rejects.toThrow(/Invalid argument \"fieldNames\"/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/sas/create-tokenized-attestation.test.ts",
    "content": "import { type Address } from '@solana/addresses';\nimport { findAssociatedTokenPda } from '@solana-program/token';\nimport {\n    deriveAttestationMintPda,\n    deriveAttestationPda,\n    getAttestationDecoder,\n    serializeAttestationData,\n} from 'sas-lib';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport {\n    createCredential,\n    createSchema,\n    getAttestationMintSize,\n    loadSasProgram,\n    programClient,\n    tokenizeSchema,\n} from './sas-test-utils';\n\nconst NFT_NAME = 'Test NFT';\nconst NFT_SYMBOL = 'TEST';\nconst NFT_URI = 'https://example.com/metadata.json';\n\ndescribe('SAS: createTokenizedAttestation', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext({ defaultPrograms: true });\n        loadSasProgram(ctx);\n    });\n\n    test('should create a tokenized attestation', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda, schema } = await createSchema(ctx, authority, credentialPda);\n        const attestationData = serializeAttestationData(schema, { field1: 'test' });\n        const { sasPda, schemaMintPda } = await tokenizeSchema(ctx, authority, credentialPda, schemaPda);\n\n        const nonce = await ctx.createAccount();\n        const recipient = await ctx.createFundedAccount();\n        const [attestationPda] = await deriveAttestationPda({ credential: credentialPda, nonce, schema: schemaPda });\n        const [attestationMintPda] = await deriveAttestationMintPda({ attestation: attestationPda });\n\n        const [recipientTokenAccount] = await findAssociatedTokenPda({\n            mint: attestationMintPda,\n            owner: recipient,\n            tokenProgram: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n        });\n\n        const mintAccountSpace = getAttestationMintSize({\n            attestationMint: attestationMintPda,\n            attestationPda,\n            name: NFT_NAME,\n            sasPda,\n            schemaMint: schemaMintPda,\n            schemaPda,\n            symbol: NFT_SYMBOL,\n            uri: NFT_URI,\n        });\n\n        const expectedAccounts = [\n            authority,\n            authority,\n            credentialPda,\n            schemaPda,\n            attestationPda,\n            ctx.SYSTEM_PROGRAM_ADDRESS,\n            schemaMintPda,\n            attestationMintPda,\n            sasPda,\n            recipientTokenAccount,\n            recipient,\n            ctx.TOKEN_2022_PROGRAM_ADDRESS,\n            ctx.ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n        ];\n        const ix = await programClient.methods\n            .createTokenizedAttestation({\n                data: attestationData,\n                expiry: 0,\n                mintAccountSpace,\n                name: NFT_NAME,\n                nonce,\n                symbol: NFT_SYMBOL,\n                uri: NFT_URI,\n            })\n            .accounts({\n                associatedTokenProgram: ctx.ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n                attestation: attestationPda,\n                attestationMint: attestationMintPda,\n                authority,\n                credential: credentialPda,\n                payer: authority,\n                recipient,\n                recipientTokenAccount,\n                sasPda,\n                schema: schemaPda,\n                schemaMint: schemaMintPda,\n                tokenProgram: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n            })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(13);\n        expectedAccounts.forEach((expected, i) => {\n            expect(ix.accounts?.[i].address).eq(expected);\n        });\n\n        await ctx.sendInstruction(ix, [authority]);\n\n        const account = ctx.requireEncodedAccount(attestationPda);\n        const attestation = getAttestationDecoder().decode(account.data);\n        expect(attestation).toMatchObject({\n            credential: credentialPda,\n            data: new Uint8Array(attestationData),\n            discriminator: 2,\n            expiry: 0n,\n            schema: schemaPda,\n        });\n    });\n\n    test('should throw AccountError when schemaMint is missing', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda } = await createSchema(ctx, authority, credentialPda);\n        const { sasPda } = await tokenizeSchema(ctx, authority, credentialPda, schemaPda);\n\n        const nonce = await ctx.createAccount();\n        const recipient = await ctx.createFundedAccount();\n        const [attestationPda] = await deriveAttestationPda({ credential: credentialPda, nonce, schema: schemaPda });\n        const [attestationMintPda] = await deriveAttestationMintPda({ attestation: attestationPda });\n\n        const [recipientTokenAccount] = await findAssociatedTokenPda({\n            mint: attestationMintPda,\n            owner: recipient,\n            tokenProgram: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n        });\n\n        await expect(\n            programClient.methods\n                .createTokenizedAttestation({\n                    data: new Uint8Array([]),\n                    expiry: 0n,\n                    mintAccountSpace: 234,\n                    name: NFT_NAME,\n                    nonce,\n                    symbol: NFT_SYMBOL,\n                    uri: NFT_URI,\n                })\n                .accounts({\n                    associatedTokenProgram: ctx.ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n                    attestation: attestationPda,\n                    attestationMint: attestationMintPda,\n                    authority,\n                    credential: credentialPda,\n                    payer: authority,\n                    recipient,\n                    recipientTokenAccount,\n                    sasPda,\n                    schema: schemaPda,\n                    schemaMint: undefined as unknown as Address,\n                    tokenProgram: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[schemaMint\\]/);\n    });\n\n    test('should throw error with invalid argument', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda } = await createSchema(ctx, authority, credentialPda);\n        const { sasPda } = await tokenizeSchema(ctx, authority, credentialPda, schemaPda);\n\n        const nonce = await ctx.createAccount();\n        const recipient = await ctx.createFundedAccount();\n        const [attestationPda] = await deriveAttestationPda({ credential: credentialPda, nonce, schema: schemaPda });\n        const [attestationMintPda] = await deriveAttestationMintPda({ attestation: attestationPda });\n\n        const [recipientTokenAccount] = await findAssociatedTokenPda({\n            mint: attestationMintPda,\n            owner: recipient,\n            tokenProgram: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n        });\n\n        await expect(\n            programClient.methods\n                .createTokenizedAttestation({\n                    data: { a: 42 } as unknown as Uint8Array,\n                    expiry: 0n,\n                    mintAccountSpace: 234,\n                    name: NFT_NAME,\n                    nonce,\n                    symbol: NFT_SYMBOL,\n                    uri: NFT_URI,\n                })\n                .accounts({\n                    associatedTokenProgram: ctx.ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n                    attestation: attestationPda,\n                    attestationMint: attestationMintPda,\n                    authority,\n                    credential: credentialPda,\n                    payer: authority,\n                    recipient,\n                    recipientTokenAccount,\n                    sasPda,\n                    schema: schemaPda,\n                    schemaMint: undefined as unknown as Address,\n                    tokenProgram: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Invalid argument \"data\"/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/sas/sas-test-utils.ts",
    "content": "import path from 'node:path';\n\nimport { type Address } from '@solana/addresses';\nimport { getMintSize } from '@solana-program/token-2022';\nimport {\n    deriveAttestationPda,\n    deriveCredentialPda,\n    deriveSasAuthorityAddress,\n    deriveSchemaMintPda,\n    deriveSchemaPda,\n    getSchemaDecoder,\n} from 'sas-lib';\n\nimport type { SvmTestContext } from '../../svm-test-context';\nimport type { SolanaAttestationServiceProgramClient } from '../generated/sas-idl-types';\nimport { createTestProgramClient } from '../test-utils';\n\nexport const programClient = createTestProgramClient<SolanaAttestationServiceProgramClient>('sas-idl.json');\n\nexport function loadSasProgram(ctx: SvmTestContext) {\n    const programPath = path.resolve(__dirname, '..', 'dumps', 'sas.so');\n    ctx.loadProgram(programClient.programAddress, programPath);\n}\n\n/**\n * Compute the mint account space needed for TokenizedSchema.\n */\nexport function getSchemaMintSize(sasPda: Address, schemaMint: Address) {\n    return getMintSize([{ __kind: 'GroupPointer', authority: sasPda, groupAddress: schemaMint }]);\n}\n\n/**\n * Compute the mint account space needed for TokenizedAttestation.\n */\nexport function getAttestationMintSize({\n    sasPda,\n    attestationMint,\n    schemaMint,\n    name,\n    symbol,\n    uri,\n    attestationPda,\n    schemaPda,\n}: {\n    attestationMint: Address;\n    attestationPda: Address;\n    name: string;\n    sasPda: Address;\n    schemaMint: Address;\n    schemaPda: Address;\n    symbol: string;\n    uri: string;\n}) {\n    return getMintSize([\n        { __kind: 'GroupMemberPointer', authority: sasPda, memberAddress: attestationMint },\n        { __kind: 'NonTransferable' },\n        { __kind: 'MetadataPointer', authority: sasPda, metadataAddress: attestationMint },\n        { __kind: 'PermanentDelegate', delegate: sasPda },\n        { __kind: 'MintCloseAuthority', closeAuthority: sasPda },\n        {\n            __kind: 'TokenMetadata',\n            additionalMetadata: new Map<string, string>([\n                ['attestation', attestationPda],\n                ['schema', schemaPda],\n            ]),\n            mint: attestationMint,\n            name,\n            symbol,\n            updateAuthority: sasPda,\n            uri,\n        },\n        { __kind: 'TokenGroupMember', group: schemaMint, memberNumber: 1, mint: attestationMint },\n    ]);\n}\n\nexport async function createCredential(ctx: SvmTestContext, opts?: { name?: string; signers?: Address[] }) {\n    const authority = await ctx.createFundedAccount();\n    const name = opts?.name ?? 'TestCredential';\n    const signers = opts?.signers ?? [authority];\n\n    const [credentialPda] = await deriveCredentialPda({ authority, name });\n\n    const ix = await programClient.methods\n        .createCredential({ name, signers })\n        .accounts({ authority, credential: credentialPda, payer: authority })\n        .instruction();\n\n    await ctx.sendInstruction(ix, [authority]);\n\n    return { authority, credentialPda, name };\n}\n\n// https://github.com/solana-foundation/solana-attestation-service/blob/master/program/src/state/schema.rs#L26\nexport const SCHEMA_DATA_STRING_TYPE = 12;\nexport const SCHEMA_DATA_U8_TYPE = 0;\n\n/**\n * Helper function to create a schema.\n * - Derives the schema PDA\n * - Sends the createSchema instruction\n * - Fetches and decodes the created schema account\n */\nexport async function createSchema(\n    ctx: SvmTestContext,\n    authority: Address,\n    credentialPda: Address,\n    opts?: { description?: string; fieldNames?: string[]; layout?: Uint8Array; name?: string; version?: number },\n) {\n    const description = opts?.description ?? '';\n    const fieldNames = opts?.fieldNames ?? ['field1'];\n    const layout = opts?.layout ?? new Uint8Array([SCHEMA_DATA_STRING_TYPE]);\n    const name = opts?.name ?? 'TestSchema';\n    const version = opts?.version ?? 1;\n\n    const [schemaPda] = await deriveSchemaPda({ credential: credentialPda, name, version });\n    const ix = await programClient.methods\n        .createSchema({ description, fieldNames, layout, name })\n        .accounts({ authority, credential: credentialPda, payer: authority, schema: schemaPda })\n        .instruction();\n    await ctx.sendInstruction(ix, [authority]);\n\n    const schemaData = ctx.requireEncodedAccount(schemaPda).data;\n    const schema = getSchemaDecoder().decode(schemaData);\n\n    return { name, schema, schemaData, schemaPda, version };\n}\n\nexport async function createAttestation(\n    ctx: SvmTestContext,\n    authority: Address,\n    credentialPda: Address,\n    schemaPda: Address,\n    opts?: { data?: Uint8Array; expiry?: bigint },\n) {\n    const data = opts?.data ?? new Uint8Array([0, 0, 0, 0]);\n    const expiry = opts?.expiry ?? 0n;\n    const nonce = await ctx.createAccount();\n\n    const [attestationPda] = await deriveAttestationPda({ credential: credentialPda, nonce, schema: schemaPda });\n\n    const ix = await programClient.methods\n        .createAttestation({ data, expiry, nonce })\n        .accounts({\n            attestation: attestationPda,\n            authority,\n            credential: credentialPda,\n            payer: authority,\n            schema: schemaPda,\n        })\n        .instruction();\n\n    await ctx.sendInstruction(ix, [authority]);\n\n    return { attestationPda, nonce };\n}\n\nexport async function tokenizeSchema(\n    ctx: SvmTestContext,\n    authority: Address,\n    credentialPda: Address,\n    schemaPda: Address,\n) {\n    const sasPda = await deriveSasAuthorityAddress();\n    const [schemaMintPda] = await deriveSchemaMintPda({ schema: schemaPda });\n    const maxSize = BigInt(getSchemaMintSize(sasPda, schemaMintPda));\n\n    const ix = await programClient.methods\n        .tokenizeSchema({ maxSize })\n        .accounts({\n            authority,\n            credential: credentialPda,\n            mint: schemaMintPda,\n            payer: authority,\n            sasPda,\n            schema: schemaPda,\n            tokenProgram: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n        })\n        .instruction();\n\n    await ctx.sendInstruction(ix, [authority]);\n\n    return { sasPda, schemaMintPda };\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/sas/tokenize-schema.test.ts",
    "content": "import { type Address } from '@solana/addresses';\nimport { deriveSasAuthorityAddress, deriveSchemaMintPda } from 'sas-lib';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createCredential, createSchema, getSchemaMintSize, loadSasProgram, programClient } from './sas-test-utils';\n\ndescribe('SAS: tokenizeSchema', () => {\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext({ defaultPrograms: true });\n        loadSasProgram(ctx);\n    });\n\n    test('should tokenize a schema and create a mint', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda } = await createSchema(ctx, authority, credentialPda);\n\n        const sasPda = await deriveSasAuthorityAddress();\n        const [schemaMintPda] = await deriveSchemaMintPda({ schema: schemaPda });\n        const maxSize = BigInt(getSchemaMintSize(sasPda, schemaMintPda));\n\n        const expectedAccounts = [\n            authority,\n            authority,\n            credentialPda,\n            schemaPda,\n            schemaMintPda,\n            sasPda,\n            ctx.SYSTEM_PROGRAM_ADDRESS,\n            ctx.TOKEN_2022_PROGRAM_ADDRESS,\n        ];\n        const ix = await programClient.methods\n            .tokenizeSchema({ maxSize })\n            .accounts({\n                authority,\n                credential: credentialPda,\n                mint: schemaMintPda,\n                payer: authority,\n                sasPda,\n                schema: schemaPda,\n                tokenProgram: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n            })\n            .instruction();\n\n        expect(ix.accounts?.length).toBe(8);\n        expectedAccounts.forEach((expected, i) => {\n            if (!ix?.accounts?.[i]) {\n                throw new Error(`Expected instruction accounts to be defined at index ${i}`);\n            }\n            expect(ix.accounts[i].address).eq(expected);\n        });\n\n        await ctx.sendInstruction(ix, [authority]);\n\n        const account = ctx.requireEncodedAccount(schemaMintPda);\n        expect(account).not.toBeNull();\n        expect(account.data.length).greaterThan(0);\n    });\n\n    test('should throw AccountError when mint is missing', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda } = await createSchema(ctx, authority, credentialPda);\n\n        const sasPda = await deriveSasAuthorityAddress();\n        const [schemaMintPda] = await deriveSchemaMintPda({ schema: schemaPda });\n        const maxSize = getSchemaMintSize(sasPda, schemaMintPda); // should work as number\n\n        await expect(\n            programClient.methods\n                .tokenizeSchema({ maxSize })\n                .accounts({\n                    authority,\n                    credential: credentialPda,\n                    mint: undefined as unknown as Address,\n                    payer: authority,\n                    sasPda,\n                    schema: schemaPda,\n                    tokenProgram: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Missing account \\[mint\\]/);\n    });\n\n    test('should throw AccountError when maxSize arg is missing', async () => {\n        const { authority, credentialPda } = await createCredential(ctx);\n        const { schemaPda } = await createSchema(ctx, authority, credentialPda);\n\n        const sasPda = await deriveSasAuthorityAddress();\n        const [schemaMintPda] = await deriveSchemaMintPda({ schema: schemaPda });\n\n        await expect(\n            programClient.methods\n                .tokenizeSchema({ maxSize: 'jondoe' as unknown as bigint })\n                .accounts({\n                    authority,\n                    credential: credentialPda,\n                    mint: schemaMintPda,\n                    payer: authority,\n                    sasPda,\n                    schema: schemaPda,\n                    tokenProgram: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n                })\n                .instruction(),\n        ).rejects.toThrow(/Invalid argument \"maxSize\"/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/system-program/advance-nonce-account.test.ts",
    "content": "import { beforeEach, describe, expect, test } from 'vitest';\n\nimport type { SystemProgramClient } from '../generated/system-program-idl-types';\nimport { createTestProgramClient, SvmTestContext } from '../test-utils';\n\ndescribe('System Program: advanceNonceAccount', () => {\n    const programClient = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n    });\n\n    test('should advance nonce multiple times and work after authority change', async () => {\n        const payer = await ctx.createFundedAccount();\n        const nonceAccount = await ctx.createAccount();\n        const originalAuthority = await ctx.createFundedAccount();\n        const newAuthority = await ctx.createFundedAccount();\n\n        const nonceAccountSpace = 80;\n        const fundingLamports = 10_000_000;\n\n        const createAccountInstruction = await programClient.methods\n            .createAccount({\n                lamports: fundingLamports,\n                programAddress: programClient.programAddress,\n                space: nonceAccountSpace,\n            })\n            .accounts({\n                newAccount: nonceAccount,\n                payer,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(createAccountInstruction, [payer, nonceAccount]);\n\n        const initializeNonceInstruction = await programClient.methods\n            .initializeNonceAccount({\n                nonceAuthority: originalAuthority,\n            })\n            .accounts({\n                nonceAccount,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(initializeNonceInstruction, [payer]);\n\n        const initialData = ctx.requireEncodedAccount(nonceAccount).data;\n\n        ctx.advanceSlots();\n        const advanceNonceInstruction1 = await programClient.methods\n            .advanceNonceAccount()\n            .accounts({\n                nonceAccount,\n                nonceAuthority: originalAuthority,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(advanceNonceInstruction1, [originalAuthority]);\n\n        const dataAfterFirstAdvance = ctx.requireEncodedAccount(nonceAccount).data;\n        expect(dataAfterFirstAdvance).not.toEqual(initialData);\n\n        ctx.advanceSlots();\n        const advanceNonceInstruction2 = await programClient.methods\n            .advanceNonceAccount()\n            .accounts({\n                nonceAccount,\n                nonceAuthority: originalAuthority,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(advanceNonceInstruction2, [originalAuthority]);\n\n        const dataAfterSecondAdvance = ctx.requireEncodedAccount(nonceAccount).data;\n        expect(dataAfterSecondAdvance).not.toEqual(dataAfterFirstAdvance);\n\n        const authorizeNonceInstruction = await programClient.methods\n            .authorizeNonceAccount({\n                newNonceAuthority: newAuthority,\n            })\n            .accounts({\n                nonceAccount,\n                nonceAuthority: originalAuthority,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(authorizeNonceInstruction, [originalAuthority]);\n\n        ctx.advanceSlots();\n        const advanceWithNewAuthority = await programClient.methods\n            .advanceNonceAccount()\n            .accounts({\n                nonceAccount,\n                nonceAuthority: newAuthority,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(advanceWithNewAuthority, [newAuthority]);\n\n        const finalAccount = ctx.requireEncodedAccount(nonceAccount);\n        expect(finalAccount).toMatchObject({\n            executable: false,\n            lamports: BigInt(fundingLamports),\n            owner: programClient.programAddress,\n        });\n        expect(finalAccount.data.length).toBe(nonceAccountSpace);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/system-program/allocate-with-seed.test.ts",
    "content": "import { beforeEach, describe, expect, test } from 'vitest';\n\nimport type { SystemProgramClient } from '../generated/system-program-idl-types';\nimport { createTestProgramClient, SvmTestContext } from '../test-utils';\n\ndescribe('System Program: allocateWithSeed', () => {\n    const programClient = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n    });\n\n    test('should allocate space for a seed-derived account', async () => {\n        const payerAccount = await ctx.createFundedAccount();\n        const baseAccount = await ctx.createFundedAccount();\n\n        const seed = 'storage';\n        const newAccount = await ctx.createAccountWithSeed(baseAccount, seed, programClient.programAddress);\n\n        const fundingLamports = 5_000_000;\n        const createIx = await programClient.methods\n            .createAccountWithSeed({\n                amount: fundingLamports,\n                base: baseAccount,\n                programAddress: programClient.programAddress,\n                seed,\n                space: 0,\n            })\n            .accounts({\n                baseAccount,\n                newAccount,\n                payer: payerAccount,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(createIx, [payerAccount, baseAccount]);\n\n        const space = 96;\n        const allocateIx = await programClient.methods\n            .allocateWithSeed({\n                base: baseAccount,\n                programAddress: programClient.programAddress,\n                seed,\n                space,\n            })\n            .accounts({\n                baseAccount,\n                newAccount,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(allocateIx, [baseAccount]);\n\n        const accountAfter = ctx.requireEncodedAccount(newAccount);\n\n        expect(accountAfter).toMatchObject({\n            data: new Uint8Array(space),\n            owner: programClient.programAddress,\n        });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/system-program/allocate.test.ts",
    "content": "import { beforeEach, describe, expect, test } from 'vitest';\n\nimport type { SystemProgramClient } from '../generated/system-program-idl-types';\nimport { createTestProgramClient, SvmTestContext } from '../test-utils';\n\ndescribe('System Program: allocate', () => {\n    const programClient = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n    });\n\n    test('should allocate space for an account', async () => {\n        const account = await ctx.createFundedAccount();\n        const space = 100;\n\n        const accountBefore = ctx.requireEncodedAccount(account);\n        expect(accountBefore.data.length).toBe(0);\n\n        const instruction = await programClient.methods\n            .allocate({ space })\n            .accounts({ newAccount: account })\n            .instruction();\n\n        await ctx.sendInstruction(instruction, [account]);\n\n        const accountAfter = ctx.requireEncodedAccount(account);\n\n        expect(accountAfter).toMatchObject({\n            owner: programClient.programAddress,\n        });\n        expect(accountAfter.data.length).toBe(space);\n        expect(accountAfter.lamports).toBeLessThan(accountBefore.lamports);\n        expect(accountAfter.data.every(byte => byte === 0)).toBe(true);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/system-program/assign-with-seed.test.ts",
    "content": "import { beforeEach, describe, expect, test } from 'vitest';\n\nimport type { SystemProgramClient } from '../generated/system-program-idl-types';\nimport { createTestProgramClient, SvmTestContext } from '../test-utils';\n\ndescribe('System Program: assignWithSeed', () => {\n    const programClient = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n    });\n\n    test('should assign seed-derived account to system program', async () => {\n        const payerAccount = await ctx.createFundedAccount();\n        const baseAccount = await ctx.createFundedAccount();\n\n        const seed = 'wallet';\n        const account = await ctx.createAccountWithSeed(baseAccount, seed, programClient.programAddress);\n\n        const createIx = await programClient.methods\n            .createAccountWithSeed({\n                amount: 5_000_000,\n                base: baseAccount,\n                programAddress: programClient.programAddress,\n                seed,\n                space: 32,\n            })\n            .accounts({\n                baseAccount,\n                newAccount: account,\n                payer: payerAccount,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(createIx, [payerAccount, baseAccount]);\n\n        const assignIx = await programClient.methods\n            .assignWithSeed({\n                base: baseAccount,\n                programAddress: programClient.programAddress,\n                seed,\n            })\n            .accounts({\n                account,\n                baseAccount,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(assignIx, [baseAccount]);\n\n        expect(ctx.requireEncodedAccount(account)).toMatchObject({\n            owner: programClient.programAddress,\n        });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/system-program/assign.test.ts",
    "content": "import { beforeEach, describe, expect, test } from 'vitest';\n\nimport type { SystemProgramClient } from '../generated/system-program-idl-types';\nimport { createTestProgramClient, SvmTestContext } from '../test-utils';\n\ndescribe('System Program: assign', () => {\n    const programClient = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n    });\n\n    test('should assign a new owner to an account', async () => {\n        const payer = await ctx.createFundedAccount();\n        const accountToAssign = await ctx.createAccount();\n        const newOwner = await ctx.createAccount();\n        const amount = 1_000_000;\n\n        const transferInstruction = await programClient.methods\n            .transferSol({ amount })\n            .accounts({\n                destination: accountToAssign,\n                source: payer,\n            })\n            .instruction();\n\n        const assignInstruction = await programClient.methods\n            .assign({ programAddress: newOwner })\n            .accounts({ account: accountToAssign })\n            .instruction();\n\n        await ctx.sendInstructions([transferInstruction, assignInstruction], [payer, accountToAssign]);\n\n        expect(ctx.requireEncodedAccount(accountToAssign)).toMatchObject({\n            lamports: BigInt(amount),\n            owner: newOwner,\n        });\n    });\n\n    test('should assign account to system program', async () => {\n        const account = await ctx.createFundedAccount();\n\n        const instruction = await programClient.methods\n            .assign({ programAddress: programClient.programAddress })\n            .accounts({ account: account })\n            .instruction();\n\n        await ctx.sendInstruction(instruction, [account]);\n\n        const encodedAccount = ctx.requireEncodedAccount(account);\n        expect(encodedAccount).toMatchObject({\n            owner: programClient.programAddress,\n        });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/system-program/authorize-nonce-account.test.ts",
    "content": "import { beforeEach, describe, expect, test } from 'vitest';\n\nimport type { SystemProgramClient } from '../generated/system-program-idl-types';\nimport { createTestProgramClient, SvmTestContext } from '../test-utils';\n\ndescribe('System Program: authorizeNonceAccount', () => {\n    const programClient = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n    });\n\n    test('should change nonce account authority to a new authority', async () => {\n        const payer = await ctx.createFundedAccount();\n        const nonceAccount = await ctx.createAccount();\n        const originalAuthority = await ctx.createFundedAccount();\n        const newAuthority = await ctx.createAccount();\n\n        const nonceAccountSpace = 80;\n        const fundingLamports = 10_000_000;\n\n        const createAccountInstruction = await programClient.methods\n            .createAccount({\n                lamports: fundingLamports,\n                programAddress: programClient.programAddress,\n                space: nonceAccountSpace,\n            })\n            .accounts({\n                newAccount: nonceAccount,\n                payer,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(createAccountInstruction, [payer, nonceAccount]);\n\n        const initializeNonceInstruction = await programClient.methods\n            .initializeNonceAccount({\n                nonceAuthority: originalAuthority,\n            })\n            .accounts({\n                nonceAccount,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(initializeNonceInstruction, [payer]);\n\n        const initializedAccount = ctx.requireEncodedAccount(nonceAccount);\n        expect(initializedAccount).toMatchObject({\n            executable: false,\n            lamports: BigInt(fundingLamports),\n            owner: programClient.programAddress,\n        });\n\n        const authorizeNonceInstruction = await programClient.methods\n            .authorizeNonceAccount({\n                newNonceAuthority: newAuthority,\n            })\n            .accounts({\n                nonceAccount,\n                nonceAuthority: originalAuthority,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(authorizeNonceInstruction, [originalAuthority]);\n\n        const authorizedAccount = ctx.requireEncodedAccount(nonceAccount);\n        expect(authorizedAccount).toMatchObject({\n            executable: false,\n            lamports: BigInt(fundingLamports),\n            owner: programClient.programAddress,\n        });\n        expect(authorizedAccount.data.length).toBe(nonceAccountSpace);\n    });\n\n    test('should allow changing authority multiple times', async () => {\n        const payer = await ctx.createFundedAccount();\n        const nonceAccount = await ctx.createAccount();\n        const firstAuthority = await ctx.createFundedAccount();\n        const secondAuthority = await ctx.createFundedAccount();\n        const thirdAuthority = await ctx.createAccount();\n\n        const nonceAccountSpace = 80;\n        const fundingLamports = 10_000_000;\n\n        const createAccountInstruction = await programClient.methods\n            .createAccount({\n                lamports: fundingLamports,\n                programAddress: programClient.programAddress,\n                space: nonceAccountSpace,\n            })\n            .accounts({\n                newAccount: nonceAccount,\n                payer,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(createAccountInstruction, [payer, nonceAccount]);\n\n        const initializeNonceInstruction = await programClient.methods\n            .initializeNonceAccount({\n                nonceAuthority: firstAuthority,\n            })\n            .accounts({\n                nonceAccount,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(initializeNonceInstruction, [payer]);\n\n        const authorizeToSecondInstruction = await programClient.methods\n            .authorizeNonceAccount({\n                newNonceAuthority: secondAuthority,\n            })\n            .accounts({\n                nonceAccount,\n                nonceAuthority: firstAuthority,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(authorizeToSecondInstruction, [firstAuthority]);\n\n        const authorizeToThirdInstruction = await programClient.methods\n            .authorizeNonceAccount({\n                newNonceAuthority: thirdAuthority,\n            })\n            .accounts({\n                nonceAccount,\n                nonceAuthority: secondAuthority,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(authorizeToThirdInstruction, [secondAuthority]);\n\n        const finalAccount = ctx.requireEncodedAccount(nonceAccount);\n        expect(finalAccount).toMatchObject({\n            executable: false,\n            lamports: BigInt(fundingLamports),\n            owner: programClient.programAddress,\n        });\n        expect(finalAccount.data.length).toBe(nonceAccountSpace);\n    });\n\n    test('should work when authority transfers to itself (no-op transfer)', async () => {\n        const payer = await ctx.createFundedAccount();\n        const nonceAccount = await ctx.createAccount();\n        const authority = await ctx.createFundedAccount();\n\n        const nonceAccountSpace = 80;\n        const fundingLamports = 10_000_000;\n\n        const createAccountInstruction = await programClient.methods\n            .createAccount({\n                lamports: fundingLamports,\n                programAddress: programClient.programAddress,\n                space: nonceAccountSpace,\n            })\n            .accounts({\n                newAccount: nonceAccount,\n                payer,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(createAccountInstruction, [payer, nonceAccount]);\n\n        const initializeNonceInstruction = await programClient.methods\n            .initializeNonceAccount({\n                nonceAuthority: authority,\n            })\n            .accounts({\n                nonceAccount,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(initializeNonceInstruction, [payer]);\n\n        const authorizeInstruction = await programClient.methods\n            .authorizeNonceAccount({\n                newNonceAuthority: authority,\n            })\n            .accounts({\n                nonceAccount,\n                nonceAuthority: authority,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(authorizeInstruction, [authority]);\n\n        const finalAccount = ctx.requireEncodedAccount(nonceAccount);\n        expect(finalAccount).toMatchObject({\n            executable: false,\n            lamports: BigInt(fundingLamports),\n            owner: programClient.programAddress,\n        });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/system-program/create-account-with-seed.test.ts",
    "content": "import { beforeEach, describe, expect, test } from 'vitest';\n\nimport type { SystemProgramClient } from '../generated/system-program-idl-types';\nimport { createTestProgramClient, SvmTestContext } from '../test-utils';\n\ndescribe('System Program: createAccountWithSeed', () => {\n    const programClient = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n    });\n\n    test('should create a new account at a seed-derived address', async () => {\n        const payerAccount = await ctx.createFundedAccount();\n        const baseAccount = await ctx.createFundedAccount();\n\n        const seed = 'vault';\n        const newAccount = await ctx.createAccountWithSeed(baseAccount, seed, programClient.programAddress);\n\n        const accountSpace = 64;\n        const fundingLamports = 5_000_000;\n\n        const createAccountWithSeedInstruction = await programClient.methods\n            .createAccountWithSeed({\n                amount: fundingLamports,\n                base: baseAccount,\n                programAddress: programClient.programAddress,\n                seed,\n                space: accountSpace,\n            })\n            .accounts({\n                baseAccount,\n                newAccount,\n                payer: payerAccount,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(createAccountWithSeedInstruction, [payerAccount, baseAccount]);\n\n        const createdAccount = ctx.requireEncodedAccount(newAccount);\n\n        expect(createdAccount).toMatchObject({\n            data: new Uint8Array(accountSpace),\n            executable: false,\n            lamports: BigInt(fundingLamports),\n            owner: programClient.programAddress,\n        });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/system-program/create-account.test.ts",
    "content": "import { beforeEach, describe, expect, test } from 'vitest';\n\nimport type { SystemProgramClient } from '../generated/system-program-idl-types';\nimport { createTestProgramClient, SvmTestContext } from '../test-utils';\n\ndescribe('System Program: createAccount', () => {\n    const programClient = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n    });\n\n    test('should create a new account with specified space and lamports', async () => {\n        const payerAccount = await ctx.createFundedAccount();\n        const newAccountAddress = await ctx.createAccount();\n\n        const accountSpace = 165;\n        const fundingLamports = 10_000_000;\n\n        const createAccountInstruction = await programClient.methods\n            .createAccount({\n                lamports: fundingLamports,\n                programAddress: programClient.programAddress,\n                space: accountSpace,\n            })\n            .accounts({\n                newAccount: newAccountAddress,\n                payer: payerAccount,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(createAccountInstruction, [payerAccount, newAccountAddress]);\n\n        const createdAccount = ctx.requireEncodedAccount(newAccountAddress);\n\n        expect(createdAccount).toMatchObject({\n            data: new Uint8Array(accountSpace),\n            executable: false,\n            lamports: BigInt(fundingLamports),\n            owner: programClient.programAddress,\n        });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/system-program/initialize-nonce-account.test.ts",
    "content": "import { beforeEach, describe, expect, test } from 'vitest';\n\nimport type { SystemProgramClient } from '../generated/system-program-idl-types';\nimport { createTestProgramClient, SvmTestContext } from '../test-utils';\n\ndescribe('System Program: initializeNonceAccount', () => {\n    const programClient = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n    });\n\n    test('should initialize a nonce account with specified authority', async () => {\n        const payer = await ctx.createFundedAccount();\n        const nonceAccount = await ctx.createAccount();\n        const nonceAuthority = await ctx.createAccount();\n\n        const nonceAccountSpace = 80;\n        const fundingLamports = 10_000_000;\n\n        const createAccountInstruction = await programClient.methods\n            .createAccount({\n                lamports: fundingLamports,\n                programAddress: programClient.programAddress,\n                space: nonceAccountSpace,\n            })\n            .accounts({\n                newAccount: nonceAccount,\n                payer,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(createAccountInstruction, [payer, nonceAccount]);\n\n        const createdAccount = ctx.requireEncodedAccount(nonceAccount);\n        expect(createdAccount.data.length).toBe(nonceAccountSpace);\n\n        const initializeNonceInstruction = await programClient.methods\n            .initializeNonceAccount({\n                nonceAuthority,\n            })\n            .accounts({\n                nonceAccount,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(initializeNonceInstruction, [payer]);\n\n        const initializedAccount = ctx.requireEncodedAccount(nonceAccount);\n\n        expect(initializedAccount).toMatchObject({\n            executable: false,\n            lamports: BigInt(fundingLamports),\n            owner: programClient.programAddress,\n        });\n        expect(initializedAccount.data.length).toBe(nonceAccountSpace);\n        expect(initializedAccount.data.some(byte => byte !== 0)).toBe(true);\n    });\n\n    test('should initialize a nonce account where authority is also the payer', async () => {\n        const payerAndAuthority = await ctx.createFundedAccount();\n        const nonceAccount = await ctx.createAccount();\n\n        const nonceAccountSpace = 80;\n        const fundingLamports = 5_000_000;\n\n        const createAccountInstruction = await programClient.methods\n            .createAccount({\n                lamports: fundingLamports,\n                programAddress: programClient.programAddress,\n                space: nonceAccountSpace,\n            })\n            .accounts({\n                newAccount: nonceAccount,\n                payer: payerAndAuthority,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(createAccountInstruction, [payerAndAuthority, nonceAccount]);\n\n        const initializeNonceInstruction = await programClient.methods\n            .initializeNonceAccount({\n                nonceAuthority: payerAndAuthority,\n            })\n            .accounts({\n                nonceAccount,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(initializeNonceInstruction, [payerAndAuthority]);\n\n        const initializedAccount = ctx.requireEncodedAccount(nonceAccount);\n\n        expect(initializedAccount).toMatchObject({\n            executable: false,\n            lamports: BigInt(fundingLamports),\n            owner: programClient.programAddress,\n        });\n        expect(initializedAccount.data.length).toBe(nonceAccountSpace);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/system-program/transfer-sol-with-seed.test.ts",
    "content": "import { beforeEach, describe, expect, test } from 'vitest';\n\nimport type { SystemProgramClient } from '../generated/system-program-idl-types';\nimport { createTestProgramClient, SvmTestContext } from '../test-utils';\n\ndescribe('System Program: transferSolWithSeed', () => {\n    const programClient = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n    });\n\n    test('should transfer SOL from a seed-derived account to a destination', async () => {\n        const payerAccount = await ctx.createFundedAccount();\n        const baseAccount = await ctx.createFundedAccount();\n\n        const seed = 'vault';\n        const source = await ctx.createAccountWithSeed(baseAccount, seed, programClient.programAddress);\n\n        const fundingLamports = 10_000_000;\n        const createIx = await programClient.methods\n            .createAccountWithSeed({\n                amount: fundingLamports,\n                base: baseAccount,\n                programAddress: programClient.programAddress,\n                seed,\n                space: 0,\n            })\n            .accounts({\n                baseAccount,\n                newAccount: source,\n                payer: payerAccount,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(createIx, [payerAccount, baseAccount]);\n\n        const destination = await ctx.createAccount();\n        const transferAmount = 3_000_000;\n\n        expect(ctx.requireEncodedAccount(source).lamports).toBe(BigInt(fundingLamports));\n        expect(ctx.fetchEncodedAccount(destination)).toBeNull();\n\n        const transferIx = await programClient.methods\n            .transferSolWithSeed({\n                amount: transferAmount,\n                fromOwner: programClient.programAddress,\n                fromSeed: seed,\n            })\n            .accounts({\n                baseAccount,\n                destination,\n                source,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(transferIx, [baseAccount]);\n\n        const sourceAfter = ctx.requireEncodedAccount(source);\n        const destinationAfter = ctx.requireEncodedAccount(destination);\n\n        expect(sourceAfter.lamports).toBe(BigInt(fundingLamports) - BigInt(transferAmount));\n        expect(destinationAfter.lamports).toBe(BigInt(transferAmount));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/system-program/transfer-sol.test.ts",
    "content": "import { beforeEach, describe, expect, test } from 'vitest';\n\nimport type { SystemProgramClient } from '../generated/system-program-idl-types';\nimport { createTestProgramClient, SvmTestContext } from '../test-utils';\n\ndescribe('System Program: transferSol', () => {\n    const programClient = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n    });\n\n    test('should transfer SOL from one account to another', async () => {\n        const initialSourceBalance = 3_000_000_000;\n        const source = await ctx.createFundedAccount(BigInt(initialSourceBalance));\n        const destination = await ctx.createAccount();\n        const transferAmount = 1_000_000_000;\n\n        expect(ctx.fetchEncodedAccount(source)).toMatchObject({\n            lamports: BigInt(initialSourceBalance),\n        });\n        expect(ctx.fetchEncodedAccount(destination)).toBeNull();\n\n        const instruction = await programClient.methods\n            .transferSol({ amount: transferAmount })\n            .accounts({ destination, source })\n            .instruction();\n\n        await ctx.sendInstruction(instruction, [source]);\n\n        const sourceAccount = ctx.requireEncodedAccount(source);\n        expect(sourceAccount.lamports).toBeLessThan(BigInt(initialSourceBalance) - BigInt(transferAmount));\n        const destinationAccount = ctx.requireEncodedAccount(destination);\n        expect(destinationAccount.lamports).toBe(BigInt(transferAmount));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/system-program/upgrade-nonce-account.test.ts",
    "content": "import { beforeEach, describe, expect, test } from 'vitest';\n\nimport type { SystemProgramClient } from '../generated/system-program-idl-types';\nimport { createTestProgramClient, SvmTestContext } from '../test-utils';\n\n/**\n *\n * NOTE: This instruction only works on LEGACY nonce accounts (created before\n * the version field was added). When we create new nonce accounts with\n * initializeNonceAccount, they are already in the CURRENT format, so calling\n * upgradeNonceAccount on them will fail with \"InvalidArgument\".\n *\n * These tests verify that the instruction can be built correctly, but cannot\n * test the actual upgrade behavior since we cannot easily create legacy nonce\n * accounts in the test environment.\n */\ndescribe('System Program: upgradeNonceAccount', () => {\n    const programClient = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n    });\n\n    test('smoke: should build upgrade nonce account instruction correctly', async () => {\n        const nonceAccount = await ctx.createAccount();\n\n        const upgradeNonceInstruction = await programClient.methods\n            .upgradeNonceAccount()\n            .accounts({\n                nonceAccount,\n            })\n            .instruction();\n\n        expect(upgradeNonceInstruction).toBeDefined();\n        expect(upgradeNonceInstruction.programAddress).toBe(programClient.programAddress);\n        expect(upgradeNonceInstruction.accounts).toBeDefined();\n        expect(upgradeNonceInstruction.data).toBeDefined();\n\n        expect(upgradeNonceInstruction.accounts?.length).toBe(1);\n\n        const nonceAccountMeta = upgradeNonceInstruction.accounts?.[0];\n        expect(nonceAccountMeta?.address).toBe(nonceAccount);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/system-program/withdraw-nonce-account.test.ts",
    "content": "import { beforeEach, describe, expect, test } from 'vitest';\n\nimport type { SystemProgramClient } from '../generated/system-program-idl-types';\nimport { createTestProgramClient, SvmTestContext } from '../test-utils';\n\ndescribe('System Program: withdrawNonceAccount', () => {\n    const programClient = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n    let ctx: SvmTestContext;\n\n    beforeEach(() => {\n        ctx = new SvmTestContext();\n    });\n\n    test('should withdraw lamports from nonce account to recipient', async () => {\n        const payer = await ctx.createFundedAccount();\n        const nonceAccount = await ctx.createAccount();\n        const nonceAuthority = await ctx.createFundedAccount();\n        const recipient = await ctx.createAccount();\n\n        const nonceAccountSpace = 80;\n        const fundingLamports = 10_000_000;\n        const withdrawAmount = 2_000_000;\n\n        const createAccountInstruction = await programClient.methods\n            .createAccount({\n                lamports: fundingLamports,\n                programAddress: programClient.programAddress,\n                space: nonceAccountSpace,\n            })\n            .accounts({\n                newAccount: nonceAccount,\n                payer,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(createAccountInstruction, [payer, nonceAccount]);\n\n        const initializeNonceInstruction = await programClient.methods\n            .initializeNonceAccount({\n                nonceAuthority,\n            })\n            .accounts({\n                nonceAccount,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(initializeNonceInstruction, [payer]);\n\n        const beforeWithdraw = ctx.requireEncodedAccount(nonceAccount);\n        expect(beforeWithdraw.lamports).toBe(BigInt(fundingLamports));\n\n        const withdrawInstruction = await programClient.methods\n            .withdrawNonceAccount({\n                withdrawAmount,\n            })\n            .accounts({\n                nonceAccount,\n                nonceAuthority,\n                recipientAccount: recipient,\n            })\n            .instruction();\n\n        await ctx.sendInstruction(withdrawInstruction, [nonceAuthority]);\n\n        const afterWithdrawNonce = ctx.requireEncodedAccount(nonceAccount);\n        expect(afterWithdrawNonce.lamports).toBe(BigInt(fundingLamports - withdrawAmount));\n\n        const recipientAccount = ctx.requireEncodedAccount(recipient);\n        expect(recipientAccount.lamports).toBe(BigInt(withdrawAmount));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/test-utils.ts",
    "content": "import { readFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { createFromJson, type RootNode } from 'codama';\n\nimport type { IdlInput, ProgramClient } from '../../src';\nimport { createProgramClient } from '../../src';\n\nexport function loadIdl(idlFileName: string, baseDir?: string): IdlInput {\n    const basePath = baseDir ?? path.resolve(__dirname, 'idls');\n    const idlPath = path.resolve(basePath, idlFileName);\n    const idlJson: unknown = JSON.parse(readFileSync(idlPath, 'utf8'));\n    if (typeof idlJson !== 'object' || idlJson === null) {\n        throw new Error(`Invalid IDL json: ${idlFileName}`);\n    }\n    return idlJson as IdlInput;\n}\n\n/**\n * Creates a program client for tests. Pass a generated client type for full type safety:\n * ```ts\n * import type { SystemProgramClient } from '../generated/system-program-idl-types';\n * const client = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n * // client.methods.advanceNonceAccount etc. are now typed, no non-null assertions needed\n * ```\n */\nexport function createTestProgramClient<T = ProgramClient>(idlFileName: string): T {\n    const idl = loadIdl(idlFileName);\n    return createProgramClient<T>(idl);\n}\n\nexport function loadRoot(idlFileName: string): RootNode {\n    const idl = loadIdl(idlFileName);\n    const json = JSON.stringify(idl);\n    return createFromJson(json).getRoot();\n}\n\nexport { SvmTestContext, type EncodedAccount } from '../svm-test-context';\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/amount-to-ui-amount.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: amountToUiAmount', () => {\n    test('should convert a token amount to its UI representation', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n\n        const ix = await tokenClient.methods\n            .amountToUiAmount({ amount: 1_000_000_000 })\n            .accounts({ mint: mintAccount })\n            .instruction();\n\n        const meta = await ctx.sendInstruction(ix, [payer]);\n        const returnData = meta.returnData();\n        const uiAmount = new TextDecoder().decode(returnData.data());\n        expect(uiAmount).toBe('1');\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/approve-checked.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: approveChecked', () => {\n    test('should approve a delegate with mint and decimals verification', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const sourceAccount = await ctx.createAccount();\n        const delegate = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, sourceAccount, mintAccount, payer);\n\n        const mintIx = await tokenClient.methods\n            .mintTo({ amount: 1_000_000 })\n            .accounts({ mint: mintAccount, mintAuthority: payer, token: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(mintIx, [payer]);\n\n        const ix = await tokenClient.methods\n            .approveChecked({ amount: 500_000, decimals: 9 })\n            .accounts({ delegate, mint: mintAccount, owner: payer, source: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const decoder = getTokenDecoder();\n        const sourceData = decoder.decode(ctx.requireEncodedAccount(sourceAccount).data);\n        expect(sourceData.delegate).toStrictEqual({ __option: 'Some', value: delegate });\n        expect(sourceData.delegatedAmount).toBe(500_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/approve.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, SPL_TOKEN_MULTISIG_SIZE, systemClient, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: approve', () => {\n    test('should approve a delegate for a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const sourceAccount = await ctx.createAccount();\n        const delegate = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, sourceAccount, mintAccount, payer);\n\n        const mintIx = await tokenClient.methods\n            .mintTo({ amount: 1_000_000 })\n            .accounts({ mint: mintAccount, mintAuthority: payer, token: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(mintIx, [payer]);\n\n        const ix = await tokenClient.methods\n            .approve({ amount: 500_000 })\n            .accounts({ delegate, owner: payer, source: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const decoder = getTokenDecoder();\n        const sourceData = decoder.decode(ctx.requireEncodedAccount(sourceAccount).data);\n        expect(sourceData.delegate).toStrictEqual({ __option: 'Some', value: delegate });\n        expect(sourceData.delegatedAmount).toBe(500_000n);\n    });\n\n    test('should approve with multisig', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const sourceAccount = await ctx.createAccount();\n        const delegate = await ctx.createAccount();\n        const multisigOwner = await ctx.createAccount();\n\n        // Create mints\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, sourceAccount, mintAccount, multisigOwner);\n\n        const mintIx = await tokenClient.methods\n            .mintTo({ amount: 1_000_000 })\n            .accounts({ mint: mintAccount, mintAuthority: payer, token: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(mintIx, [payer]);\n\n        // Create multisignature owner\n        const signer1 = await ctx.createAccount();\n        const signer2 = await ctx.createAccount();\n        const signer3 = await ctx.createAccount();\n\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(SPL_TOKEN_MULTISIG_SIZE));\n        const createAccountIx = await systemClient.methods\n            .createAccount({\n                lamports,\n                programAddress: tokenClient.programAddress,\n                space: SPL_TOKEN_MULTISIG_SIZE,\n            })\n            .accounts({ newAccount: multisigOwner, payer })\n            .instruction();\n\n        const initMultisigIx = await tokenClient.methods\n            .initializeMultisig({ m: 2, signers: [signer1, signer2, signer3] })\n            .accounts({ multisig: multisigOwner })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initMultisigIx], [payer, multisigOwner]);\n\n        // Approve delegate with multisig owner,\n        // providing signer1 and signer2 without signing by multisigOwner\n        const ix = await tokenClient.methods\n            .approve({ amount: 500_000, multiSigners: [signer1, signer2] })\n            .accounts({ delegate, owner: multisigOwner, source: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer, signer1, signer2]);\n\n        const decoder = getTokenDecoder();\n        const sourceData = decoder.decode(ctx.requireEncodedAccount(sourceAccount).data);\n        expect(sourceData.delegate).toStrictEqual({ __option: 'Some', value: delegate });\n        expect(sourceData.delegatedAmount).toBe(500_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/burn-checked.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: burnChecked', () => {\n    test('should burn tokens with decimals verification', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, tokenAccount, mintAccount, payer);\n\n        const mintIx = await tokenClient.methods\n            .mintTo({ amount: 1_000_000 })\n            .accounts({ mint: mintAccount, mintAuthority: payer, token: tokenAccount })\n            .instruction();\n        await ctx.sendInstruction(mintIx, [payer]);\n\n        const ix = await tokenClient.methods\n            .burnChecked({ amount: 400_000, decimals: 9 })\n            .accounts({ account: tokenAccount, authority: payer, mint: mintAccount })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const decoder = getTokenDecoder();\n        const tokenData = decoder.decode(ctx.requireEncodedAccount(tokenAccount).data);\n        expect(tokenData.amount).toBe(600_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/burn.test.ts",
    "content": "import { getMintDecoder, getTokenDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: burn', () => {\n    test('should burn tokens from a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, tokenAccount, mintAccount, payer);\n\n        // Mint tokens first.\n        const mintIx = await tokenClient.methods\n            .mintTo({ amount: 1_000_000 })\n            .accounts({ mint: mintAccount, mintAuthority: payer, token: tokenAccount })\n            .instruction();\n        await ctx.sendInstruction(mintIx, [payer]);\n\n        // Burn tokens.\n        const burnIx = await tokenClient.methods\n            .burn({ amount: 400_000 })\n            .accounts({ account: tokenAccount, authority: payer, mint: mintAccount })\n            .instruction();\n        await ctx.sendInstruction(burnIx, [payer]);\n\n        // Verify token account balance decreased.\n        const tokenData = getTokenDecoder().decode(ctx.requireEncodedAccount(tokenAccount).data);\n        expect(tokenData.amount).toBe(600_000n);\n\n        // Verify mint supply decreased.\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mintAccount).data);\n        expect(mintData.supply).toBe(600_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/close-account.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: closeAccount', () => {\n    test('should close a token account and transfer lamports to destination', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n        const owner = await ctx.createFundedAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, tokenAccount, mintAccount, owner);\n\n        const destBalanceBefore = ctx.getBalanceOrZero(owner);\n\n        const ix = await tokenClient.methods\n            .closeAccount()\n            .accounts({ account: tokenAccount, destination: owner, owner })\n            .instruction();\n        await ctx.sendInstruction(ix, [owner]);\n\n        expect(ctx.fetchEncodedAccount(tokenAccount)).toBeNull();\n        expect(ctx.getBalanceOrZero(owner)).toBeGreaterThan(destBalanceBefore);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/freeze-account.test.ts",
    "content": "import { AccountState, getTokenDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: freezeAccount', () => {\n    test('should freeze a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n        const freezeAuthority = await ctx.createFundedAccount();\n\n        await createMint(ctx, payer, mintAccount, payer, freezeAuthority);\n        await createTokenAccount(ctx, payer, tokenAccount, mintAccount, payer);\n\n        const freezeIx = await tokenClient.methods\n            .freezeAccount()\n            .accounts({ account: tokenAccount, mint: mintAccount, owner: freezeAuthority })\n            .instruction();\n\n        await ctx.sendInstruction(freezeIx, [freezeAuthority]);\n\n        const account = ctx.requireEncodedAccount(tokenAccount);\n        const tokenData = getTokenDecoder().decode(account.data);\n        expect(tokenData.state).toBe(AccountState.Frozen);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/get-account-data-size.test.ts",
    "content": "import { getU64Decoder } from '@solana/codecs';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, SPL_TOKEN_ACCOUNT_SIZE, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: getAccountDataSize', () => {\n    test('should return the required account size for a given mint', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n\n        const ix = await tokenClient.methods.getAccountDataSize().accounts({ mint: mintAccount }).instruction();\n\n        const meta = await ctx.sendInstruction(ix, [payer]);\n        const size = getU64Decoder().decode(meta.returnData().data());\n        expect(size).toBe(BigInt(SPL_TOKEN_ACCOUNT_SIZE));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/initialize-account.test.ts",
    "content": "import { AccountState, getTokenDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount } from './token-test-utils';\n\ndescribe('Token Program: initializeAccount', () => {\n    test('should initialize a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n        const owner = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, tokenAccount, mintAccount, owner);\n\n        const tokenData = getTokenDecoder().decode(ctx.requireEncodedAccount(tokenAccount).data);\n        expect(tokenData.mint).toBe(mintAccount);\n        expect(tokenData.owner).toBe(owner);\n        expect(tokenData.amount).toBe(0n);\n        expect(tokenData.state).toBe(AccountState.Initialized);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/initialize-account2.test.ts",
    "content": "import { AccountState, getTokenDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, SPL_TOKEN_ACCOUNT_SIZE, systemClient, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: initializeAccount2', () => {\n    test('should initialize a token account with owner passed as instruction data', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n        const owner = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(SPL_TOKEN_ACCOUNT_SIZE));\n        const createAccountIx = await systemClient.methods\n            .createAccount({\n                lamports,\n                programAddress: tokenClient.programAddress,\n                space: SPL_TOKEN_ACCOUNT_SIZE,\n            })\n            .accounts({ newAccount: tokenAccount, payer })\n            .instruction();\n\n        const initAccountIx = await tokenClient.methods\n            .initializeAccount2({ owner })\n            .accounts({ account: tokenAccount, mint: mintAccount })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initAccountIx], [payer, tokenAccount]);\n\n        const decoder = getTokenDecoder();\n        const tokenData = decoder.decode(ctx.requireEncodedAccount(tokenAccount).data);\n        expect(tokenData.mint).toBe(mintAccount);\n        expect(tokenData.owner).toBe(owner);\n        expect(tokenData.state).toBe(AccountState.Initialized);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/initialize-account3.test.ts",
    "content": "import { AccountState, getTokenDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, SPL_TOKEN_ACCOUNT_SIZE, systemClient, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: initializeAccount3', () => {\n    test('should initialize a token account without requiring the Rent sysvar', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n        const owner = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(SPL_TOKEN_ACCOUNT_SIZE));\n        const createAccountIx = await systemClient.methods\n            .createAccount({\n                lamports,\n                programAddress: tokenClient.programAddress,\n                space: SPL_TOKEN_ACCOUNT_SIZE,\n            })\n            .accounts({ newAccount: tokenAccount, payer })\n            .instruction();\n\n        const initAccountIx = await tokenClient.methods\n            .initializeAccount3({ owner })\n            .accounts({ account: tokenAccount, mint: mintAccount })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initAccountIx], [payer, tokenAccount]);\n\n        const decoder = getTokenDecoder();\n        const tokenData = decoder.decode(ctx.requireEncodedAccount(tokenAccount).data);\n        expect(tokenData.mint).toBe(mintAccount);\n        expect(tokenData.owner).toBe(owner);\n        expect(tokenData.state).toBe(AccountState.Initialized);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/initialize-immutable-owner.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, SPL_TOKEN_ACCOUNT_SIZE, systemClient, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: initializeImmutableOwner', () => {\n    test('should initialize immutable owner on a token account before initializeAccount', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n\n        const rent = ctx.getMinimumBalanceForRentExemption(BigInt(SPL_TOKEN_ACCOUNT_SIZE));\n\n        const createAccountIx = await systemClient.methods\n            .createAccount({\n                lamports: rent,\n                programAddress: tokenClient.programAddress,\n                space: SPL_TOKEN_ACCOUNT_SIZE,\n            })\n            .accounts({ newAccount: tokenAccount, payer })\n            .instruction();\n\n        const initImmutableOwnerIx = await tokenClient.methods\n            .initializeImmutableOwner()\n            .accounts({ account: tokenAccount })\n            .instruction();\n\n        const initAccountIx = await tokenClient.methods\n            .initializeAccount()\n            .accounts({ account: tokenAccount, mint: mintAccount, owner: payer })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initImmutableOwnerIx, initAccountIx], [payer, tokenAccount]);\n\n        const account = ctx.requireEncodedAccount(tokenAccount);\n        const tokenData = getTokenDecoder().decode(account.data);\n        expect(tokenData.mint).toBe(mintAccount);\n        expect(tokenData.owner).toBe(payer);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/initialize-mint.test.ts",
    "content": "import { getMintDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { SPL_TOKEN_MINT_SIZE, systemClient, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: initializeMint', () => {\n    test('should initialize a mint with default freeze authority (None)', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n\n        const mintRent = ctx.getMinimumBalanceForRentExemption(BigInt(SPL_TOKEN_MINT_SIZE));\n\n        const createAccountIx = await systemClient.methods\n            .createAccount({\n                lamports: mintRent,\n                programAddress: tokenClient.programAddress,\n                space: SPL_TOKEN_MINT_SIZE,\n            })\n            .accounts({\n                newAccount: mintAccount,\n                payer,\n            })\n            .instruction();\n\n        const initMintIx = await tokenClient.methods\n            .initializeMint({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint: mintAccount })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initMintIx], [payer, mintAccount]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mintAccount).data);\n        expect(mintData.mintAuthority).toEqual({ __option: 'Some', value: payer });\n        expect(mintData.decimals).toBe(9);\n        expect(mintData.supply).toBe(0n);\n        expect(mintData.freezeAuthority).toEqual({ __option: 'None' });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/initialize-mint2.test.ts",
    "content": "import { getMintDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { SPL_TOKEN_MINT_SIZE, systemClient, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: initializeMint2', () => {\n    test('should initialize a mint without requiring the Rent sysvar', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const freezeAuthority = await ctx.createAccount();\n\n        const mintRent = ctx.getMinimumBalanceForRentExemption(BigInt(SPL_TOKEN_MINT_SIZE));\n\n        const createAccountIx = await systemClient.methods\n            .createAccount({\n                lamports: mintRent,\n                programAddress: tokenClient.programAddress,\n                space: SPL_TOKEN_MINT_SIZE,\n            })\n            .accounts({\n                newAccount: mintAccount,\n                payer,\n            })\n            .instruction();\n\n        const initMintIx = await tokenClient.methods\n            .initializeMint2({ decimals: 6, freezeAuthority, mintAuthority: payer })\n            .accounts({ mint: mintAccount })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initMintIx], [payer, mintAccount]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mintAccount).data);\n        expect(mintData.mintAuthority).toEqual({ __option: 'Some', value: payer });\n        expect(mintData.decimals).toBe(6);\n        expect(mintData.supply).toBe(0n);\n        expect(mintData.freezeAuthority).toEqual({ __option: 'Some', value: freezeAuthority });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/initialize-multisig.test.ts",
    "content": "import { getMultisigDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { SPL_TOKEN_MULTISIG_SIZE, systemClient, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: initializeMultisig', () => {\n    test('should initialize a multisig account with 2-of-3 signers', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const multisigAccount = await ctx.createAccount();\n\n        const signer1 = await ctx.createAccount();\n        const signer2 = await ctx.createAccount();\n        const signer3 = await ctx.createAccount();\n\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(SPL_TOKEN_MULTISIG_SIZE));\n        const createAccountIx = await systemClient.methods\n            .createAccount({\n                lamports,\n                programAddress: tokenClient.programAddress,\n                space: SPL_TOKEN_MULTISIG_SIZE,\n            })\n            .accounts({ newAccount: multisigAccount, payer })\n            .instruction();\n\n        const initMultisigIx = await tokenClient.methods\n            .initializeMultisig({ m: 2, signers: [signer1, signer2, signer3] })\n            .accounts({ multisig: multisigAccount })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initMultisigIx], [payer, multisigAccount]);\n\n        const decoder = getMultisigDecoder();\n        const multisigData = decoder.decode(ctx.requireEncodedAccount(multisigAccount).data);\n        expect(multisigData.m).toBe(2);\n        expect(multisigData.n).toBe(3);\n        expect(multisigData.isInitialized).toBe(true);\n        expect(multisigData.signers.slice(0, 3)).toStrictEqual([signer1, signer2, signer3]);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/initialize-multisig2.test.ts",
    "content": "import { getMultisigDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { SPL_TOKEN_MULTISIG_SIZE, systemClient, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: initializeMultisig2', () => {\n    test('should initialize a multisig account without requiring the Rent sysvar', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const multisigAccount = await ctx.createAccount();\n\n        const signer1 = await ctx.createAccount();\n        const signer2 = await ctx.createAccount();\n        const signer3 = await ctx.createAccount();\n\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(SPL_TOKEN_MULTISIG_SIZE));\n        const createAccountIx = await systemClient.methods\n            .createAccount({\n                lamports,\n                programAddress: tokenClient.programAddress,\n                space: SPL_TOKEN_MULTISIG_SIZE,\n            })\n            .accounts({ newAccount: multisigAccount, payer })\n            .instruction();\n\n        const initMultisigIx = await tokenClient.methods\n            .initializeMultisig2({ m: 2, signers: [signer1, signer2, signer3] })\n            .accounts({ multisig: multisigAccount })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initMultisigIx], [payer, multisigAccount]);\n\n        const decoder = getMultisigDecoder();\n        const multisigData = decoder.decode(ctx.requireEncodedAccount(multisigAccount).data);\n        expect(multisigData.m).toBe(2);\n        expect(multisigData.n).toBe(3);\n        expect(multisigData.isInitialized).toBe(true);\n        expect(multisigData.signers.slice(0, 3)).toStrictEqual([signer1, signer2, signer3]);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/mint-to-checked.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: mintToChecked', () => {\n    test('should mint tokens with decimals verification', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, tokenAccount, mintAccount, payer);\n\n        const ix = await tokenClient.methods\n            .mintToChecked({ amount: 1_000_000, decimals: 9 })\n            .accounts({ mint: mintAccount, mintAuthority: payer, token: tokenAccount })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const decoder = getTokenDecoder();\n        const tokenData = decoder.decode(ctx.requireEncodedAccount(tokenAccount).data);\n        expect(tokenData.amount).toBe(1_000_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/mint-to.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: mintTo', () => {\n    test('should mint tokens to a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, tokenAccount, mintAccount, payer);\n\n        const ix = await tokenClient.methods\n            .mintTo({ amount: 1_000_000 })\n            .accounts({ mint: mintAccount, mintAuthority: payer, token: tokenAccount })\n            .instruction();\n\n        await ctx.sendInstruction(ix, [payer]);\n\n        const account = ctx.requireEncodedAccount(tokenAccount);\n        const tokenData = getTokenDecoder().decode(account.data);\n        expect(tokenData.amount).toBe(1_000_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/revoke.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: revoke', () => {\n    test('should revoke a delegate from a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const sourceAccount = await ctx.createAccount();\n        const delegate = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, sourceAccount, mintAccount, payer);\n\n        const mintIx = await tokenClient.methods\n            .mintTo({ amount: 1_000_000 })\n            .accounts({ mint: mintAccount, mintAuthority: payer, token: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(mintIx, [payer]);\n\n        const approveIx = await tokenClient.methods\n            .approve({ amount: 500_000 })\n            .accounts({ delegate, owner: payer, source: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(approveIx, [payer]);\n\n        const ix = await tokenClient.methods.revoke().accounts({ owner: payer, source: sourceAccount }).instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const decoder = getTokenDecoder();\n        const sourceData = decoder.decode(ctx.requireEncodedAccount(sourceAccount).data);\n        expect(sourceData.delegate).toStrictEqual({ __option: 'None' });\n        expect(sourceData.delegatedAmount).toBe(0n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/set-authority.test.ts",
    "content": "import { getMintDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: setAuthority', () => {\n    test('should change the mint authority to a new address', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const newAuthority = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n\n        const ix = await tokenClient.methods\n            .setAuthority({ authorityType: 'mintTokens', newAuthority })\n            .accounts({ owned: mintAccount, owner: payer })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const decoder = getMintDecoder();\n        const mintData = decoder.decode(ctx.requireEncodedAccount(mintAccount).data);\n        expect(mintData.mintAuthority).toStrictEqual({ __option: 'Some', value: newAuthority });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/sync-native.test.ts",
    "content": "import { address } from '@solana/addresses';\nimport { getTokenDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { SPL_TOKEN_ACCOUNT_SIZE, systemClient, tokenClient } from './token-test-utils';\n\nconst NATIVE_MINT = address('So11111111111111111111111111111111111111112');\n\ndescribe('Token Program: syncNative', () => {\n    test('should sync a wrapped SOL account amount with its lamport balance', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const wrappedSolAccount = await ctx.createAccount();\n\n        // Create and initialize a wrapped SOL token account.\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(SPL_TOKEN_ACCOUNT_SIZE));\n        const createAccountIx = await systemClient.methods\n            .createAccount({\n                lamports,\n                programAddress: tokenClient.programAddress,\n                space: SPL_TOKEN_ACCOUNT_SIZE,\n            })\n            .accounts({ newAccount: wrappedSolAccount, payer })\n            .instruction();\n\n        const initAccountIx = await tokenClient.methods\n            .initializeAccount()\n            .accounts({ account: wrappedSolAccount, mint: NATIVE_MINT, owner: payer })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initAccountIx], [payer, wrappedSolAccount]);\n\n        // Transfer additional SOL to the wrapped account via system program.\n        const transferAmount = 1_000_000_000n;\n        const transferIx = await systemClient.methods\n            .transferSol({ amount: transferAmount })\n            .accounts({ destination: wrappedSolAccount, source: payer })\n            .instruction();\n        await ctx.sendInstruction(transferIx, [payer]);\n\n        // Token amount is still 0 before sync.\n        const decoder = getTokenDecoder();\n        const beforeSync = decoder.decode(ctx.requireEncodedAccount(wrappedSolAccount).data);\n        expect(beforeSync.amount).toBe(0n);\n\n        // Sync native to update the token amount.\n        const syncIx = await tokenClient.methods.syncNative().accounts({ account: wrappedSolAccount }).instruction();\n        await ctx.sendInstruction(syncIx, [payer]);\n\n        const afterSync = decoder.decode(ctx.requireEncodedAccount(wrappedSolAccount).data);\n        expect(afterSync.amount).toBe(transferAmount);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/thaw-account.test.ts",
    "content": "import { AccountState, getTokenDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: thawAccount', () => {\n    test('should thaw a frozen account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n        const freezeAuthority = await ctx.createFundedAccount();\n\n        await createMint(ctx, payer, mintAccount, payer, freezeAuthority);\n        await createTokenAccount(ctx, payer, tokenAccount, mintAccount, payer);\n\n        const freezeIx = await tokenClient.methods\n            .freezeAccount()\n            .accounts({ account: tokenAccount, mint: mintAccount, owner: freezeAuthority })\n            .instruction();\n\n        await ctx.sendInstruction(freezeIx, [freezeAuthority]);\n\n        const thawIx = await tokenClient.methods\n            .thawAccount()\n            .accounts({ account: tokenAccount, mint: mintAccount, owner: freezeAuthority })\n            .instruction();\n\n        await ctx.sendInstruction(thawIx, [freezeAuthority]);\n\n        const account = ctx.requireEncodedAccount(tokenAccount);\n        const tokenData = getTokenDecoder().decode(account.data);\n        expect(tokenData.state).toBe(AccountState.Initialized);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/token-test-utils.ts",
    "content": "import type { Address } from '@solana/addresses';\n\nimport type { SystemProgramClient } from '../generated/system-program-idl-types';\nimport type { TokenProgramClient } from '../generated/token-idl-types';\nimport { createTestProgramClient, SvmTestContext } from '../test-utils';\n\nexport const tokenClient = createTestProgramClient<TokenProgramClient>('token-idl.json');\nexport const systemClient = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n\nexport const SPL_TOKEN_MINT_SIZE = 82;\nexport const SPL_TOKEN_ACCOUNT_SIZE = 165;\nexport const SPL_TOKEN_MULTISIG_SIZE = 355;\n\nexport async function createMint(\n    ctx: SvmTestContext,\n    payer: Address,\n    mint: Address,\n    mintAuthority: Address,\n    freezeAuthority?: Address,\n): Promise<void> {\n    const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(SPL_TOKEN_MINT_SIZE));\n    const createMintAccountIx = await systemClient.methods\n        .createAccount({ lamports, programAddress: tokenClient.programAddress, space: SPL_TOKEN_MINT_SIZE })\n        .accounts({ newAccount: mint, payer })\n        .instruction();\n    await ctx.sendInstruction(createMintAccountIx, [payer, mint]);\n\n    const initializeMintIx = await tokenClient.methods\n        .initializeMint({ decimals: 9, freezeAuthority: freezeAuthority ?? null, mintAuthority })\n        .accounts({ mint })\n        .instruction();\n    await ctx.sendInstruction(initializeMintIx, [payer]);\n}\n\nexport async function createTokenAccount(\n    ctx: SvmTestContext,\n    payer: Address,\n    account: Address,\n    mint: Address,\n    owner: Address,\n): Promise<void> {\n    const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(SPL_TOKEN_ACCOUNT_SIZE));\n    const createAccountIx = await systemClient.methods\n        .createAccount({ lamports, programAddress: tokenClient.programAddress, space: SPL_TOKEN_ACCOUNT_SIZE })\n        .accounts({ newAccount: account, payer })\n        .instruction();\n\n    const initAccountIx = await tokenClient.methods\n        .initializeAccount()\n        .accounts({ account, mint, owner })\n        .instruction();\n\n    await ctx.sendInstructions([createAccountIx, initAccountIx], [payer, account]);\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/transfer-checked.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: transferChecked', () => {\n    test('should transfer tokens with mint and decimal verification', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const sourceAccount = await ctx.createAccount();\n        const destinationAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, sourceAccount, mintAccount, payer);\n        await createTokenAccount(ctx, payer, destinationAccount, mintAccount, payer);\n\n        const mintIx = await tokenClient.methods\n            .mintTo({ amount: 1_000_000 })\n            .accounts({ mint: mintAccount, mintAuthority: payer, token: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(mintIx, [payer]);\n\n        const ix = await tokenClient.methods\n            .transferChecked({ amount: 400_000, decimals: 9 })\n            .accounts({ authority: payer, destination: destinationAccount, mint: mintAccount, source: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const decoder = getTokenDecoder();\n        const sourceData = decoder.decode(ctx.requireEncodedAccount(sourceAccount).data);\n        const destData = decoder.decode(ctx.requireEncodedAccount(destinationAccount).data);\n        expect(sourceData.amount).toBe(600_000n);\n        expect(destData.amount).toBe(400_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/transfer.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: transfer', () => {\n    test('should transfer tokens between accounts', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const sourceAccount = await ctx.createAccount();\n        const destinationAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, sourceAccount, mintAccount, payer);\n        await createTokenAccount(ctx, payer, destinationAccount, mintAccount, payer);\n\n        const mintIx = await tokenClient.methods\n            .mintTo({ amount: 1_000_000 })\n            .accounts({ mint: mintAccount, mintAuthority: payer, token: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(mintIx, [payer]);\n\n        const ix = await tokenClient.methods\n            .transfer({ amount: 400_000 })\n            .accounts({ authority: payer, destination: destinationAccount, source: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const decoder = getTokenDecoder();\n        const sourceData = decoder.decode(ctx.requireEncodedAccount(sourceAccount).data);\n        const destData = decoder.decode(ctx.requireEncodedAccount(destinationAccount).data);\n        expect(sourceData.amount).toBe(600_000n);\n        expect(destData.amount).toBe(400_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token/ui-amount-to-amount.test.ts",
    "content": "import { getU64Decoder } from '@solana/codecs';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, tokenClient } from './token-test-utils';\n\ndescribe('Token Program: uiAmountToAmount', () => {\n    test('should convert a UI amount string to a raw token amount', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n\n        const ix = await tokenClient.methods\n            .uiAmountToAmount({ uiAmount: '1' })\n            .accounts({ mint: mintAccount })\n            .instruction();\n\n        const meta = await ctx.sendInstruction(ix, [payer]);\n        const rawAmount = getU64Decoder().decode(meta.returnData().data());\n        expect(rawAmount).toBe(1_000_000_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/amount-to-ui-amount.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: amountToUiAmount', () => {\n    test('should convert a token amount to its UI representation', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        const amount = 1_000_000_000;\n        const expectedUiAmount = amount / 10 ** 9;\n\n        const ix = await token2022Client.methods\n            .amountToUiAmount({ amount })\n            .accounts({ mint: mintAccount })\n            .instruction();\n\n        const meta = await ctx.sendInstruction(ix, [payer]);\n        const returnData = meta.returnData();\n        const uiAmount = new TextDecoder().decode(returnData.data());\n        expect(uiAmount).toBe(expectedUiAmount.toString());\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/approve-checked.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, mintTokens, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: approveChecked', () => {\n    test('should approve_checked a delegate', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const sourceAccount = await ctx.createAccount();\n        const delegate = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, sourceAccount, mintAccount, payer);\n        await mintTokens(ctx, payer, mintAccount, sourceAccount, payer, 1_000_000);\n\n        const ix = await token2022Client.methods\n            .approveChecked({ amount: 500_000, decimals: 9 })\n            .accounts({ delegate, mint: mintAccount, owner: payer, source: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const decoder = getTokenDecoder();\n        const sourceData = decoder.decode(ctx.requireEncodedAccount(sourceAccount).data);\n        expect(sourceData.delegate).toStrictEqual({ __option: 'Some', value: delegate });\n        expect(sourceData.delegatedAmount).toBe(500_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/approve.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport {\n    createMint,\n    createTokenAccount,\n    mintTokens,\n    systemClient,\n    TOKEN_2022_MULTISIG_SIZE,\n    token2022Client,\n} from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: approve', () => {\n    test('should approve a delegate for a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const sourceAccount = await ctx.createAccount();\n        const delegate = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, sourceAccount, mintAccount, payer);\n        await mintTokens(ctx, payer, mintAccount, sourceAccount, payer, 1_000_000);\n\n        const ix = await token2022Client.methods\n            .approve({ amount: 500_000 })\n            .accounts({ delegate, owner: payer, source: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const decoder = getTokenDecoder();\n        const sourceData = decoder.decode(ctx.requireEncodedAccount(sourceAccount).data);\n        expect(sourceData.delegate).toStrictEqual({ __option: 'Some', value: delegate });\n        expect(sourceData.delegatedAmount).toBe(500_000n);\n    });\n\n    test('should approve with multisig', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const sourceAccount = await ctx.createAccount();\n        const delegate = await ctx.createAccount();\n        const multisigOwner = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, sourceAccount, mintAccount, multisigOwner);\n        await mintTokens(ctx, payer, mintAccount, sourceAccount, payer, 1_000_000);\n\n        const signer1 = await ctx.createAccount();\n        const signer2 = await ctx.createAccount();\n        const signer3 = await ctx.createAccount();\n\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(TOKEN_2022_MULTISIG_SIZE));\n        const createAccountIx = await systemClient.methods\n            .createAccount({\n                lamports,\n                programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n                space: TOKEN_2022_MULTISIG_SIZE,\n            })\n            .accounts({ newAccount: multisigOwner, payer })\n            .instruction();\n\n        const initMultisigIx = await token2022Client.methods\n            .initializeMultisig({ m: 2, signers: [signer1, signer2, signer3] })\n            .accounts({ multisig: multisigOwner })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initMultisigIx], [payer, multisigOwner]);\n\n        const ix = await token2022Client.methods\n            .approve({ amount: 500_000, multiSigners: [signer1, signer2] })\n            .accounts({ delegate, owner: multisigOwner, source: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer, signer1, signer2]);\n\n        const decoder = getTokenDecoder();\n        const sourceData = decoder.decode(ctx.requireEncodedAccount(sourceAccount).data);\n        expect(sourceData.delegate).toStrictEqual({ __option: 'Some', value: delegate });\n        expect(sourceData.delegatedAmount).toBe(500_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/burn-checked.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, mintTokens, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: burnChecked', () => {\n    test('should burn_checked tokens', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, tokenAccount, mintAccount, payer);\n        await mintTokens(ctx, payer, mintAccount, tokenAccount, payer, 1_000_000);\n\n        const ix = await token2022Client.methods\n            .burnChecked({ amount: 400_000, decimals: 9 })\n            .accounts({ account: tokenAccount, authority: payer, mint: mintAccount })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const decoder = getTokenDecoder();\n        const tokenData = decoder.decode(ctx.requireEncodedAccount(tokenAccount).data);\n        expect(tokenData.amount).toBe(600_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/burn.test.ts",
    "content": "import { getMintDecoder, getTokenDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, mintTokens, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: burn', () => {\n    test('should burn tokens from a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, tokenAccount, mintAccount, payer);\n        await mintTokens(ctx, payer, mintAccount, tokenAccount, payer, 1_000_000);\n\n        const burnIx = await token2022Client.methods\n            .burn({ amount: 400_000 })\n            .accounts({ account: tokenAccount, authority: payer, mint: mintAccount })\n            .instruction();\n        await ctx.sendInstruction(burnIx, [payer]);\n\n        const tokenData = getTokenDecoder().decode(ctx.requireEncodedAccount(tokenAccount).data);\n        expect(tokenData.amount).toBe(600_000n);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mintAccount).data);\n        expect(mintData.supply).toBe(600_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/close-account.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: closeAccount', () => {\n    test('should close a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n        const owner = await ctx.createFundedAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, tokenAccount, mintAccount, owner);\n\n        const ix = await token2022Client.methods\n            .closeAccount()\n            .accounts({ account: tokenAccount, destination: owner, owner })\n            .instruction();\n        await ctx.sendInstruction(ix, [owner]);\n\n        expect(ctx.fetchEncodedAccount(tokenAccount)).toBeNull();\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/confidential-transfer-fee.test.ts",
    "content": "import type { Address } from '@solana/addresses';\nimport { some } from '@solana/codecs';\nimport { type ExtensionArgs, getMintDecoder, getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\nconst getConfidentialTransferFeeExts = (\n    feeAuthority: Address,\n    withdrawAuthority: Address,\n    confidentialFeeAuthority: Address,\n    confidentialTransferAuthority: Address,\n    elgamalPubkey: Address,\n): ExtensionArgs[] => [\n    {\n        __kind: 'TransferFeeConfig',\n        newerTransferFee: { epoch: 0n, maximumFee: 1_000_000n, transferFeeBasisPoints: 100 },\n        olderTransferFee: { epoch: 0n, maximumFee: 0n, transferFeeBasisPoints: 0 },\n        transferFeeConfigAuthority: feeAuthority,\n        withdrawWithheldAuthority: withdrawAuthority,\n        withheldAmount: 0n,\n    },\n    {\n        __kind: 'ConfidentialTransferMint',\n        auditorElgamalPubkey: null,\n        authority: confidentialTransferAuthority,\n        autoApproveNewAccounts: true,\n    },\n    {\n        __kind: 'ConfidentialTransferFee',\n        authority: confidentialFeeAuthority,\n        elgamalPubkey: elgamalPubkey,\n        harvestToMintEnabled: true,\n        withheldAmount: new Uint8Array(64),\n    },\n];\n\ndescribe('Token 2022 Program: confidentialTransferFee', () => {\n    test('should initialize confidential transfer fee extension [initializeConfidentialTransferFee]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const feeAuthority = await ctx.createFundedAccount();\n        const withdrawAuthority = await ctx.createFundedAccount();\n        const confidentialFeeAuthority = await ctx.createFundedAccount();\n        const confidentialTransferAuthority = await ctx.createFundedAccount();\n        const elgamalPubkey = await ctx.createFundedAccount();\n\n        const size = getMintSize(\n            getConfidentialTransferFeeExts(\n                feeAuthority,\n                withdrawAuthority,\n                confidentialFeeAuthority,\n                confidentialTransferAuthority,\n                elgamalPubkey,\n            ),\n        );\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initFeeConfigIx = await token2022Client.methods\n            .initializeTransferFeeConfig({\n                maximumFee: 1_000_000,\n                transferFeeBasisPoints: 100,\n                transferFeeConfigAuthority: feeAuthority,\n                withdrawWithheldAuthority: withdrawAuthority,\n            })\n            .accounts({ mint })\n            .instruction();\n\n        const initConfidentialTransferIx = await token2022Client.methods\n            .initializeConfidentialTransferMint({\n                auditorElgamalPubkey: null,\n                authority: confidentialTransferAuthority,\n                autoApproveNewAccounts: true,\n            })\n            .accounts({ mint })\n            .instruction();\n\n        const initConfidentialFeeIx = await token2022Client.methods\n            .initializeConfidentialTransferFee({\n                authority: confidentialFeeAuthority,\n                withdrawWithheldAuthorityElGamalPubkey: elgamalPubkey,\n            })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions(\n            [createAccountIx, initFeeConfigIx, initConfidentialTransferIx, initConfidentialFeeIx, initMintIx],\n            [payer, mint],\n        );\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.mintAuthority).toEqual({ __option: 'Some', value: payer });\n        expect(mintData.extensions).toEqual(\n            some([\n                {\n                    __kind: 'TransferFeeConfig',\n                    newerTransferFee: { epoch: 0n, maximumFee: 1_000_000n, transferFeeBasisPoints: 100 },\n                    olderTransferFee: { epoch: 0n, maximumFee: 1_000_000n, transferFeeBasisPoints: 100 },\n                    transferFeeConfigAuthority: feeAuthority,\n                    withdrawWithheldAuthority: withdrawAuthority,\n                    withheldAmount: 0n,\n                },\n                {\n                    __kind: 'ConfidentialTransferMint',\n                    auditorElgamalPubkey: { __option: 'None' },\n                    authority: { __option: 'Some', value: confidentialTransferAuthority },\n                    autoApproveNewAccounts: true,\n                },\n                {\n                    __kind: 'ConfidentialTransferFee',\n                    authority: { __option: 'Some', value: confidentialFeeAuthority },\n                    elgamalPubkey,\n                    harvestToMintEnabled: true,\n                    withheldAmount: Uint8Array.from({ length: 64 }, () => 0),\n                },\n            ]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/confidential-transfer.test.ts",
    "content": "import type { Address } from '@solana/addresses';\nimport { none, some } from '@solana/codecs';\nimport { type Extension, type ExtensionArgs, getMintDecoder, getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\nconst getConfidentialTransferMintExt = (authority: Address): ExtensionArgs[] => [\n    {\n        __kind: 'ConfidentialTransferMint',\n        auditorElgamalPubkey: null,\n        authority,\n        autoApproveNewAccounts: true,\n    },\n];\n\ndescribe('Token 2022 Program: confidentialTransfer', () => {\n    test('should initialize confidential transfer mint extension [initializeConfidentialTransferMint]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const confidentialTransferAuthority = await ctx.createFundedAccount();\n\n        const size = getMintSize(getConfidentialTransferMintExt(confidentialTransferAuthority));\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initConfidentialTransferIx = await token2022Client.methods\n            .initializeConfidentialTransferMint({\n                auditorElgamalPubkey: null,\n                authority: confidentialTransferAuthority,\n                autoApproveNewAccounts: true,\n            })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initConfidentialTransferIx, initMintIx], [payer, mint]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.mintAuthority).toEqual({ __option: 'Some', value: payer });\n        expect(mintData.extensions).toEqual(\n            some<Extension[]>([\n                {\n                    __kind: 'ConfidentialTransferMint',\n                    auditorElgamalPubkey: none(),\n                    authority: some(confidentialTransferAuthority),\n                    autoApproveNewAccounts: true,\n                },\n            ]),\n        );\n    });\n\n    test('should update confidential transfer mint config [updateConfidentialTransferMint]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const confidentialTransferAuthority = await ctx.createFundedAccount();\n        const auditorElgamalPubkey = await ctx.createFundedAccount();\n\n        const size = getMintSize(getConfidentialTransferMintExt(confidentialTransferAuthority));\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initConfidentialTransferIx = await token2022Client.methods\n            .initializeConfidentialTransferMint({\n                auditorElgamalPubkey,\n                authority: confidentialTransferAuthority,\n                autoApproveNewAccounts: true,\n            })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initConfidentialTransferIx, initMintIx], [payer, mint]);\n\n        const updateIx = await token2022Client.methods\n            .updateConfidentialTransferMint({ auditorElgamalPubkey: null, autoApproveNewAccounts: false })\n            .accounts({ authority: confidentialTransferAuthority, mint })\n            .instruction();\n        await ctx.sendInstruction(updateIx, [payer, confidentialTransferAuthority]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toEqual(\n            some<Extension[]>([\n                {\n                    __kind: 'ConfidentialTransferMint',\n                    auditorElgamalPubkey: none(),\n                    authority: some(confidentialTransferAuthority),\n                    autoApproveNewAccounts: false,\n                },\n            ]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/create-native-mint.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: createNativeMint', () => {\n    test('should create the Token 2022 native mint', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n\n        const ix = await token2022Client.methods\n            .createNativeMint()\n            .accounts({ nativeMint: ctx.TOKEN_2022_NATIVE_MINT, payer })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const account = ctx.fetchEncodedAccount(ctx.TOKEN_2022_NATIVE_MINT);\n        expect(account).not.toBeNull();\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/disable-cpi-guard.test.ts",
    "content": "import { some } from '@solana/codecs';\nimport { getTokenDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: disableCpiGuard', () => {\n    test('should enable/disable CPI guard on a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mint, payer);\n        await createTokenAccount(ctx, payer, tokenAccount, mint, payer);\n\n        const reallocateIx = await token2022Client.methods\n            .reallocate({ newExtensionTypes: ['cpiGuard'] })\n            .accounts({ owner: payer, payer, token: tokenAccount })\n            .instruction();\n\n        const enableIx = await token2022Client.methods\n            .enableCpiGuard()\n            .accounts({ owner: payer, token: tokenAccount })\n            .instruction();\n\n        const disableIx = await token2022Client.methods\n            .disableCpiGuard()\n            .accounts({ owner: payer, token: tokenAccount })\n            .instruction();\n\n        await ctx.sendInstructions([reallocateIx, enableIx], [payer]);\n\n        const decoder = getTokenDecoder();\n        const tokenDataCpiEnabled = decoder.decode(ctx.requireEncodedAccount(tokenAccount).data);\n        expect(tokenDataCpiEnabled.extensions).toMatchObject(some([{ __kind: 'CpiGuard', lockCpi: true }]));\n\n        await ctx.sendInstructions([reallocateIx, disableIx], [payer]);\n        const tokenDataCpiDisabled = decoder.decode(ctx.requireEncodedAccount(tokenAccount).data);\n        expect(tokenDataCpiDisabled.extensions).toMatchObject(some([{ __kind: 'CpiGuard', lockCpi: false }]));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/disable-memo-transfers.test.ts",
    "content": "import { some } from '@solana/codecs';\nimport { getTokenDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: disableMemoTransfers', () => {\n    test('should enable/disable memo transfers on a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mint, payer);\n        await createTokenAccount(ctx, payer, tokenAccount, mint, payer);\n\n        const reallocateIx = await token2022Client.methods\n            .reallocate({ newExtensionTypes: ['memoTransfer'] })\n            .accounts({ owner: payer, payer, token: tokenAccount })\n            .instruction();\n\n        const enableIx = await token2022Client.methods\n            .enableMemoTransfers()\n            .accounts({ owner: payer, token: tokenAccount })\n            .instruction();\n\n        const disableIx = await token2022Client.methods\n            .disableMemoTransfers()\n            .accounts({ owner: payer, token: tokenAccount })\n            .instruction();\n\n        await ctx.sendInstructions([reallocateIx, enableIx], [payer]);\n\n        const tokenDataEnabledMemo = getTokenDecoder().decode(ctx.requireEncodedAccount(tokenAccount).data);\n        expect(tokenDataEnabledMemo.extensions).toMatchObject(\n            some([{ __kind: 'MemoTransfer', requireIncomingTransferMemos: true }]),\n        );\n\n        await ctx.sendInstructions([reallocateIx, disableIx], [payer]);\n        const tokenDataDisabledMemo = getTokenDecoder().decode(ctx.requireEncodedAccount(tokenAccount).data);\n        expect(tokenDataDisabledMemo.extensions).toMatchObject(\n            some([{ __kind: 'MemoTransfer', requireIncomingTransferMemos: false }]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/freeze-account.test.ts",
    "content": "import { AccountState, getTokenDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: freezeAccount', () => {\n    test('should freeze a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n        const freezeAuthority = await ctx.createFundedAccount();\n\n        await createMint(ctx, payer, mintAccount, payer, freezeAuthority);\n        await createTokenAccount(ctx, payer, tokenAccount, mintAccount, payer);\n\n        const freezeIx = await token2022Client.methods\n            .freezeAccount()\n            .accounts({ account: tokenAccount, mint: mintAccount, owner: freezeAuthority })\n            .instruction();\n\n        await ctx.sendInstruction(freezeIx, [freezeAuthority]);\n\n        const account = ctx.requireEncodedAccount(tokenAccount);\n        const tokenData = getTokenDecoder().decode(account.data);\n        expect(tokenData.state).toBe(AccountState.Frozen);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/get-account-data-size.test.ts",
    "content": "import { getU64Decoder } from '@solana/codecs';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, TOKEN_2022_ACCOUNT_SIZE, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: getAccountDataSize', () => {\n    test('should return the required account size for a given mint', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n\n        const ix = await token2022Client.methods.getAccountDataSize().accounts({ mint: mintAccount }).instruction();\n\n        const meta = await ctx.sendInstruction(ix, [payer]);\n        const size = getU64Decoder().decode(meta.returnData().data());\n        expect(size).toBe(BigInt(TOKEN_2022_ACCOUNT_SIZE));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/group-member-pointer.test.ts",
    "content": "import type { Address } from '@solana/addresses';\nimport { type OptionOrNullable, some } from '@solana/codecs';\nimport { type Extension, type ExtensionArgs, getMintDecoder, getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\nconst GROUP_MEMBER_POINTER_EXT = (\n    authority: OptionOrNullable<Address>,\n    memberAddress: OptionOrNullable<Address>,\n): ExtensionArgs[] => [{ __kind: 'GroupMemberPointer', authority, memberAddress }];\n\ndescribe('Token 2022 Program: groupMemberPointer', () => {\n    test('should initialize group member pointer extension [initializeGroupMemberPointer]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const memberPointerAuthority = await ctx.createFundedAccount();\n\n        // GroupMemberPointer points to the mint itself\n        const size = getMintSize(GROUP_MEMBER_POINTER_EXT(memberPointerAuthority, mint));\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initGroupMemberPointerIx = await token2022Client.methods\n            .initializeGroupMemberPointer({ authority: memberPointerAuthority, memberAddress: mint })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initGroupMemberPointerIx, initMintIx], [payer, mint]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.mintAuthority).toEqual({ __option: 'Some', value: payer });\n        expect(mintData.extensions).toEqual(\n            some<Extension[]>([\n                {\n                    __kind: 'GroupMemberPointer',\n                    authority: some(memberPointerAuthority),\n                    memberAddress: some(mint),\n                },\n            ]),\n        );\n    });\n\n    test('should update group member pointer address [updateGroupMemberPointer]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const memberPointerAuthority = await ctx.createFundedAccount();\n        const newMemberAddress = await ctx.createAccount();\n\n        const size = getMintSize(GROUP_MEMBER_POINTER_EXT(memberPointerAuthority, mint));\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initGroupMemberPointerIx = await token2022Client.methods\n            .initializeGroupMemberPointer({ authority: memberPointerAuthority, memberAddress: mint })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initGroupMemberPointerIx, initMintIx], [payer, mint]);\n\n        // Update group member pointer to a new address\n        const updateIx = await token2022Client.methods\n            .updateGroupMemberPointer({ memberAddress: newMemberAddress })\n            .accounts({ groupMemberPointerAuthority: memberPointerAuthority, mint })\n            .signers(['groupMemberPointerAuthority'])\n            .instruction();\n        await ctx.sendInstruction(updateIx, [payer, memberPointerAuthority]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toEqual(\n            some<Extension[]>([\n                {\n                    __kind: 'GroupMemberPointer',\n                    authority: some(memberPointerAuthority),\n                    memberAddress: some(newMemberAddress),\n                },\n            ]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/group-pointer.test.ts",
    "content": "import type { Address } from '@solana/addresses';\nimport { type OptionOrNullable, some } from '@solana/codecs';\nimport { type Extension, type ExtensionArgs, getMintDecoder, getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\nconst GROUP_POINTER_EXT = (\n    authority: OptionOrNullable<Address>,\n    groupAddress: OptionOrNullable<Address>,\n): ExtensionArgs[] => [{ __kind: 'GroupPointer' as const, authority, groupAddress }];\n\ndescribe('Token 2022 Program: groupPointer', () => {\n    test('should initialize group pointer extension [initializeGroupPointer]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const groupPointerAuthority = await ctx.createFundedAccount();\n\n        // GroupPointer points to the mint itself (common pattern)\n        const size = getMintSize(GROUP_POINTER_EXT(groupPointerAuthority, mint));\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initGroupPointerIx = await token2022Client.methods\n            .initializeGroupPointer({ authority: groupPointerAuthority, groupAddress: mint })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initGroupPointerIx, initMintIx], [payer, mint]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.mintAuthority).toEqual({ __option: 'Some', value: payer });\n        expect(mintData.extensions).toEqual(\n            some<Extension[]>([\n                {\n                    __kind: 'GroupPointer',\n                    authority: some(groupPointerAuthority),\n                    groupAddress: some(mint),\n                },\n            ]),\n        );\n    });\n\n    test('should update group pointer address [updateGroupPointer]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const groupPointerAuthority = await ctx.createFundedAccount();\n        const newGroupAddress = await ctx.createAccount();\n\n        const size = getMintSize(GROUP_POINTER_EXT(groupPointerAuthority, mint));\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initGroupPointerIx = await token2022Client.methods\n            .initializeGroupPointer({ authority: groupPointerAuthority, groupAddress: mint })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initGroupPointerIx, initMintIx], [payer, mint]);\n\n        // Update group pointer to a new address\n        const updateIx = await token2022Client.methods\n            .updateGroupPointer({ groupAddress: newGroupAddress })\n            .accounts({ groupPointerAuthority, mint })\n            .signers(['groupPointerAuthority'])\n            .instruction();\n        await ctx.sendInstruction(updateIx, [payer, groupPointerAuthority]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toEqual(\n            some<Extension[]>([\n                { __kind: 'GroupPointer', authority: some(groupPointerAuthority), groupAddress: some(newGroupAddress) },\n            ]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/harvest-withheld-tokens-to-mint.test.ts",
    "content": "import { some } from '@solana/codecs';\nimport { getMintDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport {\n    createTokenAccountWithExtensions,\n    createTransferFeeMint,\n    mintTokens,\n    token2022Client,\n} from './token-2022-test-utils';\n\nconst TRANSFER_FEE_AMOUNT_EXT = [{ __kind: 'TransferFeeAmount' as const, withheldAmount: 0n }];\n\ndescribe('Token 2022 Program: harvestWithheldTokensToMint', () => {\n    test('should harvest withheld tokens to mint', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const feeAuthority = await ctx.createFundedAccount();\n        const withdrawAuthority = await ctx.createFundedAccount();\n\n        const mint = await createTransferFeeMint(ctx, payer, feeAuthority, withdrawAuthority);\n        const source = await createTokenAccountWithExtensions(ctx, payer, mint, payer, TRANSFER_FEE_AMOUNT_EXT);\n        const destination = await createTokenAccountWithExtensions(ctx, payer, mint, payer, TRANSFER_FEE_AMOUNT_EXT);\n\n        // Mint and transfer to generate fees\n        await mintTokens(ctx, payer, mint, source, payer, 1_000_000);\n\n        const transferIx = await token2022Client.methods\n            .transferCheckedWithFee({ amount: 1_000_000, decimals: 9, fee: 10_000 })\n            .accounts({ authority: payer, destination, mint, source })\n            .instruction();\n        await ctx.sendInstruction(transferIx, [payer]);\n\n        // Harvest fees from destination to mint\n        const harvestIx = await token2022Client.methods\n            .harvestWithheldTokensToMint({ sources: [destination] })\n            .accounts({ mint })\n            .instruction();\n        await ctx.sendInstruction(harvestIx, [payer]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toMatchObject(some([{ __kind: 'TransferFeeConfig', withheldAmount: 10_000n }]));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/initialize-account.test.ts",
    "content": "import { some } from '@solana/codecs';\nimport { AccountState, getTokenDecoder, getTokenSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, systemClient, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: initializeAccount', () => {\n    test('should initialize a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n        const owner = await ctx.createFundedAccount();\n\n        await createMint(ctx, payer, mintAccount, payer, undefined);\n        const space = getTokenSize([{ __kind: 'MemoTransfer', requireIncomingTransferMemos: true }]);\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(space));\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space })\n            .accounts({ newAccount: tokenAccount, payer })\n            .instruction();\n\n        const initAccountIx = await token2022Client.methods\n            .initializeAccount()\n            .accounts({ account: tokenAccount, mint: mintAccount, owner })\n            .instruction();\n\n        const reallocateIx = await token2022Client.methods\n            .reallocate({ newExtensionTypes: ['memoTransfer'] })\n            .accounts({ owner, payer, token: tokenAccount })\n            .signers(['owner'])\n            .instruction();\n\n        const enableMemoTransfersIx = await token2022Client.methods\n            .enableMemoTransfers()\n            .accounts({ owner, token: tokenAccount })\n            .signers(['owner'])\n            .instruction();\n\n        await ctx.sendInstructions(\n            [createAccountIx, initAccountIx, reallocateIx, enableMemoTransfersIx],\n            [payer, tokenAccount, owner],\n        );\n\n        const accountData = ctx.requireEncodedAccount(tokenAccount).data;\n        const tokenData = getTokenDecoder().decode(accountData);\n\n        expect(tokenData.mint).toBe(mintAccount);\n        expect(tokenData.owner).toBe(owner);\n        expect(tokenData.amount).toBe(0n);\n        expect(tokenData.state).toBe(AccountState.Initialized);\n        expect(tokenData.extensions).toMatchObject(\n            some([{ __kind: 'MemoTransfer', requireIncomingTransferMemos: true }]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/initialize-account2.test.ts",
    "content": "import { some } from '@solana/codecs';\nimport { AccountState, getTokenDecoder, getTokenSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, systemClient, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: initializeAccount2', () => {\n    test('should initialize2 a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n        const owner = await ctx.createFundedAccount();\n\n        await createMint(ctx, payer, mintAccount, payer, undefined);\n        const space = getTokenSize([{ __kind: 'MemoTransfer', requireIncomingTransferMemos: true }]);\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(space));\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space })\n            .accounts({ newAccount: tokenAccount, payer })\n            .instruction();\n\n        const initAccountIx = await token2022Client.methods\n            .initializeAccount2({ owner })\n            .accounts({ account: tokenAccount, mint: mintAccount })\n            .instruction();\n\n        const reallocateIx = await token2022Client.methods\n            .reallocate({ newExtensionTypes: ['memoTransfer'] })\n            .accounts({ owner, payer, token: tokenAccount })\n            .signers(['owner'])\n            .instruction();\n\n        const enableMemoTransfersIx = await token2022Client.methods\n            .enableMemoTransfers()\n            .accounts({ owner, token: tokenAccount })\n            .signers(['owner'])\n            .instruction();\n\n        await ctx.sendInstructions(\n            [createAccountIx, initAccountIx, reallocateIx, enableMemoTransfersIx],\n            [payer, tokenAccount, owner],\n        );\n\n        const accountData = ctx.requireEncodedAccount(tokenAccount).data;\n        const tokenData = getTokenDecoder().decode(accountData);\n\n        expect(tokenData.mint).toBe(mintAccount);\n        expect(tokenData.owner).toBe(owner);\n        expect(tokenData.amount).toBe(0n);\n        expect(tokenData.state).toBe(AccountState.Initialized);\n        expect(tokenData.extensions).toMatchObject(\n            some([{ __kind: 'MemoTransfer', requireIncomingTransferMemos: true }]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/initialize-account3.test.ts",
    "content": "import { some } from '@solana/codecs';\nimport { AccountState, getTokenDecoder, getTokenSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, systemClient, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: initializeAccount3', () => {\n    test('should initialize3 a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n        const owner = await ctx.createFundedAccount();\n\n        await createMint(ctx, payer, mintAccount, payer, undefined);\n        const space = getTokenSize([{ __kind: 'MemoTransfer', requireIncomingTransferMemos: true }]);\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(space));\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space })\n            .accounts({ newAccount: tokenAccount, payer })\n            .instruction();\n\n        const initAccountIx = await token2022Client.methods\n            .initializeAccount3({ owner })\n            .accounts({ account: tokenAccount, mint: mintAccount })\n            .instruction();\n\n        const reallocateIx = await token2022Client.methods\n            .reallocate({ newExtensionTypes: ['memoTransfer'] })\n            .accounts({ owner, payer, token: tokenAccount })\n            .signers(['owner'])\n            .instruction();\n\n        const enableMemoTransfersIx = await token2022Client.methods\n            .enableMemoTransfers()\n            .accounts({ owner, token: tokenAccount })\n            .signers(['owner'])\n            .instruction();\n\n        await ctx.sendInstructions(\n            [createAccountIx, initAccountIx, reallocateIx, enableMemoTransfersIx],\n            [payer, tokenAccount, owner],\n        );\n\n        const accountData = ctx.requireEncodedAccount(tokenAccount).data;\n        const tokenData = getTokenDecoder().decode(accountData);\n\n        expect(tokenData.mint).toBe(mintAccount);\n        expect(tokenData.owner).toBe(owner);\n        expect(tokenData.amount).toBe(0n);\n        expect(tokenData.state).toBe(AccountState.Initialized);\n        expect(tokenData.extensions).toMatchObject(\n            some([{ __kind: 'MemoTransfer', requireIncomingTransferMemos: true }]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/initialize-default-account-state.test.ts",
    "content": "import { some } from '@solana/codecs';\nimport { AccountState, getMintDecoder, getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: initializeDefaultAccountState', () => {\n    test('should initialize default account state extension', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const freezeAuthority = await ctx.createFundedAccount();\n\n        const size = getMintSize([{ __kind: 'DefaultAccountState', state: AccountState.Frozen }]);\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initDefaultStateIx = await token2022Client.methods\n            .initializeDefaultAccountState({ state: 'frozen' })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, freezeAuthority, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initDefaultStateIx, initMintIx], [payer, mint]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.mintAuthority).toEqual({ __option: 'Some', value: payer });\n        expect(mintData.freezeAuthority).toEqual({ __option: 'Some', value: freezeAuthority });\n        expect(mintData.extensions).toMatchObject(\n            some([{ __kind: 'DefaultAccountState', state: AccountState.Frozen }]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/initialize-immutable-owner.test.ts",
    "content": "import { some } from '@solana/codecs';\nimport { getTokenDecoder, getTokenSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, systemClient, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: initializeImmutableOwner', () => {\n    test('should initialize immutable owner extension on a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n        const owner = await ctx.createFundedAccount();\n\n        await createMint(ctx, payer, mint, payer);\n\n        const space = getTokenSize([{ __kind: 'ImmutableOwner' }]);\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(space));\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space })\n            .accounts({ newAccount: tokenAccount, payer })\n            .instruction();\n\n        const initImmutableOwnerIx = await token2022Client.methods\n            .initializeImmutableOwner()\n            .accounts({ account: tokenAccount })\n            .instruction();\n\n        const initAccountIx = await token2022Client.methods\n            .initializeAccount3({ owner })\n            .accounts({ account: tokenAccount, mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initImmutableOwnerIx, initAccountIx], [payer, tokenAccount]);\n\n        const tokenData = getTokenDecoder().decode(ctx.requireEncodedAccount(tokenAccount).data);\n        expect(tokenData.mint).toBe(mint);\n        expect(tokenData.owner).toBe(owner);\n        expect(tokenData.extensions).toMatchObject(some([{ __kind: 'ImmutableOwner' }]));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/initialize-interest-bearing-mint.test.ts",
    "content": "import { some } from '@solana/codecs';\nimport { getMintDecoder, getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: initializeInterestBearingMint', () => {\n    test('should initialize interest bearing mint extension', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const rateAuthority = await ctx.createFundedAccount();\n        const freezeAuthority = await ctx.createFundedAccount();\n\n        const size = getMintSize([\n            {\n                __kind: 'InterestBearingConfig',\n                currentRate: 500,\n                initializationTimestamp: 0n,\n                lastUpdateTimestamp: 0n,\n                preUpdateAverageRate: 0,\n                rateAuthority,\n            },\n        ]);\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initInterestBearingIx = await token2022Client.methods\n            .initializeInterestBearingMint({ rate: 500, rateAuthority })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, freezeAuthority: freezeAuthority, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initInterestBearingIx, initMintIx], [payer, mint]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.mintAuthority).toEqual({ __option: 'Some', value: payer });\n        expect(mintData.freezeAuthority).toEqual({ __option: 'Some', value: freezeAuthority });\n        expect(mintData.extensions).toMatchObject(\n            some([{ __kind: 'InterestBearingConfig', currentRate: 500, rateAuthority }]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/initialize-mint-close-authority.test.ts",
    "content": "import { getMintDecoder, getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: initializeMintCloseAuthority', () => {\n    test('should initialize mint close authority extension', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const closeAuthority = await ctx.createAccount();\n\n        const size = getMintSize([{ __kind: 'MintCloseAuthority', closeAuthority }]);\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initCloseAuthIx = await token2022Client.methods\n            .initializeMintCloseAuthority({ closeAuthority })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, freezeAuthority: null, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initCloseAuthIx, initMintIx], [payer, mint]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.mintAuthority).toEqual({ __option: 'Some', value: payer });\n        expect(mintData.decimals).toBe(9);\n        expect(mintData.supply).toBe(0n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/initialize-mint.test.ts",
    "content": "import { getMintDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, TOKEN_2022_MINT_SIZE, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: initializeMint', () => {\n    test('should initialize a mint with default freeze authority (None)', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n\n        const mintRent = ctx.getMinimumBalanceForRentExemption(BigInt(TOKEN_2022_MINT_SIZE));\n\n        const createAccountIx = await systemClient.methods\n            .createAccount({\n                lamports: mintRent,\n                programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n                space: TOKEN_2022_MINT_SIZE,\n            })\n            .accounts({\n                newAccount: mintAccount,\n                payer,\n            })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint: mintAccount })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initMintIx], [payer, mintAccount]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mintAccount).data);\n        expect(mintData.mintAuthority).toEqual({ __option: 'Some', value: payer });\n        expect(mintData.decimals).toBe(9);\n        expect(mintData.supply).toBe(0n);\n        expect(mintData.freezeAuthority).toEqual({ __option: 'None' });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/initialize-mint2.test.ts",
    "content": "import { getMintDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, TOKEN_2022_MINT_SIZE, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: initializeMint2', () => {\n    test('should initialize_mint2', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const freezeAuthority = await ctx.createAccount();\n\n        const mintRent = ctx.getMinimumBalanceForRentExemption(BigInt(TOKEN_2022_MINT_SIZE));\n\n        const createAccountIx = await systemClient.methods\n            .createAccount({\n                lamports: mintRent,\n                programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n                space: TOKEN_2022_MINT_SIZE,\n            })\n            .accounts({\n                newAccount: mintAccount,\n                payer,\n            })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 6, freezeAuthority, mintAuthority: payer })\n            .accounts({ mint: mintAccount })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initMintIx], [payer, mintAccount]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mintAccount).data);\n        expect(mintData.mintAuthority).toEqual({ __option: 'Some', value: payer });\n        expect(mintData.decimals).toBe(6);\n        expect(mintData.supply).toBe(0n);\n        expect(mintData.freezeAuthority).toEqual({ __option: 'Some', value: freezeAuthority });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/initialize-multisig.test.ts",
    "content": "import { getMultisigDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, TOKEN_2022_MULTISIG_SIZE, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: initializeMultisig', () => {\n    test('should initialize a multisig account with signers', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const multisigAccount = await ctx.createAccount();\n\n        const signer1 = await ctx.createAccount();\n        const signer2 = await ctx.createAccount();\n        const signer3 = await ctx.createAccount();\n\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(TOKEN_2022_MULTISIG_SIZE));\n        const createAccountIx = await systemClient.methods\n            .createAccount({\n                lamports,\n                programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n                space: TOKEN_2022_MULTISIG_SIZE,\n            })\n            .accounts({ newAccount: multisigAccount, payer })\n            .instruction();\n\n        const initMultisigIx = await token2022Client.methods\n            .initializeMultisig({ m: 2, signers: [signer1, signer2, signer3] })\n            .accounts({ multisig: multisigAccount })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initMultisigIx], [payer, multisigAccount]);\n\n        const decoder = getMultisigDecoder();\n        const multisigData = decoder.decode(ctx.requireEncodedAccount(multisigAccount).data);\n        expect(multisigData.m).toBe(2);\n        expect(multisigData.n).toBe(3);\n        expect(multisigData.isInitialized).toBe(true);\n        expect(multisigData.signers.slice(0, 3)).toStrictEqual([signer1, signer2, signer3]);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/initialize-multisig2.test.ts",
    "content": "import { getMultisigDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, TOKEN_2022_MULTISIG_SIZE, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: initializeMultisig2', () => {\n    test('should initialize_multisig2 account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const multisigAccount = await ctx.createAccount();\n\n        const signer1 = await ctx.createAccount();\n        const signer2 = await ctx.createAccount();\n        const signer3 = await ctx.createAccount();\n\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(TOKEN_2022_MULTISIG_SIZE));\n        const createAccountIx = await systemClient.methods\n            .createAccount({\n                lamports,\n                programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n                space: TOKEN_2022_MULTISIG_SIZE,\n            })\n            .accounts({ newAccount: multisigAccount, payer })\n            .instruction();\n\n        const initMultisigIx = await token2022Client.methods\n            .initializeMultisig2({ m: 2, signers: [signer1, signer2, signer3] })\n            .accounts({ multisig: multisigAccount })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initMultisigIx], [payer, multisigAccount]);\n\n        const decoder = getMultisigDecoder();\n        const multisigData = decoder.decode(ctx.requireEncodedAccount(multisigAccount).data);\n        expect(multisigData.m).toBe(2);\n        expect(multisigData.n).toBe(3);\n        expect(multisigData.isInitialized).toBe(true);\n        expect(multisigData.signers.slice(0, 3)).toStrictEqual([signer1, signer2, signer3]);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/initialize-non-transferable-mint.test.ts",
    "content": "import { some } from '@solana/codecs';\nimport { getMintDecoder, getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: initializeNonTransferableMint', () => {\n    test('should initialize non-transferable mint extension', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n\n        const size = getMintSize([{ __kind: 'NonTransferable' }]);\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initNonTransferableIx = await token2022Client.methods\n            .initializeNonTransferableMint()\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initNonTransferableIx, initMintIx], [payer, mint]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.mintAuthority).toEqual({ __option: 'Some', value: payer });\n        expect(mintData.freezeAuthority).toEqual({ __option: 'None' });\n        expect(mintData.supply).toBe(0n);\n        expect(mintData.extensions).toMatchObject(some([{ __kind: 'NonTransferable' }]));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/initialize-permanent-delegate.test.ts",
    "content": "import { some } from '@solana/codecs';\nimport { getMintDecoder, getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: initializePermanentDelegate', () => {\n    test('should initialize permanent delegate extension', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const delegate = await ctx.createAccount();\n\n        const size = getMintSize([{ __kind: 'PermanentDelegate', delegate }]);\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initPermanentDelegateIx = await token2022Client.methods\n            .initializePermanentDelegate({ delegate })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initPermanentDelegateIx, initMintIx], [payer, mint]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.mintAuthority).toEqual({ __option: 'Some', value: payer });\n        expect(mintData.extensions).toMatchObject(some([{ __kind: 'PermanentDelegate', delegate }]));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/metadata-pointer.test.ts",
    "content": "import type { Address } from '@solana/addresses';\nimport { some } from '@solana/codecs';\nimport { type ExtensionArgs, getMintDecoder, getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\nconst METADATA_POINTER_EXT = (authority: Address, metadataAddress: Address): ExtensionArgs[] => [\n    { __kind: 'MetadataPointer', authority, metadataAddress },\n];\n\ndescribe('Token 2022 Program: metadataPointer', () => {\n    test('should initialize metadata pointer extension [initializeMetadataPointer]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const metadataPointerAuthority = await ctx.createFundedAccount();\n\n        // MetadataPointer points to the mint itself\n        const size = getMintSize(METADATA_POINTER_EXT(metadataPointerAuthority, mint));\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initMetadataPointerIx = await token2022Client.methods\n            .initializeMetadataPointer({ authority: metadataPointerAuthority, metadataAddress: mint })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initMetadataPointerIx, initMintIx], [payer, mint]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.mintAuthority).toEqual({ __option: 'Some', value: payer });\n        expect(mintData.extensions).toMatchObject(\n            some([\n                {\n                    __kind: 'MetadataPointer',\n                    authority: some(metadataPointerAuthority),\n                    metadataAddress: some(mint),\n                },\n            ]),\n        );\n    });\n\n    test('should update metadata pointer address [updateMetadataPointer]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const metadataPointerAuthority = await ctx.createFundedAccount();\n        const newMetadataAddress = await ctx.createAccount();\n\n        const size = getMintSize(METADATA_POINTER_EXT(metadataPointerAuthority, mint));\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initMetadataPointerIx = await token2022Client.methods\n            .initializeMetadataPointer({ authority: metadataPointerAuthority, metadataAddress: mint })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initMetadataPointerIx, initMintIx], [payer, mint]);\n\n        // Update metadata pointer to a new address\n        const updateIx = await token2022Client.methods\n            .updateMetadataPointer({ metadataAddress: newMetadataAddress })\n            .accounts({ metadataPointerAuthority, mint })\n            .signers(['metadataPointerAuthority'])\n            .instruction();\n        await ctx.sendInstruction(updateIx, [payer, metadataPointerAuthority]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toMatchObject(\n            some([{ __kind: 'MetadataPointer', metadataAddress: some(newMetadataAddress) }]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/mint-to-checked.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: mintToChecked', () => {\n    test('should mint_to_checked tokens', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, tokenAccount, mintAccount, payer);\n\n        const ix = await token2022Client.methods\n            .mintToChecked({ amount: 1_000_000, decimals: 9 })\n            .accounts({ mint: mintAccount, mintAuthority: payer, token: tokenAccount })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const decoder = getTokenDecoder();\n        const tokenData = decoder.decode(ctx.requireEncodedAccount(tokenAccount).data);\n        expect(tokenData.amount).toBe(1_000_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/mint-to.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: mintTo', () => {\n    test('should mint tokens to a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, tokenAccount, mintAccount, payer);\n\n        const ix = await token2022Client.methods\n            .mintTo({ amount: 1_000_000 })\n            .accounts({ mint: mintAccount, mintAuthority: payer, token: tokenAccount })\n            .instruction();\n\n        await ctx.sendInstruction(ix, [payer]);\n\n        const account = ctx.requireEncodedAccount(tokenAccount);\n        const tokenData = getTokenDecoder().decode(account.data);\n        expect(tokenData.amount).toBe(1_000_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/pausable.test.ts",
    "content": "import { some } from '@solana/codecs';\nimport { getMintDecoder, getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: pausable', () => {\n    test('should pause the mint [initializePausableConfig + pause]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const pauseAuthority = await ctx.createFundedAccount();\n\n        const size = getMintSize([{ __kind: 'PausableConfig', authority: pauseAuthority, paused: false }]);\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initPausableIx = await token2022Client.methods\n            .initializePausableConfig({ authority: pauseAuthority })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initPausableIx, initMintIx], [payer, mint]);\n\n        const mintUnpaused = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintUnpaused.extensions).toMatchObject(\n            some([{ __kind: 'PausableConfig', authority: some(pauseAuthority), paused: false }]),\n        );\n\n        const pauseIx = await token2022Client.methods\n            .pause()\n            .accounts({ authority: pauseAuthority, mint })\n            .signers(['authority'])\n            .instruction();\n        await ctx.sendInstruction(pauseIx, [payer, pauseAuthority]);\n\n        const mintPaused = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintPaused.extensions).toMatchObject(\n            some([{ __kind: 'PausableConfig', authority: some(pauseAuthority), paused: true }]),\n        );\n    });\n\n    test('should resume the mint [initializePausableConfig + pause + resume]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const pauseAuthority = await ctx.createFundedAccount();\n\n        const size = getMintSize([{ __kind: 'PausableConfig', authority: pauseAuthority, paused: false }]);\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initPausableIx = await token2022Client.methods\n            .initializePausableConfig({ authority: pauseAuthority })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initPausableIx, initMintIx], [payer, mint]);\n\n        const pauseIx = await token2022Client.methods\n            .pause()\n            .accounts({ authority: pauseAuthority, mint })\n            .signers(['authority'])\n            .instruction();\n        await ctx.sendInstruction(pauseIx, [payer, pauseAuthority]);\n\n        const mintDataPaused = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintDataPaused.extensions).toMatchObject(\n            some([{ __kind: 'PausableConfig', authority: some(pauseAuthority), paused: true }]),\n        );\n\n        const resumeIx = await token2022Client.methods\n            .resume()\n            .accounts({ authority: pauseAuthority, mint })\n            .signers(['authority'])\n            .instruction();\n        await ctx.sendInstruction(resumeIx, [payer, pauseAuthority]);\n\n        const mintDataResumed = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintDataResumed.extensions).toMatchObject(\n            some([{ __kind: 'PausableConfig', authority: some(pauseAuthority), paused: false }]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/reallocate.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: reallocate', () => {\n    test('should reallocate a token account to accommodate new extensions', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mint, payer);\n        await createTokenAccount(ctx, payer, tokenAccount, mint, payer);\n\n        const balanceBefore = ctx.getBalanceOrZero(tokenAccount);\n\n        const ix = await token2022Client.methods\n            .reallocate({ newExtensionTypes: ['memoTransfer'] })\n            .accounts({ owner: payer, payer, token: tokenAccount })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const balanceAfter = ctx.getBalanceOrZero(tokenAccount);\n        expect(balanceAfter).toBeGreaterThan(balanceBefore);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/revoke.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, mintTokens, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: revoke', () => {\n    test('should revoke a delegate from a token account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const sourceAccount = await ctx.createAccount();\n        const delegate = await ctx.createAccount();\n        const decoder = getTokenDecoder();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, sourceAccount, mintAccount, payer);\n        await mintTokens(ctx, payer, mintAccount, sourceAccount, payer, 1_000_000);\n\n        const approveIx = await token2022Client.methods\n            .approve({ amount: 500_000 })\n            .accounts({ delegate, owner: payer, source: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(approveIx, [payer]);\n\n        const sourceDataBefore = decoder.decode(ctx.requireEncodedAccount(sourceAccount).data);\n        expect(sourceDataBefore.delegate).toStrictEqual({ __option: 'Some', value: delegate });\n        expect(sourceDataBefore.delegatedAmount).toBe(500_000n);\n\n        const ix = await token2022Client.methods\n            .revoke()\n            .accounts({ owner: payer, source: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const sourceDataAfter = decoder.decode(ctx.requireEncodedAccount(sourceAccount).data);\n        expect(sourceDataAfter.delegate).toStrictEqual({ __option: 'None' });\n        expect(sourceDataAfter.delegatedAmount).toBe(0n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/scaled-ui-amount.test.ts",
    "content": "import { some } from '@solana/codecs';\nimport { getMintDecoder, getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: scaledUiAmount', () => {\n    test('should update multiplier for scaled UI amount [initializeScaledUiAmountMint + updateMultiplierScaledUiMint]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n\n        const size = getMintSize([\n            {\n                __kind: 'ScaledUiAmountConfig',\n                authority: payer,\n                multiplier: 1.0,\n                newMultiplier: 0,\n                newMultiplierEffectiveTimestamp: 0n,\n            },\n        ]);\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initScaledIx = await token2022Client.methods\n            .initializeScaledUiAmountMint({ authority: payer, multiplier: 1.0 })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initScaledIx, initMintIx], [payer, mint]);\n\n        const updateIx = await token2022Client.methods\n            .updateMultiplierScaledUiMint({ effectiveTimestamp: 0, multiplier: 2.5 })\n            .accounts({ authority: payer, mint })\n            .instruction();\n        await ctx.sendInstruction(updateIx, [payer]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toMatchObject(some([{ __kind: 'ScaledUiAmountConfig', newMultiplier: 2.5 }]));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/set-authority.test.ts",
    "content": "import { getMintDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: setAuthority', () => {\n    test('should change the mint authority to a new address', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const newAuthority = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n\n        const ix = await token2022Client.methods\n            .setAuthority({ authorityType: 'mintTokens', newAuthority })\n            .accounts({ owned: mintAccount, owner: payer })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const decoder = getMintDecoder();\n        const mintData = decoder.decode(ctx.requireEncodedAccount(mintAccount).data);\n        expect(mintData.mintAuthority).toStrictEqual({ __option: 'Some', value: newAuthority });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/sync-native.test.ts",
    "content": "import { address } from '@solana/addresses';\nimport { getTokenDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, TOKEN_2022_ACCOUNT_SIZE, token2022Client } from './token-2022-test-utils';\n\nconst TOKEN_2022_NATIVE_MINT = address('9pan9bMn5HatX4EJdBwg9VgCa7Uz5HL8N1m5D3NdXejP');\n\ndescribe('Token 2022 Program: syncNative', () => {\n    test('should sync a wrapped SOL account amount with its lamport balance', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const wrappedSolAccount = await ctx.createAccount();\n\n        // Ensure the Token 2022 native mint exists.\n        const createNativeMintIx = await token2022Client.methods\n            .createNativeMint()\n            .accounts({ nativeMint: TOKEN_2022_NATIVE_MINT, payer, systemProgram: ctx.SYSTEM_PROGRAM_ADDRESS })\n            .instruction();\n        await ctx.sendInstruction(createNativeMintIx, [payer]);\n\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(TOKEN_2022_ACCOUNT_SIZE));\n        const createAccountIx = await systemClient.methods\n            .createAccount({\n                lamports,\n                programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS,\n                space: TOKEN_2022_ACCOUNT_SIZE,\n            })\n            .accounts({ newAccount: wrappedSolAccount, payer })\n            .instruction();\n\n        const initAccountIx = await token2022Client.methods\n            .initializeAccount()\n            .accounts({ account: wrappedSolAccount, mint: TOKEN_2022_NATIVE_MINT, owner: payer })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initAccountIx], [payer, wrappedSolAccount]);\n\n        const transferAmount = 1_000_000_000n;\n        const transferIx = await systemClient.methods\n            .transferSol({ amount: transferAmount })\n            .accounts({ destination: wrappedSolAccount, source: payer })\n            .instruction();\n        await ctx.sendInstruction(transferIx, [payer]);\n\n        const decoder = getTokenDecoder();\n        const beforeSync = decoder.decode(ctx.requireEncodedAccount(wrappedSolAccount).data);\n        expect(beforeSync.amount).toBe(0n);\n\n        const syncIx = await token2022Client.methods\n            .syncNative()\n            .accounts({ account: wrappedSolAccount })\n            .instruction();\n        await ctx.sendInstruction(syncIx, [payer]);\n\n        const afterSync = decoder.decode(ctx.requireEncodedAccount(wrappedSolAccount).data);\n        expect(afterSync.amount).toBe(transferAmount);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/thaw-account.test.ts",
    "content": "import { AccountState, getTokenDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: thawAccount', () => {\n    test('should thaw a frozen account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const tokenAccount = await ctx.createAccount();\n        const freezeAuthority = await ctx.createFundedAccount();\n\n        await createMint(ctx, payer, mintAccount, payer, freezeAuthority);\n        await createTokenAccount(ctx, payer, tokenAccount, mintAccount, payer);\n\n        const freezeIx = await token2022Client.methods\n            .freezeAccount()\n            .accounts({ account: tokenAccount, mint: mintAccount, owner: freezeAuthority })\n            .instruction();\n\n        await ctx.sendInstruction(freezeIx, [freezeAuthority]);\n\n        const thawIx = await token2022Client.methods\n            .thawAccount()\n            .accounts({ account: tokenAccount, mint: mintAccount, owner: freezeAuthority })\n            .instruction();\n\n        await ctx.sendInstruction(thawIx, [freezeAuthority]);\n\n        const account = ctx.requireEncodedAccount(tokenAccount);\n        const tokenData = getTokenDecoder().decode(account.data);\n        expect(tokenData.state).toBe(AccountState.Initialized);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/token-2022-test-utils.ts",
    "content": "import type { Address } from '@solana/addresses';\nimport { getMintSize, getTokenSize } from '@solana-program/token-2022';\n\nimport type { SystemProgramClient } from '../generated/system-program-idl-types';\nimport type { Token2022ProgramClient } from '../generated/token-2022-idl-types';\nimport { createTestProgramClient, SvmTestContext } from '../test-utils';\n\nexport const token2022Client = createTestProgramClient<Token2022ProgramClient>('token-2022-idl.json');\nexport const systemClient = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n\nexport const TOKEN_2022_MINT_SIZE = getMintSize();\nexport const TOKEN_2022_ACCOUNT_SIZE = getTokenSize();\nexport const TOKEN_2022_MULTISIG_SIZE = 355;\n\n// Creates basic mint without extensions.\nexport async function createMint(\n    ctx: SvmTestContext,\n    payer: Address,\n    mint: Address,\n    mintAuthority: Address,\n    freezeAuthority?: Address,\n    space = TOKEN_2022_MINT_SIZE,\n): Promise<void> {\n    const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(space));\n    const createMintAccountIx = await systemClient.methods\n        .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space })\n        .accounts({ newAccount: mint, payer })\n        .instruction();\n    await ctx.sendInstruction(createMintAccountIx, [payer, mint]);\n\n    const initializeMintIx = await token2022Client.methods\n        .initializeMint({ decimals: 9, freezeAuthority: freezeAuthority ?? null, mintAuthority })\n        .accounts({ mint })\n        .instruction();\n    await ctx.sendInstruction(initializeMintIx, [payer]);\n}\n\n// Creates basic token account without extensions.\nexport async function createTokenAccount(\n    ctx: SvmTestContext,\n    payer: Address,\n    account: Address,\n    mint: Address,\n    owner: Address,\n    space = TOKEN_2022_ACCOUNT_SIZE,\n): Promise<void> {\n    const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(space));\n    const createAccountIx = await systemClient.methods\n        .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space })\n        .accounts({ newAccount: account, payer })\n        .instruction();\n\n    const initAccountIx = await token2022Client.methods\n        .initializeAccount()\n        .accounts({ account, mint, owner })\n        .instruction();\n\n    await ctx.sendInstructions([createAccountIx, initAccountIx], [payer, account]);\n}\n\n// Creates a mint with TransferFeeConfig extension.\nexport async function createTransferFeeMint(\n    ctx: SvmTestContext,\n    payer: Address,\n    feeAuthority: Address,\n    withdrawAuthority: Address,\n    options: { maximumFee: bigint; transferFeeBasisPoints: number } = {\n        maximumFee: 1_000_000n,\n        transferFeeBasisPoints: 100,\n    },\n): Promise<Address> {\n    const { maximumFee, transferFeeBasisPoints } = options;\n    const mint = await ctx.createAccount();\n    const size = getMintSize([\n        {\n            __kind: 'TransferFeeConfig',\n            newerTransferFee: { epoch: 0n, maximumFee, transferFeeBasisPoints },\n            olderTransferFee: { epoch: 0n, maximumFee: 0n, transferFeeBasisPoints: 0 },\n            transferFeeConfigAuthority: feeAuthority,\n            withdrawWithheldAuthority: withdrawAuthority,\n            withheldAmount: 0n,\n        },\n    ]);\n    const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n\n    const createAccountIx = await systemClient.methods\n        .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n        .accounts({ newAccount: mint, payer })\n        .instruction();\n\n    const initFeeConfigIx = await token2022Client.methods\n        .initializeTransferFeeConfig({\n            maximumFee: maximumFee,\n            transferFeeBasisPoints: transferFeeBasisPoints,\n            transferFeeConfigAuthority: feeAuthority,\n            withdrawWithheldAuthority: withdrawAuthority,\n        })\n        .accounts({ mint })\n        .instruction();\n\n    const initMintIx = await token2022Client.methods\n        .initializeMint2({ decimals: 9, mintAuthority: payer })\n        .accounts({ mint })\n        .instruction();\n\n    await ctx.sendInstructions([createAccountIx, initFeeConfigIx, initMintIx], [payer, mint]);\n    return mint;\n}\n\n// Creates a token account with given extensions.\nexport async function createTokenAccountWithExtensions(\n    ctx: SvmTestContext,\n    payer: Address,\n    mint: Address,\n    owner: Address,\n    extensions: NonNullable<Parameters<typeof getTokenSize>[0]>,\n): Promise<Address> {\n    const account = await ctx.createAccount();\n    const size = getTokenSize(extensions);\n    const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n\n    const createAccountIx = await systemClient.methods\n        .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n        .accounts({ newAccount: account, payer })\n        .instruction();\n    const initAccountIx = await token2022Client.methods\n        .initializeAccount3({ owner })\n        .accounts({ account, mint })\n        .instruction();\n\n    await ctx.sendInstructions([createAccountIx, initAccountIx], [payer, account]);\n\n    return account;\n}\n\nexport async function mintTokens(\n    ctx: SvmTestContext,\n    payer: Address,\n    mint: Address,\n    destination: Address,\n    mintAuthority: Address,\n    amount: number,\n): Promise<void> {\n    const mintIx = await token2022Client.methods\n        .mintTo({ amount })\n        .accounts({ mint, mintAuthority, token: destination })\n        .instruction();\n    await ctx.sendInstruction(mintIx, [payer, mintAuthority]);\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/token-group.test.ts",
    "content": "import type { Address } from '@solana/addresses';\nimport { some } from '@solana/codecs';\nimport { type Extension, getMintDecoder, getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\n// Create a mint with GroupPointer + TokenGroup extensions\nasync function createGroupMint(ctx: SvmTestContext, payer: Address, groupUpdateAuthority: Address, maxSize: number) {\n    const mint = await ctx.createAccount();\n\n    // Allocate only GroupPointer space (initializeMint2 rejects extra uninitialized TLV bytes)\n    // initializeTokenGroup will realloc the account internally.\n    const pointerSize = getMintSize([{ __kind: 'GroupPointer', authority: groupUpdateAuthority, groupAddress: mint }]);\n    const fullSize = getMintSize([\n        { __kind: 'GroupPointer', authority: groupUpdateAuthority, groupAddress: mint },\n        { __kind: 'TokenGroup', maxSize, mint, size: 0, updateAuthority: some(groupUpdateAuthority) },\n    ]);\n    const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(fullSize));\n\n    const createAccountIx = await systemClient.methods\n        .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: pointerSize })\n        .accounts({ newAccount: mint, payer })\n        .instruction();\n\n    const initGroupPointerIx = await token2022Client.methods\n        .initializeGroupPointer({ authority: groupUpdateAuthority, groupAddress: mint })\n        .accounts({ mint })\n        .instruction();\n\n    const initMintIx = await token2022Client.methods\n        .initializeMint2({ decimals: 0, mintAuthority: payer })\n        .accounts({ mint })\n        .instruction();\n\n    const initTokenGroupIx = await token2022Client.methods\n        .initializeTokenGroup({ maxSize, updateAuthority: groupUpdateAuthority })\n        .accounts({ group: mint, mint, mintAuthority: payer })\n        .instruction();\n\n    await ctx.sendInstructions([createAccountIx, initGroupPointerIx, initMintIx, initTokenGroupIx], [payer, mint]);\n\n    return mint;\n}\n\ndescribe('Token 2022 Program: tokenGroup', () => {\n    test('should initialize token group [initializeTokenGroup]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const groupUpdateAuthority = await ctx.createFundedAccount();\n        const maxSize = 10;\n        const mint = await createGroupMint(ctx, payer, groupUpdateAuthority, maxSize);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toMatchObject(\n            some([\n                { __kind: 'GroupPointer', authority: some(groupUpdateAuthority), groupAddress: some(mint) },\n                {\n                    __kind: 'TokenGroup',\n                    maxSize: BigInt(maxSize),\n                    size: 0n,\n                    updateAuthority: { __option: 'Some', value: groupUpdateAuthority },\n                },\n            ]),\n        );\n    });\n\n    test('should update token group max size [updateTokenGroupMaxSize]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const groupUpdateAuthority = await ctx.createFundedAccount();\n        const maxSize = 10;\n        const newMaxSize = 20;\n        const mint = await createGroupMint(ctx, payer, groupUpdateAuthority, maxSize);\n\n        const updateMaxSizeIx = await token2022Client.methods\n            .updateTokenGroupMaxSize({ maxSize: newMaxSize })\n            .accounts({ group: mint, updateAuthority: groupUpdateAuthority })\n            .instruction();\n        await ctx.sendInstruction(updateMaxSizeIx, [payer, groupUpdateAuthority]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toMatchObject(\n            some([{ __kind: 'GroupPointer' }, { __kind: 'TokenGroup', maxSize: BigInt(newMaxSize) }]),\n        );\n    });\n\n    test('should update token group update authority [updateTokenGroupUpdateAuthority]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const groupUpdateAuthority = await ctx.createFundedAccount();\n        const newUpdateAuthority = await ctx.createFundedAccount();\n        const maxSize = 10;\n        const mint = await createGroupMint(ctx, payer, groupUpdateAuthority, maxSize);\n\n        const updateAuthorityIx = await token2022Client.methods\n            .updateTokenGroupUpdateAuthority({ newUpdateAuthority })\n            .accounts({ group: mint, updateAuthority: groupUpdateAuthority })\n            .instruction();\n        await ctx.sendInstruction(updateAuthorityIx, [payer, groupUpdateAuthority]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toMatchObject(\n            some([\n                { __kind: 'GroupPointer' },\n                {\n                    __kind: 'TokenGroup',\n                    updateAuthority: { __option: 'Some', value: newUpdateAuthority },\n                },\n            ]),\n        );\n    });\n\n    test('should initialize token group member [initializeTokenGroupMember]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const groupUpdateAuthority = await ctx.createFundedAccount();\n\n        const groupMint = await createGroupMint(ctx, payer, groupUpdateAuthority, 10);\n        // const memberMint = await createMemberMint(ctx, payer, groupMint, groupUpdateAuthority);\n\n        // Create a member mint with GroupMemberPointer + TokenGroupMember\n        const memberMint = await ctx.createAccount();\n        // Allocate only GroupMemberPointer space; initializeTokenGroupMember will realloc.\n        const pointerSize = getMintSize([\n            { __kind: 'GroupMemberPointer', authority: payer, memberAddress: memberMint },\n        ]);\n        const fullSize = getMintSize([\n            { __kind: 'GroupMemberPointer', authority: payer, memberAddress: memberMint },\n            { __kind: 'TokenGroupMember', group: groupMint, memberNumber: 1, mint: memberMint },\n        ]);\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(fullSize));\n\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: pointerSize })\n            .accounts({ newAccount: memberMint, payer })\n            .instruction();\n\n        const initMemberPointerIx = await token2022Client.methods\n            .initializeGroupMemberPointer({ authority: payer, memberAddress: memberMint })\n            .accounts({ mint: memberMint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 0, mintAuthority: payer })\n            .accounts({ mint: memberMint })\n            .instruction();\n\n        const initTokenGroupMemberIx = await token2022Client.methods\n            .initializeTokenGroupMember()\n            .accounts({\n                group: groupMint,\n                groupUpdateAuthority,\n                member: memberMint,\n                memberMint,\n                memberMintAuthority: payer,\n            })\n            .instruction();\n\n        await ctx.sendInstructions(\n            [createAccountIx, initMemberPointerIx, initMintIx, initTokenGroupMemberIx],\n            [payer, memberMint, groupUpdateAuthority],\n        );\n\n        // Verify TokenGroupMember extension\n        const memberData = getMintDecoder().decode(ctx.requireEncodedAccount(memberMint).data);\n        expect(memberData.extensions).toEqual(\n            some<Extension[]>([\n                { __kind: 'GroupMemberPointer', authority: some(payer), memberAddress: some(memberMint) },\n                { __kind: 'TokenGroupMember', group: groupMint, memberNumber: 1n, mint: memberMint },\n            ]),\n        );\n\n        // Verify incremented TokenGroup size\n        const groupData = getMintDecoder().decode(ctx.requireEncodedAccount(groupMint).data);\n        expect(groupData.extensions).toEqual(\n            some<Extension[]>([\n                { __kind: 'GroupPointer', authority: some(groupUpdateAuthority), groupAddress: some(groupMint) },\n                {\n                    __kind: 'TokenGroup',\n                    maxSize: 10n,\n                    mint: groupMint,\n                    size: 1n,\n                    updateAuthority: some(groupUpdateAuthority),\n                },\n            ]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/token-metadata.test.ts",
    "content": "import type { Address } from '@solana/addresses';\nimport { some } from '@solana/codecs';\nimport { type Extension, getMintDecoder, getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\n// Create a mint with MetadataPointer + TokenMetadata extensions\nasync function createMintWithMetadata(\n    ctx: SvmTestContext,\n    payer: Address,\n    updateAuthority: Address,\n    metadata: { name: string; symbol: string; uri: string },\n) {\n    const mint = await ctx.createAccount();\n\n    // Allocate only MetadataPointer space\n    // initializeTokenMetadata will realloc the account internally to fit the metadata.\n    // Fund with enough lamports for the full size (pointer + metadata) so realloc succeeds.\n    const pointerSize = getMintSize([{ __kind: 'MetadataPointer', authority: updateAuthority, metadataAddress: mint }]);\n    const fullSize = getMintSize([\n        { __kind: 'MetadataPointer', authority: updateAuthority, metadataAddress: mint },\n        {\n            __kind: 'TokenMetadata',\n            additionalMetadata: new Map(),\n            mint,\n            name: metadata.name,\n            symbol: metadata.symbol,\n            updateAuthority,\n            uri: metadata.uri,\n        },\n    ]);\n    // Add extra space for potential field updates (updateTokenMetadataField reallocs the account)\n    const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(fullSize * 2));\n\n    const createAccountIx = await systemClient.methods\n        .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: pointerSize })\n        .accounts({ newAccount: mint, payer })\n        .instruction();\n\n    const initMetadataPointerIx = await token2022Client.methods\n        .initializeMetadataPointer({ authority: updateAuthority, metadataAddress: mint })\n        .accounts({ mint })\n        .instruction();\n\n    const initMintIx = await token2022Client.methods\n        .initializeMint2({ decimals: 9, mintAuthority: payer })\n        .accounts({ mint })\n        .instruction();\n\n    const initTokenMetadataIx = await token2022Client.methods\n        .initializeTokenMetadata({ name: metadata.name, symbol: metadata.symbol, uri: metadata.uri })\n        .accounts({ metadata: mint, mint, mintAuthority: payer, updateAuthority })\n        .instruction();\n\n    await ctx.sendInstructions(\n        [createAccountIx, initMetadataPointerIx, initMintIx, initTokenMetadataIx],\n        [payer, mint],\n    );\n\n    return mint;\n}\n\ndescribe('Token 2022 Program: tokenMetadata', () => {\n    test('should initialize token metadata [initializeTokenMetadata]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const updateAuthority = await ctx.createFundedAccount();\n\n        const mint = await createMintWithMetadata(ctx, payer, updateAuthority, {\n            name: 'Test Token',\n            symbol: 'TST',\n            uri: 'https://example.com/metadata.json',\n        });\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toMatchObject(\n            some([\n                { __kind: 'MetadataPointer', authority: some(updateAuthority), metadataAddress: some(mint) },\n                {\n                    __kind: 'TokenMetadata',\n                    name: 'Test Token',\n                    symbol: 'TST',\n                    updateAuthority: { __option: 'Some', value: updateAuthority },\n                    uri: 'https://example.com/metadata.json',\n                },\n            ]),\n        );\n    });\n\n    test('should update token metadata field [updateTokenMetadataField]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const updateAuthority = await ctx.createFundedAccount();\n\n        const mint = await createMintWithMetadata(ctx, payer, updateAuthority, {\n            name: 'Test Token',\n            symbol: 'TST',\n            uri: 'https://example.com/metadata.json',\n        });\n\n        const updateNameIx = await token2022Client.methods\n            .updateTokenMetadataField({ field: { __kind: 'name' }, value: 'Updated Token' })\n            .accounts({ metadata: mint, updateAuthority })\n            .instruction();\n        const updateSymbolIx = await token2022Client.methods\n            .updateTokenMetadataField({ field: { __kind: 'symbol' }, value: 'LOL' })\n            .accounts({ metadata: mint, updateAuthority })\n            .instruction();\n        const addKeyIx = await token2022Client.methods\n            .updateTokenMetadataField({ field: { __kind: 'key', fields: ['color'] }, value: 'blue' })\n            .accounts({ metadata: mint, updateAuthority })\n            .instruction();\n\n        await ctx.sendInstructions([updateNameIx, updateSymbolIx, addKeyIx], [payer, updateAuthority]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toEqual(\n            some<Extension[]>([\n                { __kind: 'MetadataPointer', authority: some(updateAuthority), metadataAddress: some(mint) },\n                {\n                    __kind: 'TokenMetadata',\n                    additionalMetadata: new Map([['color', 'blue']]),\n                    mint,\n                    name: 'Updated Token',\n                    symbol: 'LOL',\n                    updateAuthority: some(updateAuthority),\n                    uri: 'https://example.com/metadata.json',\n                },\n            ]),\n        );\n    });\n\n    test('should add and remove custom metadata key [updateTokenMetadataField + removeTokenMetadataKey]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const updateAuthority = await ctx.createFundedAccount();\n\n        // Use shorter metadata so there's room for additionalMetadata in the allocated space\n        const mint = await createMintWithMetadata(ctx, payer, updateAuthority, {\n            name: 'T',\n            symbol: 'T',\n            uri: '',\n        });\n\n        // Add a custom key-value pair\n        const addKeyIx = await token2022Client.methods\n            .updateTokenMetadataField({ field: { __kind: 'key', fields: ['color'] }, value: 'blue' })\n            .accounts({ metadata: mint, updateAuthority })\n            .instruction();\n        await ctx.sendInstruction(addKeyIx, [payer, updateAuthority]);\n\n        let mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toEqual(\n            some<Extension[]>([\n                { __kind: 'MetadataPointer', authority: some(updateAuthority), metadataAddress: some(mint) },\n                {\n                    __kind: 'TokenMetadata',\n                    additionalMetadata: new Map([['color', 'blue']]),\n                    mint,\n                    name: 'T',\n                    symbol: 'T',\n                    updateAuthority: some(updateAuthority),\n                    uri: '',\n                },\n            ]),\n        );\n\n        // Remove the custom key\n        const removeKeyIx = await token2022Client.methods\n            .removeTokenMetadataKey({ idempotent: false, key: 'color' })\n            .accounts({ metadata: mint, updateAuthority })\n            .instruction();\n        await ctx.sendInstruction(removeKeyIx, [payer, updateAuthority]);\n\n        mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toEqual(\n            some<Extension[]>([\n                { __kind: 'MetadataPointer', authority: some(updateAuthority), metadataAddress: some(mint) },\n                {\n                    __kind: 'TokenMetadata',\n                    additionalMetadata: new Map(),\n                    mint,\n                    name: 'T',\n                    symbol: 'T',\n                    updateAuthority: some(updateAuthority),\n                    uri: '',\n                },\n            ]),\n        );\n    });\n\n    test('should update token metadata update authority [updateTokenMetadataUpdateAuthority]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const updateAuthority = await ctx.createFundedAccount();\n        const newUpdateAuthority = await ctx.createFundedAccount();\n\n        const mint = await createMintWithMetadata(ctx, payer, updateAuthority, {\n            name: 'Test Token',\n            symbol: 'TST',\n            uri: 'https://example.com/metadata.json',\n        });\n\n        const updateAuthorityIx = await token2022Client.methods\n            .updateTokenMetadataUpdateAuthority({ newUpdateAuthority })\n            .accounts({ metadata: mint, updateAuthority })\n            .instruction();\n        await ctx.sendInstruction(updateAuthorityIx, [payer, updateAuthority]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toMatchObject(\n            some([\n                { __kind: 'MetadataPointer' },\n                {\n                    __kind: 'TokenMetadata',\n                    updateAuthority: { __option: 'Some', value: newUpdateAuthority },\n                },\n            ]),\n        );\n    });\n\n    test('should emit token metadata [emitTokenMetadata]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const updateAuthority = await ctx.createFundedAccount();\n\n        const mint = await createMintWithMetadata(ctx, payer, updateAuthority, {\n            name: 'Test Token',\n            symbol: 'TST',\n            uri: 'https://example.com/metadata.json',\n        });\n\n        // emitTokenMetadata emits serialized TokenMetadata as return data\n        // We just ensure that tx was not failed\n        const emitIx = await token2022Client.methods.emitTokenMetadata().accounts({ metadata: mint }).instruction();\n        const result = await ctx.sendInstruction(emitIx, [payer]);\n        expect(result.returnData().data()).toBeDefined();\n\n        // And verify metadata is unchanged after emit\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toMatchObject(\n            some([{ __kind: 'MetadataPointer' }, { __kind: 'TokenMetadata', name: 'Test Token', symbol: 'TST' }]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/transfer-checked.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, mintTokens, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: transferChecked', () => {\n    test('should transfer_checked tokens', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const sourceAccount = await ctx.createAccount();\n        const destinationAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, sourceAccount, mintAccount, payer);\n        await createTokenAccount(ctx, payer, destinationAccount, mintAccount, payer);\n        await mintTokens(ctx, payer, mintAccount, sourceAccount, payer, 1_000_000);\n\n        const ix = await token2022Client.methods\n            .transferChecked({ amount: 400_000, decimals: 9 })\n            .accounts({ authority: payer, destination: destinationAccount, mint: mintAccount, source: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const decoder = getTokenDecoder();\n        const sourceData = decoder.decode(ctx.requireEncodedAccount(sourceAccount).data);\n        const destData = decoder.decode(ctx.requireEncodedAccount(destinationAccount).data);\n        expect(sourceData.amount).toBe(600_000n);\n        expect(destData.amount).toBe(400_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/transfer-fee.test.ts",
    "content": "import { some } from '@solana/codecs';\nimport { getMintDecoder, getMintSize, getTokenDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport {\n    createTokenAccountWithExtensions,\n    createTransferFeeMint,\n    mintTokens,\n    systemClient,\n    token2022Client,\n} from './token-2022-test-utils';\n\nconst TRANSFER_FEE_AMOUNT_EXT = [{ __kind: 'TransferFeeAmount' as const, withheldAmount: 0n }];\n\ndescribe('Token 2022 Program: transferFee', () => {\n    test('should initialize transfer fee config extension [initializeTransferFeeConfig]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const feeAuthority = await ctx.createFundedAccount();\n        const withdrawAuthority = await ctx.createFundedAccount();\n\n        const size = getMintSize([\n            {\n                __kind: 'TransferFeeConfig',\n                newerTransferFee: { epoch: 0n, maximumFee: 1_000_000n, transferFeeBasisPoints: 100 },\n                olderTransferFee: { epoch: 0n, maximumFee: 0n, transferFeeBasisPoints: 0 },\n                transferFeeConfigAuthority: feeAuthority,\n                withdrawWithheldAuthority: withdrawAuthority,\n                withheldAmount: 0n,\n            },\n        ]);\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initFeeConfigIx = await token2022Client.methods\n            .initializeTransferFeeConfig({\n                maximumFee: 1_000_000,\n                transferFeeBasisPoints: 100,\n                transferFeeConfigAuthority: feeAuthority,\n                withdrawWithheldAuthority: withdrawAuthority,\n            })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, freezeAuthority: null, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initFeeConfigIx, initMintIx], [payer, mint]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.mintAuthority).toEqual({ __option: 'Some', value: payer });\n        expect(mintData.extensions).toMatchObject(\n            some([\n                {\n                    __kind: 'TransferFeeConfig',\n                    transferFeeConfigAuthority: feeAuthority,\n                    withdrawWithheldAuthority: withdrawAuthority,\n                },\n            ]),\n        );\n    });\n\n    test('should transfer tokens with fee [transferCheckedWithFee]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const feeAuthority = await ctx.createFundedAccount();\n        const withdrawAuthority = await ctx.createFundedAccount();\n\n        // Prepare mint and accounts with Transfer fee\n        const mint = await createTransferFeeMint(ctx, payer, feeAuthority, withdrawAuthority);\n        const source = await createTokenAccountWithExtensions(ctx, payer, mint, payer, TRANSFER_FEE_AMOUNT_EXT);\n        const destination = await createTokenAccountWithExtensions(ctx, payer, mint, payer, TRANSFER_FEE_AMOUNT_EXT);\n\n        await mintTokens(ctx, payer, mint, source, payer, 1_000_000);\n\n        // Transfer with fee: 1_000_000 * 100 / 10000 = 10_000 fee\n        const amount = 1_000_000;\n        const fee = 10_000;\n        const transferIx = await token2022Client.methods\n            .transferCheckedWithFee({ amount, decimals: 9, fee })\n            .accounts({ authority: payer, destination, mint, source })\n            .instruction();\n        await ctx.sendInstruction(transferIx, [payer]);\n\n        const decoder = getTokenDecoder();\n        const sourceData = decoder.decode(ctx.requireEncodedAccount(source).data);\n        const destData = decoder.decode(ctx.requireEncodedAccount(destination).data);\n        expect(sourceData.amount).toBe(0n);\n        expect(destData.amount).toBe(BigInt(amount - fee));\n    });\n\n    test('should set new transfer fee [setTransferFee]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const feeAuthority = await ctx.createFundedAccount();\n        const withdrawAuthority = await ctx.createFundedAccount();\n\n        // Prepare mint with Transfer fee\n        const mint = await createTransferFeeMint(ctx, payer, feeAuthority, withdrawAuthority);\n\n        const setFeeIx = await token2022Client.methods\n            .setTransferFee({ maximumFee: 2_000_000, transferFeeBasisPoints: 200 })\n            .accounts({ mint, transferFeeConfigAuthority: feeAuthority })\n            .signers(['transferFeeConfigAuthority'])\n            .instruction();\n        await ctx.sendInstruction(setFeeIx, [payer, feeAuthority]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toMatchObject(\n            some([\n                {\n                    __kind: 'TransferFeeConfig',\n                    newerTransferFee: { maximumFee: 2_000_000n, transferFeeBasisPoints: 200 },\n                },\n            ]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/transfer-hook.test.ts",
    "content": "import type { Address } from '@solana/addresses';\nimport { some } from '@solana/codecs';\nimport { type Extension, type ExtensionArgs, getMintDecoder, getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\nconst getTransferHookExt = (authority: Address, programId: Address): ExtensionArgs[] => [\n    { __kind: 'TransferHook', authority, programId },\n];\n\ndescribe('Token 2022 Program: transferHook', () => {\n    test('should initialize transfer hook extension [initializeTransferHook]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const transferHookAuthority = await ctx.createFundedAccount();\n        const hookProgramId = await ctx.createAccount();\n\n        const size = getMintSize(getTransferHookExt(transferHookAuthority, hookProgramId));\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initTransferHookIx = await token2022Client.methods\n            .initializeTransferHook({ authority: transferHookAuthority, programId: hookProgramId })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initTransferHookIx, initMintIx], [payer, mint]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.mintAuthority).toEqual({ __option: 'Some', value: payer });\n        expect(mintData.extensions).toEqual(\n            some<Extension[]>([\n                {\n                    __kind: 'TransferHook',\n                    authority: transferHookAuthority,\n                    programId: hookProgramId,\n                },\n            ]),\n        );\n    });\n\n    test('should update transfer hook program id [updateTransferHook]', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const transferHookAuthority = await ctx.createFundedAccount();\n        const hookProgramId = await ctx.createAccount();\n        const newHookProgramId = await ctx.createAccount();\n\n        const size = getMintSize(getTransferHookExt(transferHookAuthority, hookProgramId));\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initTransferHookIx = await token2022Client.methods\n            .initializeTransferHook({ authority: transferHookAuthority, programId: hookProgramId })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initTransferHookIx, initMintIx], [payer, mint]);\n\n        // Update transfer hook to a new program id\n        const updateIx = await token2022Client.methods\n            .updateTransferHook({ programId: newHookProgramId })\n            .accounts({ authority: transferHookAuthority, mint })\n            .signers(['authority'])\n            .instruction();\n        await ctx.sendInstruction(updateIx, [payer, transferHookAuthority]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toEqual(\n            some<Extension[]>([\n                { __kind: 'TransferHook', authority: transferHookAuthority, programId: newHookProgramId },\n            ]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/transfer.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, createTokenAccount, mintTokens, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: transfer', () => {\n    test('should transfer tokens between accounts', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n        const sourceAccount = await ctx.createAccount();\n        const destinationAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        await createTokenAccount(ctx, payer, sourceAccount, mintAccount, payer);\n        await createTokenAccount(ctx, payer, destinationAccount, mintAccount, payer);\n        await mintTokens(ctx, payer, mintAccount, sourceAccount, payer, 1_000_000);\n\n        const ix = await token2022Client.methods\n            .transfer({ amount: 400_000 })\n            .accounts({ authority: payer, destination: destinationAccount, source: sourceAccount })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        const decoder = getTokenDecoder();\n        const sourceData = decoder.decode(ctx.requireEncodedAccount(sourceAccount).data);\n        const destData = decoder.decode(ctx.requireEncodedAccount(destinationAccount).data);\n        expect(sourceData.amount).toBe(600_000n);\n        expect(destData.amount).toBe(400_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/ui-amount-to-amount.test.ts",
    "content": "import { getU64Decoder } from '@solana/codecs';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { createMint, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: uiAmountToAmount', () => {\n    test('should convert a UI amount string to a raw token amount', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mintAccount = await ctx.createAccount();\n\n        await createMint(ctx, payer, mintAccount, payer);\n        const amount = 1_000_000_000;\n        const uiAmount = amount / 10 ** 9;\n\n        const ix = await token2022Client.methods\n            .uiAmountToAmount({ uiAmount: uiAmount.toString() })\n            .accounts({ mint: mintAccount })\n            .instruction();\n\n        const meta = await ctx.sendInstruction(ix, [payer]);\n        const rawAmount = getU64Decoder().decode(meta.returnData().data());\n        expect(rawAmount).toBe(BigInt(amount));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/update-default-account-state.test.ts",
    "content": "import { some } from '@solana/codecs';\nimport { AccountState, getMintDecoder, getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: updateDefaultAccountState', () => {\n    test('should update default account state extension', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const freezeAuthority = await ctx.createFundedAccount();\n\n        const size = getMintSize([{ __kind: 'DefaultAccountState', state: AccountState.Frozen }]);\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initDefaultStateIx = await token2022Client.methods\n            .initializeDefaultAccountState({ state: 'frozen' })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, freezeAuthority, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initDefaultStateIx, initMintIx], [payer, mint]);\n\n        const mintDataBefore = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintDataBefore.extensions).toMatchObject(\n            some([{ __kind: 'DefaultAccountState', state: AccountState.Frozen }]),\n        );\n\n        const updateIx = await token2022Client.methods\n            .updateDefaultAccountState({ state: 'initialized' })\n            .accounts({ freezeAuthority, mint })\n            .signers(['freezeAuthority'])\n            .instruction();\n        await ctx.sendInstruction(updateIx, [payer, freezeAuthority]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toMatchObject(\n            some([{ __kind: 'DefaultAccountState', state: AccountState.Initialized }]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/update-rate-interest-bearing-mint.test.ts",
    "content": "import { some } from '@solana/codecs';\nimport { getMintDecoder, getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: updateRateInterestBearingMint', () => {\n    test('should update interest bearing mint rate', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const rateAuthority = await ctx.createFundedAccount();\n\n        const size = getMintSize([\n            {\n                __kind: 'InterestBearingConfig',\n                currentRate: 500,\n                initializationTimestamp: 0n,\n                lastUpdateTimestamp: 0n,\n                preUpdateAverageRate: 0,\n                rateAuthority,\n            },\n        ]);\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initInterestBearingIx = await token2022Client.methods\n            .initializeInterestBearingMint({ rate: 500, rateAuthority })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, freezeAuthority: null, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initInterestBearingIx, initMintIx], [payer, mint]);\n\n        const updateIx = await token2022Client.methods\n            .updateRateInterestBearingMint({ rate: 1000 })\n            .accounts({ mint, rateAuthority })\n            .signers(['rateAuthority'])\n            .instruction();\n\n        await ctx.sendInstruction(updateIx, [payer, rateAuthority]);\n\n        const mintData = getMintDecoder().decode(ctx.requireEncodedAccount(mint).data);\n        expect(mintData.extensions).toMatchObject(\n            some([{ __kind: 'InterestBearingConfig', currentRate: 1000, rateAuthority }]),\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/withdraw-excess-lamports.test.ts",
    "content": "import { getMintSize } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport { systemClient, token2022Client } from './token-2022-test-utils';\n\ndescribe('Token 2022 Program: withdrawExcessLamports', () => {\n    test('should withdraw excess lamports from a mint account', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const mint = await ctx.createAccount();\n        const destination = await ctx.createFundedAccount();\n\n        // Create mint WITH MintCloseAuthority (required for withdrawExcessLamports).\n        const size = getMintSize([{ __kind: 'MintCloseAuthority', closeAuthority: payer }]);\n        const lamports = ctx.getMinimumBalanceForRentExemption(BigInt(size));\n        const createAccountIx = await systemClient.methods\n            .createAccount({ lamports, programAddress: ctx.TOKEN_2022_PROGRAM_ADDRESS, space: size })\n            .accounts({ newAccount: mint, payer })\n            .instruction();\n\n        const initCloseAuthIx = await token2022Client.methods\n            .initializeMintCloseAuthority({ closeAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        const initMintIx = await token2022Client.methods\n            .initializeMint2({ decimals: 9, freezeAuthority: null, mintAuthority: payer })\n            .accounts({ mint })\n            .instruction();\n\n        await ctx.sendInstructions([createAccountIx, initCloseAuthIx, initMintIx], [payer, mint]);\n\n        // Airdrop excess lamports to the mint account.\n        ctx.airdropToAddress(mint, 1_000_000n);\n\n        const destBefore = ctx.getBalanceOrZero(destination);\n        const ix = await token2022Client.methods\n            .withdrawExcessLamports()\n            .accounts({ authority: payer, destinationAccount: destination, sourceAccount: mint })\n            .instruction();\n        await ctx.sendInstruction(ix, [payer]);\n\n        expect(ctx.getBalanceOrZero(destination)).toBeGreaterThan(destBefore);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/programs/token-2022/withdraw-withheld-tokens.test.ts",
    "content": "import { getTokenDecoder } from '@solana-program/token-2022';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../test-utils';\nimport {\n    createTokenAccountWithExtensions,\n    createTransferFeeMint,\n    mintTokens,\n    token2022Client,\n} from './token-2022-test-utils';\n\nconst TRANSFER_FEE_AMOUNT_EXT = [{ __kind: 'TransferFeeAmount' as const, withheldAmount: 0n }];\n\ndescribe('Token 2022 Program: withdrawWithheldTokens', () => {\n    test('should withdraw withheld tokens from mint', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const feeAuthority = await ctx.createFundedAccount();\n        const withdrawAuthority = await ctx.createFundedAccount();\n\n        // Prepare mint with Transfer fee\n        const mint = await createTransferFeeMint(ctx, payer, feeAuthority, withdrawAuthority);\n        const source = await createTokenAccountWithExtensions(ctx, payer, mint, payer, TRANSFER_FEE_AMOUNT_EXT);\n        const destination = await createTokenAccountWithExtensions(ctx, payer, mint, payer, TRANSFER_FEE_AMOUNT_EXT);\n        const feeReceiver = await createTokenAccountWithExtensions(ctx, payer, mint, payer, TRANSFER_FEE_AMOUNT_EXT);\n\n        // Mint and transfer to generate fees\n        await mintTokens(ctx, payer, mint, source, payer, 1_000_000);\n\n        const transferIx = await token2022Client.methods\n            .transferCheckedWithFee({ amount: 1_000_000, decimals: 9, fee: 10_000 })\n            .accounts({ authority: payer, destination, mint, source })\n            .instruction();\n        await ctx.sendInstruction(transferIx, [payer]);\n\n        // Harvest fees from destination to mint\n        const harvestIx = await token2022Client.methods\n            .harvestWithheldTokensToMint({ sources: [destination] })\n            .accounts({ mint })\n            .instruction();\n        await ctx.sendInstruction(harvestIx, [payer]);\n\n        // Withdraw from mint to feeReceiver\n        const withdrawIx = await token2022Client.methods\n            .withdrawWithheldTokensFromMint()\n            .accounts({ feeReceiver, mint, withdrawWithheldAuthority: withdrawAuthority })\n            .signers(['withdrawWithheldAuthority'])\n            .instruction();\n        await ctx.sendInstruction(withdrawIx, [payer, withdrawAuthority]);\n\n        const feeReceiverData = getTokenDecoder().decode(ctx.requireEncodedAccount(feeReceiver).data);\n        expect(feeReceiverData.amount).toBe(10_000n);\n    });\n\n    test('should withdraw withheld tokens from accounts', async () => {\n        const ctx = new SvmTestContext({ defaultPrograms: true });\n        const payer = await ctx.createFundedAccount();\n        const feeAuthority = await ctx.createFundedAccount();\n        const withdrawAuthority = await ctx.createFundedAccount();\n\n        // Prepare mint and accounts with Transfer fee\n        const mint = await createTransferFeeMint(ctx, payer, feeAuthority, withdrawAuthority);\n        const source = await createTokenAccountWithExtensions(ctx, payer, mint, payer, TRANSFER_FEE_AMOUNT_EXT);\n        const destination = await createTokenAccountWithExtensions(ctx, payer, mint, payer, TRANSFER_FEE_AMOUNT_EXT);\n        const feeReceiver = await createTokenAccountWithExtensions(ctx, payer, mint, payer, TRANSFER_FEE_AMOUNT_EXT);\n\n        // Mint and transfer to generate fees\n        await mintTokens(ctx, payer, mint, source, payer, 1_000_000);\n\n        const transferIx = await token2022Client.methods\n            .transferCheckedWithFee({ amount: 1_000_000, decimals: 9, fee: 10_000 })\n            .accounts({ authority: payer, destination, mint, source })\n            .instruction();\n        await ctx.sendInstruction(transferIx, [payer]);\n\n        // Withdraw directly from accounts\n        const withdrawIx = await token2022Client.methods\n            .withdrawWithheldTokensFromAccounts({ numTokenAccounts: 1, sources: [destination] })\n            .accounts({ feeReceiver, mint, withdrawWithheldAuthority: withdrawAuthority })\n            .signers(['withdrawWithheldAuthority'])\n            .instruction();\n        await ctx.sendInstruction(withdrawIx, [payer, withdrawAuthority]);\n\n        const feeReceiverData = getTokenDecoder().decode(ctx.requireEncodedAccount(feeReceiver).data);\n        expect(feeReceiverData.amount).toBe(10_000n);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/svm-test-context.ts",
    "content": "import {\n    type Address,\n    address,\n    appendTransactionMessageInstructions,\n    compileTransaction,\n    createAddressWithSeed,\n    createTransactionMessage,\n    generateKeyPairSigner,\n    type Instruction,\n    type KeyPairSigner,\n    lamports,\n    pipe,\n    setTransactionMessageFeePayerSigner,\n    signTransactionWithSigners,\n} from '@solana/kit';\nimport { TOKEN_PROGRAM_ADDRESS as TOKEN_PROGRAM_ADDR } from '@solana-program/token';\nimport {\n    ASSOCIATED_TOKEN_PROGRAM_ADDRESS as ASSOCIATED_TOKEN_PROGRAM_ADDR,\n    TOKEN_2022_PROGRAM_ADDRESS as T2022_PROGRAM_ADDR,\n} from '@solana-program/token-2022';\nimport { FailedTransactionMetadata, LiteSVM, type TransactionMetadata } from 'litesvm';\n\n/**\n * Encoded account data returned from SVM.\n */\nexport type EncodedAccount = {\n    readonly data: Uint8Array;\n    readonly executable: boolean;\n    readonly lamports: bigint;\n    readonly owner: Address;\n    readonly rentEpoch?: bigint;\n};\n\n/**\n * Configuration options for the SVM test context.\n */\nexport type SvmTestContextConfig = {\n    /** Include standard builtins */\n    readonly builtins?: boolean;\n    /** Include standard SPL programs (Token, Token-2022, ATA, etc.). Default: false. */\n    readonly defaultPrograms?: boolean;\n    /** Include standard precompiles (ed25519, secp256k1). Default: false. */\n    readonly precompiles?: boolean;\n    /** Include standard sysvars (clock, rent, etc.). Default: false. */\n    readonly sysvars?: boolean;\n};\n\n/**\n * Test context that encapsulates LiteSVM and provides a clean Solana Kit API.\n *\n * Purpose:\n * -  Hides LiteSVM implementation details and exposes Solana Kit types (Address, Instruction)\n * - Manages account lifecycle and signing internally\n * - Provides declarative test helpers (fundAccount, sendInstruction)\n *\n * Tests work exclusively with Address types while the context handles\n * keypair management and transaction building behind the scenes.\n * Use the config parameter to include additional programs.\n */\nexport class SvmTestContext {\n    private readonly svm: LiteSVM;\n    private readonly accounts: Map<Address, KeyPairSigner>;\n    private currentSlot: bigint;\n\n    readonly TOKEN_2022_PROGRAM_ADDRESS: Address = T2022_PROGRAM_ADDR;\n    readonly TOKEN_PROGRAM_ADDRESS: Address = TOKEN_PROGRAM_ADDR;\n    readonly ASSOCIATED_TOKEN_PROGRAM_ADDRESS: Address = ASSOCIATED_TOKEN_PROGRAM_ADDR;\n    readonly SYSTEM_PROGRAM_ADDRESS = address('11111111111111111111111111111111');\n    readonly SYSVAR_RENT_ADDRESS = address('SysvarRent111111111111111111111111111111111');\n    readonly SYSVAR_INSTRUCTIONS_ADDRESS = address('Sysvar1nstructions1111111111111111111111111');\n    readonly BPF_LOADER_UPGRADEABLE = address('BPFLoaderUpgradeab1e11111111111111111111111');\n    readonly TOKEN_2022_NATIVE_MINT = address('9pan9bMn5HatX4EJdBwg9VgCa7Uz5HL8N1m5D3NdXejP');\n\n    constructor(config: SvmTestContextConfig = {}) {\n        let svm = new LiteSVM();\n        if (config.defaultPrograms) {\n            svm = svm.withDefaultPrograms();\n        }\n        if (config.precompiles) {\n            svm = svm.withPrecompiles();\n        }\n        if (config.sysvars) {\n            svm = svm.withSysvars();\n        }\n        if (config.builtins) {\n            svm = svm.withBuiltins();\n        }\n        this.svm = svm;\n        this.accounts = new Map();\n        this.currentSlot = BigInt(0);\n    }\n\n    /** Creates a new keypair signer */\n    static generateKeypair(): Promise<KeyPairSigner> {\n        return generateKeyPairSigner();\n    }\n\n    /** Generates a new Address */\n    static async generateAddress(): Promise<Address> {\n        const signer = await SvmTestContext.generateKeypair();\n        return signer.address;\n    }\n\n    /** Creates a new keypair, stores it in the context, and returns its address. */\n    async createAccount(): Promise<Address> {\n        const signer = await generateKeyPairSigner();\n        this.accounts.set(signer.address, signer);\n        return signer.address;\n    }\n\n    /** Creates an account and airdrops the given lamports to it. */\n    async createFundedAccount(amount: bigint = BigInt(10e9)): Promise<Address> {\n        const addr = await this.createAccount();\n        this.svm.airdrop(addr, lamports(amount));\n        return addr;\n    }\n\n    /** Derives an address from base + seed + programId (createWithSeed). Does not store a keypair. */\n    async createAccountWithSeed(base: Address, seed: string, programId: Address): Promise<Address> {\n        return await createAddressWithSeed({ baseAddress: base, programAddress: programId, seed });\n    }\n\n    /** Airdrops lamports to an account. Account must have been created via this context. */\n    airdrop(account: Address, amount: bigint = BigInt(1e9)): void {\n        this.svm.airdrop(account, lamports(amount));\n    }\n\n    /** Airdrops lamports to any address on-chain (e.g. PDAs without stored keypairs). */\n    airdropToAddress(account: Address, amount: bigint = BigInt(1e9)): void {\n        this.svm.airdrop(account, lamports(amount));\n    }\n\n    /**\n     * Sets account data directly on any address.\n     * @param account - The account address to set\n     * @param accountData - The account data including lamports, data, owner, executable\n     */\n    setAccount(\n        account: Address,\n        accountData: {\n            readonly data: Uint8Array;\n            readonly executable?: boolean;\n            readonly lamports: bigint;\n            readonly owner: Address;\n        },\n    ): void {\n        this.svm.setAccount({\n            address: account,\n            data: accountData.data,\n            executable: accountData.executable ?? false,\n            lamports: lamports(accountData.lamports),\n            programAddress: accountData.owner,\n            space: BigInt(accountData.data.length),\n        });\n    }\n\n    /** Returns the account's lamport balance, or null if the account is unknown to the SVM. */\n    getBalance(account: Address): bigint | null {\n        const balance = this.svm.getBalance(account);\n        return balance !== null ? BigInt(balance) : null;\n    }\n\n    /** Same as getBalance but returns 0n when the account is missing. */\n    getBalanceOrZero(account: Address): bigint {\n        return this.getBalance(account) ?? BigInt(0);\n    }\n\n    /** Fetches full account data (lamports, owner, data, executable). Returns null if not found. */\n    fetchEncodedAccount(account: Address): EncodedAccount | null {\n        const accountInfo = this.svm.getAccount(account);\n\n        if (!accountInfo.exists) {\n            return null;\n        }\n\n        return {\n            data: new Uint8Array(accountInfo.data),\n            executable: accountInfo.executable,\n            lamports: BigInt(accountInfo.lamports),\n            owner: accountInfo.programAddress,\n        };\n    }\n\n    /** Like fetchEncodedAccount but throws if the account does not exist. */\n    requireEncodedAccount(account: Address): EncodedAccount {\n        const encodedAccount = this.fetchEncodedAccount(account);\n        if (!encodedAccount) {\n            throw new Error(`Account ${account} does not exist`);\n        }\n        return encodedAccount;\n    }\n\n    /** Builds, signs, and sends a transaction with a single instruction. Signers must be context-owned. */\n    async sendInstruction(instruction: Instruction, signers: Address[]): Promise<TransactionMetadata> {\n        return await this.buildAndSend([instruction], signers);\n    }\n\n    /** Builds, signs, and sends a transaction with multiple instructions. Signers must be context-owned. */\n    async sendInstructions(instructions: Instruction[], signers: Address[]): Promise<TransactionMetadata> {\n        return await this.buildAndSend(instructions, signers);\n    }\n\n    /** Warps the SVM to the specified slot. */\n    warpToSlot(slot: bigint): void {\n        this.currentSlot = slot;\n        this.svm.warpToSlot(slot);\n    }\n\n    /** Advances the SVM by the specified number of slots (default: 1). */\n    advanceSlots(count: bigint = BigInt(1)): void {\n        this.currentSlot += count;\n        this.svm.warpToSlot(this.currentSlot);\n        this.svm.expireBlockhash();\n    }\n\n    /** Loads a Solana program from a .so file. */\n    loadProgram(programAddress: Address, programPath: string): void {\n        this.svm.addProgramFromFile(programAddress, programPath);\n    }\n\n    /** Calculates the minimum balance required to make an account with the given data length rent-exempt. */\n    getMinimumBalanceForRentExemption(dataLen: bigint): bigint {\n        return this.svm.minimumBalanceForRentExemption(dataLen);\n    }\n\n    /** Returns the underlying LiteSVM instance for direct use when needed. Consider using the public methods instead. */\n    getSvm(): LiteSVM {\n        return this.svm;\n    }\n\n    private async buildAndSend(instructions: Instruction[], signers: Address[]): Promise<TransactionMetadata> {\n        if (signers.length === 0) {\n            throw new Error('At least one signer is required');\n        }\n\n        const keypairSigners = signers.map(addr => {\n            const signer = this.accounts.get(addr);\n            if (!signer) {\n                throw new Error(`Signer ${addr} not found in context`);\n            }\n            return signer;\n        });\n\n        const tx = pipe(\n            createTransactionMessage({ version: 0 }),\n            message => setTransactionMessageFeePayerSigner(keypairSigners[0], message),\n            message => this.svm.setTransactionMessageLifetimeUsingLatestBlockhash(message),\n            message => appendTransactionMessageInstructions(instructions, message),\n            message => compileTransaction(message),\n        );\n        const signedTx = await signTransactionWithSigners(keypairSigners, tx);\n\n        const result = this.svm.sendTransaction(signedTx);\n\n        if (result instanceof FailedTransactionMetadata) {\n            console.error('Transaction failed, logs:\\n', result.meta().prettyLogs());\n            throw new Error(`Transaction failed: ${result.toString()}`);\n        }\n\n        return result;\n    }\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/cli/generate-program-client-types.test.ts",
    "content": "import { execFileSync } from 'node:child_process';\nimport { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\n\nimport type { RootNode } from 'codama';\nimport { afterAll, describe, expect, test } from 'vitest';\n\nimport { generateClientTypes } from '../../../src/cli/commands/generate-client-types/generate-client-types';\n\nconst CLI_PATH = path.resolve('bin/cli.cjs');\n\nfunction execCli(args: string[]) {\n    try {\n        const stdout = execFileSync('node', [CLI_PATH, ...args], {\n            cwd: path.resolve('.'),\n            encoding: 'utf-8',\n            stdio: 'pipe',\n        });\n        return { exitCode: 0, stderr: '', stdout };\n    } catch (error: unknown) {\n        const e = error as { status: number; stderr: string; stdout: string };\n        return { exitCode: e.status ?? 1, stderr: e.stderr ?? '', stdout: e.stdout ?? '' };\n    }\n}\n\ndescribe('CLI', () => {\n    const tmpDirs: string[] = [];\n\n    afterAll(() => {\n        for (const dir of tmpDirs) {\n            rmSync(dir, { force: true, recursive: true });\n        }\n    });\n\n    test('should print help when no arguments are provided', () => {\n        const { stdout, exitCode } = execCli([]);\n        expect(stdout).toContain('Usage: dynamic-client');\n        expect(stdout).toContain('generate-client-types <codama-idl> <output-dir>');\n        expect(exitCode).toBe(0);\n    });\n\n    test('should print help when --help flag is provided', () => {\n        const { stdout, exitCode } = execCli(['--help']);\n        expect(stdout).toContain('Usage: dynamic-client');\n        expect(stdout).toContain('generate-client-types <codama-idl> <output-dir>');\n        expect(exitCode).toBe(0);\n    });\n\n    test('should exit with code 1 for unknown commands', () => {\n        const { stderr, exitCode } = execCli(['unknown-cmd']);\n        expect(stderr).toContain(\"unknown command 'unknown-cmd'\");\n        expect(exitCode).toBe(1);\n    });\n\n    test('should print subcommand help for generate-client-types --help', () => {\n        const { stdout, exitCode } = execCli(['generate-client-types', '--help']);\n        expect(stdout).toContain('generate-client-types');\n        expect(stdout).toContain('codama-idl');\n        expect(stdout).toContain('output-dir');\n        expect(exitCode).toBe(0);\n    });\n\n    test('should exit with code 1 when output dir argument is missing', () => {\n        const { exitCode, stderr } = execCli(['generate-client-types', 'some-file.json']);\n        expect(exitCode).toBe(1);\n        expect(stderr).toContain(\"missing required argument 'output-dir'\");\n    });\n\n    test('should exit with code 1 when IDL file does not exist', () => {\n        const tmpDir = mkdtempSync(path.join(tmpdir(), 'cli-test-'));\n        tmpDirs.push(tmpDir);\n        const { exitCode, stderr } = execCli(['generate-client-types', '/nonexistent/path.json', tmpDir]);\n        expect(exitCode).toBe(1);\n        expect(stderr).toContain('IDL file not found');\n    });\n\n    test('should exit with code 1 when IDL file contains invalid JSON', () => {\n        const tmpDir = mkdtempSync(path.join(tmpdir(), 'cli-test-'));\n        tmpDirs.push(tmpDir);\n        const badFile = path.join(tmpDir, 'bad.json');\n        writeFileSync(badFile, '{ not valid json');\n        const { exitCode, stderr } = execCli(['generate-client-types', badFile, tmpDir]);\n        expect(exitCode).toBe(1);\n        expect(stderr).toContain('not valid Codama JSON');\n    });\n\n    test('should read IDL and write output file for generate-client-types', () => {\n        const idlPath = path.resolve('test/programs/idls/circular-account-refs-idl.json');\n        const tmpDir = mkdtempSync(path.join(tmpdir(), 'cli-test-'));\n        tmpDirs.push(tmpDir);\n\n        const { exitCode } = execCli(['generate-client-types', idlPath, tmpDir]);\n        expect(exitCode).toBe(0);\n\n        const outputPath = path.join(tmpDir, 'circular-account-refs-idl-types.ts');\n        const output = readFileSync(outputPath, 'utf-8');\n        const idl = JSON.parse(readFileSync(idlPath, 'utf-8')) as RootNode;\n        const expected = generateClientTypes(idl);\n        expect(output).toBe(expected);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/cli/program-client-types.test.ts",
    "content": "import type { Address, ProgramDerivedAddress } from '@solana/addresses';\nimport type { Instruction } from '@solana/instructions';\nimport type { InstructionNode, RootNode } from 'codama';\nimport { describe, expectTypeOf, test } from 'vitest';\n\nimport type {\n    CreateItemAccounts,\n    CreateItemArgs,\n    CreateItemResolvers,\n    ResolverFn,\n} from '../../programs/generated/custom-resolvers-test-idl-types';\nimport type {\n    AllocateArgs,\n    CanonicalPdaSeeds,\n    NonCanonicalPdaSeeds,\n    ProgramMetadataPdas,\n    ProgramMetadataProgramClient,\n    WriteArgs,\n} from '../../programs/generated/pmp-idl-types';\nimport type {\n    CreateAccountAccounts,\n    CreateAccountArgs,\n    CreateAccountMethod,\n    SystemMethods,\n    SystemProgramClient,\n} from '../../programs/generated/system-program-idl-types';\nimport type { InitializeConfidentialTransferMintArgs } from '../../programs/generated/token-2022-idl-types';\n\ndescribe('generated program client types', () => {\n    describe('program client without PDAs (SystemProgramClient)', () => {\n        test('should align with ProgramClient structure', () => {\n            expectTypeOf<SystemProgramClient>().toHaveProperty('instructions');\n            expectTypeOf<SystemProgramClient['instructions']>().toEqualTypeOf<Map<string, InstructionNode>>();\n            expectTypeOf<SystemProgramClient['methods']>().toEqualTypeOf<SystemMethods>();\n            expectTypeOf<SystemProgramClient>().not.toHaveProperty('pdas');\n\n            expectTypeOf<SystemProgramClient>().toHaveProperty('programAddress');\n            expectTypeOf<SystemProgramClient['programAddress']>().toEqualTypeOf<Address>();\n\n            expectTypeOf<SystemProgramClient>().toHaveProperty('root');\n            expectTypeOf<SystemProgramClient['root']>().toEqualTypeOf<RootNode>();\n        });\n\n        test('should have expected method keys on SystemMethods', () => {\n            type ExpectedKeys =\n                | 'advanceNonceAccount'\n                | 'allocate'\n                | 'allocateWithSeed'\n                | 'assign'\n                | 'assignWithSeed'\n                | 'authorizeNonceAccount'\n                | 'createAccount'\n                | 'createAccountWithSeed'\n                | 'initializeNonceAccount'\n                | 'transferSol'\n                | 'transferSolWithSeed'\n                | 'upgradeNonceAccount'\n                | 'withdrawNonceAccount';\n            expectTypeOf<keyof SystemMethods>().toEqualTypeOf<ExpectedKeys>();\n        });\n\n        test('should return MethodBuilder from method call', () => {\n            type MethodsBuilder = ReturnType<CreateAccountMethod>;\n            expectTypeOf<MethodsBuilder>().toHaveProperty('accounts');\n            expectTypeOf<MethodsBuilder['accounts']>().returns.toEqualTypeOf<MethodsBuilder>();\n\n            expectTypeOf<MethodsBuilder>().toHaveProperty('instruction');\n            expectTypeOf<MethodsBuilder['instruction']>().returns.toEqualTypeOf<Promise<Instruction>>();\n\n            expectTypeOf<MethodsBuilder>().toHaveProperty('resolvers');\n            expectTypeOf<MethodsBuilder['resolvers']>().returns.toEqualTypeOf<MethodsBuilder>();\n\n            expectTypeOf<MethodsBuilder>().toHaveProperty('signers');\n            expectTypeOf<MethodsBuilder['signers']>().returns.toEqualTypeOf<MethodsBuilder>();\n        });\n\n        test('should have correct properties on CreateAccountArgs', () => {\n            expectTypeOf<CreateAccountArgs>().toHaveProperty('lamports');\n            expectTypeOf<CreateAccountArgs['lamports']>().toEqualTypeOf<bigint | number>();\n\n            expectTypeOf<CreateAccountArgs>().toHaveProperty('space');\n            expectTypeOf<CreateAccountArgs['space']>().toEqualTypeOf<bigint | number>();\n\n            expectTypeOf<CreateAccountArgs>().toHaveProperty('programAddress');\n            expectTypeOf<CreateAccountArgs['programAddress']>().toEqualTypeOf<Address>();\n        });\n\n        test('should have correct properties on CreateAccountAccounts', () => {\n            expectTypeOf<CreateAccountAccounts['payer']>().toEqualTypeOf<Address>();\n            expectTypeOf<CreateAccountAccounts['newAccount']>().toEqualTypeOf<Address>();\n        });\n    });\n\n    describe('program client with PDAs (ProgramMetadataProgramClient)', () => {\n        test('should align with ProgramClient structure', () => {\n            expectTypeOf<ProgramMetadataProgramClient>().toHaveProperty('instructions');\n            expectTypeOf<ProgramMetadataProgramClient>().toHaveProperty('pdas');\n            expectTypeOf<ProgramMetadataProgramClient['pdas']>().toEqualTypeOf<ProgramMetadataPdas>();\n            expectTypeOf<ProgramMetadataProgramClient>().toHaveProperty('programAddress');\n            expectTypeOf<ProgramMetadataProgramClient>().toHaveProperty('root');\n        });\n\n        test('should have a key for every PDA defined in the IDL', () => {\n            type ExpectedPdaKeys = 'canonical' | 'metadata' | 'nonCanonical';\n            expectTypeOf<keyof ProgramMetadataPdas>().toEqualTypeOf<ExpectedPdaKeys>();\n            type PdaFn = ProgramMetadataPdas[keyof ProgramMetadataPdas];\n            expectTypeOf<PdaFn>().returns.toEqualTypeOf<Promise<ProgramDerivedAddress>>();\n        });\n\n        test('should have correct seed properties on CanonicalPdaSeeds', () => {\n            expectTypeOf<CanonicalPdaSeeds>().toHaveProperty('program');\n            expectTypeOf<CanonicalPdaSeeds['program']>().toEqualTypeOf<Address>();\n\n            expectTypeOf<CanonicalPdaSeeds>().toHaveProperty('seed');\n            expectTypeOf<CanonicalPdaSeeds['seed']>().toEqualTypeOf<string>();\n        });\n\n        test('should have correct seed properties on NonCanonicalPdaSeeds', () => {\n            expectTypeOf<NonCanonicalPdaSeeds>().toHaveProperty('program');\n            expectTypeOf<NonCanonicalPdaSeeds['program']>().toEqualTypeOf<Address>();\n\n            expectTypeOf<NonCanonicalPdaSeeds>().toHaveProperty('authority');\n            expectTypeOf<NonCanonicalPdaSeeds['authority']>().toEqualTypeOf<Address>();\n\n            expectTypeOf<NonCanonicalPdaSeeds>().toHaveProperty('seed');\n            expectTypeOf<NonCanonicalPdaSeeds['seed']>().toEqualTypeOf<string>();\n        });\n    });\n\n    describe('remainderOptionTypeNode optional args (pmp-idl)', () => {\n        test('should have optional data in write args', () => {\n            expectTypeOf<WriteArgs>().toMatchObjectType<{ data?: Uint8Array | null; offset: number }>();\n        });\n\n        test('should have optional seed in allocate args', () => {\n            expectTypeOf<AllocateArgs>().toMatchObjectType<{ seed?: string | null }>();\n        });\n    });\n\n    describe('zeroableOptionTypeNode optional args (token-2022)', () => {\n        test('should have optional auditorElgamalPubkey in InitializeConfidentialTransferMintArgs', () => {\n            expectTypeOf<InitializeConfidentialTransferMintArgs>().toMatchObjectType<{\n                auditorElgamalPubkey?: Address | null;\n                authority?: Address | null;\n                autoApproveNewAccounts: boolean;\n            }>();\n        });\n    });\n\n    describe('resolver types', () => {\n        test('should have expected resolver keys on CreateItemResolvers', () => {\n            expectTypeOf<CreateItemResolvers>().toHaveProperty('resolveDescription');\n            expectTypeOf<CreateItemResolvers['resolveDescription']>().toExtend<\n                ResolverFn<CreateItemArgs, CreateItemAccounts>\n            >();\n\n            expectTypeOf<CreateItemResolvers>().toHaveProperty('resolveTags');\n            expectTypeOf<CreateItemResolvers['resolveTags']>().toExtend<\n                ResolverFn<CreateItemArgs, CreateItemAccounts>\n            >();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/instruction-encoding/arguments.test.ts",
    "content": "import { CodamaError } from '@codama/errors';\nimport { address } from '@solana/addresses';\nimport { getU32Encoder, getU64Encoder, mergeBytes } from '@solana/codecs';\nimport { getInitializeInstructionDataDecoder } from '@solana-program/program-metadata';\nimport type { InstructionNode, RootNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createArgumentsInputValidator, encodeInstructionArguments } from '../../../src/instruction-encoding/arguments';\nimport { getCodecFromBytesEncoding } from '../../../src/shared/bytes-encoding';\nimport { loadRoot } from '../../programs/test-utils';\n\nfunction getInstruction(root: RootNode, name: string): InstructionNode {\n    const ix = root.program.instructions.find(i => i.name === name);\n    if (!ix) throw new Error(`Instruction ${name} not found`);\n    return ix;\n}\n\ndescribe('Instruction encoding: encodeInstructionArguments', () => {\n    test('should encode omitted discriminator using default numberValueNode', () => {\n        // pmp-idl.json 'write' instruction has discriminator with defaultValue: numberValueNode(0)\n        const root = loadRoot('pmp-idl.json');\n        const ix = getInstruction(root, 'write');\n\n        const encoded = encodeInstructionArguments(root, ix, {\n            data: null,\n            offset: 2,\n        });\n\n        // discriminator: u8 + offset: u32\n        expect(encoded).toEqual(new Uint8Array([0, 2, 0, 0, 0]));\n    });\n\n    test('should encode omitted discriminator using default bytesValueNode', () => {\n        const root = loadRoot('example-idl.json');\n        const ix = getInstruction(root, 'updateOptionalInput');\n\n        const encoded = encodeInstructionArguments(root, ix, {\n            input: 42n,\n            optionalInput: null,\n        });\n\n        // discriminator defaulValue from updateOptionalInput:\n        const expectedDiscriminator = getCodecFromBytesEncoding('base16').encode('1f094566b31b79c7');\n        const expectedInput = getU64Encoder().encode(42n);\n        const expectedOptionalInput = new Uint8Array([0]);\n        expect(encoded).toEqual(\n            mergeBytes([\n                expectedDiscriminator as Uint8Array,\n                expectedInput as Uint8Array,\n                expectedOptionalInput as Uint8Array,\n            ]),\n        );\n    });\n\n    test('should transform Uint8Array in remainderOptionTypeNode argument', () => {\n        const root = loadRoot('pmp-idl.json');\n        const ix = getInstruction(root, 'write');\n\n        const testData = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);\n        const encoded = encodeInstructionArguments(root, ix, {\n            data: testData,\n            offset: 10,\n        });\n\n        const expected = mergeBytes([new Uint8Array([0]), getU32Encoder().encode(10) as Uint8Array, testData]);\n        expect(encoded).toEqual(expected);\n    });\n\n    test('should resolve definedTypeLinkNode to enumTypeNode', () => {\n        const root = loadRoot('pmp-idl.json');\n        const ix = getInstruction(root, 'initialize');\n\n        // seed is a fixedSizeTypeNode(16, stringTypeNode) - needs 16-byte padded string\n        // Enums use lowercase variant names: none=0, utf8=1, gzip=1, json=1, direct=0, etc.\n        const encoded = encodeInstructionArguments(root, ix, {\n            compression: 'gzip', // gzip=1\n            data: null,\n            dataSource: 'url', // url=1\n            encoding: 'base64', // base64=3\n            format: 'json', // json=1\n            seed: 'test', // fixed 16-byte string, null-padded\n        });\n\n        const expected = getInitializeInstructionDataDecoder().decode(encoded);\n        expect(encoded.length).toBe(21);\n        expect(expected.discriminator).toBe(1);\n        expect(expected.seed).toBe('test');\n        expect(expected.encoding).toBe(3);\n        expect(expected.compression).toBe(1);\n        expect(expected.format).toBe(1);\n        expect(expected.dataSource).toBe(1);\n    });\n\n    test('should throw ARGUMENT_MISSING for missing required argument', () => {\n        const root = loadRoot('pmp-idl.json');\n        const ix = getInstruction(root, 'write');\n\n        expect(() => encodeInstructionArguments(root, ix, {})).toThrow('Missing argument [offset] in [write].');\n    });\n\n    test('should throw DEFAULT_VALUE_MISSING when omitted argument has no defaultValue', () => {\n        const root = loadRoot('pmp-idl.json');\n        const ix = getInstruction(root, 'write');\n\n        // Create a modified instruction where the omitted discriminator has no defaultValue.\n        const modifiedIx: InstructionNode = {\n            ...ix,\n            arguments: ix.arguments.map(arg =>\n                arg.name === 'discriminator' ? { ...arg, defaultValue: undefined } : arg,\n            ),\n        };\n\n        expect(() => encodeInstructionArguments(root, modifiedIx, { data: null, offset: 0 })).toThrow(\n            'Default value is missing for argument [discriminator] in [write].',\n        );\n    });\n\n    test('should throw ValidationError when omitted argument is provided', () => {\n        const root = loadRoot('pmp-idl.json');\n        const ix = getInstruction(root, 'write');\n\n        // discriminator should be omitted due to strategy\n        const validate = createArgumentsInputValidator(root, ix);\n        expect(() =>\n            validate({\n                data: null,\n                discriminator: 99,\n                offset: 0,\n            }),\n        ).toThrow(CodamaError);\n    });\n\n    test('should encode instruction with only omitted discriminator (no user args)', () => {\n        const root = loadRoot('pmp-idl.json');\n        const ix = getInstruction(root, 'close');\n\n        const encoded = encodeInstructionArguments(root, ix, {});\n        const discriminator = 6;\n        expect(encoded).toEqual(new Uint8Array([discriminator]));\n    });\n});\n\ndescribe('Instruction validation: remaining account arguments', () => {\n    const ADDR_1 = address('11111111111111111111111111111111');\n    const ADDR_2 = address('22222222222222222222222222222222222222222222');\n\n    test('should not reject remaining account args as extra keys', () => {\n        // initializeMultisig has remainingAccounts referencing \"signers\" argumentValueNode\n        // superstruct's object() rejects unknown keys, so \"signers\" must be stripped before validation\n        const root = loadRoot('token-idl.json');\n        const ix = getInstruction(root, 'initializeMultisig');\n\n        const validate = createArgumentsInputValidator(root, ix);\n        expect(() => validate({ m: 2, signers: [ADDR_1, ADDR_2] })).not.toThrow();\n    });\n\n    test('should still validate regular arguments when remaining account args are present', () => {\n        const root = loadRoot('token-idl.json');\n        const ix = getInstruction(root, 'initializeMultisig');\n\n        // m is a required number argument — passing a string should fail validation\n        const validate = createArgumentsInputValidator(root, ix);\n        expect(() => validate({ m: 'invalid', signers: [ADDR_1] })).toThrow('Invalid argument \"m\"');\n    });\n\n    test('should not reject optional remaining account args when omitted', () => {\n        // transfer has optional multiSigners remaining accounts\n        const root = loadRoot('token-idl.json');\n        const ix = getInstruction(root, 'transfer');\n\n        const validate = createArgumentsInputValidator(root, ix);\n        expect(() => validate({ amount: 100 })).not.toThrow();\n    });\n\n    test('should not reject optional remaining account args when provided', () => {\n        const root = loadRoot('token-idl.json');\n        const ix = getInstruction(root, 'transfer');\n\n        const validate = createArgumentsInputValidator(root, ix);\n        expect(() => validate({ amount: 100, multiSigners: [ADDR_1] })).not.toThrow();\n    });\n\n    test('should not encode remaining account args as instruction data', () => {\n        const root = loadRoot('token-idl.json');\n        const ix = getInstruction(root, 'initializeMultisig');\n\n        const withSigners = encodeInstructionArguments(root, ix, { m: 2, signers: [ADDR_1, ADDR_2] });\n        const withoutSigners = encodeInstructionArguments(root, ix, { m: 2 });\n\n        // Remaining account args should not affect encoded data\n        expect(withSigners).toEqual(withoutSigners);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/instruction-encoding/create-account-meta.test.ts",
    "content": "import { address } from '@solana/addresses';\nimport { AccountRole } from '@solana/instructions';\nimport type { InstructionNode, RootNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createAccountMeta } from '../../../src/instruction-encoding/accounts/create-account-meta';\nimport { loadRoot } from '../../programs/test-utils';\n\nconst ADDR_1 = address('11111111111111111111111111111111');\nconst ADDR_2 = address('22222222222222222222222222222222222222222222');\nconst ADDR_3 = address('33333333333333333333333333333333333333333333');\nconst MULTISIG_ADDR = address('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA');\n\ndescribe('createAccountMeta: remaining accounts', () => {\n    test('should append remaining accounts from argumentsInput', async () => {\n        // initializeMultisig has remainingAccounts: [{ value: argumentValueNode(\"signers\") }]\n        // It has 2 regular accounts: multisig (user-provided) + rent (default: SysvarRent)\n        const root = loadRoot('token-idl.json');\n        const ix = getInstruction(root, 'initializeMultisig');\n\n        const result = await createAccountMeta(\n            root,\n            ix,\n            { m: 2, signers: [ADDR_1, ADDR_2, ADDR_3] },\n            { multisig: MULTISIG_ADDR },\n        );\n\n        // 2 regular accounts (multisig + rent) + 3 remaining accounts\n        expect(result).toHaveLength(5);\n        const remainingAccounts = result.slice(2);\n        expect(remainingAccounts[0]).toEqual({ address: ADDR_1, role: AccountRole.READONLY });\n        expect(remainingAccounts[1]).toEqual({ address: ADDR_2, role: AccountRole.READONLY });\n        expect(remainingAccounts[2]).toEqual({ address: ADDR_3, role: AccountRole.READONLY });\n    });\n\n    test('should use READONLY_SIGNER role when isSigner is true', async () => {\n        // transfer has remainingAccounts: [{ value: argumentValueNode(\"multiSigners\"), isOptional: true, isSigner: true }]\n        // It has 3 regular accounts: source, destination, authority (default: identity)\n        const root = loadRoot('token-idl.json');\n        const ix = getInstruction(root, 'transfer');\n\n        const result = await createAccountMeta(\n            root,\n            ix,\n            { amount: 100, multiSigners: [ADDR_1, ADDR_2] },\n            { authority: ADDR_3, destination: MULTISIG_ADDR, source: ADDR_3 },\n        );\n\n        // 3 regular accounts + 2 remaining accounts\n        const remainingAccounts = result.slice(3);\n        expect(remainingAccounts).toHaveLength(2);\n        expect(remainingAccounts[0]).toEqual({ address: ADDR_1, role: AccountRole.READONLY_SIGNER });\n        expect(remainingAccounts[1]).toEqual({ address: ADDR_2, role: AccountRole.READONLY_SIGNER });\n    });\n\n    test('should skip optional remaining accounts when not provided', async () => {\n        // transfer's multiSigners is optional — omitting it should produce no extra accounts\n        const root = loadRoot('token-idl.json');\n        const ix = getInstruction(root, 'transfer');\n\n        const result = await createAccountMeta(\n            root,\n            ix,\n            { amount: 100 },\n            { authority: ADDR_1, destination: MULTISIG_ADDR, source: ADDR_3 },\n        );\n\n        // Only 3 regular accounts, no remaining\n        expect(result).toHaveLength(3);\n    });\n\n    test('should append empty array as no remaining accounts', async () => {\n        const root = loadRoot('token-idl.json');\n        const ix = getInstruction(root, 'initializeMultisig');\n\n        const result = await createAccountMeta(root, ix, { m: 1, signers: [] }, { multisig: MULTISIG_ADDR });\n\n        // 2 regular accounts (multisig + rent), no remaining\n        expect(result).toHaveLength(2);\n    });\n\n    test('should return no remaining accounts when instruction has none defined', async () => {\n        // initializeMint has no remainingAccounts\n        const root = loadRoot('token-idl.json');\n        const ix = getInstruction(root, 'initializeMint');\n\n        const result = await createAccountMeta(\n            root,\n            ix,\n            { decimals: 9, freezeAuthority: null, mintAuthority: ADDR_1 },\n            { mint: MULTISIG_ADDR },\n        );\n\n        // Should only have regular accounts (mint + rent sysvar)\n        expect(result).toHaveLength(2);\n    });\n\n    test('should throw when remaining account argument is not an array', async () => {\n        const root = loadRoot('token-idl.json');\n        const ix = getInstruction(root, 'initializeMultisig');\n\n        await expect(\n            createAccountMeta(root, ix, { m: 2, signers: ADDR_1 }, { multisig: MULTISIG_ADDR }),\n        ).rejects.toThrow(\n            'Invalid argument input [signers]: [\"11111111111111111111111111111111\"]. Expected [Address[]].',\n        );\n    });\n\n    test('should throw when remaining account value kind is not argumentValueNode', async () => {\n        const root = loadRoot('token-idl.json');\n        const ix = getInstruction(root, 'initializeMultisig');\n\n        // Replace the argumentValueNode with an unsupported value kind\n        const remainingAccount = ix.remainingAccounts?.[0];\n        const modifiedRemainingAccount = Object.assign({}, remainingAccount, {\n            value: { kind: 'resolverValueNode', name: 'someResolver' },\n        }) as typeof remainingAccount;\n        const modifiedIx: InstructionNode = Object.assign({}, ix, {\n            remainingAccounts: [modifiedRemainingAccount],\n        });\n\n        await expect(createAccountMeta(root, modifiedIx, { m: 2 }, { multisig: MULTISIG_ADDR })).rejects.toThrow(\n            /Expected node of kind \\[argumentValueNode\\], got \\[resolverValueNode\\]/,\n        );\n    });\n\n    test('should throw when remaining account array contains invalid element types', async () => {\n        const root = loadRoot('token-idl.json');\n        const ix = getInstruction(root, 'initializeMultisig');\n\n        await expect(\n            createAccountMeta(root, ix, { m: 2, signers: [ADDR_1, 123] }, { multisig: MULTISIG_ADDR }),\n        ).rejects.toThrow(/Expected \\[Address \\| PublicKey\\] for account \\[signers\\[1\\]\\]/);\n    });\n\n    test('should throw when required remaining account argument is not provided', async () => {\n        const root = loadRoot('token-idl.json');\n        const ix = getInstruction(root, 'initializeMultisig');\n\n        // signers is required:\n        await expect(\n            createAccountMeta(root, ix, { m: 2, signers: undefined }, { multisig: MULTISIG_ADDR }),\n        ).rejects.toThrow(/Missing argument \\[signers\\]/);\n    });\n});\n\ndescribe('createAccountMeta: UNSUPPORTED_OPTIONAL_ACCOUNT_STRATEGY', () => {\n    test('should throw when optionalAccountStrategy is unsupported', async () => {\n        const root = loadRoot('token-idl.json');\n        const ix = getInstruction(root, 'initializeMint');\n\n        // Create an optional account with no default value.\n        const optionalAccount = {\n            ...ix.accounts[0],\n            defaultValue: undefined,\n            isOptional: true,\n        };\n\n        // Set an invalid optionalAccountStrategy.\n        const modifiedIx: InstructionNode = {\n            ...ix,\n            accounts: [optionalAccount],\n            // @ts-expect-error - we're intentionally passing an invalid strategy to test error handling\n            optionalAccountStrategy: 'invalid',\n        };\n\n        await expect(createAccountMeta(root, modifiedIx, {}, { [optionalAccount.name]: null })).rejects.toThrow(\n            'Unsupported optional account strategy [\"invalid\"] for account [mint] in [initializeMint].',\n        );\n    });\n});\n\nfunction getInstruction(root: RootNode, name: string): InstructionNode {\n    const ix = root.program.instructions.find(i => i.name === name);\n    if (!ix) throw new Error(`Instruction ${name} not found`);\n    return ix;\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/instruction-encoding/validators.test.ts",
    "content": "import type { InstructionArgumentNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createIxArgumentsValidator } from '../../../src/instruction-encoding/validators';\n\ndescribe('Validators', () => {\n    test('should throw for unsupported TypeNode kind', () => {\n        const fakeIxArguments = [\n            {\n                name: 'testArg',\n                type: { kind: 'fooBarTypeNode' },\n            },\n        ] as unknown as InstructionArgumentNode[];\n\n        expect(() => createIxArgumentsValidator('testInstruction', fakeIxArguments, [])).toThrow(\n            'Validator for TypeNode \"testInstruction_testArg_0\" kind: fooBarTypeNode is not implemented!',\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/program-client/create-program-client.test.ts",
    "content": "import { CodamaError } from '@codama/errors';\nimport { address } from '@solana/addresses';\nimport { describe, expect, test } from 'vitest';\n\nimport { createProgramClient } from '../../../src';\nimport type { MplTokenMetadataProgramClient } from '../../programs/generated/mpl-token-metadata-idl-types';\nimport type { SystemProgramClient } from '../../programs/generated/system-program-idl-types';\nimport { createTestProgramClient, loadIdl, SvmTestContext } from '../../programs/test-utils';\n\ndescribe('createProgramClient', () => {\n    describe('methods', () => {\n        const programClient = createTestProgramClient('system-program-idl.json');\n\n        test('should throw when accessing a non-existent instruction', () => {\n            expect(() => programClient.methods.nonExistentMethod).toThrow(CodamaError);\n            expect(() => programClient.methods.nonExistentMethod).toThrow(\n                /Instruction \\[nonExistentMethod\\] not found in IDL/,\n            );\n        });\n\n        test('should list available instructions in error message', () => {\n            try {\n                // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n                programClient.methods.nonExistentMethod;\n                expect.unreachable('should have thrown');\n            } catch (error) {\n                const message = (error as Error).message;\n                expect(message).toContain('Available:');\n\n                const allInstructions = [\n                    'createAccount',\n                    'assign',\n                    'transferSol',\n                    'createAccountWithSeed',\n                    'advanceNonceAccount',\n                    'withdrawNonceAccount',\n                    'initializeNonceAccount',\n                    'authorizeNonceAccount',\n                    'allocate',\n                    'allocateWithSeed',\n                    'assignWithSeed',\n                    'transferSolWithSeed',\n                    'upgradeNonceAccount',\n                ];\n\n                for (const ix of allInstructions) {\n                    expect(message).toContain(ix);\n                }\n            }\n        });\n\n        test('should return a builder for a valid instruction', () => {\n            const typedClient = createTestProgramClient<SystemProgramClient>('system-program-idl.json');\n            const builder = typedClient.methods.transferSol({ amount: 1000 });\n            expect(builder).toBeDefined();\n            expect(typeof builder.accounts).toBe('function');\n            expect(typeof builder.instruction).toBe('function');\n        });\n\n        test('should support \"in\" operator for existing instructions', () => {\n            expect('transferSol' in programClient.methods).toBe(true);\n            expect('nonExistentMethod' in programClient.methods).toBe(false);\n        });\n\n        test('should preserve standard object semantics for prototype properties with \"in\" operator', () => {\n            expect('toString' in programClient.methods).toBe(true);\n            expect('valueOf' in programClient.methods).toBe(true);\n            expect('constructor' in programClient.methods).toBe(true);\n            expect('hasOwnProperty' in programClient.methods).toBe(true);\n        });\n\n        test('should not throw when accessing standard prototype properties', () => {\n            expect(() => programClient.methods.constructor).not.toThrow();\n            // eslint-disable-next-line @typescript-eslint/unbound-method\n            expect(() => programClient.methods.hasOwnProperty).not.toThrow();\n            expect(programClient.methods.constructor).toBeUndefined();\n            // eslint-disable-next-line @typescript-eslint/unbound-method\n            expect(programClient.methods.hasOwnProperty).toBeUndefined();\n        });\n\n        test('should not throw when awaited directly', async () => {\n            // eslint-disable-next-line @typescript-eslint/await-thenable\n            const result = await programClient.methods;\n            expect(result).toBeDefined();\n        });\n\n        test('should not throw when serialized with JSON.stringify', () => {\n            expect(() => JSON.stringify(programClient.methods)).not.toThrow();\n        });\n    });\n\n    describe('pdas', () => {\n        const pdaClient = createTestProgramClient<MplTokenMetadataProgramClient>('mpl-token-metadata-idl.json');\n\n        test('should throw when accessing a non-existent PDA', () => {\n            // @ts-expect-error - testing error message for non-existent PDA\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n            expect(() => pdaClient.pdas.nonExistentPda).toThrow(CodamaError);\n            // @ts-expect-error - testing error message for non-existent PDA\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n            expect(() => pdaClient.pdas.nonExistentPda).toThrow(/PDA \\[nonExistentPda\\] not found in IDL/);\n        });\n\n        test('should list available PDAs in error message', () => {\n            // @ts-expect-error - testing error message for non-existent PDA\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n            expect(() => pdaClient.pdas.nonExistentPda).toThrow(/Available:/);\n        });\n\n        test('should support \"in\" operator for existing PDAs', () => {\n            expect('metadata' in pdaClient.pdas).toBe(true);\n            expect('nonExistentPda' in pdaClient.pdas).toBe(false);\n        });\n\n        test('should preserve standard object semantics for prototype properties with \"in\" operator', () => {\n            expect('toString' in pdaClient.pdas).toBe(true);\n            expect('valueOf' in pdaClient.pdas).toBe(true);\n            expect('constructor' in pdaClient.pdas).toBe(true);\n            expect('hasOwnProperty' in pdaClient.pdas).toBe(true);\n        });\n\n        test('should return undefined pdas for IDL without PDAs', () => {\n            const noPdaClient = createTestProgramClient('system-program-idl.json');\n            expect(noPdaClient.pdas).toBeUndefined();\n        });\n\n        test('should return defined pdas for IDL with PDAs', () => {\n            expect(pdaClient.pdas).toBeDefined();\n        });\n\n        test('should not throw when accessing standard prototype properties', () => {\n            expect(() => pdaClient.pdas.constructor).not.toThrow();\n            // eslint-disable-next-line @typescript-eslint/unbound-method\n            expect(() => pdaClient.pdas.hasOwnProperty).not.toThrow();\n            expect(pdaClient.pdas.constructor).toBeUndefined();\n            // eslint-disable-next-line @typescript-eslint/unbound-method\n            expect(pdaClient.pdas.hasOwnProperty).toBeUndefined();\n        });\n\n        test('should not throw when awaited directly', async () => {\n            // eslint-disable-next-line @typescript-eslint/await-thenable\n            const result = await pdaClient.pdas;\n            expect(result).toBeDefined();\n        });\n\n        test('should not throw when serialized with JSON.stringify', () => {\n            expect(() => JSON.stringify(pdaClient.pdas)).not.toThrow();\n        });\n    });\n\n    describe('programId override', () => {\n        const OVERRIDE_ADDRESS = address('7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDrdXkTfBR');\n\n        test('should reflect the override in programAddress', () => {\n            const idl = loadIdl('system-program-idl.json');\n            const client = createProgramClient<SystemProgramClient>(idl, { programId: OVERRIDE_ADDRESS });\n            expect(client.programAddress).toBe(OVERRIDE_ADDRESS);\n        });\n\n        test('should use the overridden program address in built instruction', async () => {\n            const idl = loadIdl('system-program-idl.json');\n            const client = createProgramClient<SystemProgramClient>(idl, { programId: OVERRIDE_ADDRESS });\n\n            const sourceAndDest = await SvmTestContext.generateAddress();\n            const ix = await client.methods\n                .transferSol({ amount: 1000 })\n                .accounts({ destination: sourceAndDest, source: sourceAndDest })\n                .instruction();\n\n            expect(ix.programAddress).toBe(OVERRIDE_ADDRESS);\n        });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/resolvers/resolve-account-value-node-address/resolve-account-value-node-address.test.ts",
    "content": "import { CodamaError } from '@codama/errors';\nimport { describe, expect, test } from 'vitest';\n\nimport { detectCircularDependency } from '../../../../src/instruction-encoding/resolvers/resolve-account-value-node-address';\n\ndescribe('detectCircularDependency', () => {\n    test('should not throw when no circular dependency exists', () => {\n        expect(() => detectCircularDependency('c', ['a', 'b'])).not.toThrow();\n    });\n\n    test('should throw AccountError when circular dependency detected', () => {\n        expect(() => detectCircularDependency('a', ['a', 'b'])).toThrow(CodamaError);\n    });\n\n    test('should include full resolution path in error message', () => {\n        expect(() => detectCircularDependency('a', ['a', 'b', 'c'])).toThrow(\n            /Circular dependency detected: \\[a -> b -> c -> a\\]/,\n        );\n    });\n\n    test('should detect dependency later in the path', () => {\n        expect(() => detectCircularDependency('b', ['a', 'b', 'c'])).toThrow(\n            /Circular dependency detected: \\[a -> b -> c -> b\\]/,\n        );\n    });\n\n    test('should not throw for empty path', () => {\n        expect(() => detectCircularDependency('a', [])).not.toThrow();\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/resolvers/resolve-account-value-node-address/types.test.ts",
    "content": "import { describe, expectTypeOf, test } from 'vitest';\n\nimport type { ResolutionPath } from '../../../../src/instruction-encoding/resolvers';\n\ndescribe('ResolutionPath', () => {\n    test('should be a readonly array of strings', () => {\n        expectTypeOf<ResolutionPath>().toEqualTypeOf<readonly string[]>();\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/resolvers/resolve-conditional.test.ts",
    "content": "import {\n    camelCase,\n    type ConditionalValueNode,\n    type InstructionAccountNode,\n    type InstructionNode,\n    type RootNode,\n} from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { resolveConditionalValueNodeCondition } from '../../../src/instruction-encoding/resolvers/resolve-conditional';\nimport { loadRoot } from '../../programs/test-utils';\n\nfunction getInstruction(root: RootNode, name: string): InstructionNode {\n    const ix = root.program.instructions.find(i => i.name === name);\n    if (!ix) throw new Error(`Instruction ${name} not found`);\n    return ix;\n}\n\ndescribe('resolveConditionalValueNodeCondition: INVARIANT_VIOLATION', () => {\n    test('should throw when conditionalValueNode has no value and no branches', async () => {\n        const root = loadRoot('token-idl.json');\n        const ix = getInstruction(root, 'transfer');\n\n        const ixAccountNode: InstructionAccountNode = ix.accounts[0];\n\n        const invalidConditional: ConditionalValueNode = {\n            condition: { kind: 'accountValueNode', name: camelCase('source') },\n            kind: 'conditionalValueNode',\n        };\n\n        await expect(\n            resolveConditionalValueNodeCondition({\n                accountsInput: {},\n                argumentsInput: {},\n                conditionalValueNode: invalidConditional,\n                ixAccountNode,\n                ixNode: ix,\n                resolutionPath: [],\n                resolversInput: {},\n                root,\n            }),\n        ).rejects.toThrow(\n            'Internal invariant violation: [Invalid conditionalValueNode: missing value and branches for account source in transfer].',\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/shared/address.test.ts",
    "content": "import { type Address, address } from '@solana/addresses';\nimport { describe, expect, expectTypeOf, test } from 'vitest';\n\nimport {\n    type AddressInput,\n    isConvertibleAddress,\n    isPublicKeyLike,\n    type PublicKeyLike,\n    toAddress,\n} from '../../../src/shared/address';\nimport { SvmTestContext } from '../../svm-test-context';\n\ndescribe('isPublicKeyLike', () => {\n    test('should return true for objects with toBase58 method', () => {\n        const publicKey = { toBase58: () => '11111111111111111111111111111111' };\n        expect(isPublicKeyLike(publicKey)).toBe(true);\n    });\n\n    test('should narrow type to PublicKeyLike', () => {\n        const value: unknown = { toBase58: () => '11111111111111111111111111111111' };\n        if (isPublicKeyLike(value)) {\n            expectTypeOf(value).toExtend<PublicKeyLike>();\n        }\n    });\n\n    test('should return false for plain strings', () => {\n        expect(isPublicKeyLike('11111111111111111111111111111111')).toBe(false);\n    });\n\n    test('should return false for null', () => {\n        expect(isPublicKeyLike(null)).toBe(false);\n    });\n\n    test('should return false for undefined', () => {\n        expect(isPublicKeyLike(undefined)).toBe(false);\n    });\n\n    test('should return false for numbers', () => {\n        expect(isPublicKeyLike(42)).toBe(false);\n    });\n\n    test('should return false for objects without toBase58', () => {\n        expect(isPublicKeyLike({ toString: () => 'hello' })).toBe(false);\n    });\n\n    test('should return false for objects where toBase58 is not a function', () => {\n        expect(isPublicKeyLike({ toBase58: 'not-a-function' })).toBe(false);\n    });\n});\n\ndescribe('toAddress', () => {\n    const VALID_ADDRESS = '11111111111111111111111111111111';\n\n    test('should convert a string to Address', () => {\n        const result = toAddress(VALID_ADDRESS);\n        expect(result).toBe(VALID_ADDRESS);\n        expectTypeOf(result).toExtend<Address>();\n    });\n\n    test('should convert a PublicKeyLike to Address', () => {\n        const publicKey = { toBase58: () => VALID_ADDRESS };\n        const result = toAddress(publicKey);\n        expect(result).toBe(VALID_ADDRESS);\n    });\n\n    test('should pass through an existing Address', () => {\n        const addr = address(VALID_ADDRESS);\n        const result = toAddress(addr);\n        expect(result).toBe(VALID_ADDRESS);\n    });\n\n    test('should throw for invalid non-string or pubkey Addresses', () => {\n        const invalidAddresses = [42n, 42, { a: 42 }, null, undefined];\n        for (const input of invalidAddresses) {\n            // @ts-expect-error testing invalid inputs\n            expect(() => toAddress(input)).toThrow(/Cannot convert value to Address/);\n        }\n    });\n});\n\ndescribe('isConvertibleAddress', () => {\n    test('should return true for Address', async () => {\n        const address = await SvmTestContext.generateAddress();\n        expect(isConvertibleAddress(address)).toBe(true);\n    });\n\n    test('should return true for PublicKeyLike', () => {\n        const publicKey = { toBase58: () => '11111111111111111111111111111111' };\n        const result = toAddress(publicKey);\n        expect(isConvertibleAddress(result)).toBe(true);\n    });\n\n    test('should return true for valid base58 string', () => {\n        const addr = '11111111111111111111111111111111';\n        const result = toAddress(addr);\n        expect(isConvertibleAddress(result)).toBe(true);\n    });\n\n    test('should return false for invalid string', () => {\n        const addr = 'invalid_address';\n        expect(isConvertibleAddress(addr)).toBe(false);\n    });\n\n    test('should return false for null and undefined', () => {\n        [null, undefined].forEach(invalidAddr => {\n            expect(isConvertibleAddress(invalidAddr)).toBe(false);\n        });\n    });\n\n    test('should return false for invalid objects', () => {\n        [{}, { a: 42 }].forEach(invalidAddr => {\n            expect(isConvertibleAddress(invalidAddr)).toBe(false);\n        });\n    });\n});\n\ndescribe('AddressInput type', () => {\n    test('should accept Address', () => {\n        expectTypeOf(address('11111111111111111111111111111111')).toExtend<AddressInput>();\n    });\n\n    test('should accept string', () => {\n        expectTypeOf<string>().toExtend<AddressInput>();\n    });\n\n    test('should accept PublicKeyLike', () => {\n        expectTypeOf<PublicKeyLike>().toExtend<AddressInput>();\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/shared/bytes-encoding.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { getCodecFromBytesEncoding, isUint8Array, uint8ArrayToEncodedString } from '../../../src/shared/bytes-encoding';\n\ndescribe('uint8ArrayToEncodedString', () => {\n    const helloBytes = new Uint8Array([72, 101, 108, 108, 111]);\n\n    test('should encode to base16', () => {\n        expect(uint8ArrayToEncodedString(helloBytes, 'base16')).toBe('48656c6c6f');\n    });\n\n    test('should encode to base58', () => {\n        expect(uint8ArrayToEncodedString(helloBytes, 'base58')).toBe('9Ajdvzr');\n    });\n\n    test('should encode to base64', () => {\n        expect(uint8ArrayToEncodedString(helloBytes, 'base64')).toBe('SGVsbG8=');\n    });\n\n    test('should encode to utf8', () => {\n        expect(uint8ArrayToEncodedString(helloBytes, 'utf8')).toBe('Hello');\n    });\n\n    test('should handle empty bytes', () => {\n        expect(uint8ArrayToEncodedString(new Uint8Array(), 'base16')).toBe('');\n    });\n});\n\ndescribe('getCodecFromBytesEncoding', () => {\n    test('should return codec for base16', () => {\n        const codec = getCodecFromBytesEncoding('base16');\n        expect(codec).toBeDefined();\n        expect(codec.encode('ff')).toEqual(new Uint8Array([255]));\n    });\n\n    test('should return codec for base58', () => {\n        const codec = getCodecFromBytesEncoding('base58');\n        expect(codec).toBeDefined();\n    });\n\n    test('should return codec for base64', () => {\n        const codec = getCodecFromBytesEncoding('base64');\n        expect(codec).toBeDefined();\n    });\n\n    test('should return codec for utf8', () => {\n        const codec = getCodecFromBytesEncoding('utf8');\n        expect(codec).toBeDefined();\n        expect(codec.encode('Hi')).toEqual(new Uint8Array([72, 105]));\n    });\n\n    test('should throw for unsupported encoding', () => {\n        // @ts-expect-error testing invalid input\n        expect(() => getCodecFromBytesEncoding('rot13')).toThrow(/Unrecognized bytes encoding \\[.*rot13.*\\]/);\n    });\n});\n\ndescribe('isUint8Array', () => {\n    test('should return true for Uint8Array', () => {\n        expect(isUint8Array(new Uint8Array([1, 2, 3]))).toBe(true);\n        expect(isUint8Array(new Uint8Array())).toBe(true);\n    });\n\n    test('should return false for regular arrays', () => {\n        expect(isUint8Array([1, 2, 3])).toBe(false);\n    });\n\n    test('should return false for strings', () => {\n        expect(isUint8Array('hello')).toBe(false);\n    });\n\n    test('should return false for null and undefined', () => {\n        expect(isUint8Array(null)).toBe(false);\n        expect(isUint8Array(undefined)).toBe(false);\n    });\n\n    test('should return false for other typed arrays', () => {\n        expect(isUint8Array(new Uint16Array([1, 2]))).toBe(false);\n        expect(isUint8Array(new Int8Array([1, 2]))).toBe(false);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/shared/codecs.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport {\n    getMemoizedAddressEncoder,\n    getMemoizedBase16Codec,\n    getMemoizedBase58Codec,\n    getMemoizedBase64Codec,\n    getMemoizedBooleanEncoder,\n    getMemoizedUtf8Codec,\n    getMemoizedUtf8Encoder,\n} from '../../../src/shared/codecs';\nimport { SvmTestContext } from '../../svm-test-context';\n\ndescribe('shared codecs (memoized):', () => {\n    test('should encode a base58 address to 32 bytes (getMemoizedAddressEncoder)', async () => {\n        const kp = await SvmTestContext.generateKeypair();\n        const encoder = getMemoizedAddressEncoder();\n        const result = encoder.encode(kp.address);\n        expect(result.length).toBe(32);\n    });\n\n    test('should encode a string to utf8 bytes (getMemoizedUtf8Encoder)', () => {\n        const encoder = getMemoizedUtf8Encoder();\n        expect(encoder.encode('Hello')).toEqual(new Uint8Array([72, 101, 108, 108, 111]));\n    });\n\n    test('should encode true to a single byte (getMemoizedBooleanEncoder)', () => {\n        const encoder = getMemoizedBooleanEncoder();\n        expect(encoder.encode(true)).toEqual(new Uint8Array([1]));\n    });\n\n    test('should encode a string to utf8 bytes (getMemoizedUtf8Codec)', () => {\n        const codec = getMemoizedUtf8Codec();\n        expect(codec.encode('Hi')).toEqual(new Uint8Array([72, 105]));\n    });\n\n    test('should encode a hex string to bytes (getMemoizedBase16Codec)', () => {\n        const codec = getMemoizedBase16Codec();\n        expect(codec.encode('ff')).toEqual(new Uint8Array([255]));\n    });\n\n    test('should encode a base58 string to bytes (getMemoizedBase58Codec)', () => {\n        const codec = getMemoizedBase58Codec();\n        expect(codec.encode('1')).toEqual(new Uint8Array([0]));\n    });\n\n    test('should encode a base64 string to bytes (getMemoizedBase64Codec)', () => {\n        const codec = getMemoizedBase64Codec();\n        expect(codec.encode('AQ==')).toEqual(new Uint8Array([1]));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/shared/types.test.ts",
    "content": "import type { Address } from '@solana/addresses';\nimport type { Instruction } from '@solana/instructions';\nimport { describe, expectTypeOf, test } from 'vitest';\n\nimport type { AddressInput } from '../../../src/shared/address';\nimport type {\n    AccountsInput,\n    ArgumentsInput,\n    BuildIxFn,\n    EitherSigners,\n    ResolverFn,\n    ResolversInput,\n} from '../../../src/shared/types';\n\ndescribe('AccountsInput', () => {\n    test('should accept partial record of string to AddressInput | null', () => {\n        expectTypeOf<AccountsInput>().toExtend<Partial<Record<string, AddressInput | null>>>();\n    });\n\n    test('should allow null values for optional accounts', () => {\n        expectTypeOf<{ mint: null }>().toExtend<AccountsInput>();\n    });\n\n    test('should allow AddressInput values', () => {\n        expectTypeOf<{ mint: Address }>().toExtend<AccountsInput>();\n    });\n\n    test('should allow partial (missing keys)', () => {\n        // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n        expectTypeOf<{}>().toExtend<AccountsInput>();\n    });\n});\n\ndescribe('ArgumentsInput', () => {\n    test('should accept partial record of string to unknown', () => {\n        expectTypeOf<ArgumentsInput>().toExtend<Partial<Record<string, unknown>>>();\n    });\n\n    test('should allow any value types', () => {\n        expectTypeOf<{ amount: bigint; name: string }>().toExtend<ArgumentsInput>();\n    });\n});\n\ndescribe('EitherSigners', () => {\n    test('should be an array of strings', () => {\n        expectTypeOf<EitherSigners>().toEqualTypeOf<string[]>();\n    });\n});\n\ndescribe('ResolverFn', () => {\n    test('should accept arguments and accounts input and return Promise<unknown>', () => {\n        expectTypeOf<ResolverFn>().toBeFunction();\n        expectTypeOf<ResolverFn>().parameters.toEqualTypeOf<[ArgumentsInput, AccountsInput]>();\n        expectTypeOf<ResolverFn>().returns.toEqualTypeOf<Promise<unknown>>();\n    });\n});\n\ndescribe('ResolversInput', () => {\n    test('should be a record of string to ResolverFn', () => {\n        expectTypeOf<ResolversInput>().toEqualTypeOf<Record<string, ResolverFn>>();\n    });\n});\n\ndescribe('BuildIxFn', () => {\n    test('should return a Promise of Instruction', () => {\n        expectTypeOf<BuildIxFn>().returns.toEqualTypeOf<Promise<Instruction>>();\n    });\n\n    test('should allow calling with no arguments', () => {\n        expectTypeOf<BuildIxFn>().toBeCallableWith();\n    });\n\n    test('should accept all four parameters', () => {\n        expectTypeOf<BuildIxFn>().toBeCallableWith({}, {}, [], {});\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/shared/util.test.ts",
    "content": "import { describe, expect, expectTypeOf, test } from 'vitest';\n\nimport { formatValueType, isObjectRecord, safeStringify } from '../../../src/shared/util';\n\ndescribe('isObjectRecord', () => {\n    test('should return true for plain objects', () => {\n        expect(isObjectRecord({})).toBe(true);\n        expect(isObjectRecord({ key: 'value' })).toBe(true);\n    });\n\n    test('should narrow type to Record<string, unknown>', () => {\n        const value: unknown = { key: 'value' };\n        if (isObjectRecord(value)) {\n            expectTypeOf(value).toExtend<Record<string, unknown>>();\n        }\n    });\n\n    test('should return false for null', () => {\n        expect(isObjectRecord(null)).toBe(false);\n    });\n\n    test('should return false for arrays', () => {\n        expect(isObjectRecord([1, 2, 3])).toBe(false);\n    });\n\n    test('should return false for primitives', () => {\n        expect(isObjectRecord('string')).toBe(false);\n        expect(isObjectRecord(42)).toBe(false);\n        expect(isObjectRecord(true)).toBe(false);\n        expect(isObjectRecord(undefined)).toBe(false);\n    });\n\n    test('should return false for class instances', () => {\n        expect(isObjectRecord(new Date())).toBe(false);\n        expect(isObjectRecord(new Map())).toBe(false);\n    });\n\n    test('should return false for Uint8Array', () => {\n        expect(isObjectRecord(new Uint8Array([1, 2]))).toBe(false);\n    });\n});\n\ndescribe('formatValueType', () => {\n    test('should return \"null\" for null', () => {\n        expect(formatValueType(null)).toBe('null');\n    });\n\n    test('should return array description with length', () => {\n        expect(formatValueType([1, 2, 3])).toBe('array (length 3)');\n        expect(formatValueType([])).toBe('array (length 0)');\n    });\n\n    test('should return Uint8Array description with length', () => {\n        expect(formatValueType(new Uint8Array([1, 2]))).toBe('Uint8Array (length 2)');\n        expect(formatValueType(new Uint8Array())).toBe('Uint8Array (length 0)');\n    });\n\n    test('should return \"object\" for plain objects', () => {\n        expect(formatValueType({ key: 'value' })).toBe('object');\n    });\n\n    test('should return \"object\" for class instances', () => {\n        expect(formatValueType(new Date())).toBe('object');\n    });\n\n    test('should return typeof for primitives', () => {\n        expect(formatValueType('hello')).toBe('string');\n        expect(formatValueType(42)).toBe('number');\n        expect(formatValueType(true)).toBe('boolean');\n        expect(formatValueType(undefined)).toBe('undefined');\n        expect(formatValueType(42n)).toBe('bigint');\n    });\n});\n\ndescribe('safeStringify', () => {\n    test('should stringify plain objects', () => {\n        expect(safeStringify({ a: 1 })).toBe('{\"a\":1}');\n    });\n\n    test('should stringify arrays', () => {\n        expect(safeStringify([1, 2, 3])).toBe('[1,2,3]');\n    });\n\n    test('should stringify primitives', () => {\n        expect(safeStringify('hello')).toBe('\"hello\"');\n        expect(safeStringify(42)).toBe('42');\n        expect(safeStringify(null)).toBe('null');\n        expect(safeStringify(true)).toBe('true');\n    });\n\n    test('should convert BigInt to string', () => {\n        expect(safeStringify(42n)).toBe('\"42\"');\n        expect(safeStringify({ amount: 1000n })).toBe('{\"amount\":\"1000\"}');\n    });\n\n    test('should return non-serializable object for circular references', () => {\n        const circular: Record<string, unknown> = {};\n        circular.self = circular;\n        expect(safeStringify(circular)).toBe('non-serializable object');\n    });\n\n    test('should always return a string', () => {\n        expectTypeOf(safeStringify).returns.toBeString();\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/account-default-value/account-default-value-test-utils.ts",
    "content": "import { address } from '@solana/addresses';\nimport type { InstructionAccountNode } from 'codama';\nimport { instructionAccountNode, instructionNode, programNode, rootNode } from 'codama';\n\nimport { createAccountDefaultValueVisitor } from '../../../../src/instruction-encoding/visitors/account-default-value';\n\nexport const programAddress = address('11111111111111111111111111111111');\nexport const rootNodeMock = rootNode(programNode({ name: 'test', publicKey: programAddress }));\n\nexport const ixNodeStub = instructionNode({ name: 'testInstruction' });\n\nexport const ixAccountNodeStub: InstructionAccountNode = instructionAccountNode({\n    isOptional: false,\n    isSigner: false,\n    isWritable: false,\n    name: 'testAccount',\n});\n\nexport function makeVisitor(overrides?: Partial<Parameters<typeof createAccountDefaultValueVisitor>[0]>) {\n    return createAccountDefaultValueVisitor({\n        accountAddressInput: undefined,\n        accountsInput: undefined,\n        argumentsInput: undefined,\n        ixAccountNode: ixAccountNodeStub,\n        ixNode: ixNodeStub,\n        resolutionPath: [],\n        resolversInput: undefined,\n        root: rootNodeMock,\n        ...overrides,\n    });\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/account-default-value/accountBumpValueNode.test.ts",
    "content": "import { accountBumpValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor } from './account-default-value-test-utils';\n\ndescribe('account-default-value: visitAccountBumpValue', () => {\n    test('should throw \"not yet supported\"', async () => {\n        const visitor = makeVisitor();\n        await expect(visitor.visitAccountBumpValue(accountBumpValueNode('seed'))).rejects.toThrow(\n            /Unsupported node kind \\[accountBumpValueNode\\]/,\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/account-default-value/accountValueNode.test.ts",
    "content": "import { accountValueNode, instructionAccountNode, instructionNode, publicKeyValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { makeVisitor } from './account-default-value-test-utils';\n\ndescribe('account-default-value: visitAccountValue', async () => {\n    const refAddress = await SvmTestContext.generateAddress();\n    const ixNodeWithAccount = instructionNode({\n        accounts: [\n            instructionAccountNode({\n                isOptional: false,\n                isSigner: false,\n                isWritable: false,\n                name: 'refAccount',\n            }),\n        ],\n        name: 'testInstruction',\n    });\n\n    test('should return address when user provides address in accountsInput', async () => {\n        const visitor = makeVisitor({\n            accountsInput: { refAccount: refAddress },\n            ixNode: ixNodeWithAccount,\n        });\n        const result = await visitor.visitAccountValue(accountValueNode('refAccount'));\n        expect(result).toBe(refAddress);\n    });\n\n    test('should return null for optional account with null input and omitted strategy', async () => {\n        const ixNodeWithOptional = instructionNode({\n            accounts: [\n                instructionAccountNode({\n                    isOptional: true,\n                    isSigner: false,\n                    isWritable: false,\n                    name: 'refAccount',\n                }),\n            ],\n            name: 'testInstruction',\n            optionalAccountStrategy: 'omitted',\n        });\n        const visitor = makeVisitor({\n            accountsInput: { refAccount: null },\n            ixNode: ixNodeWithOptional,\n        });\n        const result = await visitor.visitAccountValue(accountValueNode('refAccount'));\n        expect(result).toBeNull();\n    });\n\n    test('should resolve referenced account defaultValue', async () => {\n        const expectedDefaultAddress = await SvmTestContext.generateAddress();\n        const ixNodeWithDefault = instructionNode({\n            accounts: [\n                instructionAccountNode({\n                    defaultValue: publicKeyValueNode(expectedDefaultAddress),\n                    isOptional: false,\n                    isSigner: false,\n                    isWritable: false,\n                    name: 'refAccount',\n                }),\n            ],\n            name: 'testInstruction',\n        });\n        const visitor = makeVisitor({ ixNode: ixNodeWithDefault });\n        const result = await visitor.visitAccountValue(accountValueNode('refAccount'));\n        expect(result).toBe(expectedDefaultAddress);\n    });\n\n    test('should throw for unknown account reference', async () => {\n        const visitor = makeVisitor();\n        await expect(visitor.visitAccountValue(accountValueNode('unknown'))).rejects.toThrow(\n            /Referenced node \\[unknown\\] not found in \\[testInstruction\\]/,\n        );\n    });\n\n    test('should throw on circular dependency', async () => {\n        const visitor = makeVisitor({\n            ixNode: ixNodeWithAccount,\n            resolutionPath: ['refAccount'],\n        });\n        await expect(visitor.visitAccountValue(accountValueNode('refAccount'))).rejects.toThrow(\n            /Circular dependency detected: \\[/,\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/account-default-value/argumentValueNode.test.ts",
    "content": "import { argumentValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { makeVisitor } from './account-default-value-test-utils';\n\ndescribe('account-default-value: visitArgumentValue', () => {\n    test('should return address from argument value', async () => {\n        const addr = await SvmTestContext.generateAddress();\n        const visitor = makeVisitor({ argumentsInput: { myArg: addr } });\n        const result = await visitor.visitArgumentValue(argumentValueNode('myArg'));\n        expect(result).toBe(addr);\n    });\n\n    test('should throw when argument is missing', async () => {\n        const visitor = makeVisitor({ argumentsInput: {} });\n        await expect(visitor.visitArgumentValue(argumentValueNode('myArg'))).rejects.toThrow(\n            /Missing argument \\[myArg\\] in \\[testInstruction\\]/,\n        );\n    });\n\n    test('should throw when argument is null', async () => {\n        const visitor = makeVisitor({ argumentsInput: { myArg: null } });\n        await expect(visitor.visitArgumentValue(argumentValueNode('myArg'))).rejects.toThrow(\n            /Missing argument \\[myArg\\] in \\[testInstruction\\]/,\n        );\n    });\n\n    test('should throw when argument cannot be converted to Address', async () => {\n        const visitors: ReturnType<typeof makeVisitor>[] = [\n            makeVisitor({ argumentsInput: { myArg: 'not-a-valid-base58' } }),\n            makeVisitor({ argumentsInput: { myArg: { a: 42 } } }),\n        ];\n        for (const visitor of visitors) {\n            await expect(visitor.visitArgumentValue(argumentValueNode('myArg'))).rejects.toThrow(\n                /Expected \\[Address \\| PublicKey\\] for account \\[testAccount\\]/,\n            );\n        }\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/account-default-value/conditionalValueNode.test.ts",
    "content": "import {\n    argumentValueNode,\n    conditionalValueNode,\n    instructionAccountNode,\n    numberValueNode,\n    publicKeyValueNode,\n    resolverValueNode,\n} from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { ixAccountNodeStub, makeVisitor } from './account-default-value-test-utils';\n\ndescribe('account-default-value: visitConditionalValue', async () => {\n    const ifTrueAddress = await SvmTestContext.generateAddress();\n    const ifFalseAddress = await SvmTestContext.generateAddress();\n\n    test('should resolve ifTrue branch when argument condition is truthy', async () => {\n        const node = conditionalValueNode({\n            condition: argumentValueNode('flag'),\n            ifTrue: publicKeyValueNode(ifTrueAddress),\n        });\n        const visitor = makeVisitor({ argumentsInput: { flag: true } });\n        const result = await visitor.visitConditionalValue(node);\n        expect(result).toBe(ifTrueAddress);\n    });\n\n    test('should resolve ifFalse branch when argument condition is falsy', async () => {\n        const node = conditionalValueNode({\n            condition: argumentValueNode('flag'),\n            ifFalse: publicKeyValueNode(ifFalseAddress),\n            ifTrue: publicKeyValueNode(ifTrueAddress),\n        });\n        const visitor = makeVisitor({ argumentsInput: { flag: false } });\n        const result = await visitor.visitConditionalValue(node);\n        expect(result).toBe(ifFalseAddress);\n    });\n\n    test('should return null for optional account when no ifFalse and condition is falsy', async () => {\n        const optionalAccountNode = instructionAccountNode({\n            isOptional: true,\n            isSigner: false,\n            isWritable: false,\n            name: 'optionalAccount',\n        });\n        const node = conditionalValueNode({\n            condition: argumentValueNode('flag'),\n            ifTrue: publicKeyValueNode(ifTrueAddress),\n        });\n        const visitor = makeVisitor({\n            argumentsInput: { flag: false },\n            ixAccountNode: optionalAccountNode,\n        });\n        const result = await visitor.visitConditionalValue(node);\n        expect(result).toBeNull();\n    });\n\n    test('should throw for required account when no ifFalse and condition is falsy', async () => {\n        const node = conditionalValueNode({\n            condition: argumentValueNode('flag'),\n            ifTrue: publicKeyValueNode(ifTrueAddress),\n        });\n        const visitor = makeVisitor({\n            argumentsInput: { flag: false },\n            ixAccountNode: {\n                ...ixAccountNodeStub,\n                isOptional: false,\n            },\n        });\n        await expect(visitor.visitConditionalValue(node)).rejects.toThrow(/Missing account \\[/);\n    });\n\n    test('should resolve ifTrue when primitive value matches', async () => {\n        const node = conditionalValueNode({\n            condition: argumentValueNode('tokenStandard'),\n            ifFalse: publicKeyValueNode(ifFalseAddress),\n            ifTrue: publicKeyValueNode(ifTrueAddress),\n            value: numberValueNode(0),\n        });\n        const visitor = makeVisitor({ argumentsInput: { tokenStandard: 0 } });\n        const result = await visitor.visitConditionalValue(node);\n        expect(result).toBe(ifTrueAddress);\n    });\n\n    test('should resolve ifFalse when value does not match', async () => {\n        const node = conditionalValueNode({\n            condition: argumentValueNode('tokenStandard'),\n            ifFalse: publicKeyValueNode(ifFalseAddress),\n            ifTrue: publicKeyValueNode(ifTrueAddress),\n            value: numberValueNode(0),\n        });\n        const visitor = makeVisitor({ argumentsInput: { tokenStandard: 1 } });\n        const result = await visitor.visitConditionalValue(node);\n        expect(result).toBe(ifFalseAddress);\n    });\n\n    test('should resolve with resolver condition', async () => {\n        const nodeWithTrue = conditionalValueNode({\n            condition: resolverValueNode('myResolver'),\n            ifFalse: publicKeyValueNode(ifFalseAddress),\n            ifTrue: publicKeyValueNode(ifTrueAddress),\n        });\n        const visitorWithTrue = makeVisitor({ resolversInput: { myResolver: () => Promise.resolve(true) } });\n        const result = await visitorWithTrue.visitConditionalValue(nodeWithTrue);\n        expect(result).toBe(ifTrueAddress);\n\n        const visitorWithFalse = makeVisitor({ resolversInput: { myResolver: () => Promise.resolve(false) } });\n        const resultFalse = await visitorWithFalse.visitConditionalValue(nodeWithTrue);\n        expect(resultFalse).toBe(ifFalseAddress);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/account-default-value/identityValueNode.test.ts",
    "content": "import { identityValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { makeVisitor } from './account-default-value-test-utils';\n\ndescribe('account-default-value: visitIdentityValue', () => {\n    test('should return provided address', async () => {\n        const addr = await SvmTestContext.generateAddress();\n        const visitor = makeVisitor({ accountAddressInput: addr });\n        const result = await visitor.visitIdentityValue(identityValueNode());\n        expect(result).toBe(addr);\n    });\n\n    test('should throw when address not provided (undefined)', async () => {\n        const visitor = makeVisitor({ accountAddressInput: undefined });\n        await expect(visitor.visitIdentityValue(identityValueNode())).rejects.toThrow(\n            /Missing account \\[testAccount\\]/,\n        );\n    });\n\n    test('should throw when address not provided (null)', async () => {\n        const visitor = makeVisitor({ accountAddressInput: null });\n        await expect(visitor.visitIdentityValue(identityValueNode())).rejects.toThrow(\n            /Missing account \\[testAccount\\]/,\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/account-default-value/payerValueNode.test.ts",
    "content": "import { payerValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { makeVisitor } from './account-default-value-test-utils';\n\ndescribe('account-default-value: visitPayerValue', () => {\n    test('should return provided address', async () => {\n        const addr = await SvmTestContext.generateAddress();\n        const visitor = makeVisitor({ accountAddressInput: addr });\n        const result = await visitor.visitPayerValue(payerValueNode());\n        expect(result).toBe(addr);\n    });\n\n    test('should throw when address not provided (undefined)', async () => {\n        const visitor = makeVisitor({ accountAddressInput: undefined });\n        await expect(visitor.visitPayerValue(payerValueNode())).rejects.toThrow(/Missing account \\[testAccount\\]/);\n    });\n\n    test('should throw when address not provided (null)', async () => {\n        const visitor = makeVisitor({ accountAddressInput: null });\n        await expect(visitor.visitPayerValue(payerValueNode())).rejects.toThrow(/Missing account \\[testAccount\\]/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/account-default-value/pdaValueNode.test.ts",
    "content": "import { getAddressEncoder, getProgramDerivedAddress } from '@solana/addresses';\nimport { getUtf8Codec } from '@solana/codecs';\nimport {\n    argumentValueNode,\n    bytesTypeNode,\n    constantPdaSeedNode,\n    instructionArgumentNode,\n    pdaLinkNode,\n    pdaNode,\n    pdaSeedValueNode,\n    pdaValueNode,\n    programNode,\n    publicKeyTypeNode,\n    rootNode,\n    stringTypeNode,\n    stringValueNode,\n    variablePdaSeedNode,\n} from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { ixNodeStub, makeVisitor } from './account-default-value-test-utils';\n\ndescribe('account-default-value: visitPdaValue', async () => {\n    const testProgramAddress = await SvmTestContext.generateAddress();\n\n    test('should derive PDA with constant seed', async () => {\n        const pda = pdaNode({\n            name: 'testPda',\n            seeds: [constantPdaSeedNode(stringTypeNode('utf8'), stringValueNode('prefix'))],\n        });\n        const root = rootNode(programNode({ name: 'test', pdas: [pda], publicKey: testProgramAddress }));\n        const node = pdaValueNode(pdaLinkNode('testPda'));\n\n        const expectedPda = await getProgramDerivedAddress({\n            programAddress: testProgramAddress,\n            seeds: [getUtf8Codec().encode('prefix')],\n        });\n\n        const visitor = makeVisitor({ root });\n        const result = await visitor.visitPdaValue(node);\n        expect(result).toBe(expectedPda[0]);\n    });\n\n    test('should derive PDA with variable seed from argument', async () => {\n        const ownerAddress = await SvmTestContext.generateAddress();\n        const pda = pdaNode({\n            name: 'testPda',\n            seeds: [variablePdaSeedNode('owner', publicKeyTypeNode())],\n        });\n        const root = rootNode(programNode({ name: 'test', pdas: [pda], publicKey: testProgramAddress }));\n        const node = pdaValueNode(pdaLinkNode('testPda'), [pdaSeedValueNode('owner', argumentValueNode('ownerArg'))]);\n        const ixNode = {\n            ...ixNodeStub,\n            arguments: [instructionArgumentNode({ name: 'ownerArg', type: publicKeyTypeNode() })],\n        };\n\n        const expectedPda = await getProgramDerivedAddress({\n            programAddress: testProgramAddress,\n            seeds: [getAddressEncoder().encode(ownerAddress)],\n        });\n\n        const visitor = makeVisitor({\n            argumentsInput: { ownerArg: ownerAddress },\n            ixNode,\n            root,\n        });\n        const result = await visitor.visitPdaValue(node);\n        expect(result).toBe(expectedPda[0]);\n    });\n\n    test('should throw when variable seed value node is missing', async () => {\n        const pda = pdaNode({\n            name: 'testPda',\n            seeds: [variablePdaSeedNode('owner', bytesTypeNode())],\n        });\n        const root = rootNode(programNode({ name: 'test', pdas: [pda], publicKey: testProgramAddress }));\n        const node = pdaValueNode(pdaLinkNode('testPda'));\n\n        const visitor = makeVisitor({ root });\n        await expect(visitor.visitPdaValue(node)).rejects.toThrow(\n            /Referenced node \\[owner\\] not found in \\[testInstruction\\]/,\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/account-default-value/programIdValueNode.test.ts",
    "content": "import { programIdValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor, programAddress } from './account-default-value-test-utils';\n\ndescribe('account-default-value: visitProgramIdValue', () => {\n    test('should return program public key from root', async () => {\n        const visitor = makeVisitor();\n        const result = await visitor.visitProgramIdValue(programIdValueNode());\n        expect(result).toBe(programAddress);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/account-default-value/publicKeyValueNode.test.ts",
    "content": "import { publicKeyValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { makeVisitor } from './account-default-value-test-utils';\n\ndescribe('account-default-value: visitPublicKeyValue', () => {\n    test('should return public key address', async () => {\n        const addr = await SvmTestContext.generateAddress();\n        const visitor = makeVisitor();\n        const result = await visitor.visitPublicKeyValue(publicKeyValueNode(addr));\n        expect(result).toBe(addr);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/account-default-value/resolverValueNode.test.ts",
    "content": "import { resolverValueNode } from 'codama';\nimport { describe, expect, test, vi } from 'vitest';\n\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { makeVisitor } from './account-default-value-test-utils';\n\ndescribe('account-default-value: visitResolverValue', () => {\n    test('should call resolver and return address', async () => {\n        const addr = await SvmTestContext.generateAddress();\n        const visitor = makeVisitor({\n            resolversInput: { myResolver: () => Promise.resolve(addr) },\n        });\n        const result = await visitor.visitResolverValue(resolverValueNode('myResolver'));\n        expect(result).toBe(addr);\n    });\n\n    test('should throw when resolver is not provided', async () => {\n        const visitor = makeVisitor();\n        await expect(visitor.visitResolverValue(resolverValueNode('myResolver'))).rejects.toThrow(\n            /Resolver \\[myResolver\\] not provided for account \\[testAccount\\]/,\n        );\n    });\n\n    test('should throw when resolver returns null', async () => {\n        const visitor = makeVisitor({\n            resolversInput: { myResolver: () => Promise.resolve(null) },\n        });\n        await expect(visitor.visitResolverValue(resolverValueNode('myResolver'))).rejects.toThrow(\n            /Invalid account address \\[testAccount\\]: \\[null\\]/,\n        );\n    });\n\n    test('should throw when resolver returns undefined', async () => {\n        const visitor = makeVisitor({\n            resolversInput: { myResolver: () => Promise.resolve(undefined) },\n        });\n        await expect(visitor.visitResolverValue(resolverValueNode('myResolver'))).rejects.toThrow(\n            /Invalid account address \\[testAccount\\]: \\[undefined\\]/,\n        );\n    });\n\n    test('should pass arguments and accounts to resolver', async () => {\n        const addr = await SvmTestContext.generateAddress();\n        const resolverSpy = vi.fn().mockResolvedValue(addr);\n        const argumentsInput = { amount: 100 };\n        const accountsInput = { treasury: addr };\n\n        const visitor = makeVisitor({\n            accountsInput,\n            argumentsInput,\n            resolversInput: { myResolver: resolverSpy },\n        });\n        await visitor.visitResolverValue(resolverValueNode('myResolver'));\n\n        expect(resolverSpy).toHaveBeenCalledWith(argumentsInput, accountsInput);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/condition-node-value/accountValueNode.test.ts",
    "content": "import { accountValueNode, instructionAccountNode, instructionNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { makeVisitor } from './condition-node-value-test-utils';\n\ndescribe('condition-node-value: visitAccountValue', () => {\n    const ixNodeWithAccount = instructionNode({\n        accounts: [\n            instructionAccountNode({\n                isOptional: true,\n                isSigner: false,\n                isWritable: false,\n                name: 'myAccount',\n            }),\n        ],\n        name: 'testInstruction',\n    });\n\n    test('should return null when user provides null', async () => {\n        const visitor = makeVisitor({\n            accountsInput: { myAccount: null },\n            ixNode: ixNodeWithAccount,\n        });\n        const result = await visitor.visitAccountValue(accountValueNode('myAccount'));\n        expect(result).toBeNull();\n    });\n\n    test('should return address when user provides address', async () => {\n        const accAddress = await SvmTestContext.generateAddress();\n        const visitor = makeVisitor({\n            accountsInput: { myAccount: accAddress },\n            ixNode: ixNodeWithAccount,\n        });\n        const result = await visitor.visitAccountValue(accountValueNode('myAccount'));\n        expect(result).toBe(accAddress);\n    });\n\n    test('should throw for unknown account reference', async () => {\n        const visitor = makeVisitor();\n        await expect(visitor.visitAccountValue(accountValueNode('unknown'))).rejects.toThrow(\n            /Referenced node \\[unknown\\] not found in \\[testInstruction\\]/,\n        );\n    });\n\n    test('should throw on circular dependency', async () => {\n        const visitor = makeVisitor({\n            ixNode: ixNodeWithAccount,\n            resolutionPath: ['myAccount'],\n        });\n        await expect(visitor.visitAccountValue(accountValueNode('myAccount'))).rejects.toThrow(\n            /Circular dependency detected: \\[/,\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/condition-node-value/argumentValueNode.test.ts",
    "content": "import { argumentValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor } from './condition-node-value-test-utils';\n\ndescribe('condition-node-value: visitArgumentValue', () => {\n    test('should return argument value', async () => {\n        const visitor = makeVisitor({ argumentsInput: { amount: 42 } });\n        const result = await visitor.visitArgumentValue(argumentValueNode('amount'));\n        expect(result).toBe(42);\n    });\n\n    test('should return undefined for missing argument', async () => {\n        const visitor = makeVisitor({ argumentsInput: {} });\n        const result = await visitor.visitArgumentValue(argumentValueNode('amount'));\n        expect(result).toBeUndefined();\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/condition-node-value/condition-node-value-test-utils.ts",
    "content": "import { instructionNode, programNode, rootNode } from 'codama';\n\nimport { createConditionNodeValueVisitor } from '../../../../src/instruction-encoding/visitors/condition-node-value';\n\nconst rootNodeMock = rootNode(programNode({ name: 'test', publicKey: '11111111111111111111111111111111' }));\nconst ixNodeStub = instructionNode({ name: 'testInstruction' });\n\nexport function makeVisitor(overrides?: Partial<Parameters<typeof createConditionNodeValueVisitor>[0]>) {\n    return createConditionNodeValueVisitor({\n        accountsInput: undefined,\n        argumentsInput: undefined,\n        ixNode: ixNodeStub,\n        resolutionPath: [],\n        resolversInput: undefined,\n        root: rootNodeMock,\n        ...overrides,\n    });\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/condition-node-value/resolverValueNode.test.ts",
    "content": "import { resolverValueNode } from 'codama';\nimport { describe, expect, test, vi } from 'vitest';\n\nimport { makeVisitor } from './condition-node-value-test-utils';\n\ndescribe('condition-node-value: visitResolverValue', () => {\n    test('should return undefined when resolversInput is undefined', async () => {\n        const visitor = makeVisitor();\n        const result = await visitor.visitResolverValue(resolverValueNode('myResolver'));\n        expect(result).toBeUndefined();\n    });\n\n    test('should return undefined when resolver not in the resolversInput', async () => {\n        const visitor = makeVisitor({ resolversInput: {} });\n        const result = await visitor.visitResolverValue(resolverValueNode('myResolver'));\n        expect(result).toBeUndefined();\n    });\n\n    test('should call resolver and return result', async () => {\n        const visitor = makeVisitor({\n            resolversInput: { myResolver: async () => await Promise.resolve(999) },\n        });\n        const result = await visitor.visitResolverValue(resolverValueNode('myResolver'));\n        expect(result).toBe(999);\n    });\n\n    test('should throw ResolverError when resolver throws', async () => {\n        const visitor = makeVisitor({\n            resolversInput: {\n                myResolver: () => {\n                    throw new Error('some error');\n                },\n            },\n        });\n        await expect(visitor.visitResolverValue(resolverValueNode('myResolver'))).rejects.toThrow(\n            /Resolver \\[myResolver\\] threw an error while resolving \\[conditionalValueNode\\] \\[myResolver\\]/,\n        );\n    });\n\n    test('should pass arguments and accounts to resolver', async () => {\n        const resolverSpy = vi.fn().mockReturnValue('resolved');\n        const argumentsInput = { amount: 100 };\n        const accountsInput = { treasury: null };\n\n        const visitor = makeVisitor({\n            accountsInput,\n            argumentsInput,\n            resolversInput: { myResolver: resolverSpy },\n        });\n        const result = await visitor.visitResolverValue(resolverValueNode('myResolver'));\n\n        expect(result).toBe('resolved');\n        expect(resolverSpy).toHaveBeenCalledWith(argumentsInput, accountsInput);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/default-value-encoder/booleanValueNode.test.ts",
    "content": "import { getBooleanCodec } from '@solana/codecs';\nimport { booleanTypeNode, booleanValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor } from './default-value-encoder-test-utils';\n\ndescribe('default-value-encoder: visitBooleanValue', () => {\n    test('should encode true', () => {\n        const visitor = makeVisitor(booleanTypeNode());\n        const result = visitor.visitBooleanValue(booleanValueNode(true));\n        expect(result).toEqual(getBooleanCodec().encode(true));\n    });\n\n    test('should encode false', () => {\n        const visitor = makeVisitor(booleanTypeNode());\n        const result = visitor.visitBooleanValue(booleanValueNode(false));\n        expect(result).toEqual(getBooleanCodec().encode(false));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/default-value-encoder/bytesValueNode.test.ts",
    "content": "import { getBase16Codec, getBase58Codec, getUtf8Codec } from '@solana/codecs';\nimport { bytesTypeNode, bytesValueNode, fixedSizeTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { makeVisitor } from './default-value-encoder-test-utils';\n\ndescribe('default-value-encoder: visitBytesValue', () => {\n    test('should encode base16 bytes', () => {\n        const visitor = makeVisitor(fixedSizeTypeNode(bytesTypeNode(), 4));\n        const result = visitor.visitBytesValue(bytesValueNode('base16', 'deadbeef'));\n        expect(result).toEqual(getBase16Codec().encode('deadbeef'));\n    });\n\n    test('should encode base58 bytes', async () => {\n        const bs58 = await SvmTestContext.generateAddress();\n        const visitor = makeVisitor(fixedSizeTypeNode(bytesTypeNode(), 32));\n        const result = visitor.visitBytesValue(bytesValueNode('base58', bs58));\n        expect(result).toEqual(getBase58Codec().encode(bs58));\n    });\n\n    test('should encode utf8 bytes', () => {\n        const visitor = makeVisitor(fixedSizeTypeNode(bytesTypeNode(), 5));\n        const result = visitor.visitBytesValue(bytesValueNode('utf8', 'hello'));\n        expect(result).toEqual(getUtf8Codec().encode('hello'));\n    });\n\n    test('should encode empty bytes', () => {\n        const visitor = makeVisitor(fixedSizeTypeNode(bytesTypeNode(), 0));\n        const result = visitor.visitBytesValue(bytesValueNode('base16', ''));\n        expect(result).toEqual(new Uint8Array(0));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/default-value-encoder/default-value-encoder-test-utils.ts",
    "content": "import { getNodeCodec } from '@codama/dynamic-codecs';\nimport type { InstructionArgumentNode, TypeNode } from 'codama';\nimport { instructionArgumentNode, instructionNode, programNode, rootNode } from 'codama';\n\nimport { createDefaultValueEncoderVisitor } from '../../../../src/instruction-encoding/visitors/default-value-encoder';\n\nconst root = rootNode(programNode({ name: 'test_program', publicKey: '11111111111111111111111111111111' }));\n\nexport function makeVisitor(argType: TypeNode) {\n    const ixArgNode: InstructionArgumentNode = instructionArgumentNode({\n        name: 'testArg',\n        type: argType,\n    });\n    const ixNode = instructionNode({\n        arguments: [ixArgNode],\n        name: 'testInstruction',\n    });\n    const codec = getNodeCodec([root, root.program, ixNode, ixArgNode]);\n    return createDefaultValueEncoderVisitor(codec);\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/default-value-encoder/enumValueNode.test.ts",
    "content": "import { enumEmptyVariantTypeNode, enumTypeNode, enumValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor } from './default-value-encoder-test-utils';\n\ndescribe('default-value-encoder: visitEnumValue', () => {\n    test('should encode variants', () => {\n        const visitor = makeVisitor(\n            enumTypeNode([enumEmptyVariantTypeNode('variantA'), enumEmptyVariantTypeNode('variantB')]),\n        );\n        const variantA = visitor.visitEnumValue(enumValueNode('testEnum', 'variantA'));\n        expect(variantA).toEqual(new Uint8Array([0]));\n\n        const variantB = visitor.visitEnumValue(enumValueNode('testEnum', 'variantB'));\n        expect(variantB).toEqual(new Uint8Array([1]));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/default-value-encoder/noneValueNode.test.ts",
    "content": "import { noneValueNode, numberTypeNode, optionTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor } from './default-value-encoder-test-utils';\n\ndescribe('default-value-encoder: visitNoneValue', () => {\n    test('should encode none as option prefix byte 0', () => {\n        const visitor = makeVisitor(optionTypeNode(numberTypeNode('u8')));\n        const result = visitor.visitNoneValue(noneValueNode());\n        expect(result).toEqual(new Uint8Array([0]));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/default-value-encoder/numberValueNode.test.ts",
    "content": "import { getU8Codec, getU32Codec } from '@solana/codecs';\nimport { numberTypeNode, numberValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor } from './default-value-encoder-test-utils';\n\ndescribe('default-value-encoder: visitNumberValue', () => {\n    test('should encode u8 value', () => {\n        const visitor = makeVisitor(numberTypeNode('u8'));\n        const result = visitor.visitNumberValue(numberValueNode(42));\n        expect(result).toEqual(getU8Codec().encode(42));\n    });\n\n    test('should encode zero', () => {\n        const visitor = makeVisitor(numberTypeNode('u8'));\n        const result = visitor.visitNumberValue(numberValueNode(0));\n        expect(result).toEqual(getU8Codec().encode(0));\n    });\n\n    test('should encode u32 value', () => {\n        const visitor = makeVisitor(numberTypeNode('u32'));\n        const result = visitor.visitNumberValue(numberValueNode(100_000));\n        expect(result).toEqual(getU32Codec().encode(100_000));\n    });\n\n    test('should encode max u8 value', () => {\n        const visitor = makeVisitor(numberTypeNode('u8'));\n        const result = visitor.visitNumberValue(numberValueNode(255));\n        expect(result).toEqual(getU8Codec().encode(255));\n    });\n\n    test('should throw on overflow for u8 value', () => {\n        const visitor = makeVisitor(numberTypeNode('u8'));\n        expect(() => visitor.visitNumberValue(numberValueNode(1000))).toThrow();\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/default-value-encoder/publicKeyValueNode.test.ts",
    "content": "import { getAddressCodec } from '@solana/addresses';\nimport { publicKeyTypeNode, publicKeyValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { makeVisitor } from './default-value-encoder-test-utils';\n\ndescribe('default-value-encoder: visitPublicKeyValue', () => {\n    test('should encode public key as 32 bytes', async () => {\n        const pubkey = await SvmTestContext.generateAddress();\n        const visitor = makeVisitor(publicKeyTypeNode());\n        const result = visitor.visitPublicKeyValue(publicKeyValueNode(pubkey));\n        expect(result).toEqual(getAddressCodec().encode(pubkey));\n        expect(result.length).toBe(32);\n    });\n\n    test('should throw for invalid public key', () => {\n        const invalidPubkey = 'not-a-valid-pubkey';\n        const visitor = makeVisitor(publicKeyTypeNode());\n        expect(() => visitor.visitPublicKeyValue(publicKeyValueNode(invalidPubkey))).toThrow();\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/default-value-encoder/stringValueNode.test.ts",
    "content": "import { getBase16Codec, getBase58Codec, getUtf8Codec } from '@solana/codecs';\nimport { fixedSizeTypeNode, stringTypeNode, stringValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor } from './default-value-encoder-test-utils';\n\ndescribe('default-value-encoder: visitStringValue', () => {\n    test('should encode utf8 string', () => {\n        const visitor = makeVisitor(fixedSizeTypeNode(stringTypeNode('utf8'), 5));\n        const result = visitor.visitStringValue(stringValueNode('hello'));\n        expect(result).toEqual(getUtf8Codec().encode('hello'));\n    });\n\n    test('should encode base16 string', () => {\n        const visitor = makeVisitor(fixedSizeTypeNode(stringTypeNode('base16'), 4));\n        const result = visitor.visitStringValue(stringValueNode('deadbeef'));\n        expect(result).toEqual(getBase16Codec().encode('deadbeef'));\n    });\n\n    test('should encode base58 string', () => {\n        const visitor = makeVisitor(fixedSizeTypeNode(stringTypeNode('base58'), 3));\n        const result = visitor.visitStringValue(stringValueNode('abc'));\n        expect(result).toEqual(getBase58Codec().encode('abc'));\n    });\n\n    test('should encode empty string', () => {\n        const visitor = makeVisitor(fixedSizeTypeNode(stringTypeNode('utf8'), 0));\n        const result = visitor.visitStringValue(stringValueNode(''));\n        expect(result).toEqual(getUtf8Codec().encode(''));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/amountTypeNode.test.ts",
    "content": "import { amountTypeNode, numberTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('amountTypeNode', () => {\n    test('should delegate to inner number type (pass-through)', () => {\n        const transformer = createInputValueTransformer(amountTypeNode(numberTypeNode('u64'), 2, 'USD'), rootNodeMock);\n        expect(transformer(100)).toBe(100);\n        expect(transformer(0)).toBe(0);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/arrayTypeNode.test.ts",
    "content": "import { arrayTypeNode, bytesTypeNode, numberTypeNode, prefixedCountNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('arrayTypeNode', () => {\n    test('should transform array items with bytes inner type', () => {\n        const transformer = createInputValueTransformer(\n            arrayTypeNode(bytesTypeNode(), prefixedCountNode(numberTypeNode('u32'))),\n            rootNodeMock,\n            { bytesEncoding: 'base16' },\n        );\n        const input = [new Uint8Array([0x01]), new Uint8Array([0x02])];\n        expect(transformer(input)).toEqual([\n            ['base16', '01'],\n            ['base16', '02'],\n        ]);\n    });\n\n    test('should pass through array of primitives', () => {\n        const transformer = createInputValueTransformer(\n            arrayTypeNode(numberTypeNode('u8'), prefixedCountNode(numberTypeNode('u32'))),\n            rootNodeMock,\n        );\n        expect(transformer([1, 2, 3])).toEqual([1, 2, 3]);\n    });\n\n    test('should throw for non-array input', () => {\n        const transformer = createInputValueTransformer(\n            arrayTypeNode(numberTypeNode('u8'), prefixedCountNode(numberTypeNode('u32'))),\n            rootNodeMock,\n        );\n        expect(() => transformer('not an array')).toThrow(/Expected \\[array\\] for \\[arrayTypeNode\\]/);\n        expect(() => transformer(42)).toThrow(/Expected \\[array\\] for \\[arrayTypeNode\\]/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/booleanTypeNode.test.ts",
    "content": "import { booleanTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('booleanTypeNode', () => {\n    test('should pass through boolean values', () => {\n        const transformer = createInputValueTransformer(booleanTypeNode(), rootNodeMock);\n        expect(transformer(true)).toBe(true);\n        expect(transformer(false)).toBe(false);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/bytesTypeNode.test.ts",
    "content": "import { bytesTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('bytesTypeNode', () => {\n    test('should transform Uint8Array or number[] to tuple for bytesTypeNode', () => {\n        const transformer = createInputValueTransformer(bytesTypeNode(), rootNodeMock, { bytesEncoding: 'base16' });\n\n        // 'Hello' as bytes: [72, 101, 108, 108, 111] -> base16: '48656c6c6f'\n        const inputNumbers = [72, 101, 108, 108, 111];\n        const inputUint8 = new Uint8Array(inputNumbers);\n        const resultWithUint8 = transformer(inputUint8);\n        const resultWithNumbers = transformer(inputNumbers);\n        const expectedResult = ['base16', '48656c6c6f'];\n\n        expect(resultWithUint8).toEqual(expectedResult);\n        expect(resultWithNumbers).toEqual(expectedResult);\n    });\n\n    test('should throw error for non-Uint8Array input', () => {\n        const transformer = createInputValueTransformer(bytesTypeNode(), rootNodeMock, { bytesEncoding: 'base16' });\n        const expectedMessage = /Expected \\[Uint8Array \\| number\\[\\]\\] for \\[bytesTypeNode\\]/;\n        expect(() => transformer(null)).toThrow(expectedMessage);\n        expect(() => transformer(undefined)).toThrow(expectedMessage);\n        expect(() => transformer('not a Uint8Array')).toThrow(expectedMessage);\n        expect(() => transformer(123)).toThrow(expectedMessage);\n        expect(() => transformer({ data: [1, 2, 3] })).toThrow(expectedMessage);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/dateTimeTypeNode.test.ts",
    "content": "import { dateTimeTypeNode, numberTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('dateTimeTypeNode', () => {\n    test('should delegate to inner number type (pass-through)', () => {\n        const transformer = createInputValueTransformer(dateTimeTypeNode(numberTypeNode('i64')), rootNodeMock);\n        expect(transformer(1700000000)).toBe(1700000000);\n        expect(transformer(0)).toBe(0);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/definedTypeLinkNode.test.ts",
    "content": "import { definedTypeLinkNode, definedTypeNode, numberTypeNode, programNode, rootNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\n\ndescribe('definedTypeLinkNode', () => {\n    test('should resolve defined type and delegate', () => {\n        const root = rootNode(\n            programNode({\n                definedTypes: [definedTypeNode({ name: 'myNumber', type: numberTypeNode('u64') })],\n                name: 'test',\n                publicKey: '11111111111111111111111111111111',\n            }),\n        );\n        const transformer = createInputValueTransformer(definedTypeLinkNode('myNumber'), root);\n        expect(transformer(42)).toBe(42);\n    });\n\n    test('should throw for unknown type name', () => {\n        const root = rootNode(\n            programNode({\n                name: 'test',\n                publicKey: '11111111111111111111111111111111',\n            }),\n        );\n        expect(() => createInputValueTransformer(definedTypeLinkNode('nonExistent'), root)).toThrow(\n            /Could not find linked node \\[nonExistent\\] from \\[definedTypeLinkNode\\]/,\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/enumTypeNode.test.ts",
    "content": "import {\n    arrayTypeNode,\n    bytesTypeNode,\n    definedTypeLinkNode,\n    definedTypeNode,\n    enumEmptyVariantTypeNode,\n    enumStructVariantTypeNode,\n    enumTupleVariantTypeNode,\n    enumTypeNode,\n    numberTypeNode,\n    optionTypeNode,\n    prefixedCountNode,\n    programNode,\n    rootNode,\n    structFieldTypeNode,\n    structTypeNode,\n    tupleTypeNode,\n} from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('enumTypeNode', () => {\n    // Based on pmp-idl.json, mpl-token-metadata-idl.json, token-2022-idl.json\n\n    test('should pass through scalar enum (number)', () => {\n        // Based on pmp-idl.json: accountDiscriminator enum\n        const scalarEnum = enumTypeNode([\n            enumEmptyVariantTypeNode('empty'),\n            enumEmptyVariantTypeNode('buffer'),\n            enumEmptyVariantTypeNode('metadata'),\n        ]);\n        const transformer = createInputValueTransformer(scalarEnum, rootNodeMock);\n\n        expect(transformer(0)).toBe(0);\n        expect(transformer(1)).toBe(1);\n        expect(transformer(2)).toBe(2);\n    });\n\n    test('should pass through scalar enum (string)', () => {\n        const scalarEnum = enumTypeNode([enumEmptyVariantTypeNode('initialized'), enumEmptyVariantTypeNode('frozen')]);\n        const transformer = createInputValueTransformer(scalarEnum, rootNodeMock);\n\n        expect(transformer('initialized')).toBe('initialized');\n        expect(transformer('frozen')).toBe('frozen');\n    });\n\n    test('should pass through empty variant enum', () => {\n        const dataEnum = enumTypeNode([\n            enumEmptyVariantTypeNode('none'),\n            enumEmptyVariantTypeNode('utf8'),\n            enumEmptyVariantTypeNode('base58'),\n        ]);\n        const transformer = createInputValueTransformer(dataEnum, rootNodeMock);\n\n        const input = { __kind: 'none' };\n        expect(transformer(input)).toEqual({ __kind: 'None' });\n    });\n\n    test('should transform bytes in struct variant', () => {\n        // Based on mpl-token-metadata-idl.json: complex enum with struct variants\n        const enumWithStructVariant = enumTypeNode([\n            enumEmptyVariantTypeNode('empty'),\n            enumStructVariantTypeNode(\n                'withData',\n                structTypeNode([\n                    structFieldTypeNode({ name: 'id', type: numberTypeNode('u32') }),\n                    structFieldTypeNode({ name: 'data', type: bytesTypeNode() }),\n                ]),\n            ),\n        ]);\n\n        const transformer = createInputValueTransformer(enumWithStructVariant, rootNodeMock, {\n            bytesEncoding: 'base16',\n        });\n\n        const input = {\n            __kind: 'withData',\n            data: new Uint8Array([1, 2, 3]),\n            id: 42,\n        };\n\n        expect(transformer(input)).toEqual({\n            __kind: 'WithData',\n            data: ['base16', '010203'],\n            id: 42,\n        });\n    });\n\n    test('should transform bytes in tuple variant', () => {\n        const enumWithTupleVariant = enumTypeNode([\n            enumEmptyVariantTypeNode('empty'),\n            enumTupleVariantTypeNode('withBytes', tupleTypeNode([bytesTypeNode(), numberTypeNode('u8')])),\n        ]);\n\n        const transformer = createInputValueTransformer(enumWithTupleVariant, rootNodeMock, {\n            bytesEncoding: 'base16',\n        });\n\n        const input = {\n            __kind: 'withBytes',\n            fields: [new Uint8Array([0xde, 0xad]), 255],\n        };\n\n        expect(transformer(input)).toEqual({\n            __kind: 'WithBytes',\n            fields: [['base16', 'dead'], 255],\n        });\n    });\n\n    test('should throw on unknown variant', () => {\n        const enumWithVariants = enumTypeNode([enumEmptyVariantTypeNode('known1'), enumEmptyVariantTypeNode('known2')]);\n\n        const transformer = createInputValueTransformer(enumWithVariants, rootNodeMock);\n\n        const input = { __kind: 'unknownVariant', someData: 123 };\n        expect(() => transformer(input)).toThrow(/Expected \\[one of \\[known1, known2\\]\\] for \\[enumTypeNode\\]/);\n    });\n\n    test('should pass through non-object input for enumTypeNode', () => {\n        const enumNode = enumTypeNode([enumEmptyVariantTypeNode('variant1'), enumEmptyVariantTypeNode('variant2')]);\n\n        const transformer = createInputValueTransformer(enumNode, rootNodeMock);\n\n        expect(transformer(null)).toBe(null);\n        expect(transformer(undefined)).toBe(undefined);\n        expect(transformer('string')).toBe('string');\n    });\n\n    test('should handle enum without __kind discriminator', () => {\n        const enumNode = enumTypeNode([enumEmptyVariantTypeNode('variant1')]);\n        const transformer = createInputValueTransformer(enumNode, rootNodeMock);\n\n        // Object without __kind should pass through\n        const input = { someField: 'value' };\n        expect(transformer(input)).toEqual(input);\n    });\n\n    test('should handle nested enum with multiple bytes fields in struct variant', () => {\n        // Complex real-world scenario\n        const complexEnum = enumTypeNode([\n            enumEmptyVariantTypeNode('none'),\n            enumStructVariantTypeNode(\n                'complex',\n                structTypeNode([\n                    structFieldTypeNode({ name: 'id', type: numberTypeNode('u32') }),\n                    structFieldTypeNode({ name: 'key', type: bytesTypeNode() }),\n                    structFieldTypeNode({ name: 'value', type: bytesTypeNode() }),\n                    structFieldTypeNode({\n                        name: 'nested',\n                        type: optionTypeNode(bytesTypeNode()),\n                    }),\n                ]),\n            ),\n        ]);\n\n        const transformer = createInputValueTransformer(complexEnum, rootNodeMock, { bytesEncoding: 'base16' });\n\n        const input = {\n            __kind: 'complex',\n            id: 100,\n            key: new Uint8Array([1, 2]),\n            nested: new Uint8Array([5, 6]),\n            value: new Uint8Array([3, 4]),\n        };\n\n        expect(transformer(input)).toEqual({\n            __kind: 'Complex',\n            id: 100,\n            key: ['base16', '0102'],\n            nested: ['base16', '0506'],\n            value: ['base16', '0304'],\n        });\n    });\n\n    test('should handle enum with array of bytes in struct variant', () => {\n        const enumWithArray = enumTypeNode([\n            enumStructVariantTypeNode(\n                'withArray',\n                structTypeNode([\n                    structFieldTypeNode({\n                        name: 'items',\n                        type: arrayTypeNode(bytesTypeNode(), prefixedCountNode(numberTypeNode('u32'))),\n                    }),\n                ]),\n            ),\n        ]);\n\n        const transformer = createInputValueTransformer(enumWithArray, rootNodeMock, { bytesEncoding: 'base16' });\n\n        const input = {\n            __kind: 'withArray',\n            items: [new Uint8Array([1, 2]), new Uint8Array([3, 4])],\n        };\n\n        expect(transformer(input)).toEqual({\n            __kind: 'WithArray',\n            items: [\n                ['base16', '0102'],\n                ['base16', '0304'],\n            ],\n        });\n    });\n\n    test('should throw on tuple variant without fields', () => {\n        const enumWithTuple = enumTypeNode([\n            enumTupleVariantTypeNode('tuple', tupleTypeNode([numberTypeNode('u32'), bytesTypeNode()])),\n        ]);\n\n        const transformer = createInputValueTransformer(enumWithTuple, rootNodeMock, { bytesEncoding: 'base16' });\n\n        const input = { __kind: 'tuple', someOtherProp: 123 };\n        expect(() => transformer(input)).toThrow(/Expected \\[array \\(fields\\)\\] for \\[enumTupleVariantTypeNode\\]/);\n    });\n\n    test('should handle deeply nested enum variants', () => {\n        // Enum containing another enum in struct variant\n        const innerEnum = enumTypeNode([\n            enumEmptyVariantTypeNode('inner1'),\n            enumStructVariantTypeNode(\n                'inner2',\n                structTypeNode([structFieldTypeNode({ name: 'data', type: bytesTypeNode() })]),\n            ),\n        ]);\n\n        const root = rootNode(\n            programNode({\n                definedTypes: [\n                    definedTypeNode({\n                        name: 'InnerEnum',\n                        type: innerEnum,\n                    }),\n                ],\n                name: 'test',\n                publicKey: '11111111111111111111111111111111',\n            }),\n        );\n\n        const outerEnum = enumTypeNode([\n            enumStructVariantTypeNode(\n                'outer',\n                structTypeNode([structFieldTypeNode({ name: 'inner', type: definedTypeLinkNode('InnerEnum') })]),\n            ),\n        ]);\n\n        const transformer = createInputValueTransformer(outerEnum, root, { bytesEncoding: 'base16' });\n\n        const input = {\n            __kind: 'outer',\n            inner: {\n                __kind: 'inner2',\n                data: new Uint8Array([0xff, 0xee]),\n            },\n        };\n\n        expect(transformer(input)).toEqual({\n            __kind: 'Outer',\n            inner: {\n                __kind: 'Inner2',\n                data: ['base16', 'ffee'],\n            },\n        });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/fixedSizeTypeNode.test.ts",
    "content": "import { bytesTypeNode, fixedSizeTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('fixedSizeTypeNode', () => {\n    test('should delegate to inner type (bytes transform visible)', () => {\n        const transformer = createInputValueTransformer(fixedSizeTypeNode(bytesTypeNode(), 4), rootNodeMock, {\n            bytesEncoding: 'base16',\n        });\n        const input = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);\n        expect(transformer(input)).toEqual(['base16', 'deadbeef']);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/hiddenPrefixTypeNode.test.ts",
    "content": "import {\n    bytesTypeNode,\n    bytesValueNode,\n    constantValueNode,\n    fixedSizeTypeNode,\n    hiddenPrefixTypeNode,\n    numberTypeNode,\n    stringTypeNode,\n    stringValueNode,\n} from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('hiddenPrefixTypeNode', () => {\n    test('should delegate to inner type [bytesTypeNode]', () => {\n        const transformer = createInputValueTransformer(\n            hiddenPrefixTypeNode(bytesTypeNode(), [constantValueNode(bytesTypeNode(), bytesValueNode('base16', 'ff'))]),\n            rootNodeMock,\n            { bytesEncoding: 'base16' },\n        );\n        const input = new Uint8Array([0x01, 0x02]);\n        expect(transformer(input)).toEqual(['base16', '0102']);\n    });\n\n    test('should delegate to inner type [numberTypeNode]', () => {\n        const transformer = createInputValueTransformer(\n            hiddenPrefixTypeNode(numberTypeNode('u32'), [\n                constantValueNode(bytesTypeNode(), bytesValueNode('base16', 'ffff')),\n            ]),\n            rootNodeMock,\n            { bytesEncoding: 'base16' },\n        );\n        expect(transformer(42)).toEqual(42);\n    });\n\n    test('should delegate to inner type [stringTypeNode]', () => {\n        const transformer = createInputValueTransformer(\n            hiddenPrefixTypeNode(fixedSizeTypeNode(stringTypeNode('utf8'), 10), [\n                constantValueNode(stringTypeNode('utf8'), stringValueNode('Hello')),\n            ]),\n            rootNodeMock,\n        );\n        expect(transformer('World')).toEqual('World');\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/hiddenSuffixTypeNode.test.ts",
    "content": "import { bytesTypeNode, bytesValueNode, constantValueNode, hiddenSuffixTypeNode, numberTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('hiddenSuffixTypeNode', () => {\n    test('should delegate to inner type', () => {\n        const transformer = createInputValueTransformer(\n            hiddenSuffixTypeNode(bytesTypeNode(), [constantValueNode(bytesTypeNode(), bytesValueNode('base16', 'ff'))]),\n            rootNodeMock,\n            { bytesEncoding: 'base16' },\n        );\n        const input = new Uint8Array([0x01, 0x02]);\n        expect(transformer(input)).toEqual(['base16', '0102']);\n    });\n\n    test('should delegate to inner type [numberTypeNode]', () => {\n        const transformer = createInputValueTransformer(\n            hiddenSuffixTypeNode(numberTypeNode('u32'), [\n                constantValueNode(bytesTypeNode(), bytesValueNode('base16', 'ffff')),\n            ]),\n            rootNodeMock,\n            { bytesEncoding: 'base16' },\n        );\n        expect(transformer(42)).toEqual(42);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/input-value-transformer-test-utils.ts",
    "content": "import { programNode, rootNode } from 'codama';\n\n// Shared root node mock for tests\nexport const rootNodeMock = rootNode(\n    programNode({\n        name: 'test',\n        publicKey: '11111111111111111111111111111111',\n    }),\n);\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/mapTypeNode.test.ts",
    "content": "import { bytesTypeNode, mapTypeNode, numberTypeNode, prefixedCountNode, stringTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('mapTypeNode', () => {\n    test('should transform map values with bytes inner type', () => {\n        const transformer = createInputValueTransformer(\n            mapTypeNode(stringTypeNode('utf8'), bytesTypeNode(), prefixedCountNode(numberTypeNode('u32'))),\n            rootNodeMock,\n            { bytesEncoding: 'base16' },\n        );\n        const input = { key1: new Uint8Array([0x01]), key2: new Uint8Array([0x02]) };\n        expect(transformer(input)).toEqual({ key1: ['base16', '01'], key2: ['base16', '02'] });\n    });\n\n    test('should pass through map with primitive values', () => {\n        const transformer = createInputValueTransformer(\n            mapTypeNode(stringTypeNode('utf8'), numberTypeNode('u64'), prefixedCountNode(numberTypeNode('u32'))),\n            rootNodeMock,\n        );\n        expect(transformer({ a: 1, b: 2 })).toEqual({ a: 1, b: 2 });\n    });\n\n    test('should throw for non-object input', () => {\n        const transformer = createInputValueTransformer(\n            mapTypeNode(stringTypeNode('utf8'), numberTypeNode('u8'), prefixedCountNode(numberTypeNode('u32'))),\n            rootNodeMock,\n        );\n        expect(() => transformer('not an object')).toThrow(/Expected \\[object\\] for \\[mapTypeNode\\]/);\n        expect(() => transformer([1, 2])).toThrow(/Expected \\[object\\] for \\[mapTypeNode\\]/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/numberTypeNode.test.ts",
    "content": "import { numberTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('numberTypeNode', () => {\n    test('should pass through number values', () => {\n        const transformer = createInputValueTransformer(numberTypeNode('u64'), rootNodeMock);\n        expect(transformer(0)).toBe(0);\n        expect(transformer(42)).toBe(42);\n        expect(transformer(999)).toBe(999);\n        expect(transformer(Number.MAX_SAFE_INTEGER)).toBe(Number.MAX_SAFE_INTEGER);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/optionTypeNode.test.ts",
    "content": "import { bytesTypeNode, numberTypeNode, optionTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('optionTypeNode', () => {\n    test('should pass through null and undefined', () => {\n        const transformer = createInputValueTransformer(\n            optionTypeNode(numberTypeNode('u8'), { prefix: numberTypeNode('u8') }),\n            rootNodeMock,\n        );\n        expect(transformer(null)).toBe(null);\n        expect(transformer(undefined)).toBe(undefined);\n    });\n\n    test('should transform non-null inner value', () => {\n        const transformer = createInputValueTransformer(\n            optionTypeNode(bytesTypeNode(), { prefix: numberTypeNode('u8') }),\n            rootNodeMock,\n            { bytesEncoding: 'base16' },\n        );\n        expect(transformer(new Uint8Array([0xff]))).toEqual(['base16', 'ff']);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/postOffsetTypeNode.test.ts",
    "content": "import { bytesTypeNode, numberTypeNode, postOffsetTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('postOffsetTypeNode', () => {\n    test('should delegate to inner type [bytesTypeNode]', () => {\n        const transformer = createInputValueTransformer(postOffsetTypeNode(bytesTypeNode(), 0), rootNodeMock, {\n            bytesEncoding: 'base16',\n        });\n        const input = new Uint8Array([0xab, 0xcd]);\n        expect(transformer(input)).toEqual(['base16', 'abcd']);\n    });\n\n    test('should delegate to inner type [numberTypeNode]', () => {\n        const transformer = createInputValueTransformer(postOffsetTypeNode(numberTypeNode('u32'), 0), rootNodeMock);\n        expect(transformer(42)).toEqual(42);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/preOffsetTypeNode.test.ts",
    "content": "import { bytesTypeNode, preOffsetTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('preOffsetTypeNode', () => {\n    test('should delegate to inner type', () => {\n        const transformer = createInputValueTransformer(preOffsetTypeNode(bytesTypeNode(), 0), rootNodeMock, {\n            bytesEncoding: 'base16',\n        });\n        const input = new Uint8Array([0xab, 0xcd]);\n        expect(transformer(input)).toEqual(['base16', 'abcd']);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/publicKeyTypeNode.test.ts",
    "content": "import { publicKeyTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('publicKeyTypeNode', () => {\n    test('should pass through public key string', async () => {\n        const transformer = createInputValueTransformer(publicKeyTypeNode(), rootNodeMock);\n        const pubkey = await SvmTestContext.generateAddress();\n        expect(transformer(pubkey)).toBe(pubkey);\n    });\n\n    test('should pass through any value unchanged', () => {\n        const transformer = createInputValueTransformer(publicKeyTypeNode(), rootNodeMock);\n        expect(transformer(null)).toBe(null);\n        expect(transformer(123)).toBe(123);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/remainderOptionTypeNode.test.ts",
    "content": "import { bytesTypeNode, remainderOptionTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('remainderOptionTypeNode', () => {\n    test('should pass through null and undefined', () => {\n        const transformer = createInputValueTransformer(remainderOptionTypeNode(bytesTypeNode()), rootNodeMock);\n        expect(transformer(null)).toBe(null);\n        expect(transformer(undefined)).toBe(undefined);\n    });\n\n    test('should transform non-null inner value', () => {\n        const transformer = createInputValueTransformer(remainderOptionTypeNode(bytesTypeNode()), rootNodeMock, {\n            bytesEncoding: 'base16',\n        });\n        expect(transformer(new Uint8Array([0xab]))).toEqual(['base16', 'ab']);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/sentinelTypeNode.test.ts",
    "content": "import { bytesTypeNode, bytesValueNode, constantValueNode, sentinelTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('sentinelTypeNode', () => {\n    test('should delegate to inner type', () => {\n        const transformer = createInputValueTransformer(\n            sentinelTypeNode(bytesTypeNode(), constantValueNode(bytesTypeNode(), bytesValueNode('base16', 'ff'))),\n            rootNodeMock,\n            { bytesEncoding: 'base16' },\n        );\n        const input = new Uint8Array([0xab, 0xcd]);\n        expect(transformer(input)).toEqual(['base16', 'abcd']);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/setTypeNode.test.ts",
    "content": "import { bytesTypeNode, numberTypeNode, prefixedCountNode, setTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('setTypeNode', () => {\n    test('should transform set items with bytes inner type', () => {\n        const transformer = createInputValueTransformer(\n            setTypeNode(bytesTypeNode(), prefixedCountNode(numberTypeNode('u32'))),\n            rootNodeMock,\n            { bytesEncoding: 'base16' },\n        );\n        const input = [new Uint8Array([0xaa]), new Uint8Array([0xbb])];\n        expect(transformer(input)).toEqual([\n            ['base16', 'aa'],\n            ['base16', 'bb'],\n        ]);\n    });\n\n    test('should throw for non-array input', () => {\n        const transformer = createInputValueTransformer(\n            setTypeNode(numberTypeNode('u8'), prefixedCountNode(numberTypeNode('u32'))),\n            rootNodeMock,\n        );\n        expect(() => transformer('not an array')).toThrow(/Expected \\[array\\] for \\[setTypeNode\\]/);\n        expect(() => transformer({ a: 1 })).toThrow(/Expected \\[array\\] for \\[setTypeNode\\]/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/sizePrefixTypeNode.test.ts",
    "content": "import { bytesTypeNode, numberTypeNode, sizePrefixTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('sizePrefixTypeNode', () => {\n    test('should delegate to inner type', () => {\n        const transformer = createInputValueTransformer(\n            sizePrefixTypeNode(bytesTypeNode(), numberTypeNode('u32')),\n            rootNodeMock,\n            { bytesEncoding: 'base16' },\n        );\n        const input = new Uint8Array([0x01, 0x02]);\n        expect(transformer(input)).toEqual(['base16', '0102']);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/solAmountTypeNode.test.ts",
    "content": "import { numberTypeNode, solAmountTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('solAmountTypeNode', () => {\n    test('should delegate to inner number type (pass-through)', () => {\n        const transformer = createInputValueTransformer(solAmountTypeNode(numberTypeNode('u64')), rootNodeMock);\n        expect(transformer(1000000000)).toBe(1000000000);\n        expect(transformer(0)).toBe(0);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/stringTypeNode.test.ts",
    "content": "import { stringTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('stringTypeNode', () => {\n    test('should pass through string values', () => {\n        const transformer = createInputValueTransformer(stringTypeNode('utf8'), rootNodeMock);\n        expect(transformer('hello')).toBe('hello');\n        expect(transformer('')).toBe('');\n        expect(transformer('🎉 unicode')).toBe('🎉 unicode');\n    });\n\n    test('should pass through non-string values unchanged', () => {\n        const transformer = createInputValueTransformer(stringTypeNode('utf8'), rootNodeMock);\n        expect(transformer(42)).toBe(42);\n        expect(transformer(null)).toBe(null);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/structTypeNode.test.ts",
    "content": "import {\n    arrayTypeNode,\n    bytesTypeNode,\n    fixedCountNode,\n    numberTypeNode,\n    optionTypeNode,\n    stringTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n} from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('structTypeNode', () => {\n    test('should transform struct with bytes field', () => {\n        const transformer = createInputValueTransformer(\n            structTypeNode([\n                structFieldTypeNode({ name: 'name', type: stringTypeNode('utf8') }),\n                structFieldTypeNode({ name: 'data', type: bytesTypeNode() }),\n            ]),\n            rootNodeMock,\n            { bytesEncoding: 'base16' },\n        );\n\n        const input = {\n            data: new Uint8Array([1, 2, 3]),\n            name: 'test',\n        };\n\n        expect(transformer(input)).toEqual({\n            data: ['base16', '010203'],\n            name: 'test',\n        });\n    });\n\n    test('should transform complex nested structure with bytes in array', () => {\n        const transformer = createInputValueTransformer(\n            structTypeNode([\n                structFieldTypeNode({ name: 'id', type: numberTypeNode('u32') }),\n                structFieldTypeNode({\n                    name: 'items',\n                    type: arrayTypeNode(\n                        structTypeNode([\n                            structFieldTypeNode({ name: 'name', type: stringTypeNode('utf8') }),\n                            structFieldTypeNode({ name: 'data', type: bytesTypeNode() }),\n                        ]),\n                        fixedCountNode(2),\n                    ),\n                }),\n            ]),\n            rootNodeMock,\n            { bytesEncoding: 'base16' },\n        );\n\n        const input = {\n            id: 123,\n            items: [\n                { data: new Uint8Array([1, 2, 3]), name: 'item1' },\n                { data: new Uint8Array([4, 5]), name: 'item2' },\n            ],\n        };\n\n        expect(transformer(input)).toEqual({\n            id: 123,\n            items: [\n                { data: ['base16', '010203'], name: 'item1' },\n                { data: ['base16', '0405'], name: 'item2' },\n            ],\n        });\n    });\n\n    test('should throw error for non-object input', () => {\n        const transformer = createInputValueTransformer(\n            structTypeNode([structFieldTypeNode({ name: 'data', type: bytesTypeNode() })]),\n            rootNodeMock,\n            { bytesEncoding: 'base16' },\n        );\n\n        expect(() => transformer(null)).toThrow(/Expected \\[object\\] for \\[structTypeNode\\]/);\n        expect(() => transformer(undefined)).toThrow(/Expected \\[object\\] for \\[structTypeNode\\]/);\n        expect(() => transformer('not an object')).toThrow(/Expected \\[object\\] for \\[structTypeNode\\]/);\n        expect(() => transformer(123)).toThrow(/Expected \\[object\\] for \\[structTypeNode\\]/);\n        expect(() => transformer([1, 2, 3])).toThrow(/Expected \\[object\\] for \\[structTypeNode\\]/);\n    });\n\n    test('should throw error for Date, Map, and Set inputs', () => {\n        const transformer = createInputValueTransformer(\n            structTypeNode([structFieldTypeNode({ name: 'data', type: bytesTypeNode() })]),\n            rootNodeMock,\n            { bytesEncoding: 'base16' },\n        );\n\n        expect(() => transformer(new Date())).toThrow(/Expected \\[object\\] for \\[structTypeNode\\]/);\n        expect(() => transformer(new Map())).toThrow(/Expected \\[object\\] for \\[structTypeNode\\]/);\n        expect(() => transformer(new Set())).toThrow(/Expected \\[object\\] for \\[structTypeNode\\]/);\n    });\n\n    test('should transform multiple bytes fields in struct', () => {\n        const transformer = createInputValueTransformer(\n            structTypeNode([\n                structFieldTypeNode({ name: 'key', type: bytesTypeNode() }),\n                structFieldTypeNode({ name: 'value', type: bytesTypeNode() }),\n                structFieldTypeNode({ name: 'id', type: numberTypeNode('u32') }),\n            ]),\n            rootNodeMock,\n            { bytesEncoding: 'base16' },\n        );\n\n        const input = {\n            id: 999,\n            key: new Uint8Array([1, 2]),\n            value: new Uint8Array([3, 4, 5]),\n        };\n\n        expect(transformer(input)).toEqual({\n            id: 999,\n            key: ['base16', '0102'],\n            value: ['base16', '030405'],\n        });\n    });\n\n    test('should handle struct with missing optional fields', () => {\n        const structNode = structTypeNode([\n            structFieldTypeNode({ name: 'required', type: numberTypeNode('u32') }),\n            structFieldTypeNode({ name: 'optional', type: optionTypeNode(bytesTypeNode()) }),\n        ]);\n        const transformer = createInputValueTransformer(structNode, rootNodeMock, { bytesEncoding: 'base16' });\n\n        const input = { required: 100 };\n        expect(transformer(input)).toEqual({ required: 100 });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/tupleTypeNode.test.ts",
    "content": "import { bytesTypeNode, numberTypeNode, tupleTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('tupleTypeNode', () => {\n    test('should transform each item by position', () => {\n        const transformer = createInputValueTransformer(\n            tupleTypeNode([numberTypeNode('u8'), bytesTypeNode()]),\n            rootNodeMock,\n            { bytesEncoding: 'base16' },\n        );\n        const input = [42, new Uint8Array([0xff])];\n        expect(transformer(input)).toEqual([42, ['base16', 'ff']]);\n    });\n\n    test('should throw for non-array input', () => {\n        const transformer = createInputValueTransformer(tupleTypeNode([numberTypeNode('u8')]), rootNodeMock);\n        expect(() => transformer('not an array')).toThrow(/Expected \\[array\\] for \\[tupleTypeNode\\]/);\n    });\n\n    test('should throw for wrong length', () => {\n        const transformer = createInputValueTransformer(\n            tupleTypeNode([numberTypeNode('u8'), numberTypeNode('u16')]),\n            rootNodeMock,\n        );\n        expect(() => transformer([1])).toThrow(/Expected \\[array\\(length:2\\)\\] for \\[tupleTypeNode\\]/);\n        expect(() => transformer([1, 2, 3])).toThrow(/Expected \\[array\\(length:2\\)\\] for \\[tupleTypeNode\\]/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/input-value-transformer/zeroableOptionTypeNode.test.ts",
    "content": "import { bytesTypeNode, zeroableOptionTypeNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { createInputValueTransformer } from '../../../../src/instruction-encoding/visitors/input-value-transformer';\nimport { rootNodeMock } from './input-value-transformer-test-utils';\n\ndescribe('zeroableOptionTypeNode', () => {\n    test('should pass through null and undefined', () => {\n        const transformer = createInputValueTransformer(zeroableOptionTypeNode(bytesTypeNode()), rootNodeMock);\n        expect(transformer(null)).toBe(null);\n        expect(transformer(undefined)).toBe(undefined);\n    });\n\n    test('should transform non-null inner value', () => {\n        const transformer = createInputValueTransformer(zeroableOptionTypeNode(bytesTypeNode()), rootNodeMock, {\n            bytesEncoding: 'base16',\n        });\n        expect(transformer(new Uint8Array([0xcd]))).toEqual(['base16', 'cd']);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/pda-seed-value/accountValueNode.test.ts",
    "content": "import { address, getAddressEncoder } from '@solana/addresses';\nimport { accountValueNode, instructionAccountNode, instructionNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { makeVisitor } from './pda-seed-value-test-utils';\n\ndescribe('pda-seed-value: visitAccountValue', () => {\n    const ixNodeWithAccount = instructionNode({\n        accounts: [\n            instructionAccountNode({\n                isSigner: false,\n                isWritable: false,\n                name: 'authority',\n            }),\n        ],\n        name: 'testInstruction',\n    });\n\n    test('should encode provided account address', async () => {\n        const randomAddress = await new SvmTestContext().createAccount();\n        const visitor = makeVisitor({\n            accountsInput: { authority: randomAddress },\n            ixNode: ixNodeWithAccount,\n        });\n        const result = await visitor.visitAccountValue(accountValueNode('authority'));\n        expect(result).toEqual(getAddressEncoder().encode(address(randomAddress)));\n    });\n\n    test('should fall through to resolution when provided address is null', async () => {\n        const visitor = makeVisitor({\n            accountsInput: { authority: null },\n            ixNode: ixNodeWithAccount,\n        });\n        // null is not treated as a provided address — it falls through to resolveAccountAddress,\n        // which throws because the account has no default value\n        await expect(visitor.visitAccountValue(accountValueNode('authority'))).rejects.toThrow(\n            /Missing account \\[authority\\]/,\n        );\n    });\n\n    test('should throw when resolved address is null', async () => {\n        const ixNodeWithOptionalAccount = instructionNode({\n            accounts: [\n                instructionAccountNode({\n                    isOptional: true,\n                    isSigner: false,\n                    isWritable: false,\n                    name: 'authority',\n                }),\n            ],\n            name: 'testInstruction',\n            optionalAccountStrategy: 'omitted',\n        });\n        const visitor = makeVisitor({\n            accountsInput: { authority: null },\n            ixNode: ixNodeWithOptionalAccount,\n        });\n        await expect(visitor.visitAccountValue(accountValueNode('authority'))).rejects.toThrow(\n            /Failed to derive PDA for account \\[authority\\]/,\n        );\n    });\n\n    test('should throw for unknown account reference', async () => {\n        const visitor = makeVisitor({ ixNode: ixNodeWithAccount });\n        await expect(visitor.visitAccountValue(accountValueNode('nonexistent'))).rejects.toThrow(\n            /Referenced node \\[nonexistent\\] not found in \\[testInstruction\\]/,\n        );\n    });\n\n    test('should throw on circular dependency', async () => {\n        const visitor = makeVisitor({\n            ixNode: ixNodeWithAccount,\n            resolutionPath: ['authority'],\n        });\n        await expect(visitor.visitAccountValue(accountValueNode('authority'))).rejects.toThrow(\n            /Circular dependency detected: \\[/,\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/pda-seed-value/argumentValueNode.test.ts",
    "content": "import { getUtf8Codec } from '@solana/codecs';\nimport {\n    argumentValueNode,\n    instructionArgumentNode,\n    instructionNode,\n    numberTypeNode,\n    publicKeyTypeNode,\n    remainderOptionTypeNode,\n    sizePrefixTypeNode,\n    stringTypeNode,\n} from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { makeVisitor } from './pda-seed-value-test-utils';\n\ndescribe('pda-seed-value: visitArgumentValue', () => {\n    const ixNodeWithArg = instructionNode({\n        arguments: [instructionArgumentNode({ name: 'title', type: stringTypeNode('utf8') })],\n        name: 'testInstruction',\n    });\n\n    test('should encode argument value using its codec', async () => {\n        const visitor = makeVisitor({\n            argumentsInput: { title: 'hello' },\n            ixNode: ixNodeWithArg,\n        });\n        const result = await visitor.visitArgumentValue(argumentValueNode('title'));\n        expect(result).toEqual(getUtf8Codec().encode('hello'));\n    });\n\n    test('should use seedTypeNode override instead of argument type', async () => {\n        // Argument type is sizePrefixTypeNode (u32 length prefix + utf8 string),\n        // but seedTypeNode overrides it to plain stringTypeNode (raw utf8 bytes only).\n        // This mirrors how on-chain PDA derivation uses raw string bytes as seeds,\n        // even when the instruction argument is serialized with a length prefix.\n        const sizePrefixedArgType = sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u32'));\n        const ixNodeWithSizePrefixedArg = instructionNode({\n            arguments: [instructionArgumentNode({ name: 'name', type: sizePrefixedArgType })],\n            name: 'testInstruction',\n        });\n\n        const visitor = makeVisitor({\n            argumentsInput: { name: 'hello' },\n            ixNode: ixNodeWithSizePrefixedArg,\n            seedTypeNode: stringTypeNode('utf8'),\n        });\n        const result = await visitor.visitArgumentValue(argumentValueNode('name'));\n\n        // Should produce raw utf8 bytes (5 bytes), NOT size-prefixed bytes (4 + 5 = 9 bytes)\n        const rawUtf8Bytes = getUtf8Codec().encode('hello');\n        expect(result).toEqual(rawUtf8Bytes);\n        expect(result.length).toBe(5);\n    });\n\n    test('should throw for unknown argument name', async () => {\n        const visitor = makeVisitor({ ixNode: ixNodeWithArg });\n        await expect(visitor.visitArgumentValue(argumentValueNode('unknown'))).rejects.toThrow(\n            /Referenced node \\[unknown\\] not found in \\[testInstruction\\]/,\n        );\n    });\n\n    test('should throw when required argument value is undefined', async () => {\n        const visitor = makeVisitor({\n            argumentsInput: {},\n            ixNode: ixNodeWithArg,\n        });\n        await expect(visitor.visitArgumentValue(argumentValueNode('title'))).rejects.toThrow(\n            /Missing argument \\[title\\]/,\n        );\n    });\n\n    test('should throw when required argument value is null', async () => {\n        const visitor = makeVisitor({\n            argumentsInput: { title: null },\n            ixNode: ixNodeWithArg,\n        });\n        await expect(visitor.visitArgumentValue(argumentValueNode('title'))).rejects.toThrow(\n            /Missing argument \\[title\\]/,\n        );\n    });\n\n    describe('remainderOptionTypeNode seeds', () => {\n        // Mirrors the pmp IDL's metadata PDA:\n        // the \"authority\" seed is remainderOptionTypeNode(publicKeyTypeNode) — null is canonical.\n        const ixNodeWithOptionalSeed = instructionNode({\n            arguments: [\n                instructionArgumentNode({\n                    name: 'authority',\n                    type: remainderOptionTypeNode(publicKeyTypeNode()),\n                }),\n            ],\n            name: 'testInstruction',\n        });\n\n        test('should return empty bytes when argument is undefined', async () => {\n            const visitor = makeVisitor({\n                argumentsInput: {},\n                ixNode: ixNodeWithOptionalSeed,\n            });\n            const result = await visitor.visitArgumentValue(argumentValueNode('authority'));\n            expect(result).toEqual(new Uint8Array(0));\n        });\n\n        test('should return empty bytes when argument is null', async () => {\n            const visitor = makeVisitor({\n                argumentsInput: { authority: null },\n                ixNode: ixNodeWithOptionalSeed,\n            });\n            const result = await visitor.visitArgumentValue(argumentValueNode('authority'));\n            expect(result).toEqual(new Uint8Array(0));\n        });\n\n        test('should encode value when argument is provided', async () => {\n            const authority = await SvmTestContext.generateAddress();\n            const visitor = makeVisitor({\n                argumentsInput: { authority },\n                ixNode: ixNodeWithOptionalSeed,\n            });\n            const result = await visitor.visitArgumentValue(argumentValueNode('authority'));\n            expect(result.length).toBe(32);\n        });\n\n        test('should return empty bytes when seedTypeNode override is remainderOptionTypeNode and argument is null', async () => {\n            const ixNodeWithRequiredArg = instructionNode({\n                arguments: [instructionArgumentNode({ name: 'authority', type: publicKeyTypeNode() })],\n                name: 'testInstruction',\n            });\n            const visitor = makeVisitor({\n                argumentsInput: { authority: null },\n                ixNode: ixNodeWithRequiredArg,\n                seedTypeNode: remainderOptionTypeNode(publicKeyTypeNode()),\n            });\n            const result = await visitor.visitArgumentValue(argumentValueNode('authority'));\n            expect(result).toEqual(new Uint8Array(0));\n        });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/pda-seed-value/booleanValueNode.test.ts",
    "content": "import { getBooleanCodec } from '@solana/codecs';\nimport { booleanValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor } from './pda-seed-value-test-utils';\n\ndescribe('pda-seed-value: visitBooleanValue', () => {\n    test('should encode true', async () => {\n        const result = await makeVisitor().visitBooleanValue(booleanValueNode(true));\n        expect(result).toEqual(getBooleanCodec().encode(true));\n    });\n\n    test('should encode false', async () => {\n        const result = await makeVisitor().visitBooleanValue(booleanValueNode(false));\n        expect(result).toEqual(getBooleanCodec().encode(false));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/pda-seed-value/bytesValueNode.test.ts",
    "content": "import { getBase16Codec, getBase58Codec, getUtf8Codec } from '@solana/codecs';\nimport { bytesValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { makeVisitor } from './pda-seed-value-test-utils';\n\ndescribe('pda-seed-value: visitBytesValue', () => {\n    test('should encode base16 data', async () => {\n        // const hex = Buffer.from('Hello', 'utf8').toString('hex');\n        const hex = '48656c6c6f';\n        const result = await makeVisitor().visitBytesValue(bytesValueNode('base16', hex));\n        expect(result).toEqual(getBase16Codec().encode(hex));\n    });\n\n    test('should encode base58 data', async () => {\n        const b58 = await new SvmTestContext().createAccount();\n        const result = await makeVisitor().visitBytesValue(bytesValueNode('base58', b58));\n        expect(result).toEqual(getBase58Codec().encode(b58));\n    });\n\n    test('should encode utf8 data', async () => {\n        const text = 'Hello';\n        const result = await makeVisitor().visitBytesValue(bytesValueNode('utf8', text));\n        expect(result).toEqual(getUtf8Codec().encode(text));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/pda-seed-value/constantValueNode.test.ts",
    "content": "import { getUtf8Codec } from '@solana/codecs';\nimport { constantValueNode, mapValueNode, numberTypeNode, stringTypeNode, stringValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { PDA_SEED_VALUE_SUPPORTED_NODE_KINDS } from '../../../../src/instruction-encoding/visitors/pda-seed-value';\nimport { makeVisitor } from './pda-seed-value-test-utils';\n\ndescribe('pda-seed-value: visitConstantValue', () => {\n    test('should delegate to inner stringValueNode', async () => {\n        const node = constantValueNode(stringTypeNode('utf8'), stringValueNode('Hello world'));\n        const result = await makeVisitor().visitConstantValue(node);\n        expect(result).toEqual(getUtf8Codec().encode('Hello world'));\n    });\n\n    test('should delegate to nested inner constantValueNode', async () => {\n        const node = constantValueNode(\n            stringTypeNode('utf8'),\n            constantValueNode(stringTypeNode('utf8'), stringValueNode('Nested hello world')),\n        );\n        const result = await makeVisitor().visitConstantValue(node);\n        expect(result).toEqual(getUtf8Codec().encode('Nested hello world'));\n    });\n\n    test('should throw for unsupported inner node kind', async () => {\n        const node = constantValueNode(numberTypeNode('u8'), mapValueNode([]));\n        await expect(makeVisitor().visitConstantValue(node)).rejects.toThrow(\n            `Expected node of kind [${PDA_SEED_VALUE_SUPPORTED_NODE_KINDS.join(',')}], got [mapValueNode]`,\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/pda-seed-value/noneValueNode.test.ts",
    "content": "import { noneValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor } from './pda-seed-value-test-utils';\n\ndescribe('pda-seed-value: visitNoneValue', () => {\n    test('should return empty Uint8Array', async () => {\n        const result = await makeVisitor().visitNoneValue(noneValueNode());\n        expect(result).toEqual(new Uint8Array(0));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/pda-seed-value/numberValueNode.test.ts",
    "content": "import { CodamaError } from '@codama/errors';\nimport { numberValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor } from './pda-seed-value-test-utils';\n\ndescribe('pda-seed-value: visitNumberValue', () => {\n    test('should encode 0 as single byte', async () => {\n        const result = await makeVisitor().visitNumberValue(numberValueNode(0));\n        expect(result).toEqual(new Uint8Array([0]));\n    });\n\n    test('should encode 255 as single byte', async () => {\n        const result = await makeVisitor().visitNumberValue(numberValueNode(255));\n        expect(result).toEqual(new Uint8Array([255]));\n    });\n\n    test('should throw for value > 255', async () => {\n        await expect(makeVisitor().visitNumberValue(numberValueNode(256))).rejects.toThrow(/out of range/);\n    });\n\n    test('should throw for negative value', async () => {\n        await expect(makeVisitor().visitNumberValue(numberValueNode(-1))).rejects.toThrow(CodamaError);\n    });\n\n    test('should throw for non-integer value', async () => {\n        await expect(makeVisitor().visitNumberValue(numberValueNode(1.5))).rejects.toThrow(/out of range/);\n    });\n\n    test('should throw for large value', async () => {\n        await expect(makeVisitor().visitNumberValue(numberValueNode(70000))).rejects.toThrow(/out of range/);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/pda-seed-value/pda-seed-value-test-utils.ts",
    "content": "import { address } from '@solana/addresses';\nimport { instructionNode, programNode, rootNode } from 'codama';\n\nimport { createPdaSeedValueVisitor } from '../../../../src/instruction-encoding/visitors/pda-seed-value';\n\nconst PROGRAM_PUBLIC_KEY = '11111111111111111111111111111111';\n\nexport const rootNodeMock = rootNode(programNode({ name: 'test', publicKey: PROGRAM_PUBLIC_KEY }));\n\nexport const ixNodeStub = instructionNode({ name: 'testInstruction' });\n\nexport function makeVisitor(overrides?: Partial<Parameters<typeof createPdaSeedValueVisitor>[0]>) {\n    return createPdaSeedValueVisitor({\n        accountsInput: undefined,\n        argumentsInput: undefined,\n        ixNode: ixNodeStub,\n        programId: address(PROGRAM_PUBLIC_KEY),\n        resolutionPath: [],\n        resolversInput: undefined,\n        root: rootNodeMock,\n        ...overrides,\n    });\n}\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/pda-seed-value/programIdValueNode.test.ts",
    "content": "import { getAddressEncoder } from '@solana/addresses';\nimport { programIdValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { makeVisitor } from './pda-seed-value-test-utils';\n\ndescribe('pda-seed-value: visitProgramIdValue', () => {\n    test('should encode the context programId as 32-byte address', async () => {\n        const svm = new SvmTestContext();\n        const randomAddress = await svm.createAccount();\n        const result = await makeVisitor({\n            programId: randomAddress,\n        }).visitProgramIdValue(programIdValueNode());\n        expect(result).toEqual(getAddressEncoder().encode(randomAddress));\n    });\n\n    test('should throw an error for non-string programId', async () => {\n        const invalidValues = [42, [1, 2, 3], null];\n        for (const value of invalidValues) {\n            // @ts-expect-error testing invalid programId value\n            const visitor = makeVisitor({ programId: value });\n            await expect(visitor.visitProgramIdValue(programIdValueNode())).rejects.toThrow(\n                `Cannot convert value to Address: [${JSON.stringify(value)}].`,\n            );\n        }\n    });\n\n    test('should throw an error for invalid string programId', async () => {\n        const invalidValues = ['not-a-key', '123', '', '      '];\n        for (const value of invalidValues) {\n            // @ts-expect-error testing invalid programId value\n            const visitor = makeVisitor({ programId: value });\n            await expect(visitor.visitProgramIdValue(programIdValueNode())).rejects.toThrow(\n                `Cannot convert value to Address: [${JSON.stringify(value)}].`,\n            );\n        }\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/pda-seed-value/publicKeyValueNode.test.ts",
    "content": "import { address, getAddressEncoder } from '@solana/addresses';\nimport { publicKeyValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { makeVisitor } from './pda-seed-value-test-utils';\n\ndescribe('pda-seed-value: visitPublicKeyValue', () => {\n    test('should encode the provided public key as 32-byte address', async () => {\n        const svm = new SvmTestContext();\n        const randomAddress = await svm.createAccount();\n        const result = await makeVisitor().visitPublicKeyValue(publicKeyValueNode(randomAddress));\n        expect(result).toEqual(getAddressEncoder().encode(address(randomAddress)));\n    });\n\n    test('should throw for invalid public key', async () => {\n        const invalidPublicKeys = [123, 'not-a-key', [1, 2, 3], null];\n        const visitor = makeVisitor();\n\n        for (const invalidPublicKey of invalidPublicKeys) {\n            // @ts-expect-error testing invalid inputs\n            await expect(visitor.visitPublicKeyValue(publicKeyValueNode(invalidPublicKey))).rejects.toThrow(\n                `Cannot convert value to Address: [${JSON.stringify(invalidPublicKey)}].`,\n            );\n        }\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/pda-seed-value/someValueNode.test.ts",
    "content": "import {\n    constantValueNode,\n    mapValueNode,\n    numberValueNode,\n    publicKeyTypeNode,\n    publicKeyValueNode,\n    someValueNode,\n} from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { PDA_SEED_VALUE_SUPPORTED_NODE_KINDS } from '../../../../src/instruction-encoding/visitors/pda-seed-value';\nimport { makeVisitor } from './pda-seed-value-test-utils';\n\ndescribe('pda-seed-value: visitSomeValue', () => {\n    test('should delegate to inner numberValueNode', async () => {\n        const node = someValueNode(numberValueNode(42));\n        const result = await makeVisitor().visitSomeValue(node);\n        expect(result).toEqual(new Uint8Array([42]));\n    });\n\n    test('should throw for unsupported inner node kind', async () => {\n        const node = someValueNode(mapValueNode([]));\n        await expect(makeVisitor().visitSomeValue(node)).rejects.toThrow(\n            `Expected node of kind [${PDA_SEED_VALUE_SUPPORTED_NODE_KINDS.join(',')}], got [mapValueNode]`,\n        );\n    });\n\n    test('should throw for unsupported nested inner node kind', async () => {\n        const node = someValueNode(constantValueNode(publicKeyTypeNode(), publicKeyValueNode('invalid-key')));\n        await expect(makeVisitor().visitSomeValue(node)).rejects.toThrow(\n            'Cannot convert value to Address: [\"invalid-key\"].',\n        );\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/pda-seed-value/stringValueNode.test.ts",
    "content": "import { getUtf8Codec } from '@solana/codecs';\nimport { stringValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor } from './pda-seed-value-test-utils';\n\ndescribe('pda-seed-value: visitStringValue', () => {\n    test('should encode non-empty string as UTF-8 bytes', async () => {\n        const result = await makeVisitor().visitStringValue(stringValueNode('hello'));\n        expect(result).toEqual(getUtf8Codec().encode('hello'));\n    });\n\n    test('should encode empty string as empty bytes', async () => {\n        const result = await makeVisitor().visitStringValue(stringValueNode(''));\n        expect(result).toEqual(getUtf8Codec().encode(''));\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/value-node-value/arrayValueNode.test.ts",
    "content": "import { accountValueNode, arrayValueNode, numberValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { VALUE_NODE_SUPPORTED_NODE_KINDS } from '../../../../src/instruction-encoding/visitors/value-node-value';\nimport { makeVisitor } from './value-node-value-test-utils';\n\ndescribe('value-node-value: visitArrayValue', () => {\n    test('should resolve empty array', () => {\n        const result = makeVisitor().visitArrayValue(arrayValueNode([]));\n        expect(result).toEqual({ kind: 'arrayValueNode', value: [] });\n    });\n\n    test('should resolve array items recursively', () => {\n        const result = makeVisitor().visitArrayValue(arrayValueNode([numberValueNode(1), numberValueNode(2)]));\n        expect(result).toEqual({\n            kind: 'arrayValueNode',\n            value: [\n                { kind: 'numberValueNode', value: 1 },\n                { kind: 'numberValueNode', value: 2 },\n            ],\n        });\n    });\n\n    test('should throw for unsupported inner node', () => {\n        expect(() =>\n            makeVisitor().visitArrayValue(\n                // @ts-expect-error - accountValueNode is invalid\n                arrayValueNode([accountValueNode('test')]),\n            ),\n        ).toThrow(`Expected node of kind [${VALUE_NODE_SUPPORTED_NODE_KINDS.join(',')}], got [accountValueNode]`);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/value-node-value/booleanValueNode.test.ts",
    "content": "import { booleanValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor } from './value-node-value-test-utils';\n\ndescribe('value-node-value: visitBooleanValue', () => {\n    test('should resolve true', () => {\n        const result = makeVisitor().visitBooleanValue(booleanValueNode(true));\n        expect(result).toEqual({ kind: 'booleanValueNode', value: true });\n    });\n\n    test('should resolve false', () => {\n        const result = makeVisitor().visitBooleanValue(booleanValueNode(false));\n        expect(result).toEqual({ kind: 'booleanValueNode', value: false });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/value-node-value/bytesValueNode.test.ts",
    "content": "import { bytesValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor } from './value-node-value-test-utils';\n\ndescribe('value-node-value: visitBytesValue', () => {\n    test('should resolve with base16 encoding', () => {\n        const result = makeVisitor().visitBytesValue(bytesValueNode('base16', 'deadbeef'));\n        expect(result).toEqual({ encoding: 'base16', kind: 'bytesValueNode', value: 'deadbeef' });\n    });\n\n    test('should resolve with base64 encoding', () => {\n        const result = makeVisitor().visitBytesValue(bytesValueNode('base64', 'AQID'));\n        expect(result).toEqual({ encoding: 'base64', kind: 'bytesValueNode', value: 'AQID' });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/value-node-value/constantValueNode.test.ts",
    "content": "import { accountValueNode, constantValueNode, numberTypeNode, numberValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { VALUE_NODE_SUPPORTED_NODE_KINDS } from '../../../../src/instruction-encoding/visitors/value-node-value';\nimport { makeVisitor } from './value-node-value-test-utils';\n\ndescribe('value-node-value: visitConstantValue', () => {\n    test('should delegate to inner value node', () => {\n        const result = makeVisitor().visitConstantValue(constantValueNode(numberTypeNode('u8'), numberValueNode(255)));\n        expect(result).toEqual({ kind: 'numberValueNode', value: 255 });\n    });\n\n    test('should throw for unsupported inner node', () => {\n        expect(() =>\n            makeVisitor().visitConstantValue(\n                // @ts-expect-error - accountValueNode is invalid inside constantValueNode\n                constantValueNode(numberTypeNode('u8'), accountValueNode('test')),\n            ),\n        ).toThrow(`Expected node of kind [${VALUE_NODE_SUPPORTED_NODE_KINDS.join(',')}], got [accountValueNode]`);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/value-node-value/enumValueNode.test.ts",
    "content": "import { enumValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor } from './value-node-value-test-utils';\n\ndescribe('value-node-value: visitEnumValue', () => {\n    test('should resolve enum variant', () => {\n        const result = makeVisitor().visitEnumValue(enumValueNode('TokenStandard', 'nonFungible'));\n        expect(result).toEqual({ kind: 'enumValueNode', value: 'nonFungible' });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/value-node-value/mapValueNode.test.ts",
    "content": "import { accountValueNode, mapEntryValueNode, mapValueNode, numberValueNode, stringValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { VALUE_NODE_SUPPORTED_NODE_KINDS } from '../../../../src/instruction-encoding/visitors/value-node-value';\nimport { makeVisitor } from './value-node-value-test-utils';\n\ndescribe('value-node-value: visitMapValue', () => {\n    test('should resolve empty map', () => {\n        const result = makeVisitor().visitMapValue(mapValueNode([]));\n        expect(result).toEqual({ kind: 'mapValueNode', value: [] });\n    });\n\n    test('should resolve key/value pairs recursively', () => {\n        const result = makeVisitor().visitMapValue(\n            mapValueNode([mapEntryValueNode(stringValueNode('key1'), numberValueNode(100))]),\n        );\n        expect(result).toEqual({\n            kind: 'mapValueNode',\n            value: [\n                {\n                    key: { kind: 'stringValueNode', value: 'key1' },\n                    value: { kind: 'numberValueNode', value: 100 },\n                },\n            ],\n        });\n    });\n\n    test('should throw for unsupported map key', () => {\n        expect(() =>\n            makeVisitor().visitMapValue(\n                mapValueNode([\n                    mapEntryValueNode(\n                        // @ts-expect-error - accountValueNode is invalid StandaloneValueNode\n                        accountValueNode('test'),\n                        numberValueNode(1),\n                    ),\n                ]),\n            ),\n        ).toThrow(`Expected node of kind [${VALUE_NODE_SUPPORTED_NODE_KINDS.join(',')}], got [accountValueNode]`);\n    });\n\n    test('should throw for unsupported map value', () => {\n        expect(() =>\n            makeVisitor().visitMapValue(\n                mapValueNode([\n                    mapEntryValueNode(\n                        stringValueNode('ok'),\n                        // @ts-expect-error - accountValueNode is invalid StandaloneValueNode\n                        accountValueNode('test'),\n                    ),\n                ]),\n            ),\n        ).toThrow(`Expected node of kind [${VALUE_NODE_SUPPORTED_NODE_KINDS.join(',')}], got [accountValueNode]`);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/value-node-value/noneValueNode.test.ts",
    "content": "import { noneValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor } from './value-node-value-test-utils';\n\ndescribe('value-node-value: visitNoneValue', () => {\n    test('should resolve none to null', () => {\n        const result = makeVisitor().visitNoneValue(noneValueNode());\n        expect(result).toEqual({ kind: 'noneValueNode', value: null });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/value-node-value/numberValueNode.test.ts",
    "content": "import { numberValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor } from './value-node-value-test-utils';\n\ndescribe('value-node-value: visitNumberValue', () => {\n    test('should resolve positive number', () => {\n        const result = makeVisitor().visitNumberValue(numberValueNode(42));\n        expect(result).toEqual({ kind: 'numberValueNode', value: 42 });\n    });\n\n    test('should resolve zero', () => {\n        const result = makeVisitor().visitNumberValue(numberValueNode(0));\n        expect(result).toEqual({ kind: 'numberValueNode', value: 0 });\n    });\n\n    test('should resolve negative number', () => {\n        const result = makeVisitor().visitNumberValue(numberValueNode(-7));\n        expect(result).toEqual({ kind: 'numberValueNode', value: -7 });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/value-node-value/publicKeyValueNode.test.ts",
    "content": "import { address } from '@solana/addresses';\nimport { publicKeyValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { SvmTestContext } from '../../../svm-test-context';\nimport { makeVisitor } from './value-node-value-test-utils';\n\ndescribe('value-node-value: visitPublicKeyValue', () => {\n    test('should resolve to Address', async () => {\n        const key = await SvmTestContext.generateAddress();\n        const result = makeVisitor().visitPublicKeyValue(publicKeyValueNode(key));\n        expect(result).toEqual({ kind: 'publicKeyValueNode', value: address(key) });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/value-node-value/setValueNode.test.ts",
    "content": "import { accountValueNode, numberValueNode, setValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { VALUE_NODE_SUPPORTED_NODE_KINDS } from '../../../../src/instruction-encoding/visitors/value-node-value';\nimport { makeVisitor } from './value-node-value-test-utils';\n\ndescribe('value-node-value: visitSetValue', () => {\n    test('should resolve empty set', () => {\n        const result = makeVisitor().visitSetValue(setValueNode([]));\n        expect(result).toEqual({ kind: 'setValueNode', value: [] });\n    });\n\n    test('should resolve set items', () => {\n        const result = makeVisitor().visitSetValue(setValueNode([numberValueNode(10), numberValueNode(20)]));\n        expect(result).toEqual({\n            kind: 'setValueNode',\n            value: [\n                { kind: 'numberValueNode', value: 10 },\n                { kind: 'numberValueNode', value: 20 },\n            ],\n        });\n    });\n\n    test('should throw for unsupported inner node', () => {\n        expect(() =>\n            makeVisitor().visitSetValue(\n                // @ts-expect-error - accountValueNode is invalid as StandaloneValueNode\n                setValueNode([accountValueNode('test')]),\n            ),\n        ).toThrow(`Expected node of kind [${VALUE_NODE_SUPPORTED_NODE_KINDS.join(',')}], got [accountValueNode]`);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/value-node-value/someValueNode.test.ts",
    "content": "import { accountValueNode, numberValueNode, someValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { VALUE_NODE_SUPPORTED_NODE_KINDS } from '../../../../src/instruction-encoding/visitors/value-node-value';\nimport { makeVisitor } from './value-node-value-test-utils';\n\ndescribe('value-node-value: visitSomeValue', () => {\n    test('should delegate to inner value node', () => {\n        const result = makeVisitor().visitSomeValue(someValueNode(numberValueNode(42)));\n        expect(result).toEqual({ kind: 'numberValueNode', value: 42 });\n    });\n\n    test('should throw for unsupported inner node', () => {\n        expect(() =>\n            makeVisitor().visitSomeValue(\n                // @ts-expect-error - accountValueNode is invalid\n                someValueNode(accountValueNode('test')),\n            ),\n        ).toThrow(`Expected node of kind [${VALUE_NODE_SUPPORTED_NODE_KINDS.join(',')}], got [accountValueNode]`);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/value-node-value/stringValueNode.test.ts",
    "content": "import { stringValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { makeVisitor } from './value-node-value-test-utils';\n\ndescribe('value-node-value: visitStringValue', () => {\n    test('should resolve string', () => {\n        const result = makeVisitor().visitStringValue(stringValueNode('hello'));\n        expect(result).toEqual({ kind: 'stringValueNode', value: 'hello' });\n    });\n\n    test('should resolve empty string', () => {\n        const result = makeVisitor().visitStringValue(stringValueNode(''));\n        expect(result).toEqual({ kind: 'stringValueNode', value: '' });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/value-node-value/structValueNode.test.ts",
    "content": "import { accountValueNode, numberValueNode, stringValueNode, structFieldValueNode, structValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { VALUE_NODE_SUPPORTED_NODE_KINDS } from '../../../../src/instruction-encoding/visitors/value-node-value';\nimport { makeVisitor } from './value-node-value-test-utils';\n\ndescribe('value-node-value: visitStructValue', () => {\n    test('should resolve struct fields to object entries', () => {\n        const result = makeVisitor().visitStructValue(\n            structValueNode([\n                structFieldValueNode('name', stringValueNode('Alice')),\n                structFieldValueNode('age', numberValueNode(30)),\n            ]),\n        );\n        expect(result).toEqual({\n            kind: 'structValueNode',\n            value: {\n                age: { kind: 'numberValueNode', value: 30 },\n                name: { kind: 'stringValueNode', value: 'Alice' },\n            },\n        });\n    });\n\n    test('should throw for unsupported field value', () => {\n        expect(() =>\n            makeVisitor().visitStructValue(\n                // @ts-expect-error - accountValueNode is invalid as a StandaloneValueNode\n                structValueNode([structFieldValueNode('invalid_field', accountValueNode('test'))]),\n            ),\n        ).toThrow(`Expected node of kind [${VALUE_NODE_SUPPORTED_NODE_KINDS.join(',')}], got [accountValueNode]`);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/value-node-value/tupleValueNode.test.ts",
    "content": "import { accountValueNode, booleanValueNode, numberValueNode, stringValueNode, tupleValueNode } from 'codama';\nimport { describe, expect, test } from 'vitest';\n\nimport { VALUE_NODE_SUPPORTED_NODE_KINDS } from '../../../../src/instruction-encoding/visitors/value-node-value';\nimport { makeVisitor } from './value-node-value-test-utils';\n\ndescribe('value-node-value: visitTupleValue', () => {\n    test('should resolve mixed-type tuple items', () => {\n        const result = makeVisitor().visitTupleValue(\n            tupleValueNode([numberValueNode(1), stringValueNode('a'), booleanValueNode(true)]),\n        );\n        expect(result).toEqual({\n            kind: 'tupleValueNode',\n            value: [\n                { kind: 'numberValueNode', value: 1 },\n                { kind: 'stringValueNode', value: 'a' },\n                { kind: 'booleanValueNode', value: true },\n            ],\n        });\n    });\n\n    test('should throw for unsupported inner node', () => {\n        expect(() =>\n            makeVisitor().visitTupleValue(\n                // @ts-expect-error - accountValueNode is invalid as a StandaloneValueNode\n                tupleValueNode([accountValueNode('test')]),\n            ),\n        ).toThrow(`Expected node of kind [${VALUE_NODE_SUPPORTED_NODE_KINDS.join(',')}], got [accountValueNode]`);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-client/test/unit/visitors/value-node-value/value-node-value-test-utils.ts",
    "content": "import { createValueNodeVisitor } from '../../../../src/instruction-encoding/visitors/value-node-value';\n\nexport function makeVisitor() {\n    return createValueNodeVisitor();\n}\n"
  },
  {
    "path": "packages/dynamic-client/tsconfig.declarations.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"declarationMap\": true,\n        \"emitDeclarationOnly\": true,\n        \"outDir\": \"./dist/types\"\n    },\n    \"extends\": \"./tsconfig.json\",\n    \"include\": [\"src/index.ts\", \"src/types\"]\n}\n"
  },
  {
    "path": "packages/dynamic-client/tsconfig.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": {\n        \"lib\": [\"ES2022.Object\", \"ES2022.Error\"]\n    },\n    \"display\": \"@codama/dynamic-client\",\n    \"extends\": \"../../tsconfig.json\",\n    \"include\": [\"src\", \"test\"]\n}\n"
  },
  {
    "path": "packages/dynamic-client/tsup.cli.config.ts",
    "content": "import { defineConfig } from 'tsup';\n\nimport { getCliBuildConfig } from '../../tsup.config.base';\n\nexport default defineConfig([getCliBuildConfig()]);\n"
  },
  {
    "path": "packages/dynamic-client/tsup.config.ts",
    "content": "import { defineConfig } from 'tsup';\n\nimport { getCliBuildConfig, getPackageBuildConfigs } from '../../tsup.config.base';\n\nexport default defineConfig([...getPackageBuildConfigs(), getCliBuildConfig()]);\n"
  },
  {
    "path": "packages/dynamic-client/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\nimport { getVitestConfig } from '../../vitest.config.base.mjs';\n\nexport default defineConfig({\n    test: {\n        projects: [getVitestConfig('browser'), getVitestConfig('node'), getVitestConfig('react-native')],\n    },\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/.gitignore",
    "content": "dist/\n"
  },
  {
    "path": "packages/dynamic-codecs/.prettierignore",
    "content": "dist/\ntest/e2e/\ntest-ledger/\ntarget/\nCHANGELOG.md\n"
  },
  {
    "path": "packages/dynamic-codecs/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Codama\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/dynamic-codecs/README.md",
    "content": "# Codama ➤ Dynamic Codecs\n\n[![npm][npm-image]][npm-url]\n[![npm-downloads][npm-downloads-image]][npm-url]\n\n[npm-downloads-image]: https://img.shields.io/npm/dm/@codama/dynamic-codecs.svg?style=flat\n[npm-image]: https://img.shields.io/npm/v/@codama/dynamic-codecs.svg?style=flat&label=%40codama%2Fdynamic-codecs\n[npm-url]: https://www.npmjs.com/package/@codama/dynamic-codecs\n\nThis package provides a set of helpers that provide `Codecs` for Codama nodes that describe data.\n\n## Installation\n\n```sh\npnpm install @codama/dynamic-codecs\n```\n\n> [!NOTE]\n> This package is **not** included in the main [`codama`](../library) package.\n\n## Functions\n\n### `getNodeCodec(path, options?)`\n\nGiven the full `NodePath` of a node inside a Codama IDL, returns a `Codec<unknown>` (as defined in `@solana/codecs`) that enables encoding and decoding data for that node.\n\n```ts\nconst codec = getNodeCodec([root, program, definedType]);\nconst bytes = codec.encode(someData);\nconst decodedData = codec.decode(bytes);\n```\n\nNote that it is important to provide the full `NodePath` of the node in order to properly follow link nodes inside the Codama IDL. Here is a more complex example illustrating how link nodes are resolved:\n\n```ts\n// Here we define a program with two types, one of which is a link to the other.\nconst root = rootNode(\n    programNode({\n        definedTypes: [\n            definedTypeNode({ name: 'slot', type: numberTypeNode('u64') }),\n            definedTypeNode({ name: 'lastSlot', type: definedTypeLinkNode('slot') }),\n        ],\n        name: 'myProgram',\n        publicKey: '1111',\n    }),\n);\n\n// The codec for the linked `lastSlot` defined type is resolved using the `slot` defined type.\nconst codec = getNodeCodec([root, root.program, root.program.definedTypes[1]]);\nexpect(codec.encode(42)).toStrictEqual(hex('2a00000000000000'));\nexpect(codec.decode(hex('2a00000000000000'))).toBe(42n);\n```\n\n#### Options\n\nThe `getNodeCodec` function accepts the following options.\n\n| Name            | Type            | Default    | Description                                              |\n| --------------- | --------------- | ---------- | -------------------------------------------------------- |\n| `bytesEncoding` | `BytesEncoding` | `\"base64\"` | The default encoding to use when formatting plain bytes. |\n\n#### Decoded format\n\nIn the table below, we illustrate the format of each codec based on the node from which it was created.\n\nNote that we purposefully avoid types such as `Uint8Array`, `Set` or `Map` in order to keep the format JSON compatible. For instance, plain bytes are not provided as `Uint8Array` but as a tuple of type `[BytesEncoding, string]` — e.g. `[\"base64\", \"HelloWorld++\"]` — where the default bytes encoding is `base64` which is configurable via the `bytesEncoding` option.\n\n| Node                                                                                    | Example                                                     | Notes                                                                                       |\n| --------------------------------------------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------- |\n| [`AccountLinkNode`](../nodes/docs/linkNodes/AccountLinkNode.md)                         | -                                                           | Same as `AccountNode`                                                                       |\n| [`AccountNode`](../nodes/docs/AccountNode.md)                                           | -                                                           | Same as `node.data`                                                                         |\n| [`DefinedTypeLinkNode`](../nodes/docs/linkNodes/DefinedTypeLinkNode.md)                 | -                                                           | Same as `DefinedTypeNode`                                                                   |\n| [`DefinedTypeNode`](../nodes/docs/DefinedTypeNode.md)                                   | -                                                           | Same as `node.type`                                                                         |\n| [`InstructionArgumentLinkNode`](../nodes/docs/linkNodes/InstructionArgumentLinkNode.md) | -                                                           | Same as `InstructionArgumentNode`                                                           |\n| [`InstructionArgumentNode`](../nodes/docs/InstructionArgumentNode.md)                   | -                                                           | Same as `node.type`                                                                         |\n| [`InstructionLinkNode`](../nodes/docs/linkNodes/InstructionLinkNode.md)                 | -                                                           | Same as `InstructionNode`                                                                   |\n| [`InstructionNode`](../nodes/docs/InstructionNode.md)                                   | -                                                           | Same as a `StructTypeNode` containing all `node.arguments`                                  |\n| [`AmountTypeNode`](../nodes/docs/typeNodes/AmountTypeNode.md)                           | `42`                                                        | Same as `NumberTypeNode`                                                                    |\n| [`ArrayTypeNode`](../nodes/docs/typeNodes/ArrayTypeNode.md)                             | `[1, 2, 3]`                                                 |                                                                                             |\n| [`BooleanTypeNode`](../nodes/docs/typeNodes/BooleanTypeNode.md)                         | `true` or `false`                                           |                                                                                             |\n| [`BytesTypeNode`](../nodes/docs/typeNodes/BytesTypeNode.md)                             | `[\"base16\", \"00ffaa\"]`                                      | Uses `bytesEncoding` option to decode                                                       |\n| [`DateTimeTypeNode`](../nodes/docs/typeNodes/DateTimeTypeNode.md)                       | `42`                                                        | Same as `NumberTypeNode`                                                                    |\n| [`EnumTypeNode`](../nodes/docs/typeNodes/EnumTypeNode.md)                               | `2` or `{ __kind: \"move\", x: 12, y: 34 }`                   | Uses number indices for scalar enums. Uses discriminated unions otherwise.                  |\n| [`FixedSizeTypeNode`](../nodes/docs/typeNodes/FixedSizeTypeNode.md)                     | -                                                           | Same as `node.type`                                                                         |\n| [`HiddenPrefixTypeNode`](../nodes/docs/typeNodes/HiddenPrefixTypeNode.md)               | -                                                           | Same as `node.type`                                                                         |\n| [`HiddenSuffixTypeNode`](../nodes/docs/typeNodes/HiddenSuffixTypeNode.md)               | -                                                           | Same as `node.type`                                                                         |\n| [`MapTypeNode`](../nodes/docs/typeNodes/MapTypeNode.md)                                 | `{ key1: \"value1\", key2: \"value2\" }`                        | Represent `Maps` as `objects`                                                               |\n| [`NumberTypeNode`](../nodes/docs/typeNodes/NumberTypeNode.md)                           | `42`                                                        | This could be a `bigint`                                                                    |\n| [`OptionTypeNode`](../nodes/docs/typeNodes/OptionTypeNode.md)                           | `{ __option: \"Some\", value: 42 }` or `{ __option: \"None\" }` | Uses value objects (instead of `T \\| null`) to avoid loosing information on nested options. |\n| [`PostOffsetTypeNode`](../nodes/docs/typeNodes/PostOffsetTypeNode.md)                   | -                                                           | Same as `node.type`                                                                         |\n| [`PreOffsetTypeNode`](../nodes/docs/typeNodes/PreOffsetTypeNode.md)                     | -                                                           | Same as `node.type`                                                                         |\n| [`PublicKeyTypeNode`](../nodes/docs/typeNodes/PublicKeyTypeNode.md)                     | `\"3QC7Pnv2KfwwdC44gPcmQWuZXmRSbUpmWMJnhenMC8CU\"`            | Uses base58 representations of public keys                                                  |\n| [`RemainderOptionTypeNode`](../nodes/docs/typeNodes/RemainderOptionTypeNode.md)         | `{ __option: \"Some\", value: 42 }` or `{ __option: \"None\" }` | Same as `OptionTypeNode`                                                                    |\n| [`SentinelTypeNode`](../nodes/docs/typeNodes/SentinelTypeNode.md)                       | -                                                           | Same as `node.type`                                                                         |\n| [`SetTypeNode`](../nodes/docs/typeNodes/SetTypeNode.md)                                 | `[1, 2, 3]`                                                 | Same as `ArrayTypeNode`                                                                     |\n| [`SizePrefixTypeNode`](../nodes/docs/typeNodes/SizePrefixTypeNode.md)                   | -                                                           | Same as `node.type`                                                                         |\n| [`SolAmountTypeNode`](../nodes/docs/typeNodes/SolAmountTypeNode.md)                     | `42`                                                        | Same as `NumberTypeNode`                                                                    |\n| [`StringTypeNode`](../nodes/docs/typeNodes/StringTypeNode.md)                           | `\"Hello World\"`                                             | Uses the encoding defined in the node — i.e. `node.encoding`                                |\n| [`StructTypeNode`](../nodes/docs/typeNodes/StructTypeNode.md)                           | `{ name: \"John\", age: 42 }`                                 |                                                                                             |\n| [`TupleTypeNode`](../nodes/docs/typeNodes/TupleTypeNode.md)                             | `[\"John\", 42]`                                              | Uses arrays to create tuples                                                                |\n| [`ZeroableOptionTypeNode`](../nodes/docs/typeNodes/ZeroableOptionTypeNode.md)           | `{ __option: \"Some\", value: 42 }` or `{ __option: \"None\" }` | Same as `OptionTypeNode`                                                                    |\n\n### `getNodeCodecVisitor(linkables, options?)`\n\nThis visitor is used by `getNodeCodec` under the hood. It returns a `Codec<unknown>` for the visited node.\n\n```ts\nreturn visit(someTypeNode, getNodeCodecVisitor(linkables));\n```\n\n### `getValueNodeVisitor(linkables, options?)`\n\nThis visitor is used by the `getValueNodeVisitor` under the hood. It returns an `unknown` value for the visited `ValueNode`.\n\n```ts\nreturn visit(someValueNode, getValueNodeVisitor(linkables));\n```\n"
  },
  {
    "path": "packages/dynamic-codecs/package.json",
    "content": "{\n    \"name\": \"@codama/dynamic-codecs\",\n    \"version\": \"1.2.0\",\n    \"description\": \"Get codecs on demand for Codama IDLs\",\n    \"exports\": {\n        \"types\": \"./dist/types/index.d.ts\",\n        \"react-native\": \"./dist/index.react-native.mjs\",\n        \"browser\": {\n            \"import\": \"./dist/index.browser.mjs\",\n            \"require\": \"./dist/index.browser.cjs\"\n        },\n        \"node\": {\n            \"import\": \"./dist/index.node.mjs\",\n            \"require\": \"./dist/index.node.cjs\"\n        }\n    },\n    \"browser\": {\n        \"./dist/index.node.cjs\": \"./dist/index.browser.cjs\",\n        \"./dist/index.node.mjs\": \"./dist/index.browser.mjs\"\n    },\n    \"main\": \"./dist/index.node.cjs\",\n    \"module\": \"./dist/index.node.mjs\",\n    \"react-native\": \"./dist/index.react-native.mjs\",\n    \"types\": \"./dist/types/index.d.ts\",\n    \"type\": \"commonjs\",\n    \"files\": [\n        \"./dist/types\",\n        \"./dist/index.*\"\n    ],\n    \"sideEffects\": false,\n    \"keywords\": [\n        \"solana\",\n        \"framework\",\n        \"standard\",\n        \"specifications\",\n        \"codecs\"\n    ],\n    \"scripts\": {\n        \"build\": \"rimraf dist && tsup && tsc -p ./tsconfig.declarations.json\",\n        \"dev\": \"vitest --project node\",\n        \"lint\": \"eslint . && prettier --check .\",\n        \"lint:fix\": \"eslint --fix . && prettier --write .\",\n        \"test\": \"pnpm test:types && pnpm test:treeshakability && pnpm test:unit\",\n        \"test:treeshakability\": \"for file in dist/index.*.mjs; do agadoo $file; done\",\n        \"test:types\": \"tsc --noEmit\",\n        \"test:unit\": \"vitest run\"\n    },\n    \"dependencies\": {\n        \"@codama/errors\": \"workspace:*\",\n        \"@codama/nodes\": \"workspace:*\",\n        \"@codama/visitors-core\": \"workspace:*\",\n        \"@solana/codecs\": \"^5.3.0\"\n    },\n    \"license\": \"MIT\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/codama-idl/codama\"\n    },\n    \"bugs\": {\n        \"url\": \"http://github.com/codama-idl/codama/issues\"\n    },\n    \"browserslist\": [\n        \"supports bigint and not dead\",\n        \"maintained node versions\"\n    ]\n}\n"
  },
  {
    "path": "packages/dynamic-codecs/src/codecs.ts",
    "content": "import {\n    CODAMA_ERROR__UNRECOGNIZED_BYTES_ENCODING,\n    CODAMA_ERROR__UNRECOGNIZED_NUMBER_FORMAT,\n    CodamaError,\n} from '@codama/errors';\nimport {\n    AccountLinkNode,\n    AccountNode,\n    BytesEncoding,\n    CountNode,\n    DefinedTypeLinkNode,\n    DefinedTypeNode,\n    EventNode,\n    InstructionArgumentLinkNode,\n    InstructionArgumentNode,\n    InstructionLinkNode,\n    InstructionNode,\n    isNode,\n    isScalarEnum,\n    NumberFormat,\n    pascalCase,\n    RegisteredTypeNode,\n    structFieldTypeNode,\n    structFieldTypeNodeFromInstructionArgumentNode,\n    structTypeNode,\n    structTypeNodeFromInstructionArgumentNodes,\n} from '@codama/nodes';\nimport {\n    getLastNodeFromPath,\n    getRecordLinkablesVisitor,\n    LinkableDictionary,\n    NodePath,\n    NodeStack,\n    pipe,\n    recordNodeStackVisitor,\n    visit,\n    Visitor,\n} from '@codama/visitors-core';\nimport {\n    addCodecSentinel,\n    addCodecSizePrefix,\n    assertIsFixedSize,\n    Codec,\n    createCodec,\n    fixCodecSize,\n    getArrayCodec,\n    getBase16Codec,\n    getBase58Codec,\n    getBase64Codec,\n    getBooleanCodec,\n    getConstantCodec,\n    getDiscriminatedUnionCodec,\n    getEnumCodec,\n    getF32Codec,\n    getF64Codec,\n    getHiddenPrefixCodec,\n    getHiddenSuffixCodec,\n    getI8Codec,\n    getI16Codec,\n    getI32Codec,\n    getI64Codec,\n    getI128Codec,\n    getMapCodec,\n    getOptionCodec,\n    getShortU16Codec,\n    getStructCodec,\n    getTupleCodec,\n    getU8Codec,\n    getU16Codec,\n    getU32Codec,\n    getU64Codec,\n    getU128Codec,\n    getUnitCodec,\n    getUtf8Codec,\n    NumberCodec,\n    offsetCodec,\n    padLeftCodec,\n    padRightCodec,\n    transformCodec,\n} from '@solana/codecs';\n\nimport { getValueNodeVisitor } from './values';\n\nexport type EncodableNodes =\n    | AccountLinkNode\n    | AccountNode\n    | DefinedTypeLinkNode\n    | DefinedTypeNode\n    | EventNode\n    | InstructionArgumentLinkNode\n    | InstructionArgumentNode\n    | InstructionLinkNode\n    | InstructionNode\n    | RegisteredTypeNode;\n\nexport type CodecVisitorOptions = {\n    bytesEncoding?: BytesEncoding;\n};\n\nexport function getNodeCodec(path: NodePath<EncodableNodes>, options: CodecVisitorOptions = {}): Codec<unknown> {\n    const linkables = new LinkableDictionary();\n    visit(path[0], getRecordLinkablesVisitor(linkables));\n\n    return visit(\n        getLastNodeFromPath(path),\n        getNodeCodecVisitor(linkables, {\n            stack: new NodeStack(path.slice(0, -1)),\n            ...options,\n        }),\n    );\n}\n\nexport function getNodeCodecVisitor(\n    linkables: LinkableDictionary,\n    options: CodecVisitorOptions & { stack?: NodeStack } = {},\n): Visitor<Codec<unknown>, EncodableNodes['kind']> {\n    const stack = options.stack ?? new NodeStack();\n    const bytesEncoding = options.bytesEncoding ?? 'base64';\n    const valueNodeVisitor = getValueNodeVisitor(linkables, {\n        codecVisitorFactory: () => visitor,\n        stack,\n    });\n\n    const baseVisitor: Visitor<Codec<unknown>, EncodableNodes['kind']> = {\n        visitAccount(node) {\n            return visit(node.data, this);\n        },\n        visitAccountLink(node) {\n            const path = linkables.getPathOrThrow(stack.getPath(node.kind));\n            stack.pushPath(path);\n            const result = visit(getLastNodeFromPath(path), this);\n            stack.popPath();\n            return result;\n        },\n        visitAmountType(node) {\n            return visit(node.number, this);\n        },\n        visitArrayType(node) {\n            const item = visit(node.item, this);\n            const size = getSizeFromCountNode(node.count, this);\n            return getArrayCodec(item, { size }) as Codec<unknown>;\n        },\n        visitBooleanType(node) {\n            const size = visit(node.size, this) as NumberCodec;\n            return getBooleanCodec({ size }) as Codec<unknown>;\n        },\n        visitBytesType() {\n            // Note we use a format like `[\"base64\", \"someData\"]` to encode bytes,\n            // instead of using `Uint8Arrays` in order to be compatible with JSON.\n            return createCodec<[BytesEncoding, string]>({\n                getSizeFromValue: ([encoding, value]) => {\n                    return getCodecFromBytesEncoding(encoding).getSizeFromValue(value);\n                },\n                read: (bytes, offset) => {\n                    const [value, newOffset] = getCodecFromBytesEncoding(bytesEncoding).read(bytes, offset);\n                    return [[bytesEncoding, value], newOffset];\n                },\n                write: ([encoding, value], bytes, offset) => {\n                    return getCodecFromBytesEncoding(encoding).write(value, bytes, offset);\n                },\n            }) as Codec<unknown>;\n        },\n        visitDateTimeType(node) {\n            return visit(node.number, this);\n        },\n        visitDefinedType(node) {\n            return visit(node.type, this);\n        },\n        visitDefinedTypeLink(node) {\n            const path = linkables.getPathOrThrow(stack.getPath(node.kind));\n            stack.pushPath(path);\n            const result = visit(getLastNodeFromPath(path), this);\n            stack.popPath();\n            return result;\n        },\n        visitEnumEmptyVariantType() {\n            return getUnitCodec() as Codec<unknown>;\n        },\n        visitEnumStructVariantType(node) {\n            return visit(node.struct, this);\n        },\n        visitEnumTupleVariantType(node) {\n            const tupleAsStruct = structTypeNode([structFieldTypeNode({ name: 'fields', type: node.tuple })]);\n            return visit(tupleAsStruct, this);\n        },\n        visitEnumType(node) {\n            const size = visit(node.size, this) as NumberCodec;\n            // Scalar enums are decoded as simple numbers.\n            if (isScalarEnum(node)) {\n                return getEnumCodec(\n                    Object.fromEntries(\n                        node.variants.flatMap((variant, index) => [\n                            [variant.name, index],\n                            [index, variant.name],\n                        ]),\n                    ),\n                    { size },\n                ) as Codec<unknown>;\n            }\n            // Data enums are decoded as discriminated unions, e.g. `{ __kind: 'Move', x: 10, y: 20 }`.\n            const variants = node.variants.map(variant => [pascalCase(variant.name), visit(variant, this)] as const);\n            return getDiscriminatedUnionCodec(variants, { size }) as unknown as Codec<unknown>;\n        },\n        visitEvent(node) {\n            return visit(node.data, this);\n        },\n        visitFixedSizeType(node) {\n            const type = visit(node.type, this);\n            return fixCodecSize(type, node.size);\n        },\n        visitHiddenPrefixType(node) {\n            const type = visit(node.type, this);\n            const constants = node.prefix.map(constant => {\n                const constantCodec = visit(constant.type, this);\n                const constantValue = visit(constant.value, valueNodeVisitor);\n                return getConstantCodec(constantCodec.encode(constantValue));\n            });\n            return getHiddenPrefixCodec(type, constants);\n        },\n        visitHiddenSuffixType(node) {\n            const type = visit(node.type, this);\n            const constants = node.suffix.map(constant => {\n                const constantCodec = visit(constant.type, this);\n                const constantValue = visit(constant.value, valueNodeVisitor);\n                return getConstantCodec(constantCodec.encode(constantValue));\n            });\n            return getHiddenSuffixCodec(type, constants);\n        },\n        visitInstruction(node) {\n            return visit(structTypeNodeFromInstructionArgumentNodes(node.arguments), this);\n        },\n        visitInstructionArgument(node) {\n            return visit(structFieldTypeNodeFromInstructionArgumentNode(node), this);\n        },\n        visitInstructionArgumentLink(node) {\n            const path = linkables.getPathOrThrow(stack.getPath(node.kind));\n            stack.pushPath(path);\n            const result = visit(getLastNodeFromPath(path), this);\n            stack.popPath();\n            return result;\n        },\n        visitInstructionLink(node) {\n            const path = linkables.getPathOrThrow(stack.getPath(node.kind));\n            stack.pushPath(path);\n            const result = visit(getLastNodeFromPath(path), this);\n            stack.popPath();\n            return result;\n        },\n        visitMapType(node) {\n            const key = visit(node.key, this);\n            const value = visit(node.value, this);\n            const size = getSizeFromCountNode(node.count, this);\n            // Note we transform maps as objects to be compatible with JSON.\n            return transformCodec(\n                getMapCodec(key, value, { size }),\n                (value: object) => new Map(Object.entries(value)),\n                (map: Map<unknown, unknown>) => Object.fromEntries(map) as object,\n            ) as Codec<unknown>;\n        },\n        visitNumberType(node) {\n            return getCodecFromNumberFormat(node.format) as Codec<unknown>;\n        },\n        visitOptionType(node) {\n            const item = visit(node.item, this);\n            const prefix = visit(node.prefix, this) as NumberCodec;\n            if (node.fixed) {\n                assertIsFixedSize(item);\n                return getOptionCodec(item, { noneValue: 'zeroes', prefix });\n            }\n            return getOptionCodec(item, { prefix });\n        },\n        visitPostOffsetType(node) {\n            const type = visit(node.type, this);\n            switch (node.strategy) {\n                case 'padded':\n                    return padRightCodec(type, node.offset);\n                case 'absolute':\n                    return offsetCodec(type, {\n                        postOffset: ({ wrapBytes }) => (node.offset < 0 ? wrapBytes(node.offset) : node.offset),\n                    });\n                case 'preOffset':\n                    return offsetCodec(type, { postOffset: ({ preOffset }) => preOffset + node.offset });\n                case 'relative':\n                default:\n                    return offsetCodec(type, { postOffset: ({ postOffset }) => postOffset + node.offset });\n            }\n        },\n        visitPreOffsetType(node) {\n            const type = visit(node.type, this);\n            switch (node.strategy) {\n                case 'padded':\n                    return padLeftCodec(type, node.offset);\n                case 'absolute':\n                    return offsetCodec(type, {\n                        preOffset: ({ wrapBytes }) => (node.offset < 0 ? wrapBytes(node.offset) : node.offset),\n                    });\n                case 'relative':\n                default:\n                    return offsetCodec(type, { preOffset: ({ preOffset }) => preOffset + node.offset });\n            }\n        },\n        visitPublicKeyType() {\n            return fixCodecSize(getBase58Codec(), 32) as Codec<unknown>;\n        },\n        visitRemainderOptionType(node) {\n            const item = visit(node.item, this);\n            return getOptionCodec(item, { prefix: null });\n        },\n        visitSentinelType(node) {\n            const type = visit(node.type, this);\n            const sentinelCodec = visit(node.sentinel.type, this);\n            const sentinelValue = visit(node.sentinel.value, valueNodeVisitor);\n            const sentinelBytes = sentinelCodec.encode(sentinelValue);\n            return addCodecSentinel(type, sentinelBytes);\n        },\n        visitSetType(node) {\n            const item = visit(node.item, this);\n            const size = getSizeFromCountNode(node.count, this);\n            // Note we use the array codecs since it is compatible with the JSON format.\n            return getArrayCodec(item, { size }) as Codec<unknown>;\n        },\n        visitSizePrefixType(node) {\n            const type = visit(node.type, this);\n            const prefix = visit(node.prefix, this) as NumberCodec;\n            return addCodecSizePrefix(type, prefix);\n        },\n        visitSolAmountType(node) {\n            return visit(node.number, this);\n        },\n        visitStringType(node) {\n            return getCodecFromBytesEncoding(node.encoding) as Codec<unknown>;\n        },\n        visitStructFieldType(node) {\n            return visit(node.type, this);\n        },\n        visitStructType(node) {\n            const fields = node.fields.map(field => [field.name, visit(field, this)] as const);\n            return getStructCodec(fields) as Codec<unknown>;\n        },\n        visitTupleType(node) {\n            const items = node.items.map(item => visit(item, this));\n            return getTupleCodec(items) as Codec<unknown>;\n        },\n        visitZeroableOptionType(node) {\n            const item = visit(node.item, this);\n            assertIsFixedSize(item);\n            if (node.zeroValue) {\n                const noneCodec = visit(node.zeroValue.type, this);\n                const noneValue = visit(node.zeroValue.value, valueNodeVisitor);\n                const noneBytes = noneCodec.encode(noneValue);\n                return getOptionCodec(item, { noneValue: noneBytes, prefix: null });\n            }\n            return getOptionCodec(item, { noneValue: 'zeroes', prefix: null });\n        },\n    };\n\n    const visitor = pipe(baseVisitor, v => recordNodeStackVisitor(v, stack));\n    return visitor;\n}\n\nfunction getCodecFromBytesEncoding(encoding: BytesEncoding) {\n    switch (encoding) {\n        case 'base16':\n            return getBase16Codec();\n        case 'base58':\n            return getBase58Codec();\n        case 'base64':\n            return getBase64Codec();\n        case 'utf8':\n            return getUtf8Codec();\n        default:\n            throw new CodamaError(CODAMA_ERROR__UNRECOGNIZED_BYTES_ENCODING, {\n                encoding: encoding satisfies never,\n            });\n    }\n}\n\nfunction getCodecFromNumberFormat(format: NumberFormat) {\n    switch (format) {\n        case 'u8':\n            return getU8Codec();\n        case 'u16':\n            return getU16Codec();\n        case 'u32':\n            return getU32Codec();\n        case 'u64':\n            return getU64Codec();\n        case 'u128':\n            return getU128Codec();\n        case 'i8':\n            return getI8Codec();\n        case 'i16':\n            return getI16Codec();\n        case 'i32':\n            return getI32Codec();\n        case 'i64':\n            return getI64Codec();\n        case 'i128':\n            return getI128Codec();\n        case 'f32':\n            return getF32Codec();\n        case 'f64':\n            return getF64Codec();\n        case 'shortU16':\n            return getShortU16Codec();\n        default:\n            throw new CodamaError(CODAMA_ERROR__UNRECOGNIZED_NUMBER_FORMAT, {\n                format: format satisfies never,\n            });\n    }\n}\n\nfunction getSizeFromCountNode(\n    node: CountNode,\n    visitor: Visitor<unknown, EncodableNodes['kind']>,\n): NumberCodec | number | 'remainder' {\n    if (isNode(node, 'prefixedCountNode')) {\n        return visit(node.prefix, visitor) as NumberCodec;\n    }\n    if (isNode(node, 'fixedCountNode')) {\n        return node.value;\n    }\n    return 'remainder';\n}\n"
  },
  {
    "path": "packages/dynamic-codecs/src/index.ts",
    "content": "import { LinkableDictionary, NodeStack } from '@codama/visitors-core';\nimport { containsBytes, ReadonlyUint8Array } from '@solana/codecs';\n\nimport { getNodeCodecVisitor } from './codecs';\nimport { getValueNodeVisitor } from './values';\n\nexport * from './codecs';\nexport * from './values';\n\nexport type { ReadonlyUint8Array };\nexport { containsBytes };\n\nexport type CodecAndValueVisitors = {\n    codecVisitor: ReturnType<typeof getNodeCodecVisitor>;\n    valueVisitor: ReturnType<typeof getValueNodeVisitor>;\n};\n\nexport function getCodecAndValueVisitors(linkables: LinkableDictionary, options: { stack?: NodeStack } = {}) {\n    const stack = options.stack ?? new NodeStack();\n    const codecVisitor = getNodeCodecVisitor(linkables, { stack });\n    const valueVisitor = getValueNodeVisitor(linkables, { codecVisitorFactory: () => codecVisitor, stack });\n    return { codecVisitor, valueVisitor };\n}\n"
  },
  {
    "path": "packages/dynamic-codecs/src/types/global.d.ts",
    "content": "declare const __BROWSER__: boolean;\ndeclare const __ESM__: boolean;\ndeclare const __NODEJS__: boolean;\ndeclare const __REACTNATIVE__: boolean;\ndeclare const __TEST__: boolean;\ndeclare const __VERSION__: string;\n"
  },
  {
    "path": "packages/dynamic-codecs/src/values.ts",
    "content": "import { CODAMA_ERROR__ENUM_VARIANT_NOT_FOUND, CodamaError } from '@codama/errors';\nimport { assertIsNode, bytesTypeNode, isNode, isScalarEnum, pascalCase, ValueNode } from '@codama/nodes';\nimport { LinkableDictionary, NodeStack, pipe, recordNodeStackVisitor, visit, Visitor } from '@codama/visitors-core';\n\nimport { CodecVisitorOptions, getNodeCodecVisitor } from './codecs';\n\nexport function getValueNodeVisitor(\n    linkables: LinkableDictionary,\n    options: {\n        codecVisitorFactory?: () => ReturnType<typeof getNodeCodecVisitor>;\n        codecVisitorOptions?: CodecVisitorOptions;\n        stack?: NodeStack;\n    } = {},\n): Visitor<unknown, ValueNode['kind']> {\n    const stack = options.stack ?? new NodeStack();\n    let cachedCodecVisitor: ReturnType<typeof getNodeCodecVisitor> | null = null;\n    const codecVisitorFactory =\n        options.codecVisitorFactory ??\n        (() => (cachedCodecVisitor ??= getNodeCodecVisitor(linkables, { stack, ...options.codecVisitorOptions })));\n\n    const baseVisitor: Visitor<unknown, ValueNode['kind']> = {\n        visitArrayValue(node) {\n            return node.items.map(item => visit(item, this));\n        },\n        visitBooleanValue(node) {\n            return node.boolean;\n        },\n        visitBytesValue(node) {\n            return [node.encoding, node.data];\n        },\n        visitConstantValue(node) {\n            const codec = visit(node.type, codecVisitorFactory());\n            const value = visit(node.value, this);\n            const bytes = codec.encode(value);\n            const bytesCodec = visit(bytesTypeNode(), codecVisitorFactory());\n            return bytesCodec.decode(bytes);\n        },\n        visitEnumValue(node) {\n            const enumType = linkables.getOrThrow([...stack.getPath(node.kind), node.enum]).type;\n            assertIsNode(enumType, 'enumTypeNode');\n            const variantIndex = enumType.variants.findIndex(variant => variant.name === node.variant);\n            if (variantIndex < 0) {\n                throw new CodamaError(CODAMA_ERROR__ENUM_VARIANT_NOT_FOUND, {\n                    enum: node.enum,\n                    enumName: node.enum.name,\n                    variant: node.variant,\n                });\n            }\n            const variant = enumType.variants[variantIndex];\n            if (isScalarEnum(enumType)) return variantIndex;\n            const kind = { __kind: pascalCase(node.variant) };\n            if (isNode(variant, 'enumEmptyVariantTypeNode')) return kind;\n            if (isNode(variant, 'enumStructVariantTypeNode') && !!node.value) {\n                const value = visit(node.value, this) as object;\n                return { ...kind, ...value };\n            }\n            if (isNode(variant, 'enumTupleVariantTypeNode') && !!node.value) {\n                const fields = visit(node.value, this);\n                return { ...kind, fields };\n            }\n            return kind;\n        },\n        visitMapValue(node) {\n            return Object.fromEntries(\n                node.entries.map(entry => {\n                    const key = visit(entry.key, this);\n                    const value = visit(entry.value, this);\n                    return [key, value];\n                }),\n            ) as unknown;\n        },\n        visitNoneValue() {\n            return { __option: 'None' };\n        },\n        visitNumberValue(node) {\n            return node.number;\n        },\n        visitPublicKeyValue(node) {\n            return node.publicKey;\n        },\n        visitSetValue(node) {\n            return node.items.map(item => visit(item, this));\n        },\n        visitSomeValue(node) {\n            const value = visit(node.value, this);\n            return { __option: 'Some', value };\n        },\n        visitStringValue(node) {\n            return node.string;\n        },\n        visitStructValue(node) {\n            return Object.fromEntries(\n                node.fields.map(field => {\n                    const name = field.name;\n                    const value = visit(field.value, this);\n                    return [name, value];\n                }),\n            );\n        },\n        visitTupleValue(node) {\n            return node.items.map(item => visit(item, this));\n        },\n    };\n\n    return pipe(baseVisitor, v => recordNodeStackVisitor(v, stack));\n}\n"
  },
  {
    "path": "packages/dynamic-codecs/test/_setup.ts",
    "content": "import { getBase16Encoder, ReadonlyUint8Array } from '@solana/codecs';\n\nexport function hex(hexadecimal: string): ReadonlyUint8Array {\n    return getBase16Encoder().encode(hexadecimal);\n}\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/AccountNode.test.ts",
    "content": "import { accountNode, numberTypeNode, structFieldTypeNode, structTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it delegates to the underlying data node', () => {\n    const codec = getNodeCodec([\n        accountNode({\n            data: structTypeNode([\n                structFieldTypeNode({\n                    name: 'foo',\n                    type: numberTypeNode('u32'),\n                }),\n            ]),\n            name: 'myAccount',\n        }),\n    ]);\n    expect(codec.encode({ foo: 42 })).toStrictEqual(hex('2a000000'));\n    expect(codec.decode(hex('2a000000'))).toStrictEqual({ foo: 42 });\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/ArrayTypeNode.test.ts",
    "content": "import { arrayTypeNode, fixedCountNode, numberTypeNode, prefixedCountNode, remainderCountNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it decodes prefixed arrays', () => {\n    const codec = getNodeCodec([arrayTypeNode(numberTypeNode('u16'), prefixedCountNode(numberTypeNode('u32')))]);\n    expect(codec.encode([42, 99, 650])).toStrictEqual(hex('030000002a0063008a02'));\n    expect(codec.decode(hex('030000002a0063008a02'))).toStrictEqual([42, 99, 650]);\n});\n\ntest('it decodes fixed arrays', () => {\n    const codec = getNodeCodec([arrayTypeNode(numberTypeNode('u16'), fixedCountNode(3))]);\n    expect(codec.encode([42, 99, 650])).toStrictEqual(hex('2a0063008a02'));\n    expect(codec.decode(hex('2a0063008a02'))).toStrictEqual([42, 99, 650]);\n});\n\ntest('it decodes remainder arrays', () => {\n    const codec = getNodeCodec([arrayTypeNode(numberTypeNode('u16'), remainderCountNode())]);\n    expect(codec.encode([42, 99, 650])).toStrictEqual(hex('2a0063008a02'));\n    expect(codec.decode(hex('2a0063008a02'))).toStrictEqual([42, 99, 650]);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/BooleanTypeNode.test.ts",
    "content": "import { booleanTypeNode, numberTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('default', () => {\n    const codec = getNodeCodec([booleanTypeNode()]);\n    expect(codec.encode(true)).toStrictEqual(hex('01'));\n    expect(codec.decode(hex('01'))).toBe(true);\n    expect(codec.encode(false)).toStrictEqual(hex('00'));\n    expect(codec.decode(hex('00'))).toBe(false);\n});\n\ntest('custom number', () => {\n    const codec = getNodeCodec([booleanTypeNode(numberTypeNode('u32'))]);\n    expect(codec.encode(true)).toStrictEqual(hex('01000000'));\n    expect(codec.decode(hex('01000000'))).toBe(true);\n    expect(codec.encode(false)).toStrictEqual(hex('00000000'));\n    expect(codec.decode(hex('00000000'))).toBe(false);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/BytesTypeNode.test.ts",
    "content": "import { bytesTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it uses base64 encoding by default', () => {\n    const codec = getNodeCodec([bytesTypeNode()]);\n    expect(codec.encode(['base64', 'HelloWorld++'])).toStrictEqual(hex('1de965a16a2b95dfbe'));\n    expect(codec.decode(hex('1de965a16a2b95dfbe'))).toStrictEqual(['base64', 'HelloWorld++']);\n});\n\ntest('it can use a custom default encoding', () => {\n    const codec = getNodeCodec([bytesTypeNode()], { bytesEncoding: 'base16' });\n    expect(codec.encode(['base16', 'deadb0d1e5'])).toStrictEqual(hex('deadb0d1e5'));\n    expect(codec.decode(hex('deadb0d1e5'))).toStrictEqual(['base16', 'deadb0d1e5']);\n});\n\ntest('the first tuple item is always used when encoding the data', () => {\n    const codec = getNodeCodec([bytesTypeNode()], { bytesEncoding: 'base64' });\n    expect(codec.encode(['base16', 'deadb0d1e5'])).toStrictEqual(hex('deadb0d1e5'));\n    expect(codec.decode(hex('deadb0d1e5'))).toStrictEqual(['base64', '3q2w0eU=']);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/DefinedTypeLinkNode.test.ts",
    "content": "import {\n    definedTypeLinkNode,\n    definedTypeNode,\n    numberTypeNode,\n    programLinkNode,\n    programNode,\n    rootNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it resolves the codec of defined type link nodes', () => {\n    // Given an existing defined type and a LinkNode pointing to it.\n    const root = rootNode(\n        programNode({\n            definedTypes: [\n                definedTypeNode({ name: 'slot', type: numberTypeNode('u64') }),\n                definedTypeNode({ name: 'lastSlot', type: definedTypeLinkNode('slot') }),\n            ],\n            name: 'myProgram',\n            publicKey: '1111',\n        }),\n    );\n\n    // When we get the codec for the defined type pointing to another defined type.\n    const codec = getNodeCodec([root, root.program, root.program.definedTypes[1]]);\n\n    // Then we expect the codec to match the linked defined type.\n    expect(codec.encode(42)).toStrictEqual(hex('2a00000000000000'));\n    expect(codec.decode(hex('2a00000000000000'))).toBe(42n);\n});\n\ntest('it follows linked nodes using the correct paths', () => {\n    // Given two link nodes designed so that the path would\n    // fail if we did not save and restored linked paths.\n    const programA = programNode({\n        definedTypes: [\n            definedTypeNode({\n                name: 'typeA',\n                type: definedTypeLinkNode('typeB1', programLinkNode('programB')),\n            }),\n        ],\n        name: 'programA',\n        publicKey: '1111',\n    });\n    const programB = programNode({\n        definedTypes: [\n            definedTypeNode({ name: 'typeB1', type: definedTypeLinkNode('typeB2') }),\n            definedTypeNode({ name: 'typeB2', type: numberTypeNode('u64') }),\n        ],\n        name: 'programB',\n        publicKey: '2222',\n    });\n    const root = rootNode(programA, [programB]);\n\n    // When we get the codec for the defined type in programA.\n    const codec = getNodeCodec([root, programA, programA.definedTypes[0]]);\n\n    // Then we expect the links in programB to be resolved correctly.\n    expect(codec.encode(42)).toStrictEqual(hex('2a00000000000000'));\n    expect(codec.decode(hex('2a00000000000000'))).toBe(42n);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/DefinedTypeNode.test.ts",
    "content": "import { definedTypeNode, numberTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it delegates to the underlying type node', () => {\n    const codec = getNodeCodec([definedTypeNode({ name: 'foo', type: numberTypeNode('u32') })]);\n    expect(codec.encode(42)).toStrictEqual(hex('2a000000'));\n    expect(codec.decode(hex('2a000000'))).toBe(42);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/EnumTypeNode.test.ts",
    "content": "import {\n    enumEmptyVariantTypeNode,\n    enumStructVariantTypeNode,\n    enumTupleVariantTypeNode,\n    enumTypeNode,\n    fixedSizeTypeNode,\n    numberTypeNode,\n    stringTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n    tupleTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it encodes scalar enums', () => {\n    const codec = getNodeCodec([enumTypeNode([enumEmptyVariantTypeNode('up'), enumEmptyVariantTypeNode('down')])]);\n    expect(codec.encode(0)).toStrictEqual(hex('00'));\n    expect(codec.decode(hex('00'))).toBe(0);\n    expect(codec.encode(1)).toStrictEqual(hex('01'));\n    expect(codec.decode(hex('01'))).toBe(1);\n});\n\ntest('it encodes scalar enums with custom sizes', () => {\n    const codec = getNodeCodec([\n        enumTypeNode([enumEmptyVariantTypeNode('up'), enumEmptyVariantTypeNode('down')], {\n            size: numberTypeNode('u16'),\n        }),\n    ]);\n    expect(codec.encode(0)).toStrictEqual(hex('0000'));\n    expect(codec.decode(hex('0000'))).toBe(0);\n    expect(codec.encode(1)).toStrictEqual(hex('0100'));\n    expect(codec.decode(hex('0100'))).toBe(1);\n});\n\ntest('it encodes data enums', () => {\n    const codec = getNodeCodec([\n        enumTypeNode([\n            enumEmptyVariantTypeNode('quit'),\n            enumTupleVariantTypeNode('write', tupleTypeNode([fixedSizeTypeNode(stringTypeNode('utf8'), 5)])),\n            enumStructVariantTypeNode(\n                'move',\n                structTypeNode([\n                    structFieldTypeNode({ name: 'x', type: numberTypeNode('u8') }),\n                    structFieldTypeNode({ name: 'y', type: numberTypeNode('u8') }),\n                ]),\n            ),\n        ]),\n    ]);\n    const quitVariant = { __kind: 'Quit' };\n    expect(codec.encode(quitVariant)).toStrictEqual(hex('00'));\n    expect(codec.decode(hex('00'))).toStrictEqual(quitVariant);\n    const writeVariant = { __kind: 'Write', fields: ['Hello'] };\n    expect(codec.encode(writeVariant)).toStrictEqual(hex('0148656c6c6f'));\n    expect(codec.decode(hex('0148656c6c6f'))).toStrictEqual(writeVariant);\n    const moveVariant = { __kind: 'Move', x: 10, y: 20 };\n    expect(codec.encode(moveVariant)).toStrictEqual(hex('020a14'));\n    expect(codec.decode(hex('020a14'))).toStrictEqual(moveVariant);\n});\n\ntest('it encodes data enums with custom sizes', () => {\n    const codec = getNodeCodec([\n        enumTypeNode(\n            [\n                enumEmptyVariantTypeNode('quit'),\n                enumTupleVariantTypeNode('write', tupleTypeNode([fixedSizeTypeNode(stringTypeNode('utf8'), 5)])),\n            ],\n            { size: numberTypeNode('u16') },\n        ),\n    ]);\n    const quitVariant = { __kind: 'Quit' };\n    expect(codec.encode(quitVariant)).toStrictEqual(hex('0000'));\n    expect(codec.decode(hex('0000'))).toStrictEqual(quitVariant);\n    const writeVariant = { __kind: 'Write', fields: ['Hello'] };\n    expect(codec.encode(writeVariant)).toStrictEqual(hex('010048656c6c6f'));\n    expect(codec.decode(hex('010048656c6c6f'))).toStrictEqual(writeVariant);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/EventNode.test.ts",
    "content": "import { eventNode, numberTypeNode, structFieldTypeNode, structTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it delegates to the underlying event data node', () => {\n    const codec = getNodeCodec([\n        eventNode({\n            data: structTypeNode([\n                structFieldTypeNode({\n                    name: 'foo',\n                    type: numberTypeNode('u32'),\n                }),\n            ]),\n            name: 'myEvent',\n        }),\n    ]);\n    expect(codec.encode({ foo: 42 })).toStrictEqual(hex('2a000000'));\n    expect(codec.decode(hex('2a000000'))).toStrictEqual({ foo: 42 });\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/FixedSizeTypeNode.test.ts",
    "content": "import { fixedSizeTypeNode, stringTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it decodes fixed size strings', () => {\n    const codec = getNodeCodec([fixedSizeTypeNode(stringTypeNode('utf8'), 5)]);\n    expect(codec.encode('Hello')).toStrictEqual(hex('48656c6c6f'));\n    expect(codec.decode(hex('48656c6c6f'))).toBe('Hello');\n    expect(codec.encode('Sup')).toStrictEqual(hex('5375700000'));\n    expect(codec.decode(hex('5375700000'))).toBe('Sup');\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/HiddenPrefixTypeNode.test.ts",
    "content": "import {\n    constantValueNode,\n    fixedSizeTypeNode,\n    hiddenPrefixTypeNode,\n    numberTypeNode,\n    numberValueNode,\n    stringTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it hides hidden prefixes from the main type', () => {\n    const codec = getNodeCodec([\n        hiddenPrefixTypeNode(fixedSizeTypeNode(stringTypeNode('utf8'), 5), [\n            constantValueNode(numberTypeNode('u64'), numberValueNode(42)),\n        ]),\n    ]);\n    expect(codec.encode('Alice')).toStrictEqual(hex('2a00000000000000416c696365'));\n    expect(codec.decode(hex('2a00000000000000416c696365'))).toStrictEqual('Alice');\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/HiddenSuffixTypeNode.test.ts",
    "content": "import {\n    constantValueNode,\n    fixedSizeTypeNode,\n    hiddenSuffixTypeNode,\n    numberTypeNode,\n    numberValueNode,\n    stringTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it hides hidden suffixes from the main type', () => {\n    const codec = getNodeCodec([\n        hiddenSuffixTypeNode(fixedSizeTypeNode(stringTypeNode('utf8'), 5), [\n            constantValueNode(numberTypeNode('u64'), numberValueNode(42)),\n        ]),\n    ]);\n    expect(codec.encode('Alice')).toStrictEqual(hex('416c6963652a00000000000000'));\n    expect(codec.decode(hex('416c6963652a00000000000000'))).toStrictEqual('Alice');\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/InstructionArgumentNode.test.ts",
    "content": "import { instructionArgumentNode, numberTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it delegates to the type node of the argument', () => {\n    const codec = getNodeCodec([\n        instructionArgumentNode({\n            name: 'foo',\n            type: numberTypeNode('u32'),\n        }),\n    ]);\n    expect(codec.encode(42)).toStrictEqual(hex('2a000000'));\n    expect(codec.decode(hex('2a000000'))).toStrictEqual(42);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/InstructionNode.test.ts",
    "content": "import { instructionArgumentNode, instructionNode, numberTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it delegates to the instruction arguments as a struct', () => {\n    const codec = getNodeCodec([\n        instructionNode({\n            arguments: [\n                instructionArgumentNode({\n                    name: 'foo',\n                    type: numberTypeNode('u32'),\n                }),\n            ],\n            name: 'myInstruction',\n        }),\n    ]);\n    expect(codec.encode({ foo: 42 })).toStrictEqual(hex('2a000000'));\n    expect(codec.decode(hex('2a000000'))).toStrictEqual({ foo: 42 });\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/MapTypeNode.test.ts",
    "content": "import {\n    fixedCountNode,\n    fixedSizeTypeNode,\n    mapTypeNode,\n    numberTypeNode,\n    prefixedCountNode,\n    remainderCountNode,\n    stringTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it decodes prefixed maps as objects', () => {\n    const key = fixedSizeTypeNode(stringTypeNode('utf8'), 3);\n    const value = numberTypeNode('u16');\n    const codec = getNodeCodec([mapTypeNode(key, value, prefixedCountNode(numberTypeNode('u32')))]);\n    // eslint-disable-next-line sort-keys-fix/sort-keys-fix\n    const map = { foo: 42, bar: 99, baz: 650 };\n    expect(codec.encode(map)).toStrictEqual(hex('03000000666f6f2a00626172630062617a8a02'));\n    expect(codec.decode(hex('03000000666f6f2a00626172630062617a8a02'))).toStrictEqual(map);\n});\n\ntest('it decodes fixed maps as objects', () => {\n    const key = fixedSizeTypeNode(stringTypeNode('utf8'), 3);\n    const value = numberTypeNode('u16');\n    const codec = getNodeCodec([mapTypeNode(key, value, fixedCountNode(3))]);\n    // eslint-disable-next-line sort-keys-fix/sort-keys-fix\n    const map = { foo: 42, bar: 99, baz: 650 };\n    expect(codec.encode(map)).toStrictEqual(hex('666f6f2a00626172630062617a8a02'));\n    expect(codec.decode(hex('666f6f2a00626172630062617a8a02'))).toStrictEqual(map);\n});\n\ntest('it decodes remainder maps as objects', () => {\n    const key = fixedSizeTypeNode(stringTypeNode('utf8'), 3);\n    const value = numberTypeNode('u16');\n    const codec = getNodeCodec([mapTypeNode(key, value, remainderCountNode())]);\n    // eslint-disable-next-line sort-keys-fix/sort-keys-fix\n    const map = { foo: 42, bar: 99, baz: 650 };\n    expect(codec.encode(map)).toStrictEqual(hex('666f6f2a00626172630062617a8a02'));\n    expect(codec.decode(hex('666f6f2a00626172630062617a8a02'))).toStrictEqual(map);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/NumberTypeNode.test.ts",
    "content": "import { numberTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('u8', () => {\n    const codec = getNodeCodec([numberTypeNode('u8')]);\n    expect(codec.encode(42)).toStrictEqual(hex('2a'));\n    expect(codec.decode(hex('2a'))).toBe(42);\n});\n\ntest('u16', () => {\n    const codec = getNodeCodec([numberTypeNode('u16')]);\n    expect(codec.encode(42)).toStrictEqual(hex('2a00'));\n    expect(codec.decode(hex('2a00'))).toBe(42);\n});\n\ntest('u32', () => {\n    const codec = getNodeCodec([numberTypeNode('u32')]);\n    expect(codec.encode(42)).toStrictEqual(hex('2a000000'));\n    expect(codec.decode(hex('2a000000'))).toBe(42);\n});\n\ntest('u64', () => {\n    const codec = getNodeCodec([numberTypeNode('u64')]);\n    expect(codec.encode(42)).toStrictEqual(hex('2a00000000000000'));\n    expect(codec.decode(hex('2a00000000000000'))).toBe(42n);\n});\n\ntest('u128', () => {\n    const codec = getNodeCodec([numberTypeNode('u128')]);\n    expect(codec.encode(42)).toStrictEqual(hex('2a000000000000000000000000000000'));\n    expect(codec.decode(hex('2a000000000000000000000000000000'))).toBe(42n);\n});\n\ntest('i8', () => {\n    const codec = getNodeCodec([numberTypeNode('i8')]);\n    expect(codec.encode(-42)).toStrictEqual(hex('d6'));\n    expect(codec.decode(hex('d6'))).toBe(-42);\n});\n\ntest('i16', () => {\n    const codec = getNodeCodec([numberTypeNode('i16')]);\n    expect(codec.encode(-42)).toStrictEqual(hex('d6ff'));\n    expect(codec.decode(hex('d6ff'))).toBe(-42);\n});\n\ntest('i32', () => {\n    const codec = getNodeCodec([numberTypeNode('i32')]);\n    expect(codec.encode(-42)).toStrictEqual(hex('d6ffffff'));\n    expect(codec.decode(hex('d6ffffff'))).toBe(-42);\n});\n\ntest('i64', () => {\n    const codec = getNodeCodec([numberTypeNode('i64')]);\n    expect(codec.encode(-42)).toStrictEqual(hex('d6ffffffffffffff'));\n    expect(codec.decode(hex('d6ffffffffffffff'))).toBe(-42n);\n});\n\ntest('i128', () => {\n    const codec = getNodeCodec([numberTypeNode('i128')]);\n    expect(codec.encode(-42)).toStrictEqual(hex('d6ffffffffffffffffffffffffffffff'));\n    expect(codec.decode(hex('d6ffffffffffffffffffffffffffffff'))).toBe(-42n);\n});\n\ntest('f32', () => {\n    const codec = getNodeCodec([numberTypeNode('f32')]);\n    expect(codec.encode(1.5)).toStrictEqual(hex('0000c03f'));\n    expect(codec.decode(hex('0000c03f'))).toBe(1.5);\n});\n\ntest('f64', () => {\n    const codec = getNodeCodec([numberTypeNode('f64')]);\n    expect(codec.encode(1.5)).toStrictEqual(hex('000000000000f83f'));\n    expect(codec.decode(hex('000000000000f83f'))).toBe(1.5);\n});\n\ntest('shortU16', () => {\n    const codec = getNodeCodec([numberTypeNode('shortU16')]);\n    expect(codec.encode(42)).toStrictEqual(hex('2a'));\n    expect(codec.decode(hex('2a'))).toBe(42);\n    expect(codec.encode(128)).toStrictEqual(hex('8001'));\n    expect(codec.decode(hex('8001'))).toBe(128);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/OptionTypeNode.test.ts",
    "content": "import { numberTypeNode, optionTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it encodes prefixed options', () => {\n    const codec = getNodeCodec([optionTypeNode(numberTypeNode('u16'))]);\n    expect(codec.encode({ __option: 'Some', value: 42 })).toStrictEqual(hex('012a00'));\n    expect(codec.decode(hex('012a00'))).toStrictEqual({ __option: 'Some', value: 42 });\n    expect(codec.encode({ __option: 'None' })).toStrictEqual(hex('00'));\n    expect(codec.decode(hex('00'))).toStrictEqual({ __option: 'None' });\n});\n\ntest('it encodes prefixed options with custom sizes', () => {\n    const codec = getNodeCodec([optionTypeNode(numberTypeNode('u16'), { prefix: numberTypeNode('u32') })]);\n    expect(codec.encode({ __option: 'Some', value: 42 })).toStrictEqual(hex('010000002a00'));\n    expect(codec.decode(hex('010000002a00'))).toStrictEqual({ __option: 'Some', value: 42 });\n    expect(codec.encode({ __option: 'None' })).toStrictEqual(hex('00000000'));\n    expect(codec.decode(hex('00000000'))).toStrictEqual({ __option: 'None' });\n});\n\ntest('it encodes prefixed options with fixed size items', () => {\n    const codec = getNodeCodec([optionTypeNode(numberTypeNode('u16'), { fixed: true })]);\n    expect(codec.encode({ __option: 'Some', value: 42 })).toStrictEqual(hex('012a00'));\n    expect(codec.decode(hex('012a00'))).toStrictEqual({ __option: 'Some', value: 42 });\n    expect(codec.encode({ __option: 'None' })).toStrictEqual(hex('000000'));\n    expect(codec.decode(hex('000000'))).toStrictEqual({ __option: 'None' });\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/PostOffsetTypeNode.test.ts",
    "content": "import { fixedSizeTypeNode, numberTypeNode, postOffsetTypeNode, preOffsetTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it encodes relative post-offsets', () => {\n    const node = tupleTypeNode([\n        postOffsetTypeNode(fixedSizeTypeNode(numberTypeNode('u8'), 4), -2),\n        numberTypeNode('u8'),\n    ]);\n    const codec = getNodeCodec([node]);\n    expect(codec.encode([0xaa, 0xff])).toStrictEqual(hex('aa00ff0000'));\n    expect(codec.decode(hex('aa00ff0000'))).toStrictEqual([0xaa, 0xff]);\n});\n\ntest('it encodes padded post-offsets', () => {\n    const node = tupleTypeNode([postOffsetTypeNode(numberTypeNode('u8'), 4, 'padded'), numberTypeNode('u8')]);\n    const codec = getNodeCodec([node]);\n    expect(codec.encode([0xaa, 0xff])).toStrictEqual(hex('aa00000000ff'));\n    expect(codec.decode(hex('aa00000000ff'))).toStrictEqual([0xaa, 0xff]);\n});\n\ntest('it encodes absolute post-offsets', () => {\n    const node = tupleTypeNode([\n        postOffsetTypeNode(fixedSizeTypeNode(numberTypeNode('u8'), 4), -2, 'absolute'),\n        numberTypeNode('u8'),\n    ]);\n    const codec = getNodeCodec([node]);\n    expect(codec.encode([0xaa, 0xff])).toStrictEqual(hex('aa0000ff00'));\n    expect(codec.decode(hex('aa0000ff00'))).toStrictEqual([0xaa, 0xff]);\n});\n\ntest('it encodes post-offsets relative to the previous pre-offset', () => {\n    const node = tupleTypeNode([\n        postOffsetTypeNode(preOffsetTypeNode(numberTypeNode('u8'), 4, 'padded'), 0, 'preOffset'),\n        numberTypeNode('u8'),\n    ]);\n    const codec = getNodeCodec([node]);\n    expect(codec.encode([0xaa, 0xff])).toStrictEqual(hex('ff000000aa00'));\n    expect(codec.decode(hex('ff000000aa00'))).toStrictEqual([0xaa, 0xff]);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/PreOffsetTypeNode.test.ts",
    "content": "import { numberTypeNode, preOffsetTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it encodes relative pre-offsets', () => {\n    const node = tupleTypeNode([\n        preOffsetTypeNode(numberTypeNode('u8'), 1),\n        preOffsetTypeNode(numberTypeNode('u8'), -2),\n    ]);\n    const codec = getNodeCodec([node]);\n    expect(codec.encode([0xaa, 0xff])).toStrictEqual(hex('ffaa'));\n    expect(codec.decode(hex('ffaa'))).toStrictEqual([0xaa, 0xff]);\n});\n\ntest('it encodes padded pre-offsets', () => {\n    const node = tupleTypeNode([preOffsetTypeNode(numberTypeNode('u8'), 4, 'padded'), numberTypeNode('u8')]);\n    const codec = getNodeCodec([node]);\n    expect(codec.encode([0xaa, 0xff])).toStrictEqual(hex('00000000aaff'));\n    expect(codec.decode(hex('00000000aaff'))).toStrictEqual([0xaa, 0xff]);\n});\n\ntest('it encodes absolute pre-offsets', () => {\n    const node = tupleTypeNode([\n        preOffsetTypeNode(numberTypeNode('u8'), 1),\n        preOffsetTypeNode(numberTypeNode('u8'), 0, 'absolute'),\n    ]);\n    const codec = getNodeCodec([node]);\n    expect(codec.encode([0xaa, 0xff])).toStrictEqual(hex('ffaa'));\n    expect(codec.decode(hex('ffaa'))).toStrictEqual([0xaa, 0xff]);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/PublicKeyTypeNode.test.ts",
    "content": "import { publicKeyTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it decodes as a base58 string', () => {\n    const codec = getNodeCodec([publicKeyTypeNode()]);\n    expect(codec.encode('LorisCg1FTs89a32VSrFskYDgiRbNQzct1WxyZb7nuA')).toStrictEqual(\n        hex('0513045e052f4919b608963de73c666e0672e06e28140ab841bff1cc83a178b5'),\n    );\n    expect(codec.decode(hex('0513045e052f4919b608963de73c666e0672e06e28140ab841bff1cc83a178b5'))).toBe(\n        'LorisCg1FTs89a32VSrFskYDgiRbNQzct1WxyZb7nuA',\n    );\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/RemainderOptionTypeNode.test.ts",
    "content": "import { numberTypeNode, remainderOptionTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it encodes remainder options', () => {\n    const codec = getNodeCodec([remainderOptionTypeNode(numberTypeNode('u16'))]);\n    expect(codec.encode({ __option: 'Some', value: 42 })).toStrictEqual(hex('2a00'));\n    expect(codec.decode(hex('2a00'))).toStrictEqual({ __option: 'Some', value: 42 });\n    expect(codec.encode({ __option: 'None' })).toStrictEqual(hex(''));\n    expect(codec.decode(hex(''))).toStrictEqual({ __option: 'None' });\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/SentinelTypeNode.test.ts",
    "content": "import { constantValueNodeFromBytes, sentinelTypeNode, stringTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it encodes sentinel types', () => {\n    const sentinel = constantValueNodeFromBytes('base16', 'ffff');\n    const codec = getNodeCodec([sentinelTypeNode(stringTypeNode('utf8'), sentinel)]);\n    expect(codec.encode('Hello World!')).toStrictEqual(hex('48656c6c6f20576f726c6421ffff'));\n    expect(codec.decode(hex('48656c6c6f20576f726c6421ffff'))).toBe('Hello World!');\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/SetTypeNode.test.ts",
    "content": "import { fixedCountNode, numberTypeNode, prefixedCountNode, remainderCountNode, setTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it decodes prefixed sets', () => {\n    const codec = getNodeCodec([setTypeNode(numberTypeNode('u16'), prefixedCountNode(numberTypeNode('u32')))]);\n    expect(codec.encode([42, 99, 650])).toStrictEqual(hex('030000002a0063008a02'));\n    expect(codec.decode(hex('030000002a0063008a02'))).toStrictEqual([42, 99, 650]);\n});\n\ntest('it decodes fixed sets', () => {\n    const codec = getNodeCodec([setTypeNode(numberTypeNode('u16'), fixedCountNode(3))]);\n    expect(codec.encode([42, 99, 650])).toStrictEqual(hex('2a0063008a02'));\n    expect(codec.decode(hex('2a0063008a02'))).toStrictEqual([42, 99, 650]);\n});\n\ntest('it decodes remainder sets', () => {\n    const codec = getNodeCodec([setTypeNode(numberTypeNode('u16'), remainderCountNode())]);\n    expect(codec.encode([42, 99, 650])).toStrictEqual(hex('2a0063008a02'));\n    expect(codec.decode(hex('2a0063008a02'))).toStrictEqual([42, 99, 650]);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/SizePrefixTypeNode.test.ts",
    "content": "import { numberTypeNode, sizePrefixTypeNode, stringTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it encodes types prefixed with their sizes', () => {\n    const codec = getNodeCodec([sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u32'))]);\n    expect(codec.encode('Hello World!')).toStrictEqual(hex('0c00000048656c6c6f20576f726c6421'));\n    expect(codec.decode(hex('0c00000048656c6c6f20576f726c6421'))).toBe('Hello World!');\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/StringTypeNode.test.ts",
    "content": "import { stringTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('base16', () => {\n    const codec = getNodeCodec([stringTypeNode('base16')]);\n    expect(codec.encode('deadb0d1e5')).toStrictEqual(hex('deadb0d1e5'));\n    expect(codec.decode(hex('deadb0d1e5'))).toBe('deadb0d1e5');\n});\n\ntest('base58', () => {\n    const codec = getNodeCodec([stringTypeNode('base58')]);\n    expect(codec.encode('heLLo')).toStrictEqual(hex('1b6a3070'));\n    expect(codec.decode(hex('1b6a3070'))).toBe('heLLo');\n});\n\ntest('base64', () => {\n    const codec = getNodeCodec([stringTypeNode('base64')]);\n    expect(codec.encode('HelloWorld++')).toStrictEqual(hex('1de965a16a2b95dfbe'));\n    expect(codec.decode(hex('1de965a16a2b95dfbe'))).toBe('HelloWorld++');\n});\n\ntest('utf8', () => {\n    const codec = getNodeCodec([stringTypeNode('utf8')]);\n    expect(codec.encode('Hello World!')).toStrictEqual(hex('48656c6c6f20576f726c6421'));\n    expect(codec.decode(hex('48656c6c6f20576f726c6421'))).toBe('Hello World!');\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/StructFieldTypeNode.test.ts",
    "content": "import { numberTypeNode, structFieldTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it encodes struct fields using their types', () => {\n    const codec = getNodeCodec([structFieldTypeNode({ name: 'age', type: numberTypeNode('u16') })]);\n    expect(codec.encode(42)).toStrictEqual(hex('2a00'));\n    expect(codec.decode(hex('2a00'))).toStrictEqual(42);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/StructTypeNode.test.ts",
    "content": "import { fixedSizeTypeNode, numberTypeNode, stringTypeNode, structFieldTypeNode, structTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it encodes structs', () => {\n    const codec = getNodeCodec([\n        structTypeNode([\n            structFieldTypeNode({ name: 'firstname', type: fixedSizeTypeNode(stringTypeNode('utf8'), 5) }),\n            structFieldTypeNode({ name: 'age', type: numberTypeNode('u16') }),\n        ]),\n    ]);\n    const person = { age: 42, firstname: 'Alice' };\n    expect(codec.encode(person)).toStrictEqual(hex('416c6963652a00'));\n    expect(codec.decode(hex('416c6963652a00'))).toStrictEqual(person);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/TupleTypeNode.test.ts",
    "content": "import { fixedSizeTypeNode, numberTypeNode, stringTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it encodes tuples', () => {\n    const codec = getNodeCodec([tupleTypeNode([fixedSizeTypeNode(stringTypeNode('utf8'), 3), numberTypeNode('u16')])]);\n    expect(codec.encode(['foo', 42])).toStrictEqual(hex('666f6f2a00'));\n    expect(codec.decode(hex('666f6f2a00'))).toStrictEqual(['foo', 42]);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/codecs/ZeroableOptionTypeNode.test.ts",
    "content": "import { constantValueNodeFromBytes, numberTypeNode, zeroableOptionTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodec } from '../../src';\nimport { hex } from '../_setup';\n\ntest('it encodes zeroable options', () => {\n    const codec = getNodeCodec([zeroableOptionTypeNode(numberTypeNode('u16'))]);\n    expect(codec.encode({ __option: 'Some', value: 42 })).toStrictEqual(hex('2a00'));\n    expect(codec.decode(hex('2a00'))).toStrictEqual({ __option: 'Some', value: 42 });\n    expect(codec.encode({ __option: 'None' })).toStrictEqual(hex('0000'));\n    expect(codec.decode(hex('0000'))).toStrictEqual({ __option: 'None' });\n});\n\ntest('it encodes zeroable options with custom zero values', () => {\n    const zeroValue = constantValueNodeFromBytes('base16', 'ffff');\n    const codec = getNodeCodec([zeroableOptionTypeNode(numberTypeNode('u16'), zeroValue)]);\n    expect(codec.encode({ __option: 'Some', value: 42 })).toStrictEqual(hex('2a00'));\n    expect(codec.decode(hex('2a00'))).toStrictEqual({ __option: 'Some', value: 42 });\n    expect(codec.encode({ __option: 'None' })).toStrictEqual(hex('ffff'));\n    expect(codec.decode(hex('ffff'))).toStrictEqual({ __option: 'None' });\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/types/global.d.ts",
    "content": "declare const __BROWSER__: boolean;\ndeclare const __ESM__: boolean;\ndeclare const __NODEJS__: boolean;\ndeclare const __REACTNATIVE__: boolean;\ndeclare const __TEST__: boolean;\ndeclare const __VERSION__: string;\n"
  },
  {
    "path": "packages/dynamic-codecs/test/values/ArrayValueNode.test.ts",
    "content": "import { arrayValueNode, numberValueNode } from '@codama/nodes';\nimport { LinkableDictionary, visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { getValueNodeVisitor } from '../../src';\n\ntest('it returns an array of all resolved value nodes', () => {\n    const node = arrayValueNode([numberValueNode(1), numberValueNode(2), numberValueNode(3)]);\n    const result = visit(node, getValueNodeVisitor(new LinkableDictionary()));\n    expect(result).toStrictEqual([1, 2, 3]);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/values/BytesValueNode.test.ts",
    "content": "import { bytesValueNode } from '@codama/nodes';\nimport { LinkableDictionary, visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { getValueNodeVisitor } from '../../src';\n\ntest('it returns a tuple with encoding and encoded data', () => {\n    const node = bytesValueNode('base58', 'heLLo');\n    const result = visit(node, getValueNodeVisitor(new LinkableDictionary()));\n    expect(result).toStrictEqual(['base58', 'heLLo']);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/values/ConstantValueNode.test.ts",
    "content": "import {\n    booleanTypeNode,\n    booleanValueNode,\n    bytesTypeNode,\n    bytesValueNode,\n    constantValueNode,\n    fixedSizeTypeNode,\n    noneValueNode,\n    numberTypeNode,\n    numberValueNode,\n    optionTypeNode,\n    someValueNode,\n    stringTypeNode,\n    stringValueNode,\n    structFieldTypeNode,\n    structFieldValueNode,\n    structTypeNode,\n    structValueNode,\n} from '@codama/nodes';\nimport { LinkableDictionary, visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { getNodeCodecVisitor, getValueNodeVisitor } from '../../src';\n\ntest('it returns bytes from encoded numbers', () => {\n    const node = constantValueNode(numberTypeNode('u32'), numberValueNode(42));\n    const result = visit(node, getValueNodeVisitor(new LinkableDictionary()));\n    expect(result).toStrictEqual(['base64', 'KgAAAA==']);\n});\n\ntest('it uses the default byte encoding from the codec visitor', () => {\n    const node = constantValueNode(numberTypeNode('u32'), numberValueNode(42));\n    const linkables = new LinkableDictionary();\n    const codecVisitorFactory = () => getNodeCodecVisitor(linkables, { bytesEncoding: 'base16' });\n    const result = visit(node, getValueNodeVisitor(linkables, { codecVisitorFactory }));\n    expect(result).toStrictEqual(['base16', '2a000000']);\n});\n\ntest('it uses the default byte encoding from the codec visitor options', () => {\n    const node = constantValueNode(numberTypeNode('u32'), numberValueNode(42));\n    const result = visit(\n        node,\n        getValueNodeVisitor(new LinkableDictionary(), { codecVisitorOptions: { bytesEncoding: 'base16' } }),\n    );\n    expect(result).toStrictEqual(['base16', '2a000000']);\n});\n\ntest('it returns bytes from byte values', () => {\n    const node = constantValueNode(bytesTypeNode(), bytesValueNode('base16', 'deadb0d1e5'));\n    const result = visit(node, getValueNodeVisitor(new LinkableDictionary()));\n    expect(result).toStrictEqual(['base64', '3q2w0eU=']);\n});\n\ntest('it returns bytes from string values', () => {\n    const node = constantValueNode(stringTypeNode('base16'), stringValueNode('deadb0d1e5'));\n    const result = visit(node, getValueNodeVisitor(new LinkableDictionary()));\n    expect(result).toStrictEqual(['base64', '3q2w0eU=']);\n});\n\ntest('it returns bytes from boolean values', () => {\n    const visitor = getValueNodeVisitor(new LinkableDictionary(), { codecVisitorOptions: { bytesEncoding: 'base16' } });\n    const resultFalse = visit(constantValueNode(booleanTypeNode(), booleanValueNode(false)), visitor);\n    const resultTrue = visit(constantValueNode(booleanTypeNode(), booleanValueNode(true)), visitor);\n    expect(resultFalse).toStrictEqual(['base16', '00']);\n    expect(resultTrue).toStrictEqual(['base16', '01']);\n});\n\ntest('it returns bytes from struct values', () => {\n    const node = constantValueNode(\n        structTypeNode([\n            structFieldTypeNode({ name: 'firstname', type: fixedSizeTypeNode(stringTypeNode('utf8'), 5) }),\n            structFieldTypeNode({ name: 'age', type: numberTypeNode('u16') }),\n        ]),\n        structValueNode([\n            structFieldValueNode('firstname', stringValueNode('John')),\n            structFieldValueNode('age', stringValueNode('42')),\n        ]),\n    );\n    const visitor = getValueNodeVisitor(new LinkableDictionary(), { codecVisitorOptions: { bytesEncoding: 'base16' } });\n    const result = visit(node, visitor);\n    expect(result).toStrictEqual(['base16', '4a6f686e002a00']);\n});\n\ntest('it returns bytes from option values', () => {\n    const visitor = getValueNodeVisitor(new LinkableDictionary(), { codecVisitorOptions: { bytesEncoding: 'base16' } });\n    const type = optionTypeNode(numberTypeNode('u16'));\n    const resultNone = visit(constantValueNode(type, noneValueNode()), visitor);\n    const resultSome = visit(constantValueNode(type, someValueNode(numberValueNode(42))), visitor);\n    expect(resultNone).toStrictEqual(['base16', '00']);\n    expect(resultSome).toStrictEqual(['base16', '012a00']);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/values/EnumValueNode.test.ts",
    "content": "import {\n    definedTypeNode,\n    enumEmptyVariantTypeNode,\n    enumStructVariantTypeNode,\n    enumTupleVariantTypeNode,\n    enumTypeNode,\n    enumValueNode,\n    fixedSizeTypeNode,\n    numberTypeNode,\n    numberValueNode,\n    programNode,\n    rootNode,\n    stringTypeNode,\n    stringValueNode,\n    structFieldTypeNode,\n    structFieldValueNode,\n    structTypeNode,\n    structValueNode,\n    tupleTypeNode,\n    tupleValueNode,\n} from '@codama/nodes';\nimport { LinkableDictionary, NodeStack, visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { getValueNodeVisitor } from '../../src';\n\ntest('it returns scalar enum values as numbers', () => {\n    // Given a program with a scalar enum.\n    const definedType = definedTypeNode({\n        name: 'direction',\n        type: enumTypeNode([\n            enumEmptyVariantTypeNode('up'),\n            enumEmptyVariantTypeNode('right'),\n            enumEmptyVariantTypeNode('down'),\n            enumEmptyVariantTypeNode('left'),\n        ]),\n    });\n    const root = rootNode(programNode({ definedTypes: [definedType], name: 'myProgram', publicKey: '1111' }));\n\n    // And a LinkableDictionary that recorded the enum.\n    const linkables = new LinkableDictionary();\n    linkables.recordPath([root, root.program, definedType]);\n\n    // And a value node visitor that's under the same program.\n    const stack = new NodeStack([root, root.program]);\n    const visitor = getValueNodeVisitor(linkables, { stack });\n\n    // When we visit enum value nodes for this enum type.\n    const resultUp = visit(enumValueNode('direction', 'up'), visitor);\n    const resultRight = visit(enumValueNode('direction', 'right'), visitor);\n    const resultDown = visit(enumValueNode('direction', 'down'), visitor);\n    const resultLeft = visit(enumValueNode('direction', 'left'), visitor);\n\n    // Then we expect the values to be resolved from the linkable type as numbers.\n    expect(resultUp).toBe(0);\n    expect(resultRight).toBe(1);\n    expect(resultDown).toBe(2);\n    expect(resultLeft).toBe(3);\n});\n\ntest('it returns data enum values as objects', () => {\n    // Given a program with a data enum.\n    const definedType = definedTypeNode({\n        name: 'action',\n        type: enumTypeNode([\n            enumEmptyVariantTypeNode('quit'),\n            enumTupleVariantTypeNode('write', tupleTypeNode([fixedSizeTypeNode(stringTypeNode('utf8'), 5)])),\n            enumStructVariantTypeNode(\n                'move',\n                structTypeNode([\n                    structFieldTypeNode({ name: 'x', type: numberTypeNode('u8') }),\n                    structFieldTypeNode({ name: 'y', type: numberTypeNode('u8') }),\n                ]),\n            ),\n        ]),\n    });\n    const root = rootNode(programNode({ definedTypes: [definedType], name: 'myProgram', publicKey: '1111' }));\n\n    // And a LinkableDictionary that recorded the enum.\n    const linkables = new LinkableDictionary();\n    linkables.recordPath([root, root.program, definedType]);\n\n    // And a value node visitor that's under the same program.\n    const stack = new NodeStack([root, root.program]);\n    const visitor = getValueNodeVisitor(linkables, { stack });\n\n    // When we visit enum value nodes for this enum type.\n    const resultQuit = visit(enumValueNode('action', 'quit'), visitor);\n    const resultWrite = visit(enumValueNode('action', 'write', tupleValueNode([stringValueNode('Hello')])), visitor);\n    const resultMove = visit(\n        enumValueNode(\n            'action',\n            'move',\n            structValueNode([\n                structFieldValueNode('x', numberValueNode(10)),\n                structFieldValueNode('y', numberValueNode(20)),\n            ]),\n        ),\n        visitor,\n    );\n\n    // Then we expect the values to be resolved from the linkable type as numbers.\n    expect(resultQuit).toStrictEqual({ __kind: 'Quit' });\n    expect(resultWrite).toStrictEqual({ __kind: 'Write', fields: ['Hello'] });\n    expect(resultMove).toStrictEqual({ __kind: 'Move', x: 10, y: 20 });\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/values/MapValueNode.test.ts",
    "content": "import { mapEntryValueNode, mapValueNode, numberValueNode, stringValueNode } from '@codama/nodes';\nimport { LinkableDictionary, visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { getValueNodeVisitor } from '../../src';\n\ntest('it resolves map value nodes as objects', () => {\n    const node = mapValueNode([\n        mapEntryValueNode(stringValueNode('foo'), numberValueNode(1)),\n        mapEntryValueNode(stringValueNode('bar'), numberValueNode(2)),\n        mapEntryValueNode(stringValueNode('baz'), numberValueNode(3)),\n    ]);\n    const result = visit(node, getValueNodeVisitor(new LinkableDictionary()));\n    expect(result).toStrictEqual({ bar: 2, baz: 3, foo: 1 });\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/values/NoneValueNode.test.ts",
    "content": "import { noneValueNode } from '@codama/nodes';\nimport { LinkableDictionary, visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { getValueNodeVisitor } from '../../src';\n\ntest('it returns a None value object', () => {\n    const result = visit(noneValueNode(), getValueNodeVisitor(new LinkableDictionary()));\n    expect(result).toStrictEqual({ __option: 'None' });\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/values/NumberValueNode.test.ts",
    "content": "import { numberValueNode } from '@codama/nodes';\nimport { LinkableDictionary, visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { getValueNodeVisitor } from '../../src';\n\ntest('it returns the number as-is', () => {\n    const result = visit(numberValueNode(42), getValueNodeVisitor(new LinkableDictionary()));\n    expect(result).toBe(42);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/values/PublicKeyValueNode.test.ts",
    "content": "import { publicKeyValueNode } from '@codama/nodes';\nimport { LinkableDictionary, visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { getValueNodeVisitor } from '../../src';\n\ntest('it returns the public key as-is', () => {\n    const visitor = getValueNodeVisitor(new LinkableDictionary());\n    const result = visit(publicKeyValueNode('B3SqCE8ww4xmoPcfm1gGibZENPkPCVp3jNwkYcg7xS6j'), visitor);\n    expect(result).toBe('B3SqCE8ww4xmoPcfm1gGibZENPkPCVp3jNwkYcg7xS6j');\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/values/SetValueNode.test.ts",
    "content": "import { numberValueNode, setValueNode } from '@codama/nodes';\nimport { LinkableDictionary, visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { getValueNodeVisitor } from '../../src';\n\ntest('it returns an array of all resolved value nodes', () => {\n    const node = setValueNode([numberValueNode(1), numberValueNode(2), numberValueNode(3)]);\n    const result = visit(node, getValueNodeVisitor(new LinkableDictionary()));\n    expect(result).toStrictEqual([1, 2, 3]);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/values/SomeValueNode.test.ts",
    "content": "import { someValueNode, stringValueNode } from '@codama/nodes';\nimport { LinkableDictionary, visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { getValueNodeVisitor } from '../../src';\n\ntest('it wraps the underlying value in a value object', () => {\n    const result = visit(someValueNode(stringValueNode('Hello World!')), getValueNodeVisitor(new LinkableDictionary()));\n    expect(result).toStrictEqual({ __option: 'Some', value: 'Hello World!' });\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/values/StringValueNode.test.ts",
    "content": "import { stringValueNode } from '@codama/nodes';\nimport { LinkableDictionary, visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { getValueNodeVisitor } from '../../src';\n\ntest('it returns the string as-is', () => {\n    const result = visit(stringValueNode('Hello World!'), getValueNodeVisitor(new LinkableDictionary()));\n    expect(result).toBe('Hello World!');\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/values/StructValueNode.test.ts",
    "content": "import { numberValueNode, stringValueNode, structFieldValueNode, structValueNode } from '@codama/nodes';\nimport { LinkableDictionary, visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { getValueNodeVisitor } from '../../src';\n\ntest('it returns struct values as objects', () => {\n    const node = structValueNode([\n        structFieldValueNode('firstname', stringValueNode('John')),\n        structFieldValueNode('age', numberValueNode(42)),\n    ]);\n    const result = visit(node, getValueNodeVisitor(new LinkableDictionary()));\n    expect(result).toStrictEqual({ age: 42, firstname: 'John' });\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/test/values/TupleValueNode.test.ts",
    "content": "import { booleanValueNode, numberValueNode, stringValueNode, tupleValueNode } from '@codama/nodes';\nimport { LinkableDictionary, visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { getValueNodeVisitor } from '../../src';\n\ntest('it returns the tuple as an array of values', () => {\n    const node = tupleValueNode([numberValueNode(42), stringValueNode('Hello'), booleanValueNode(true)]);\n    const result = visit(node, getValueNodeVisitor(new LinkableDictionary()));\n    expect(result).toStrictEqual([42, 'Hello', true]);\n});\n"
  },
  {
    "path": "packages/dynamic-codecs/tsconfig.declarations.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"declarationMap\": true,\n        \"emitDeclarationOnly\": true,\n        \"outDir\": \"./dist/types\"\n    },\n    \"extends\": \"./tsconfig.json\",\n    \"include\": [\"src/index.ts\", \"src/types\"]\n}\n"
  },
  {
    "path": "packages/dynamic-codecs/tsconfig.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": { \"lib\": [] },\n    \"display\": \"@codama/dynamic-codecs\",\n    \"extends\": \"../../tsconfig.json\",\n    \"include\": [\"src\", \"test\"]\n}\n"
  },
  {
    "path": "packages/dynamic-codecs/tsup.config.ts",
    "content": "import { defineConfig } from 'tsup';\n\nimport { getPackageBuildConfigs } from '../../tsup.config.base';\n\nexport default defineConfig(getPackageBuildConfigs());\n"
  },
  {
    "path": "packages/dynamic-codecs/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\nimport { getVitestConfig } from '../../vitest.config.base.mjs';\n\nexport default defineConfig({\n    test: {\n        projects: [getVitestConfig('browser'), getVitestConfig('node'), getVitestConfig('react-native')],\n    },\n});\n"
  },
  {
    "path": "packages/dynamic-parsers/.gitignore",
    "content": "dist/\n"
  },
  {
    "path": "packages/dynamic-parsers/.prettierignore",
    "content": "dist/\ntest/e2e/\ntest-ledger/\ntarget/\nCHANGELOG.md\n"
  },
  {
    "path": "packages/dynamic-parsers/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Codama\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/dynamic-parsers/README.md",
    "content": "# Codama ➤ Dynamic Parsers\n\n[![npm][npm-image]][npm-url]\n[![npm-downloads][npm-downloads-image]][npm-url]\n\n[npm-downloads-image]: https://img.shields.io/npm/dm/@codama/dynamic-parsers.svg?style=flat\n[npm-image]: https://img.shields.io/npm/v/@codama/dynamic-parsers.svg?style=flat&label=%40codama%2Fdynamic-parsers\n[npm-url]: https://www.npmjs.com/package/@codama/dynamic-parsers\n\nThis package provides a set of helpers that, given any Codama IDL, dynamically identifies and parses any byte array into deserialized accounts, events, and instructions.\n\n## Installation\n\n```sh\npnpm install @codama/dynamic-parsers\n```\n\n> [!NOTE]\n> This package is **not** included in the main [`codama`](../library) package.\n\n## Types\n\n### `ParsedData<TNode>`\n\nThis type represents the result of identifying and parsing a byte array from a given root node. It provides us with the full `NodePath` of the identified node, as well as the data deserialized from the provided bytes.\n\n```ts\ntype ParsedData<TNode extends AccountNode | EventNode | InstructionNode> = {\n    data: unknown;\n    path: NodePath<TNode>;\n};\n```\n\n## Functions\n\n### `parseAccountData(rootNode, bytes)`\n\nGiven a `RootNode` and a byte array, this function will attempt to identify the correct account node and use it to deserialize the provided bytes. Therefore, it returns a `ParsedData<AccountNode>` object if the parsing was successful, or `undefined` otherwise.\n\n```ts\nconst parsedData = parseAccountData(rootNode, bytes);\n// ^ ParsedData<AccountNode> | undefined\n\nif (parsedData) {\n    const accountNode: AccountNode = getLastNodeFromPath(parsedData.path);\n    const decodedData: unknown = parsedData.data;\n}\n```\n\n### `parseEventData(rootNode, bytes)`\n\nSimilarly to `parseAccountData`, this function will match the provided bytes to an event node and deserialize them accordingly. It returns a `ParsedData<EventNode>` object if the parsing was successful, or `undefined` otherwise.\n\n```ts\nconst parsedData = parseEventData(rootNode, bytes);\n// ^ ParsedData<EventNode> | undefined\n\nif (parsedData) {\n    const eventNode: EventNode = getLastNodeFromPath(parsedData.path);\n    const decodedData: unknown = parsedData.data;\n}\n```\n\n### `parseInstructionData(rootNode, bytes)`\n\nSimilarly to `parseAccountData`, this function will match the provided bytes to an instruction node and deserialize them accordingly. It returns a `ParsedData<InstructionNode>` object if the parsing was successful, or `undefined` otherwise.\n\n```ts\nconst parsedData = parseInstructionData(rootNode, bytes);\n// ^ ParsedData<InstructionNode> | undefined\n\nif (parsedData) {\n    const instructionNode: InstructionNode = getLastNodeFromPath(parsedData.path);\n    const decodedData: unknown = parsedData.data;\n}\n```\n\n### `parseInstruction(rootNode, instruction)`\n\nThis function accepts a `RootNode` and an `Instruction` type — as defined in `@solana/instructions` — in order to return a `ParsedData<InstructionNode>` object that also includes an `accounts` array that match each `AccountMeta` with its corresponding account name.\n\n```ts\nconst parsedData = parseInstruction(rootNode, instruction);\n\nif (parsedData) {\n    const namedAccounts = parsedData.accounts;\n    // ^ Array<AccountMeta & { name: string }>\n}\n```\n\n### `identifyAccountData`\n\nThis function tries to match the provided bytes to an account node, returning a `NodePath<AccountNode>` object if the identification was successful, or `undefined` otherwise. It is used by the `parseAccountData` function under the hood.\n\n```ts\nconst path = identifyAccountData(root, bytes);\n// ^ NodePath<AccountNode> | undefined\n\nif (path) {\n    const accountNode: AccountNode = getLastNodeFromPath(path);\n}\n```\n\n### `identifyInstructionData`\n\nThis function tries to match the provided bytes to an instruction node, returning a `NodePath<InstructionNode>` object if the identification was successful, or `undefined` otherwise. It is used by the `parseInstructionData` function under the hood.\n\n```ts\nconst path = identifyInstructionData(root, bytes);\n// ^ NodePath<InstructionNode> | undefined\n\nif (path) {\n    const instructionNode: InstructionNode = getLastNodeFromPath(path);\n}\n```\n\n### `identifyEventData`\n\nThis function tries to match the provided bytes to an event node, returning a `NodePath<EventNode>` object if the identification was successful, or `undefined` otherwise. It is used by the `parseEventData` function under the hood.\n\n```ts\nconst path = identifyEventData(root, bytes);\n// ^ NodePath<EventNode> | undefined\n\nif (path) {\n    const eventNode: EventNode = getLastNodeFromPath(path);\n}\n```\n"
  },
  {
    "path": "packages/dynamic-parsers/package.json",
    "content": "{\n    \"name\": \"@codama/dynamic-parsers\",\n    \"version\": \"1.2.0\",\n    \"description\": \"Helpers to dynamically identify and parse accounts and instructions\",\n    \"exports\": {\n        \"types\": \"./dist/types/index.d.ts\",\n        \"react-native\": \"./dist/index.react-native.mjs\",\n        \"browser\": {\n            \"import\": \"./dist/index.browser.mjs\",\n            \"require\": \"./dist/index.browser.cjs\"\n        },\n        \"node\": {\n            \"import\": \"./dist/index.node.mjs\",\n            \"require\": \"./dist/index.node.cjs\"\n        }\n    },\n    \"browser\": {\n        \"./dist/index.node.cjs\": \"./dist/index.browser.cjs\",\n        \"./dist/index.node.mjs\": \"./dist/index.browser.mjs\"\n    },\n    \"main\": \"./dist/index.node.cjs\",\n    \"module\": \"./dist/index.node.mjs\",\n    \"react-native\": \"./dist/index.react-native.mjs\",\n    \"types\": \"./dist/types/index.d.ts\",\n    \"type\": \"commonjs\",\n    \"files\": [\n        \"./dist/types\",\n        \"./dist/index.*\"\n    ],\n    \"sideEffects\": false,\n    \"keywords\": [\n        \"solana\",\n        \"framework\",\n        \"standard\",\n        \"specifications\",\n        \"parsers\"\n    ],\n    \"scripts\": {\n        \"build\": \"rimraf dist && tsup && tsc -p ./tsconfig.declarations.json\",\n        \"dev\": \"vitest --project node\",\n        \"lint\": \"eslint . && prettier --check .\",\n        \"lint:fix\": \"eslint --fix . && prettier --write .\",\n        \"test\": \"pnpm test:types && pnpm test:treeshakability && pnpm test:unit\",\n        \"test:treeshakability\": \"for file in dist/index.*.mjs; do agadoo $file; done\",\n        \"test:types\": \"tsc --noEmit\",\n        \"test:unit\": \"vitest run\"\n    },\n    \"dependencies\": {\n        \"@codama/dynamic-codecs\": \"workspace:*\",\n        \"@codama/errors\": \"workspace:*\",\n        \"@codama/nodes\": \"workspace:*\",\n        \"@codama/visitors-core\": \"workspace:*\",\n        \"@solana/instructions\": \"^5.3.0\"\n    },\n    \"devDependencies\": {\n        \"@solana/codecs\": \"^5.3.0\"\n    },\n    \"license\": \"MIT\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/codama-idl/codama\"\n    },\n    \"bugs\": {\n        \"url\": \"http://github.com/codama-idl/codama/issues\"\n    },\n    \"browserslist\": [\n        \"supports bigint and not dead\",\n        \"maintained node versions\"\n    ]\n}\n"
  },
  {
    "path": "packages/dynamic-parsers/src/discriminators.ts",
    "content": "import { CodecAndValueVisitors, containsBytes, ReadonlyUint8Array } from '@codama/dynamic-codecs';\nimport {\n    CODAMA_ERROR__DISCRIMINATOR_FIELD_HAS_NO_DEFAULT_VALUE,\n    CODAMA_ERROR__DISCRIMINATOR_FIELD_NOT_FOUND,\n    CodamaError,\n} from '@codama/errors';\nimport {\n    assertIsNode,\n    ConstantDiscriminatorNode,\n    constantDiscriminatorNode,\n    constantValueNode,\n    DiscriminatorNode,\n    FieldDiscriminatorNode,\n    isNode,\n    SizeDiscriminatorNode,\n    StructTypeNode,\n    TypeNode,\n} from '@codama/nodes';\nimport { visit } from '@codama/visitors-core';\n\nexport function matchDiscriminators(\n    bytes: ReadonlyUint8Array,\n    discriminators: DiscriminatorNode[],\n    typeNode: TypeNode,\n    visitors: CodecAndValueVisitors,\n): boolean {\n    return (\n        discriminators.length > 0 &&\n        discriminators.every(discriminator => matchDiscriminator(bytes, discriminator, typeNode, visitors))\n    );\n}\n\nfunction matchDiscriminator(\n    bytes: ReadonlyUint8Array,\n    discriminator: DiscriminatorNode,\n    typeNode: TypeNode,\n    visitors: CodecAndValueVisitors,\n): boolean {\n    if (isNode(discriminator, 'constantDiscriminatorNode')) {\n        return matchConstantDiscriminator(bytes, discriminator, visitors);\n    }\n    if (isNode(discriminator, 'fieldDiscriminatorNode')) {\n        return matchFieldDiscriminator(bytes, discriminator, typeNode, visitors);\n    }\n    assertIsNode(discriminator, 'sizeDiscriminatorNode');\n    return matchSizeDiscriminator(bytes, discriminator);\n}\n\nfunction matchConstantDiscriminator(\n    bytes: ReadonlyUint8Array,\n    discriminator: ConstantDiscriminatorNode,\n    { codecVisitor, valueVisitor }: CodecAndValueVisitors,\n): boolean {\n    const codec = visit(discriminator.constant.type, codecVisitor);\n    const value = visit(discriminator.constant.value, valueVisitor);\n    const bytesToMatch = codec.encode(value);\n    return containsBytes(bytes, bytesToMatch, discriminator.offset);\n}\n\nfunction matchFieldDiscriminator(\n    bytes: ReadonlyUint8Array,\n    discriminator: FieldDiscriminatorNode,\n    typeNode: TypeNode,\n    visitors: CodecAndValueVisitors,\n): boolean {\n    if (!isNode(typeNode, 'structTypeNode')) {\n        throw new CodamaError(CODAMA_ERROR__DISCRIMINATOR_FIELD_NOT_FOUND, {\n            field: discriminator.name,\n        });\n    }\n    const struct = typeNode as StructTypeNode;\n    const field = struct.fields.find(field => field.name === discriminator.name);\n    if (!field) {\n        throw new CodamaError(CODAMA_ERROR__DISCRIMINATOR_FIELD_NOT_FOUND, {\n            field: discriminator.name,\n        });\n    }\n    if (!field.defaultValue) {\n        throw new CodamaError(CODAMA_ERROR__DISCRIMINATOR_FIELD_HAS_NO_DEFAULT_VALUE, {\n            field: discriminator.name,\n        });\n    }\n    const constantNode = constantValueNode(field.type, field.defaultValue);\n    const constantDiscriminator = constantDiscriminatorNode(constantNode, discriminator.offset);\n    return matchConstantDiscriminator(bytes, constantDiscriminator, visitors);\n}\n\nfunction matchSizeDiscriminator(bytes: ReadonlyUint8Array, discriminator: SizeDiscriminatorNode): boolean {\n    return bytes.length === discriminator.size;\n}\n"
  },
  {
    "path": "packages/dynamic-parsers/src/identify.ts",
    "content": "import { CodecAndValueVisitors, getCodecAndValueVisitors, ReadonlyUint8Array } from '@codama/dynamic-codecs';\nimport {\n    AccountNode,\n    EventNode,\n    GetNodeFromKind,\n    InstructionNode,\n    isNodeFilter,\n    resolveNestedTypeNode,\n    RootNode,\n    structTypeNodeFromInstructionArgumentNodes,\n} from '@codama/nodes';\nimport {\n    getRecordLinkablesVisitor,\n    LinkableDictionary,\n    NodePath,\n    NodeStack,\n    pipe,\n    recordNodeStackVisitor,\n    visit,\n    Visitor,\n} from '@codama/visitors-core';\n\nimport { matchDiscriminators } from './discriminators';\n\nexport function identifyAccountData(\n    root: RootNode,\n    bytes: ReadonlyUint8Array | Uint8Array,\n): NodePath<AccountNode> | undefined {\n    return identifyData(root, bytes, 'accountNode');\n}\n\nexport function identifyEventData(\n    root: RootNode,\n    bytes: ReadonlyUint8Array | Uint8Array,\n): NodePath<EventNode> | undefined {\n    return identifyData(root, bytes, 'eventNode');\n}\n\nexport function identifyInstructionData(\n    root: RootNode,\n    bytes: ReadonlyUint8Array | Uint8Array,\n): NodePath<InstructionNode> | undefined {\n    return identifyData(root, bytes, 'instructionNode');\n}\n\nexport function identifyData<TKind extends 'accountNode' | 'eventNode' | 'instructionNode'>(\n    root: RootNode,\n    bytes: ReadonlyUint8Array | Uint8Array,\n    kind?: TKind | TKind[],\n): NodePath<GetNodeFromKind<TKind>> | undefined {\n    const stack = new NodeStack();\n    const linkables = new LinkableDictionary();\n    visit(root, getRecordLinkablesVisitor(linkables));\n\n    const codecAndValueVisitors = getCodecAndValueVisitors(linkables, { stack });\n    const visitor = getByteIdentificationVisitor(\n        kind ?? (['accountNode', 'instructionNode', 'eventNode'] as TKind[]),\n        bytes,\n        codecAndValueVisitors,\n        { stack },\n    );\n\n    return visit(root, visitor);\n}\n\nexport function getByteIdentificationVisitor<TKind extends 'accountNode' | 'eventNode' | 'instructionNode'>(\n    kind: TKind | TKind[],\n    bytes: ReadonlyUint8Array | Uint8Array,\n    codecAndValueVisitors: CodecAndValueVisitors,\n    options: { stack?: NodeStack } = {},\n) {\n    const stack = options.stack ?? new NodeStack();\n\n    return pipe(\n        {\n            visitAccount(node) {\n                if (!node.discriminators) return;\n                const struct = resolveNestedTypeNode(node.data);\n                const match = matchDiscriminators(bytes, node.discriminators, struct, codecAndValueVisitors);\n                return match ? stack.getPath(node.kind) : undefined;\n            },\n            visitEvent(node) {\n                if (!node.discriminators) return;\n                const match = matchDiscriminators(\n                    bytes,\n                    node.discriminators,\n                    resolveNestedTypeNode(node.data),\n                    codecAndValueVisitors,\n                );\n                return match ? stack.getPath(node.kind) : undefined;\n            },\n            visitInstruction(node) {\n                if (!node.discriminators) return;\n                const struct = structTypeNodeFromInstructionArgumentNodes(node.arguments);\n                const match = matchDiscriminators(bytes, node.discriminators, struct, codecAndValueVisitors);\n                return match ? stack.getPath(node.kind) : undefined;\n            },\n            visitProgram(node) {\n                const candidates = [...node.accounts, ...node.events, ...node.instructions].filter(isNodeFilter(kind));\n                for (const candidate of candidates) {\n                    const result = visit(candidate, this);\n                    if (result) return result;\n                }\n            },\n            visitRoot(node) {\n                return visit(node.program, this);\n            },\n        } as Visitor<\n            NodePath<GetNodeFromKind<TKind>> | undefined,\n            'accountNode' | 'eventNode' | 'instructionNode' | 'programNode' | 'rootNode'\n        >,\n        v => recordNodeStackVisitor(v, stack),\n    );\n}\n"
  },
  {
    "path": "packages/dynamic-parsers/src/index.ts",
    "content": "export * from './identify';\nexport * from './parsers';\n"
  },
  {
    "path": "packages/dynamic-parsers/src/parsers.ts",
    "content": "import { getNodeCodec, ReadonlyUint8Array } from '@codama/dynamic-codecs';\nimport { AccountNode, CamelCaseString, EventNode, GetNodeFromKind, InstructionNode, RootNode } from '@codama/nodes';\nimport { getLastNodeFromPath, NodePath } from '@codama/visitors-core';\nimport type {\n    AccountLookupMeta,\n    AccountMeta,\n    Instruction,\n    InstructionWithAccounts,\n    InstructionWithData,\n} from '@solana/instructions';\n\nimport { identifyData } from './identify';\n\ntype ParsableNode = AccountNode | EventNode | InstructionNode;\ntype ParsableNodeKind = ParsableNode['kind'];\n\nexport type ParsedData<TNode extends ParsableNode> = {\n    data: unknown;\n    path: NodePath<TNode>;\n};\n\nexport function parseAccountData(\n    root: RootNode,\n    bytes: ReadonlyUint8Array | Uint8Array,\n): ParsedData<AccountNode> | undefined {\n    return parseData(root, bytes, 'accountNode');\n}\n\nexport function parseEventData(\n    root: RootNode,\n    bytes: ReadonlyUint8Array | Uint8Array,\n): ParsedData<EventNode> | undefined {\n    return parseData(root, bytes, 'eventNode');\n}\n\nexport function parseInstructionData(\n    root: RootNode,\n    bytes: ReadonlyUint8Array | Uint8Array,\n): ParsedData<InstructionNode> | undefined {\n    return parseData(root, bytes, 'instructionNode');\n}\n\nexport function parseData<TKind extends ParsableNodeKind>(\n    root: RootNode,\n    bytes: ReadonlyUint8Array | Uint8Array,\n    kind?: TKind | TKind[],\n): ParsedData<GetNodeFromKind<TKind>> | undefined {\n    const path = identifyData<TKind>(root, bytes, kind ?? (['accountNode', 'instructionNode', 'eventNode'] as TKind[]));\n    if (!path) return undefined;\n    const codec = getNodeCodec(path as NodePath<ParsableNode>);\n    const data = codec.decode(bytes);\n    return { data, path };\n}\n\ntype ParsedInstructionAccounts = ReadonlyArray<AccountMeta & { name: CamelCaseString }>;\ntype ParsedInstruction = ParsedData<InstructionNode> & { accounts: ParsedInstructionAccounts };\n\nexport function parseInstruction(\n    root: RootNode,\n    instruction: Instruction &\n        InstructionWithAccounts<readonly (AccountLookupMeta | AccountMeta)[]> &\n        InstructionWithData<ReadonlyUint8Array>,\n): ParsedInstruction | undefined {\n    const parsedData = parseInstructionData(root, instruction.data);\n    if (!parsedData) return undefined;\n    const instructionNode = getLastNodeFromPath(parsedData.path);\n    const accounts: ParsedInstructionAccounts = instructionNode.accounts.flatMap((account, index) => {\n        const accountMeta = instruction.accounts[index];\n        if (!accountMeta) return [];\n        return [{ ...accountMeta, name: account.name }];\n    });\n    return { ...parsedData, accounts };\n}\n"
  },
  {
    "path": "packages/dynamic-parsers/src/types/global.d.ts",
    "content": "declare const __BROWSER__: boolean;\ndeclare const __ESM__: boolean;\ndeclare const __NODEJS__: boolean;\ndeclare const __REACTNATIVE__: boolean;\ndeclare const __TEST__: boolean;\ndeclare const __VERSION__: string;\n"
  },
  {
    "path": "packages/dynamic-parsers/test/_setup.ts",
    "content": "import { getBase16Encoder, ReadonlyUint8Array } from '@solana/codecs';\n\nexport function hex(hexadecimal: string): ReadonlyUint8Array {\n    return getBase16Encoder().encode(hexadecimal);\n}\n"
  },
  {
    "path": "packages/dynamic-parsers/test/discriminators.test.ts",
    "content": "import { CodecAndValueVisitors, getCodecAndValueVisitors } from '@codama/dynamic-codecs';\nimport {\n    CODAMA_ERROR__DISCRIMINATOR_FIELD_HAS_NO_DEFAULT_VALUE,\n    CODAMA_ERROR__DISCRIMINATOR_FIELD_NOT_FOUND,\n    CodamaError,\n} from '@codama/errors';\nimport {\n    accountNode,\n    constantDiscriminatorNode,\n    constantValueNode,\n    constantValueNodeFromBytes,\n    definedTypeLinkNode,\n    definedTypeNode,\n    fieldDiscriminatorNode,\n    fixedSizeTypeNode,\n    numberTypeNode,\n    numberValueNode,\n    programLinkNode,\n    programNode,\n    rootNode,\n    sizeDiscriminatorNode,\n    stringTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n} from '@codama/nodes';\nimport { getRecordLinkablesVisitor, LinkableDictionary, NodeStack, visit } from '@codama/visitors-core';\nimport { beforeEach, describe, expect, test } from 'vitest';\n\nimport { matchDiscriminators } from '../src/discriminators';\nimport { hex } from './_setup';\n\ndescribe('matchDiscriminators', () => {\n    let linkables: LinkableDictionary;\n    let codecAndValueVisitors: CodecAndValueVisitors;\n    beforeEach(() => {\n        linkables = new LinkableDictionary();\n        codecAndValueVisitors = getCodecAndValueVisitors(linkables);\n    });\n    test('it does not match if no discriminators are provided', () => {\n        const result = matchDiscriminators(hex('ff'), [], structTypeNode([]), codecAndValueVisitors);\n        expect(result).toBe(false);\n    });\n    describe('size discriminators', () => {\n        test('it returns true if the size matches exactly', () => {\n            const result = matchDiscriminators(\n                hex('0102030405'),\n                [sizeDiscriminatorNode(5)],\n                structTypeNode([]),\n                codecAndValueVisitors,\n            );\n            expect(result).toBe(true);\n        });\n        test('it returns false if the size is lower', () => {\n            const result = matchDiscriminators(\n                hex('01020304'),\n                [sizeDiscriminatorNode(5)],\n                structTypeNode([]),\n                codecAndValueVisitors,\n            );\n            expect(result).toBe(false);\n        });\n        test('it returns false if the size is greater', () => {\n            const result = matchDiscriminators(\n                hex('010203040506'),\n                [sizeDiscriminatorNode(5)],\n                structTypeNode([]),\n                codecAndValueVisitors,\n            );\n            expect(result).toBe(false);\n        });\n    });\n    describe('constant discriminators', () => {\n        test('it returns true if the bytes start with the provided constant', () => {\n            const discriminator = constantDiscriminatorNode(constantValueNodeFromBytes('base16', 'ff'));\n            const result = matchDiscriminators(\n                hex('ff0102030405'),\n                [discriminator],\n                structTypeNode([]),\n                codecAndValueVisitors,\n            );\n            expect(result).toBe(true);\n        });\n        test('it returns false if the bytes do not start with the provided constant', () => {\n            const discriminator = constantDiscriminatorNode(constantValueNodeFromBytes('base16', 'ff'));\n            const result = matchDiscriminators(\n                hex('aa0102030405'),\n                [discriminator],\n                structTypeNode([]),\n                codecAndValueVisitors,\n            );\n            expect(result).toBe(false);\n        });\n        test('it returns true if the bytes match with the provided constant at the given offset', () => {\n            const discriminator = constantDiscriminatorNode(\n                constantValueNodeFromBytes('base16', 'ff'),\n                3 /** offset */,\n            );\n            const result = matchDiscriminators(\n                hex('010203ff0405'),\n                [discriminator],\n                structTypeNode([]),\n                codecAndValueVisitors,\n            );\n            expect(result).toBe(true);\n        });\n        test('it returns false if the bytes do not match with the provided constant at the given offset', () => {\n            const discriminator = constantDiscriminatorNode(\n                constantValueNodeFromBytes('base16', 'ff'),\n                3 /** offset */,\n            );\n            const result = matchDiscriminators(\n                hex('010203aa0405'),\n                [discriminator],\n                structTypeNode([]),\n                codecAndValueVisitors,\n            );\n            expect(result).toBe(false);\n        });\n        test('it resolves link nodes correctly', () => {\n            // Given two link nodes designed so that the path would\n            // fail if we did not save and restored linked paths.\n            const discriminator = constantDiscriminatorNode(\n                constantValueNode(definedTypeLinkNode('typeB1', programLinkNode('programB')), numberValueNode(42)),\n            );\n            const programA = programNode({\n                accounts: [accountNode({ discriminators: [discriminator], name: 'myAccount' })],\n                definedTypes: [\n                    definedTypeNode({\n                        name: 'typeA',\n                        type: definedTypeLinkNode('typeB1', programLinkNode('programB')),\n                    }),\n                ],\n                name: 'programA',\n                publicKey: '1111',\n            });\n            const programB = programNode({\n                definedTypes: [\n                    definedTypeNode({ name: 'typeB1', type: definedTypeLinkNode('typeB2') }),\n                    definedTypeNode({ name: 'typeB2', type: numberTypeNode('u32') }),\n                ],\n                name: 'programB',\n                publicKey: '2222',\n            });\n            const root = rootNode(programA, [programB]);\n\n            // And given a recorded linkables dictionary.\n            const linkables = new LinkableDictionary();\n            visit(root, getRecordLinkablesVisitor(linkables));\n\n            // And a stack keeping track of the current visited nodes.\n            const stack = new NodeStack([root, programA, programA.accounts[0]]);\n            codecAndValueVisitors = getCodecAndValueVisitors(linkables, { stack });\n\n            // When we match the discriminator which should resolve to a u32 number equal to 42.\n            const result = matchDiscriminators(\n                hex('2a0000000102030405'),\n                [discriminator],\n                structTypeNode([]),\n                codecAndValueVisitors,\n            );\n\n            // Then we expect the discriminator to match.\n            expect(result).toBe(true);\n        });\n    });\n    describe('field discriminators', () => {\n        test('it returns true if the bytes start with the provided field default value', () => {\n            const discriminator = fieldDiscriminatorNode('key');\n            const fields = structTypeNode([\n                structFieldTypeNode({\n                    defaultValue: numberValueNode(0xff),\n                    name: 'key',\n                    type: numberTypeNode('u8'),\n                }),\n            ]);\n            const result = matchDiscriminators(hex('ff0102030405'), [discriminator], fields, codecAndValueVisitors);\n            expect(result).toBe(true);\n        });\n        test('it returns false if the bytes do not start with the provided field default value', () => {\n            const discriminator = fieldDiscriminatorNode('key');\n            const fields = structTypeNode([\n                structFieldTypeNode({\n                    defaultValue: numberValueNode(0xff),\n                    name: 'key',\n                    type: numberTypeNode('u8'),\n                }),\n            ]);\n            const result = matchDiscriminators(hex('aa0102030405'), [discriminator], fields, codecAndValueVisitors);\n            expect(result).toBe(false);\n        });\n        test('it returns true if the bytes match with the provided field default value at the given offset', () => {\n            const discriminator = fieldDiscriminatorNode('key', 3 /** offset */);\n            const fields = structTypeNode([\n                structFieldTypeNode({ name: 'id', type: fixedSizeTypeNode(stringTypeNode('utf8'), 3) }),\n                structFieldTypeNode({\n                    defaultValue: numberValueNode(0xff),\n                    name: 'key',\n                    type: numberTypeNode('u8'),\n                }),\n            ]);\n            const result = matchDiscriminators(hex('010203ff0405'), [discriminator], fields, codecAndValueVisitors);\n            expect(result).toBe(true);\n        });\n        test('it returns false if the bytes do not match with the provided field default value at the given offset', () => {\n            const discriminator = fieldDiscriminatorNode('key', 3 /** offset */);\n            const fields = structTypeNode([\n                structFieldTypeNode({ name: 'id', type: fixedSizeTypeNode(stringTypeNode('utf8'), 3) }),\n                structFieldTypeNode({\n                    defaultValue: numberValueNode(0xff),\n                    name: 'key',\n                    type: numberTypeNode('u8'),\n                }),\n            ]);\n            const result = matchDiscriminators(hex('010203aa0405'), [discriminator], fields, codecAndValueVisitors);\n            expect(result).toBe(false);\n        });\n        test('it throws an error if the discriminator field is not found', () => {\n            const discriminator = fieldDiscriminatorNode('key');\n            const fields = structTypeNode([]);\n            expect(() =>\n                matchDiscriminators(hex('0102030405'), [discriminator], fields, codecAndValueVisitors),\n            ).toThrow(new CodamaError(CODAMA_ERROR__DISCRIMINATOR_FIELD_NOT_FOUND, { field: 'key' }));\n        });\n        test('it throws an error if the discriminator field does not have a default value', () => {\n            const discriminator = fieldDiscriminatorNode('key');\n            const fields = structTypeNode([\n                structFieldTypeNode({\n                    name: 'key',\n                    type: numberTypeNode('u8'),\n                }),\n            ]);\n            expect(() =>\n                matchDiscriminators(hex('0102030405'), [discriminator], fields, codecAndValueVisitors),\n            ).toThrow(new CodamaError(CODAMA_ERROR__DISCRIMINATOR_FIELD_HAS_NO_DEFAULT_VALUE, { field: 'key' }));\n        });\n        test('it resolves link nodes correctly', () => {\n            // Given two link nodes designed so that the path would\n            // fail if we did not save and restored linked paths.\n            const discriminator = fieldDiscriminatorNode('key');\n            const fields = structTypeNode([\n                structFieldTypeNode({\n                    defaultValue: numberValueNode(42),\n                    name: 'key',\n                    type: definedTypeLinkNode('typeB1', programLinkNode('programB')),\n                }),\n            ]);\n            const programA = programNode({\n                accounts: [accountNode({ data: fields, discriminators: [discriminator], name: 'myAccount' })],\n                definedTypes: [\n                    definedTypeNode({\n                        name: 'typeA',\n                        type: definedTypeLinkNode('typeB1', programLinkNode('programB')),\n                    }),\n                ],\n                name: 'programA',\n                publicKey: '1111',\n            });\n            const programB = programNode({\n                definedTypes: [\n                    definedTypeNode({ name: 'typeB1', type: definedTypeLinkNode('typeB2') }),\n                    definedTypeNode({ name: 'typeB2', type: numberTypeNode('u32') }),\n                ],\n                name: 'programB',\n                publicKey: '2222',\n            });\n            const root = rootNode(programA, [programB]);\n\n            // And given a recorded linkables dictionary.\n            const linkables = new LinkableDictionary();\n            visit(root, getRecordLinkablesVisitor(linkables));\n\n            // And a stack keeping track of the current visited nodes.\n            const stack = new NodeStack([root, programA, programA.accounts[0]]);\n            codecAndValueVisitors = getCodecAndValueVisitors(linkables, { stack });\n\n            // When we match the discriminator which should resolve to a u32 number equal to 42.\n            const result = matchDiscriminators(\n                hex('2a0000000102030405'),\n                [discriminator],\n                fields,\n                codecAndValueVisitors,\n            );\n\n            // Then we expect the discriminator to match.\n            expect(result).toBe(true);\n        });\n    });\n    describe('multiple discriminators', () => {\n        test('it returns true if all discriminators match', () => {\n            const result = matchDiscriminators(\n                hex('ff0102030405'),\n                [constantDiscriminatorNode(constantValueNodeFromBytes('base16', 'ff')), sizeDiscriminatorNode(6)],\n                structTypeNode([]),\n                codecAndValueVisitors,\n            );\n            expect(result).toBe(true);\n        });\n        test('it returns false if any discriminator does not match', () => {\n            const result = matchDiscriminators(\n                hex('ff0102030405'),\n                [constantDiscriminatorNode(constantValueNodeFromBytes('base16', 'ff')), sizeDiscriminatorNode(999)],\n                structTypeNode([]),\n                codecAndValueVisitors,\n            );\n            expect(result).toBe(false);\n        });\n        test('it can match on all discriminator types', () => {\n            const result = matchDiscriminators(\n                hex('aabb01020304'),\n                [\n                    fieldDiscriminatorNode('key'),\n                    constantDiscriminatorNode(constantValueNodeFromBytes('base16', 'bb'), 1),\n                    sizeDiscriminatorNode(6),\n                ],\n                structTypeNode([\n                    structFieldTypeNode({\n                        defaultValue: numberValueNode(0xaa),\n                        name: 'key',\n                        type: numberTypeNode('u8'),\n                    }),\n                ]),\n                codecAndValueVisitors,\n            );\n            expect(result).toBe(true);\n        });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-parsers/test/identify.test.ts",
    "content": "import {\n    accountNode,\n    bytesTypeNode,\n    constantDiscriminatorNode,\n    constantValueNode,\n    constantValueNodeFromBytes,\n    eventNode,\n    fixedSizeTypeNode,\n    hiddenPrefixTypeNode,\n    instructionNode,\n    numberTypeNode,\n    programNode,\n    rootNode,\n    sizeDiscriminatorNode,\n    structTypeNode,\n    tupleTypeNode,\n} from '@codama/nodes';\nimport { describe, expect, test } from 'vitest';\n\nimport { identifyAccountData, identifyEventData, identifyInstructionData } from '../src';\nimport { hex } from './_setup';\n\ndescribe('identifyAccountData', () => {\n    test('it identifies an account using its discriminator nodes', () => {\n        const root = rootNode(\n            programNode({\n                accounts: [accountNode({ discriminators: [sizeDiscriminatorNode(4)], name: 'myAccount' })],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        );\n        const result = identifyAccountData(root, hex('01020304'));\n        expect(result).toStrictEqual([root, root.program, root.program.accounts[0]]);\n    });\n    test('it fails to identify accounts whose discriminator nodes do not match the given data', () => {\n        const root = rootNode(\n            programNode({\n                accounts: [accountNode({ discriminators: [sizeDiscriminatorNode(999)], name: 'myAccount' })],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        );\n        const result = identifyAccountData(root, hex('01020304'));\n        expect(result).toBeUndefined();\n    });\n    test('it fails to identify accounts with no discriminator nodes', () => {\n        const root = rootNode(\n            programNode({ accounts: [accountNode({ name: 'myAccount' })], name: 'myProgram', publicKey: '1111' }),\n        );\n        const result = identifyAccountData(root, hex('01020304'));\n        expect(result).toBeUndefined();\n    });\n    test('it identifies the first matching account if multiple accounts match', () => {\n        const root = rootNode(\n            programNode({\n                accounts: [\n                    accountNode({\n                        discriminators: [sizeDiscriminatorNode(4)],\n                        name: 'accountA',\n                    }),\n                    accountNode({\n                        discriminators: [constantDiscriminatorNode(constantValueNodeFromBytes('base16', 'ff'))],\n                        name: 'accountB',\n                    }),\n                ],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        );\n        const result = identifyAccountData(root, hex('ff010203'));\n        expect(result).toStrictEqual([root, root.program, root.program.accounts[0]]);\n    });\n    test('it does not identify accounts in additional programs', () => {\n        const root = rootNode(programNode({ name: 'myProgram', publicKey: '1111' }), [\n            programNode({\n                accounts: [accountNode({ discriminators: [sizeDiscriminatorNode(4)], name: 'myAccount' })],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        ]);\n        const result = identifyAccountData(root, hex('01020304'));\n        expect(result).toBeUndefined();\n    });\n    test('it does not identify accounts using instruction discriminators', () => {\n        const root = rootNode(programNode({ name: 'myProgram', publicKey: '1111' }), [\n            programNode({\n                instructions: [instructionNode({ discriminators: [sizeDiscriminatorNode(4)], name: 'myInstruction' })],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        ]);\n        const result = identifyAccountData(root, hex('01020304'));\n        expect(result).toBeUndefined();\n    });\n});\n\ndescribe('identifyInstructionData', () => {\n    test('it identifies an instruction using its discriminator nodes', () => {\n        const root = rootNode(\n            programNode({\n                instructions: [instructionNode({ discriminators: [sizeDiscriminatorNode(4)], name: 'myInstruction' })],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        );\n        const result = identifyInstructionData(root, hex('01020304'));\n        expect(result).toStrictEqual([root, root.program, root.program.instructions[0]]);\n    });\n    test('it fails to identify instructions whose discriminator nodes do not match the given data', () => {\n        const root = rootNode(\n            programNode({\n                instructions: [\n                    instructionNode({ discriminators: [sizeDiscriminatorNode(999)], name: 'myInstruction' }),\n                ],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        );\n        const result = identifyInstructionData(root, hex('01020304'));\n        expect(result).toBeUndefined();\n    });\n    test('it fails to identify instructions with no discriminator nodes', () => {\n        const root = rootNode(\n            programNode({\n                instructions: [instructionNode({ name: 'myInstruction' })],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        );\n        const result = identifyInstructionData(root, hex('01020304'));\n        expect(result).toBeUndefined();\n    });\n    test('it identifies the first matching instruction if multiple instructions match', () => {\n        const root = rootNode(\n            programNode({\n                instructions: [\n                    instructionNode({\n                        discriminators: [sizeDiscriminatorNode(4)],\n                        name: 'instructionA',\n                    }),\n                    instructionNode({\n                        discriminators: [constantDiscriminatorNode(constantValueNodeFromBytes('base16', 'ff'))],\n                        name: 'instructionB',\n                    }),\n                ],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        );\n        const result = identifyInstructionData(root, hex('ff010203'));\n        expect(result).toStrictEqual([root, root.program, root.program.instructions[0]]);\n    });\n    test('it does not identify instructions in additional programs', () => {\n        const root = rootNode(programNode({ name: 'myProgram', publicKey: '1111' }), [\n            programNode({\n                instructions: [instructionNode({ discriminators: [sizeDiscriminatorNode(4)], name: 'myInstruction' })],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        ]);\n        const result = identifyInstructionData(root, hex('01020304'));\n        expect(result).toBeUndefined();\n    });\n    test('it does not identify instructions using account discriminators', () => {\n        const root = rootNode(programNode({ name: 'myProgram', publicKey: '1111' }), [\n            programNode({\n                accounts: [accountNode({ discriminators: [sizeDiscriminatorNode(4)], name: 'myAccount' })],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        ]);\n        const result = identifyInstructionData(root, hex('01020304'));\n        expect(result).toBeUndefined();\n    });\n});\n\ndescribe('identifyEventData', () => {\n    test('it identifies an event using its discriminator nodes', () => {\n        const root = rootNode(\n            programNode({\n                events: [\n                    eventNode({\n                        data: structTypeNode([]),\n                        discriminators: [sizeDiscriminatorNode(4)],\n                        name: 'myEvent',\n                    }),\n                ],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        );\n        const result = identifyEventData(root, hex('01020304'));\n        expect(result).toStrictEqual([root, root.program, root.program.events[0]]);\n    });\n    test('it fails to identify events whose discriminator nodes do not match the given data', () => {\n        const root = rootNode(\n            programNode({\n                events: [\n                    eventNode({\n                        data: structTypeNode([]),\n                        discriminators: [sizeDiscriminatorNode(999)],\n                        name: 'myEvent',\n                    }),\n                ],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        );\n        const result = identifyEventData(root, hex('01020304'));\n        expect(result).toBeUndefined();\n    });\n    test('it fails to identify events with no discriminator nodes', () => {\n        const root = rootNode(\n            programNode({\n                events: [eventNode({ data: structTypeNode([]), name: 'myEvent' })],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        );\n        const result = identifyEventData(root, hex('01020304'));\n        expect(result).toBeUndefined();\n    });\n    test('it does not identify events using instruction discriminators', () => {\n        const root = rootNode(\n            programNode({\n                instructions: [instructionNode({ discriminators: [sizeDiscriminatorNode(4)], name: 'myInstruction' })],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        );\n        const result = identifyEventData(root, hex('01020304'));\n        expect(result).toBeUndefined();\n    });\n    test('it identifies tuple events using constant discriminators', () => {\n        const root = rootNode(\n            programNode({\n                events: [\n                    eventNode({\n                        data: hiddenPrefixTypeNode(tupleTypeNode([numberTypeNode('u32')]), [\n                            constantValueNode(\n                                fixedSizeTypeNode(bytesTypeNode(), 2),\n                                constantValueNodeFromBytes('base16', '0102'),\n                            ),\n                        ]),\n                        discriminators: [\n                            constantDiscriminatorNode(\n                                constantValueNode(\n                                    fixedSizeTypeNode(bytesTypeNode(), 2),\n                                    constantValueNodeFromBytes('base16', '0102'),\n                                ),\n                            ),\n                        ],\n                        name: 'tupleEvent',\n                    }),\n                ],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        );\n        const result = identifyEventData(root, hex('01022a000000'));\n        expect(result).toStrictEqual([root, root.program, root.program.events[0]]);\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-parsers/test/parsers.test.ts",
    "content": "import {\n    accountNode,\n    bytesTypeNode,\n    constantDiscriminatorNode,\n    constantValueNode,\n    constantValueNodeFromBytes,\n    eventNode,\n    fieldDiscriminatorNode,\n    fixedSizeTypeNode,\n    hiddenPrefixTypeNode,\n    instructionArgumentNode,\n    instructionNode,\n    numberTypeNode,\n    numberValueNode,\n    programNode,\n    rootNode,\n    sizePrefixTypeNode,\n    stringTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n    tupleTypeNode,\n} from '@codama/nodes';\nimport { describe, expect, test } from 'vitest';\n\nimport { parseAccountData, parseEventData, parseInstructionData } from '../src';\nimport { hex } from './_setup';\n\ndescribe('parseAccountData', () => {\n    test('it parses some account data from a root node', () => {\n        const root = rootNode(\n            programNode({\n                accounts: [\n                    accountNode({\n                        data: structTypeNode([\n                            structFieldTypeNode({\n                                defaultValue: numberValueNode(9),\n                                name: 'discriminator',\n                                type: numberTypeNode('u8'),\n                            }),\n                            structFieldTypeNode({\n                                name: 'firstname',\n                                type: sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u16')),\n                            }),\n                            structFieldTypeNode({\n                                name: 'age',\n                                type: numberTypeNode('u8'),\n                            }),\n                        ]),\n                        discriminators: [fieldDiscriminatorNode('discriminator')],\n                        name: 'myAccount',\n                    }),\n                ],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        );\n        const result = parseAccountData(root, hex('090500416c6963652a'));\n        expect(result).toStrictEqual({\n            data: { age: 42, discriminator: 9, firstname: 'Alice' },\n            path: [root, root.program, root.program.accounts[0]],\n        });\n    });\n});\n\ndescribe('parseInstructionData', () => {\n    test('it parses some instruction data from a root node', () => {\n        const root = rootNode(\n            programNode({\n                instructions: [\n                    instructionNode({\n                        arguments: [\n                            instructionArgumentNode({\n                                defaultValue: numberValueNode(9),\n                                name: 'discriminator',\n                                type: numberTypeNode('u8'),\n                            }),\n                            instructionArgumentNode({\n                                name: 'firstname',\n                                type: sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u16')),\n                            }),\n                            instructionArgumentNode({\n                                name: 'age',\n                                type: numberTypeNode('u8'),\n                            }),\n                        ],\n                        discriminators: [fieldDiscriminatorNode('discriminator')],\n                        name: 'myInstruction',\n                    }),\n                ],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        );\n        const result = parseInstructionData(root, hex('090500416c6963652a'));\n        expect(result).toStrictEqual({\n            data: { age: 42, discriminator: 9, firstname: 'Alice' },\n            path: [root, root.program, root.program.instructions[0]],\n        });\n    });\n});\n\ndescribe('parseEventData', () => {\n    test('it parses some event data from a root node', () => {\n        const root = rootNode(\n            programNode({\n                events: [\n                    eventNode({\n                        data: structTypeNode([\n                            structFieldTypeNode({\n                                defaultValue: numberValueNode(9),\n                                name: 'discriminator',\n                                type: numberTypeNode('u8'),\n                            }),\n                            structFieldTypeNode({\n                                name: 'firstname',\n                                type: sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u16')),\n                            }),\n                            structFieldTypeNode({\n                                name: 'age',\n                                type: numberTypeNode('u8'),\n                            }),\n                        ]),\n                        discriminators: [fieldDiscriminatorNode('discriminator')],\n                        name: 'myEvent',\n                    }),\n                ],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        );\n        const result = parseEventData(root, hex('090500416c6963652a'));\n        expect(result).toStrictEqual({\n            data: { age: 42, discriminator: 9, firstname: 'Alice' },\n            path: [root, root.program, root.program.events[0]],\n        });\n    });\n    test('it parses tuple event data from a root node', () => {\n        const root = rootNode(\n            programNode({\n                events: [\n                    eventNode({\n                        data: hiddenPrefixTypeNode(tupleTypeNode([numberTypeNode('u32')]), [\n                            constantValueNode(\n                                fixedSizeTypeNode(bytesTypeNode(), 2),\n                                constantValueNodeFromBytes('base16', '0102'),\n                            ),\n                        ]),\n                        discriminators: [\n                            constantDiscriminatorNode(\n                                constantValueNode(\n                                    fixedSizeTypeNode(bytesTypeNode(), 2),\n                                    constantValueNodeFromBytes('base16', '0102'),\n                                ),\n                            ),\n                        ],\n                        name: 'tupleEvent',\n                    }),\n                ],\n                name: 'myProgram',\n                publicKey: '1111',\n            }),\n        );\n        const result = parseEventData(root, hex('01022a000000'));\n        expect(result).toStrictEqual({\n            data: [42],\n            path: [root, root.program, root.program.events[0]],\n        });\n    });\n});\n"
  },
  {
    "path": "packages/dynamic-parsers/test/types/global.d.ts",
    "content": "declare const __BROWSER__: boolean;\ndeclare const __ESM__: boolean;\ndeclare const __NODEJS__: boolean;\ndeclare const __REACTNATIVE__: boolean;\ndeclare const __TEST__: boolean;\ndeclare const __VERSION__: string;\n"
  },
  {
    "path": "packages/dynamic-parsers/tsconfig.declarations.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"declarationMap\": true,\n        \"emitDeclarationOnly\": true,\n        \"outDir\": \"./dist/types\"\n    },\n    \"extends\": \"./tsconfig.json\",\n    \"include\": [\"src/index.ts\", \"src/types\"]\n}\n"
  },
  {
    "path": "packages/dynamic-parsers/tsconfig.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": { \"lib\": [] },\n    \"display\": \"@codama/dynamic-parsers\",\n    \"extends\": \"../../tsconfig.json\",\n    \"include\": [\"src\", \"test\"]\n}\n"
  },
  {
    "path": "packages/dynamic-parsers/tsup.config.ts",
    "content": "import { defineConfig } from 'tsup';\n\nimport { getPackageBuildConfigs } from '../../tsup.config.base';\n\nexport default defineConfig(getPackageBuildConfigs());\n"
  },
  {
    "path": "packages/dynamic-parsers/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\nimport { getVitestConfig } from '../../vitest.config.base.mjs';\n\nexport default defineConfig({\n    test: {\n        projects: [getVitestConfig('browser'), getVitestConfig('node'), getVitestConfig('react-native')],\n    },\n});\n"
  },
  {
    "path": "packages/errors/.gitignore",
    "content": "dist/\n"
  },
  {
    "path": "packages/errors/.prettierignore",
    "content": "dist/\ntest/e2e/\ntest-ledger/\ntarget/\nCHANGELOG.md\n"
  },
  {
    "path": "packages/errors/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Codama\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/errors/README.md",
    "content": "# Codama ➤ Errors\n\n[![npm][npm-image]][npm-url]\n[![npm-downloads][npm-downloads-image]][npm-url]\n\n[npm-downloads-image]: https://img.shields.io/npm/dm/@codama/errors.svg?style=flat\n[npm-image]: https://img.shields.io/npm/v/@codama/errors.svg?style=flat&label=%40codama%2Ferrors\n[npm-url]: https://www.npmjs.com/package/@codama/errors\n\nThis package defines a `CodamaError` class that accepts a specific error code and a context object based on that code. It enables us to catch and handle errors in a more structured way.\n\n## Installation\n\n```sh\npnpm install @codama/errors\n```\n\n> [!NOTE]\n> This package is included in the main [`codama`](../library) package. Meaning, you already have access to its content if you are installing Codama this way.\n>\n> ```sh\n> pnpm install codama\n> ```\n\n## Reading error messages\n\n### In development mode\n\nWhen the `NODE_ENV` environment variable is not set to `\"production\"`, every error message will be included in the bundle. As such, you will be able to read them in plain language wherever they appear.\n\n### In production mode\n\nOn the other hand, when `NODE_ENV` is set to `\"production\"`, error messages will be stripped from the bundle to save space. Only the error code will appear when an error is encountered. Follow the instructions in the error message to convert the error code back to the human-readable error message.\n\nFor instance, to recover the error text for the error with code `123`:\n\n```shell\nnpx @codama/errors decode -- 123\n```\n\n## Catching errors\n\nWhen you catch a `CodamaError` and assert its error code using `isCodamaError()`, TypeScript will refine the error's context to the type associated with that error code. You can use that context to render useful error messages, or to make context-aware decisions that help your application to recover from the error.\n\n```ts\nimport { CODAMA_ERROR__UNEXPECTED_NODE_KIND, isCodamaError } from '@codama/errors';\n\ntry {\n    const codama = createFromJson(jsonIdl);\n} catch (e) {\n    if (isCodamaError(e, CODAMA_ERROR__UNEXPECTED_NODE_KIND)) {\n        const { expectedKinds, kind, node } = e.context;\n        // ...\n    } else if (isCodamaError(e, CODAMA_ERROR__VERSION_MISMATCH)) {\n        const { codamaVersion, rootVersion } = e.context;\n        // ...\n    } else {\n        throw e;\n    }\n}\n```\n\n## Contributing\n\n### Adding a new error\n\nTo add a new error in Codama, follow these steps:\n\n1. Add a new exported error code constant to `src/codes.ts`. Find the most appropriate group for your error and ensure it is appended to the end of that group.\n2. Add that new constant to the `CodamaErrorCode` union in `src/codes.ts`.\n3. If you would like the new error to encapsulate context about the error itself define that context in `src/context.ts`.\n4. Add the error's message to `src/messages.ts`. Any context values that you defined above will be interpolated into the message wherever you write `$key`, where `key` is the index of a value in the context (eg. ``'Unrecognized node `$kind`.'``).\n5. Publish a new version of `@codama/errors` using changesets — maintainers will handle this via tha changesets CI workflow.\n6. Bump the version of `@codama/errors` or `codama` in the consumer package from which the error is thrown.\n\n### Removing an error message\n\n- Don't remove errors.\n- Don't change the meaning of an error message.\n- Don't change or reorder error codes.\n- Don't change or remove members of an error's context.\n\nWhen an older client throws an error, we want to make sure that they can always decode the error. If you make any of the changes above, old clients will, by definition, not have received your changes. This could make the errors that they throw impossible to decode going forward.\n"
  },
  {
    "path": "packages/errors/bin/cli.cjs",
    "content": "#!/usr/bin/env -S node\n\nconst run = require('../dist/cli.cjs').run;\n\nrun(process.argv);\n"
  },
  {
    "path": "packages/errors/package.json",
    "content": "{\n    \"name\": \"@codama/errors\",\n    \"version\": \"1.6.0\",\n    \"description\": \"Error management for Codama\",\n    \"exports\": {\n        \"types\": \"./dist/types/index.d.ts\",\n        \"react-native\": \"./dist/index.react-native.mjs\",\n        \"browser\": {\n            \"import\": \"./dist/index.browser.mjs\",\n            \"require\": \"./dist/index.browser.cjs\"\n        },\n        \"node\": {\n            \"import\": \"./dist/index.node.mjs\",\n            \"require\": \"./dist/index.node.cjs\"\n        }\n    },\n    \"browser\": {\n        \"./dist/index.node.cjs\": \"./dist/index.browser.cjs\",\n        \"./dist/index.node.mjs\": \"./dist/index.browser.mjs\"\n    },\n    \"main\": \"./dist/index.node.cjs\",\n    \"module\": \"./dist/index.node.mjs\",\n    \"react-native\": \"./dist/index.react-native.mjs\",\n    \"types\": \"./dist/types/index.d.ts\",\n    \"type\": \"commonjs\",\n    \"bin\": \"./bin/cli.cjs\",\n    \"files\": [\n        \"./bin\",\n        \"./dist/types\",\n        \"./dist/cli.*\",\n        \"./dist/index.*\"\n    ],\n    \"sideEffects\": false,\n    \"keywords\": [\n        \"solana\",\n        \"framework\",\n        \"standard\",\n        \"specifications\"\n    ],\n    \"scripts\": {\n        \"build\": \"rimraf dist && tsup && tsc -p ./tsconfig.declarations.json\",\n        \"dev\": \"vitest --project node\",\n        \"lint\": \"eslint . && prettier --check .\",\n        \"lint:fix\": \"eslint --fix . && prettier --write .\",\n        \"test\": \"pnpm test:types && pnpm test:treeshakability && pnpm test:unit\",\n        \"test:treeshakability\": \"for file in dist/index.*.mjs; do agadoo $file; done\",\n        \"test:types\": \"tsc --noEmit\",\n        \"test:unit\": \"vitest run\"\n    },\n    \"dependencies\": {\n        \"@codama/node-types\": \"workspace:*\",\n        \"commander\": \"^14.0.2\",\n        \"picocolors\": \"^1.1.1\"\n    },\n    \"license\": \"MIT\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/codama-idl/codama\"\n    },\n    \"bugs\": {\n        \"url\": \"http://github.com/codama-idl/codama/issues\"\n    },\n    \"browserslist\": [\n        \"supports bigint and not dead\",\n        \"maintained node versions\"\n    ]\n}\n"
  },
  {
    "path": "packages/errors/src/cli/index.ts",
    "content": "/**\n * Heavily inspired by @solana/errors.\n * @see https://github.com/anza-xyz/kit/blob/main/packages/errors\n */\n\nimport { Command, InvalidArgumentError } from 'commander';\nimport pico from 'picocolors';\n\nimport { version } from '../../package.json';\nimport { CodamaErrorCode } from '../codes';\nimport { decodeEncodedContext } from '../context';\nimport { getHumanReadableErrorMessage } from '../message-formatter';\nimport { CodamaErrorMessages } from '../messages';\n\nconst program = new Command();\n\nprogram.name('@codama/errors').description('Decode Codama JavaScript errors thrown in production').version(version);\n\nprogram\n    .command('decode')\n    .description('Decode a `CodamaErrorCode` to a human-readable message')\n    .argument('<code>', 'numeric error code to decode', rawCode => {\n        const code = parseInt(rawCode, 10);\n        if (isNaN(code) || `${code}` !== rawCode) {\n            throw new InvalidArgumentError('It must be an integer');\n        }\n        if (!(code in CodamaErrorMessages)) {\n            throw new InvalidArgumentError('There exists no error with that code');\n        }\n        return code;\n    })\n    .argument('[encodedContext]', 'encoded context to interpolate into the error message', encodedContext => {\n        try {\n            return decodeEncodedContext(encodedContext);\n        } catch {\n            throw new InvalidArgumentError('Encoded context malformed');\n        }\n    })\n    .action((code: number, context: object | undefined) => {\n        const header = codamaColor(pico.bold('[Decoded]') + ` Codama error code #${code}`);\n        const message = getHumanReadableErrorMessage(code as CodamaErrorCode, context);\n        console.log(`\\n${header}\\n    ${message}`);\n        if (context) {\n            const contextHeader = pico.blue(pico.bold('[Context]'));\n            const contextString = JSON.stringify(context, null, 4).split('\\n').join('\\n    ');\n            console.log(`\\n${contextHeader}\\n    ${contextString}`);\n        }\n    });\n\nexport function run(argv: readonly string[]) {\n    program.parse(argv);\n}\n\nfunction codamaColor(text: string): string {\n    if (!pico.isColorSupported) return text;\n    return `\\x1b[38;2;231;171;97m${text}\\x1b[0m`;\n}\n"
  },
  {
    "path": "packages/errors/src/codes.ts",
    "content": "/**\n * Heavily inspired by @solana/errors.\n * @see https://github.com/anza-xyz/kit/blob/main/packages/errors\n *\n * ---\n *\n * WARNING:\n *   - Don't remove error codes\n *   - Don't change or reorder error codes.\n *\n * Good naming conventions:\n *   - Prefixing common errors — e.g. under the same package — can be a good way to namespace them.\n *   - Use consistent names — e.g. choose `PDA` or `PROGRAM_DERIVED_ADDRESS` and stick with it. Ensure your names are consistent with existing error codes. The decision might have been made for you.\n *   - Recommended prefixes and suffixes:\n *     - `MALFORMED_`: Some input was not constructed properly. E.g. `MALFORMED_BASE58_ENCODED_ADDRESS`.\n *     - `INVALID_`: Some input is invalid (other than because it was MALFORMED). E.g. `INVALID_NUMBER_OF_BYTES`.\n *     - `EXPECTED_`: Some input was different than expected, no need to specify the \"GOT\" part unless necessary. E.g. `EXPECTED_DECODED_ACCOUNT`.\n *     - `_CANNOT_`: Some operation cannot be performed or some input cannot be used due to some condition. E.g. `CANNOT_DECODE_EMPTY_BYTE_ARRAY` or `PDA_CANNOT_END_WITH_PDA_MARKER`.\n *     - `_MUST_BE_`: Some condition must be true. E.g. `NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE`.\n *     - `_FAILED_TO_`: Tried to perform some operation and failed. E.g. `FAILED_TO_DECODE_ACCOUNT`.\n *     - `_NOT_FOUND`: Some operation lead to not finding something. E.g. `ACCOUNT_NOT_FOUND`.\n *     - `_OUT_OF_RANGE`: Some value is out of range. E.g. `ENUM_DISCRIMINATOR_OUT_OF_RANGE`.\n *     - `_EXCEEDED`: Some limit was exceeded. E.g. `PDA_MAX_SEED_LENGTH_EXCEEDED`.\n *     - `_MISMATCH`: Some elements do not match. E.g. `ENCODER_DECODER_FIXED_SIZE_MISMATCH`.\n *     - `_MISSING`: Some required input is missing. E.g. `TRANSACTION_FEE_PAYER_MISSING`.\n *     - `_UNIMPLEMENTED`: Some required component is not available in the environment. E.g. `SUBTLE_CRYPTO_VERIFY_FUNCTION_UNIMPLEMENTED`.\n */\nexport const CODAMA_ERROR__UNRECOGNIZED_NODE_KIND = 1;\nexport const CODAMA_ERROR__UNEXPECTED_NODE_KIND = 2;\nexport const CODAMA_ERROR__UNEXPECTED_NESTED_NODE_KIND = 3;\nexport const CODAMA_ERROR__LINKED_NODE_NOT_FOUND = 4;\nexport const CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE = 5;\nexport const CODAMA_ERROR__VERSION_MISMATCH = 6;\nexport const CODAMA_ERROR__UNRECOGNIZED_NUMBER_FORMAT = 7;\nexport const CODAMA_ERROR__UNRECOGNIZED_BYTES_ENCODING = 8;\nexport const CODAMA_ERROR__ENUM_VARIANT_NOT_FOUND = 9;\nexport const CODAMA_ERROR__DISCRIMINATOR_FIELD_NOT_FOUND = 10;\nexport const CODAMA_ERROR__DISCRIMINATOR_FIELD_HAS_NO_DEFAULT_VALUE = 11;\n\n// Visitors-related errors.\n// Reserve error codes in the range [1200000-1200999].\nexport const CODAMA_ERROR__VISITORS__CANNOT_ADD_DUPLICATED_PDA_NAMES = 1200000;\nexport const CODAMA_ERROR__VISITORS__INVALID_PDA_SEED_VALUES = 1200001;\nexport const CODAMA_ERROR__VISITORS__CYCLIC_DEPENDENCY_DETECTED_WHEN_RESOLVING_INSTRUCTION_DEFAULT_VALUES = 1200002;\nexport const CODAMA_ERROR__VISITORS__CANNOT_USE_OPTIONAL_ACCOUNT_AS_PDA_SEED_VALUE = 1200003;\nexport const CODAMA_ERROR__VISITORS__INVALID_INSTRUCTION_DEFAULT_VALUE_DEPENDENCY = 1200004;\nexport const CODAMA_ERROR__VISITORS__ACCOUNT_FIELD_NOT_FOUND = 1200005;\nexport const CODAMA_ERROR__VISITORS__INVALID_NUMBER_WRAPPER = 1200006;\nexport const CODAMA_ERROR__VISITORS__CANNOT_EXTEND_MISSING_VISIT_FUNCTION = 1200007;\nexport const CODAMA_ERROR__VISITORS__FAILED_TO_VALIDATE_NODE = 1200008;\nexport const CODAMA_ERROR__VISITORS__INSTRUCTION_ENUM_ARGUMENT_NOT_FOUND = 1200009;\nexport const CODAMA_ERROR__VISITORS__CANNOT_FLATTEN_STRUCT_WITH_CONFLICTING_ATTRIBUTES = 1200010;\nexport const CODAMA_ERROR__VISITORS__RENDER_MAP_KEY_NOT_FOUND = 1200011;\nexport const CODAMA_ERROR__VISITORS__CANNOT_REMOVE_LAST_PATH_IN_NODE_STACK = 1200012;\n\n// Anchor-related errors.\n// Reserve error codes in the range [2100000-2100999].\nexport const CODAMA_ERROR__ANCHOR__UNRECOGNIZED_IDL_TYPE = 2100000;\nexport const CODAMA_ERROR__ANCHOR__ACCOUNT_TYPE_MISSING = 2100001;\nexport const CODAMA_ERROR__ANCHOR__ARGUMENT_TYPE_MISSING = 2100002;\nexport const CODAMA_ERROR__ANCHOR__TYPE_PATH_MISSING = 2100003;\nexport const CODAMA_ERROR__ANCHOR__SEED_KIND_UNIMPLEMENTED = 2100004;\nexport const CODAMA_ERROR__ANCHOR__PROGRAM_ID_KIND_UNIMPLEMENTED = 2100005;\nexport const CODAMA_ERROR__ANCHOR__GENERIC_TYPE_MISSING = 2100006;\nexport const CODAMA_ERROR__ANCHOR__EVENT_TYPE_MISSING = 2100007;\n\n// Dynamic-client-related errors.\n// Reserve error codes in the range [2500000-2500999].\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__INSTRUCTION_NOT_FOUND = 2500000;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__PDA_NOT_FOUND = 2500001;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__NODE_REFERENCE_NOT_FOUND = 2500002;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING = 2500003;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ACCOUNT_ADDRESS = 2500004;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ADDRESS_TYPE = 2500005;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__CANNOT_CONVERT_TO_ADDRESS = 2500006;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_RESOLVER_MISSING = 2500007;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__CIRCULAR_ACCOUNT_DEPENDENCY = 2500008;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_OPTIONAL_ACCOUNT_STRATEGY = 2500009;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_DERIVE_PDA = 2500010;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING = 2500011;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__DEFAULT_VALUE_MISSING = 2500012;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ARGUMENT_INPUT = 2500013;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE = 2500014;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_ENCODE_ARGUMENT = 2500015;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_EXECUTE_RESOLVER = 2500016;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_VALIDATE_INPUT = 2500017;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_NODE = 2500018;\nexport const CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION = 2500019;\n\n// Renderers-related errors.\n// Reserve error codes in the range [2800000-2800999].\nexport const CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE = 2800000;\nexport const CODAMA_ERROR__RENDERERS__MISSING_DEPENDENCY_VERSIONS = 2800001;\n\n/**\n * A union of every Codama error code\n *\n * You might be wondering why this is not a TypeScript enum or const enum.\n *\n * One of the goals of this library is to enable people to use some or none of it without having to\n * bundle all of it.\n *\n * If we made the set of error codes an enum then anyone who imported it (even if to only use a\n * single error code) would be forced to bundle every code and its label.\n *\n * Const enums appear to solve this problem by letting the compiler inline only the codes that are\n * actually used. Unfortunately exporting ambient (const) enums from a library like `@codama/errors`\n * is not safe, for a variety of reasons covered here: https://stackoverflow.com/a/28818850\n */\nexport type CodamaErrorCode =\n    | typeof CODAMA_ERROR__ANCHOR__ACCOUNT_TYPE_MISSING\n    | typeof CODAMA_ERROR__ANCHOR__ARGUMENT_TYPE_MISSING\n    | typeof CODAMA_ERROR__ANCHOR__EVENT_TYPE_MISSING\n    | typeof CODAMA_ERROR__ANCHOR__GENERIC_TYPE_MISSING\n    | typeof CODAMA_ERROR__ANCHOR__PROGRAM_ID_KIND_UNIMPLEMENTED\n    | typeof CODAMA_ERROR__ANCHOR__SEED_KIND_UNIMPLEMENTED\n    | typeof CODAMA_ERROR__ANCHOR__TYPE_PATH_MISSING\n    | typeof CODAMA_ERROR__ANCHOR__UNRECOGNIZED_IDL_TYPE\n    | typeof CODAMA_ERROR__DISCRIMINATOR_FIELD_HAS_NO_DEFAULT_VALUE\n    | typeof CODAMA_ERROR__DISCRIMINATOR_FIELD_NOT_FOUND\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_RESOLVER_MISSING\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__CANNOT_CONVERT_TO_ADDRESS\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__CIRCULAR_ACCOUNT_DEPENDENCY\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__DEFAULT_VALUE_MISSING\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_DERIVE_PDA\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_ENCODE_ARGUMENT\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_EXECUTE_RESOLVER\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_VALIDATE_INPUT\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__INSTRUCTION_NOT_FOUND\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ACCOUNT_ADDRESS\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ARGUMENT_INPUT\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__NODE_REFERENCE_NOT_FOUND\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__PDA_NOT_FOUND\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ADDRESS_TYPE\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_NODE\n    | typeof CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_OPTIONAL_ACCOUNT_STRATEGY\n    | typeof CODAMA_ERROR__ENUM_VARIANT_NOT_FOUND\n    | typeof CODAMA_ERROR__LINKED_NODE_NOT_FOUND\n    | typeof CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE\n    | typeof CODAMA_ERROR__RENDERERS__MISSING_DEPENDENCY_VERSIONS\n    | typeof CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE\n    | typeof CODAMA_ERROR__UNEXPECTED_NESTED_NODE_KIND\n    | typeof CODAMA_ERROR__UNEXPECTED_NODE_KIND\n    | typeof CODAMA_ERROR__UNRECOGNIZED_BYTES_ENCODING\n    | typeof CODAMA_ERROR__UNRECOGNIZED_NODE_KIND\n    | typeof CODAMA_ERROR__UNRECOGNIZED_NUMBER_FORMAT\n    | typeof CODAMA_ERROR__VERSION_MISMATCH\n    | typeof CODAMA_ERROR__VISITORS__ACCOUNT_FIELD_NOT_FOUND\n    | typeof CODAMA_ERROR__VISITORS__CANNOT_ADD_DUPLICATED_PDA_NAMES\n    | typeof CODAMA_ERROR__VISITORS__CANNOT_EXTEND_MISSING_VISIT_FUNCTION\n    | typeof CODAMA_ERROR__VISITORS__CANNOT_FLATTEN_STRUCT_WITH_CONFLICTING_ATTRIBUTES\n    | typeof CODAMA_ERROR__VISITORS__CANNOT_REMOVE_LAST_PATH_IN_NODE_STACK\n    | typeof CODAMA_ERROR__VISITORS__CANNOT_USE_OPTIONAL_ACCOUNT_AS_PDA_SEED_VALUE\n    | typeof CODAMA_ERROR__VISITORS__CYCLIC_DEPENDENCY_DETECTED_WHEN_RESOLVING_INSTRUCTION_DEFAULT_VALUES\n    | typeof CODAMA_ERROR__VISITORS__FAILED_TO_VALIDATE_NODE\n    | typeof CODAMA_ERROR__VISITORS__INSTRUCTION_ENUM_ARGUMENT_NOT_FOUND\n    | typeof CODAMA_ERROR__VISITORS__INVALID_INSTRUCTION_DEFAULT_VALUE_DEPENDENCY\n    | typeof CODAMA_ERROR__VISITORS__INVALID_NUMBER_WRAPPER\n    | typeof CODAMA_ERROR__VISITORS__INVALID_PDA_SEED_VALUES\n    | typeof CODAMA_ERROR__VISITORS__RENDER_MAP_KEY_NOT_FOUND;\n"
  },
  {
    "path": "packages/errors/src/context.ts",
    "content": "/**\n * Heavily inspired by @solana/errors.\n * @see https://github.com/anza-xyz/kit/blob/main/packages/errors\n */\n\nimport {\n    AccountNode,\n    AccountValueNode,\n    CamelCaseString,\n    EnumTypeNode,\n    InstructionAccountNode,\n    InstructionArgumentNode,\n    InstructionNode,\n    LinkNode,\n    Node,\n    NodeKind,\n    PdaNode,\n    PdaSeedValueNode,\n    ProgramNode,\n} from '@codama/node-types';\n\nimport {\n    CODAMA_ERROR__ANCHOR__ACCOUNT_TYPE_MISSING,\n    CODAMA_ERROR__ANCHOR__ARGUMENT_TYPE_MISSING,\n    CODAMA_ERROR__ANCHOR__EVENT_TYPE_MISSING,\n    CODAMA_ERROR__ANCHOR__GENERIC_TYPE_MISSING,\n    CODAMA_ERROR__ANCHOR__PROGRAM_ID_KIND_UNIMPLEMENTED,\n    CODAMA_ERROR__ANCHOR__SEED_KIND_UNIMPLEMENTED,\n    CODAMA_ERROR__ANCHOR__TYPE_PATH_MISSING,\n    CODAMA_ERROR__ANCHOR__UNRECOGNIZED_IDL_TYPE,\n    CODAMA_ERROR__DISCRIMINATOR_FIELD_HAS_NO_DEFAULT_VALUE,\n    CODAMA_ERROR__DISCRIMINATOR_FIELD_NOT_FOUND,\n    CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_RESOLVER_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__CANNOT_CONVERT_TO_ADDRESS,\n    CODAMA_ERROR__DYNAMIC_CLIENT__CIRCULAR_ACCOUNT_DEPENDENCY,\n    CODAMA_ERROR__DYNAMIC_CLIENT__DEFAULT_VALUE_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_DERIVE_PDA,\n    CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_ENCODE_ARGUMENT,\n    CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_EXECUTE_RESOLVER,\n    CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_VALIDATE_INPUT,\n    CODAMA_ERROR__DYNAMIC_CLIENT__INSTRUCTION_NOT_FOUND,\n    CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ACCOUNT_ADDRESS,\n    CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ARGUMENT_INPUT,\n    CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION,\n    CODAMA_ERROR__DYNAMIC_CLIENT__NODE_REFERENCE_NOT_FOUND,\n    CODAMA_ERROR__DYNAMIC_CLIENT__PDA_NOT_FOUND,\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ADDRESS_TYPE,\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE,\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_NODE,\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_OPTIONAL_ACCOUNT_STRATEGY,\n    CODAMA_ERROR__ENUM_VARIANT_NOT_FOUND,\n    CODAMA_ERROR__LINKED_NODE_NOT_FOUND,\n    CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE,\n    CODAMA_ERROR__RENDERERS__MISSING_DEPENDENCY_VERSIONS,\n    CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE,\n    CODAMA_ERROR__UNEXPECTED_NESTED_NODE_KIND,\n    CODAMA_ERROR__UNEXPECTED_NODE_KIND,\n    CODAMA_ERROR__UNRECOGNIZED_BYTES_ENCODING,\n    CODAMA_ERROR__UNRECOGNIZED_NODE_KIND,\n    CODAMA_ERROR__UNRECOGNIZED_NUMBER_FORMAT,\n    CODAMA_ERROR__VERSION_MISMATCH,\n    CODAMA_ERROR__VISITORS__ACCOUNT_FIELD_NOT_FOUND,\n    CODAMA_ERROR__VISITORS__CANNOT_ADD_DUPLICATED_PDA_NAMES,\n    CODAMA_ERROR__VISITORS__CANNOT_EXTEND_MISSING_VISIT_FUNCTION,\n    CODAMA_ERROR__VISITORS__CANNOT_FLATTEN_STRUCT_WITH_CONFLICTING_ATTRIBUTES,\n    CODAMA_ERROR__VISITORS__CANNOT_REMOVE_LAST_PATH_IN_NODE_STACK,\n    CODAMA_ERROR__VISITORS__CANNOT_USE_OPTIONAL_ACCOUNT_AS_PDA_SEED_VALUE,\n    CODAMA_ERROR__VISITORS__CYCLIC_DEPENDENCY_DETECTED_WHEN_RESOLVING_INSTRUCTION_DEFAULT_VALUES,\n    CODAMA_ERROR__VISITORS__FAILED_TO_VALIDATE_NODE,\n    CODAMA_ERROR__VISITORS__INSTRUCTION_ENUM_ARGUMENT_NOT_FOUND,\n    CODAMA_ERROR__VISITORS__INVALID_INSTRUCTION_DEFAULT_VALUE_DEPENDENCY,\n    CODAMA_ERROR__VISITORS__INVALID_NUMBER_WRAPPER,\n    CODAMA_ERROR__VISITORS__INVALID_PDA_SEED_VALUES,\n    CODAMA_ERROR__VISITORS__RENDER_MAP_KEY_NOT_FOUND,\n    CodamaErrorCode,\n} from './codes';\n\ntype DefaultUnspecifiedErrorContextToUndefined<T> = {\n    [P in CodamaErrorCode]: P extends keyof T ? T[P] : undefined;\n};\n\n/**\n * WARNING:\n *   - Don't change or remove members of an error's context.\n */\nexport type CodamaErrorContext = DefaultUnspecifiedErrorContextToUndefined<{\n    [CODAMA_ERROR__ANCHOR__ACCOUNT_TYPE_MISSING]: {\n        name: string;\n    };\n    [CODAMA_ERROR__ANCHOR__ARGUMENT_TYPE_MISSING]: {\n        name: string;\n    };\n    [CODAMA_ERROR__ANCHOR__EVENT_TYPE_MISSING]: {\n        name: string;\n    };\n    [CODAMA_ERROR__ANCHOR__GENERIC_TYPE_MISSING]: {\n        name: string;\n    };\n    [CODAMA_ERROR__ANCHOR__PROGRAM_ID_KIND_UNIMPLEMENTED]: {\n        kind: string;\n    };\n    [CODAMA_ERROR__ANCHOR__SEED_KIND_UNIMPLEMENTED]: {\n        kind: string;\n    };\n    [CODAMA_ERROR__ANCHOR__TYPE_PATH_MISSING]: {\n        idlType: string;\n        path: string;\n    };\n    [CODAMA_ERROR__ANCHOR__UNRECOGNIZED_IDL_TYPE]: {\n        idlType: string;\n    };\n    [CODAMA_ERROR__DISCRIMINATOR_FIELD_HAS_NO_DEFAULT_VALUE]: {\n        field: CamelCaseString;\n    };\n    [CODAMA_ERROR__DISCRIMINATOR_FIELD_NOT_FOUND]: {\n        field: CamelCaseString;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING]: {\n        accountName: CamelCaseString;\n        instructionName: CamelCaseString;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_RESOLVER_MISSING]: {\n        accountName: CamelCaseString;\n        resolverName: CamelCaseString;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING]: {\n        argumentName: CamelCaseString;\n        instructionName: CamelCaseString;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__CANNOT_CONVERT_TO_ADDRESS]: {\n        value: string;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__CIRCULAR_ACCOUNT_DEPENDENCY]: {\n        chain: string;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__DEFAULT_VALUE_MISSING]: {\n        argumentName: CamelCaseString;\n        instructionName: CamelCaseString;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_DERIVE_PDA]: {\n        accountName: CamelCaseString;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_ENCODE_ARGUMENT]: {\n        argumentName: CamelCaseString;\n        instructionName: CamelCaseString;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_EXECUTE_RESOLVER]: {\n        resolverName: CamelCaseString;\n        targetKind: NodeKind;\n        targetName: CamelCaseString;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_VALIDATE_INPUT]: {\n        message: string;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__INSTRUCTION_NOT_FOUND]: {\n        availableIxs: string[];\n        instructionName: string;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ACCOUNT_ADDRESS]: {\n        accountName: CamelCaseString;\n        value: string;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ARGUMENT_INPUT]: {\n        argumentName: CamelCaseString;\n        expectedType: string;\n        value: string;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION]: {\n        message: string;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__NODE_REFERENCE_NOT_FOUND]: {\n        instructionName: CamelCaseString;\n        referencedName: CamelCaseString;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__PDA_NOT_FOUND]: {\n        available: string;\n        pdaName: string;\n    };\n\n    [CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ADDRESS_TYPE]: {\n        accountName: string;\n        actualType: string;\n        expectedType: string;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE]: {\n        actualType: string;\n        expectedType: string;\n        nodeKind: NodeKind;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_NODE]: {\n        nodeKind: NodeKind;\n    };\n    [CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_OPTIONAL_ACCOUNT_STRATEGY]: {\n        accountName: CamelCaseString;\n        instructionName: CamelCaseString;\n        strategy: string;\n    };\n    [CODAMA_ERROR__ENUM_VARIANT_NOT_FOUND]: {\n        enum: EnumTypeNode;\n        enumName: CamelCaseString;\n        variant: CamelCaseString;\n    };\n    [CODAMA_ERROR__LINKED_NODE_NOT_FOUND]: {\n        kind: LinkNode['kind'];\n        linkNode: LinkNode;\n        name: CamelCaseString;\n        path: readonly Node[];\n    };\n    [CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE]: {\n        fsFunction: string;\n    };\n    [CODAMA_ERROR__RENDERERS__MISSING_DEPENDENCY_VERSIONS]: {\n        dependencies: readonly string[];\n        message: string;\n    };\n    [CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE]: {\n        kind: NodeKind;\n        node: Node | undefined;\n    };\n    [CODAMA_ERROR__UNEXPECTED_NESTED_NODE_KIND]: {\n        expectedKinds: NodeKind[];\n        kind: NodeKind | null;\n        node: Node | null | undefined;\n    };\n    [CODAMA_ERROR__UNEXPECTED_NODE_KIND]: {\n        expectedKinds: NodeKind[];\n        kind: NodeKind | null;\n        node: Node | null | undefined;\n    };\n    [CODAMA_ERROR__UNRECOGNIZED_BYTES_ENCODING]: {\n        encoding: string;\n    };\n    [CODAMA_ERROR__UNRECOGNIZED_NODE_KIND]: {\n        kind: string;\n    };\n    [CODAMA_ERROR__UNRECOGNIZED_NUMBER_FORMAT]: {\n        format: string;\n    };\n    [CODAMA_ERROR__VERSION_MISMATCH]: {\n        codamaVersion: string;\n        rootVersion: string;\n    };\n    [CODAMA_ERROR__VISITORS__ACCOUNT_FIELD_NOT_FOUND]: {\n        account: AccountNode;\n        missingField: CamelCaseString;\n        name: CamelCaseString;\n    };\n    [CODAMA_ERROR__VISITORS__CANNOT_ADD_DUPLICATED_PDA_NAMES]: {\n        duplicatedPdaNames: CamelCaseString[];\n        program: ProgramNode;\n        programName: CamelCaseString;\n    };\n    [CODAMA_ERROR__VISITORS__CANNOT_EXTEND_MISSING_VISIT_FUNCTION]: {\n        visitFunction: string;\n    };\n    [CODAMA_ERROR__VISITORS__CANNOT_FLATTEN_STRUCT_WITH_CONFLICTING_ATTRIBUTES]: {\n        conflictingAttributes: CamelCaseString[];\n    };\n    [CODAMA_ERROR__VISITORS__CANNOT_REMOVE_LAST_PATH_IN_NODE_STACK]: {\n        path: readonly Node[];\n    };\n    [CODAMA_ERROR__VISITORS__CANNOT_USE_OPTIONAL_ACCOUNT_AS_PDA_SEED_VALUE]: {\n        instruction: InstructionNode;\n        instructionAccount: InstructionAccountNode;\n        instructionAccountName: CamelCaseString;\n        instructionName: CamelCaseString;\n        seed: PdaSeedValueNode<AccountValueNode>;\n        seedName: CamelCaseString;\n        seedValueName: CamelCaseString;\n    };\n    [CODAMA_ERROR__VISITORS__CYCLIC_DEPENDENCY_DETECTED_WHEN_RESOLVING_INSTRUCTION_DEFAULT_VALUES]: {\n        cycle: (InstructionAccountNode | InstructionArgumentNode)[];\n        formattedCycle: string;\n        instruction: InstructionNode;\n        instructionName: CamelCaseString;\n    };\n    [CODAMA_ERROR__VISITORS__FAILED_TO_VALIDATE_NODE]: {\n        formattedHistogram: string;\n        validationItems: ValidationItem[];\n    };\n    [CODAMA_ERROR__VISITORS__INSTRUCTION_ENUM_ARGUMENT_NOT_FOUND]: {\n        argumentName: CamelCaseString;\n        instruction: InstructionNode;\n        instructionName: CamelCaseString;\n    };\n    [CODAMA_ERROR__VISITORS__INVALID_INSTRUCTION_DEFAULT_VALUE_DEPENDENCY]: {\n        dependency: InstructionAccountNode | InstructionArgumentNode;\n        dependencyKind: 'instructionAccountNode' | 'instructionArgumentNode';\n        dependencyName: CamelCaseString;\n        instruction: InstructionNode;\n        instructionName: CamelCaseString;\n        parent: InstructionAccountNode | InstructionArgumentNode;\n        parentKind: 'instructionAccountNode' | 'instructionArgumentNode';\n        parentName: CamelCaseString;\n    };\n    [CODAMA_ERROR__VISITORS__INVALID_NUMBER_WRAPPER]: {\n        wrapper: string;\n    };\n    [CODAMA_ERROR__VISITORS__INVALID_PDA_SEED_VALUES]: {\n        instruction: InstructionNode;\n        instructionName: CamelCaseString;\n        pda: PdaNode;\n        pdaName: CamelCaseString;\n    };\n    [CODAMA_ERROR__VISITORS__RENDER_MAP_KEY_NOT_FOUND]: {\n        key: string;\n    };\n}>;\n\ntype ValidationItem = {\n    level: 'debug' | 'error' | 'info' | 'trace' | 'warn';\n    message: string;\n    node: Node;\n    path: Node[];\n};\n\nexport function decodeEncodedContext(encodedContext: string): object {\n    const decodedUrlString = __NODEJS__ ? Buffer.from(encodedContext, 'base64').toString('utf8') : atob(encodedContext);\n    return Object.fromEntries(new URLSearchParams(decodedUrlString).entries());\n}\n\nfunction encodeValue(value: unknown): string {\n    if (Array.isArray(value)) {\n        const commaSeparatedValues = value.map(encodeValue).join('%2C%20' /* \", \" */);\n        return '%5B' /* \"[\" */ + commaSeparatedValues + /* \"]\" */ '%5D';\n    } else if (typeof value === 'bigint') {\n        return `${value}n`;\n    } else {\n        return encodeURIComponent(\n            String(\n                value != null && Object.getPrototypeOf(value) === null\n                    ? // Plain objects with no protoype don't have a `toString` method.\n                      // Convert them before stringifying them.\n                      { ...(value as object) }\n                    : value,\n            ),\n        );\n    }\n}\n\nfunction encodeObjectContextEntry([key, value]: [string, unknown]): `${typeof key}=${string}` {\n    return `${key}=${encodeValue(value)}`;\n}\n\nexport function encodeContextObject(context: object): string {\n    const searchParamsString = Object.entries(context).map(encodeObjectContextEntry).join('&');\n    return __NODEJS__ ? Buffer.from(searchParamsString, 'utf8').toString('base64') : btoa(searchParamsString);\n}\n"
  },
  {
    "path": "packages/errors/src/error.ts",
    "content": "/**\n * Heavily inspired by @solana/errors.\n * @see https://github.com/anza-xyz/kit/blob/main/packages/errors\n */\n\nimport { CodamaErrorCode } from './codes';\nimport { CodamaErrorContext } from './context';\nimport { getErrorMessage } from './message-formatter';\n\nexport function isCodamaError<TErrorCode extends CodamaErrorCode>(\n    e: unknown,\n    code?: TErrorCode,\n): e is CodamaError<TErrorCode> {\n    const isCodamaError = e instanceof Error && e.name === 'CodamaError';\n    if (isCodamaError) {\n        if (code !== undefined) {\n            return (e as CodamaError<TErrorCode>).context.__code === code;\n        }\n        return true;\n    }\n    return false;\n}\n\ntype CodamaErrorCodedContext = Readonly<{\n    [P in CodamaErrorCode]: (CodamaErrorContext[P] extends undefined ? object : CodamaErrorContext[P]) & {\n        __code: P;\n    };\n}>;\n\nexport class CodamaError<TErrorCode extends CodamaErrorCode = CodamaErrorCode> extends Error {\n    readonly context: CodamaErrorCodedContext[TErrorCode];\n    constructor(\n        ...[code, contextAndErrorOptions]: CodamaErrorContext[TErrorCode] extends undefined\n            ? [code: TErrorCode, errorOptions?: ErrorOptions | undefined]\n            : [code: TErrorCode, contextAndErrorOptions: CodamaErrorContext[TErrorCode] & (ErrorOptions | undefined)]\n    ) {\n        let context: CodamaErrorContext[TErrorCode] | undefined;\n        let errorOptions: ErrorOptions | undefined;\n        if (contextAndErrorOptions) {\n            // If the `ErrorOptions` type ever changes, update this code.\n            const { cause, ...contextRest } = contextAndErrorOptions;\n            if (cause) {\n                errorOptions = { cause };\n            }\n            if (Object.keys(contextRest).length > 0) {\n                context = contextRest as CodamaErrorContext[TErrorCode];\n            }\n        }\n        const message = getErrorMessage(code, context);\n        super(message, errorOptions);\n        this.context = {\n            __code: code,\n            ...context,\n        } as CodamaErrorCodedContext[TErrorCode];\n        // This is necessary so that `isCodamaError()` can identify a `CodamaError` without having\n        // to import the class for use in an `instanceof` check.\n        this.name = 'CodamaError';\n    }\n}\n"
  },
  {
    "path": "packages/errors/src/index.ts",
    "content": "export * from './codes';\nexport * from './error';\nexport * from './logs';\nexport * from './stack-trace';\n"
  },
  {
    "path": "packages/errors/src/logs.ts",
    "content": "export function logError(message: string) {\n    console.error(message);\n}\n\nexport function logWarn(message: string) {\n    console.warn(message);\n}\n\nexport function logInfo(message: string) {\n    console.log(message);\n}\n"
  },
  {
    "path": "packages/errors/src/message-formatter.ts",
    "content": "/**\n * Heavily inspired by @solana/errors.\n * @see https://github.com/anza-xyz/kit/blob/main/packages/errors\n */\n\nimport { CodamaErrorCode } from './codes';\nimport { encodeContextObject } from './context';\nimport { CodamaErrorMessages } from './messages';\n\nexport function getHumanReadableErrorMessage<TErrorCode extends CodamaErrorCode>(\n    code: TErrorCode,\n    context: object = {},\n): string {\n    const messageFormatString = CodamaErrorMessages[code];\n    const message = messageFormatString.replace(/(?<!\\\\)\\$(\\w+)/g, (substring, variableName) =>\n        variableName in context ? `${context[variableName as keyof typeof context] as string}` : substring,\n    );\n    return message;\n}\n\nexport function getErrorMessage<TErrorCode extends CodamaErrorCode>(code: TErrorCode, context: object = {}): string {\n    if (process.env.NODE_ENV !== 'production') {\n        return getHumanReadableErrorMessage(code, context);\n    } else {\n        let decodingAdviceMessage = `Codama error #${code}; Decode this error by running \\`npx @codama/errors decode -- ${code}`;\n        if (Object.keys(context).length) {\n            /**\n             * DANGER: Be sure that the shell command is escaped in such a way that makes it\n             *         impossible for someone to craft malicious context values that would result in\n             *         an exploit against anyone who bindly copy/pastes it into their terminal.\n             */\n            decodingAdviceMessage += ` '${encodeContextObject(context)}'`;\n        }\n        return `${decodingAdviceMessage}\\``;\n    }\n}\n"
  },
  {
    "path": "packages/errors/src/messages.ts",
    "content": "/**\n * Heavily inspired by @solana/errors.\n * @see https://github.com/anza-xyz/kit/blob/main/packages/errors\n */\n\nimport {\n    CODAMA_ERROR__ANCHOR__ACCOUNT_TYPE_MISSING,\n    CODAMA_ERROR__ANCHOR__ARGUMENT_TYPE_MISSING,\n    CODAMA_ERROR__ANCHOR__EVENT_TYPE_MISSING,\n    CODAMA_ERROR__ANCHOR__GENERIC_TYPE_MISSING,\n    CODAMA_ERROR__ANCHOR__PROGRAM_ID_KIND_UNIMPLEMENTED,\n    CODAMA_ERROR__ANCHOR__SEED_KIND_UNIMPLEMENTED,\n    CODAMA_ERROR__ANCHOR__TYPE_PATH_MISSING,\n    CODAMA_ERROR__ANCHOR__UNRECOGNIZED_IDL_TYPE,\n    CODAMA_ERROR__DISCRIMINATOR_FIELD_HAS_NO_DEFAULT_VALUE,\n    CODAMA_ERROR__DISCRIMINATOR_FIELD_NOT_FOUND,\n    CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_RESOLVER_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__CANNOT_CONVERT_TO_ADDRESS,\n    CODAMA_ERROR__DYNAMIC_CLIENT__CIRCULAR_ACCOUNT_DEPENDENCY,\n    CODAMA_ERROR__DYNAMIC_CLIENT__DEFAULT_VALUE_MISSING,\n    CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_DERIVE_PDA,\n    CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_ENCODE_ARGUMENT,\n    CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_EXECUTE_RESOLVER,\n    CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_VALIDATE_INPUT,\n    CODAMA_ERROR__DYNAMIC_CLIENT__INSTRUCTION_NOT_FOUND,\n    CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ACCOUNT_ADDRESS,\n    CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ARGUMENT_INPUT,\n    CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION,\n    CODAMA_ERROR__DYNAMIC_CLIENT__NODE_REFERENCE_NOT_FOUND,\n    CODAMA_ERROR__DYNAMIC_CLIENT__PDA_NOT_FOUND,\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ADDRESS_TYPE,\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE,\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_NODE,\n    CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_OPTIONAL_ACCOUNT_STRATEGY,\n    CODAMA_ERROR__ENUM_VARIANT_NOT_FOUND,\n    CODAMA_ERROR__LINKED_NODE_NOT_FOUND,\n    CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE,\n    CODAMA_ERROR__RENDERERS__MISSING_DEPENDENCY_VERSIONS,\n    CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE,\n    CODAMA_ERROR__UNEXPECTED_NESTED_NODE_KIND,\n    CODAMA_ERROR__UNEXPECTED_NODE_KIND,\n    CODAMA_ERROR__UNRECOGNIZED_BYTES_ENCODING,\n    CODAMA_ERROR__UNRECOGNIZED_NODE_KIND,\n    CODAMA_ERROR__UNRECOGNIZED_NUMBER_FORMAT,\n    CODAMA_ERROR__VERSION_MISMATCH,\n    CODAMA_ERROR__VISITORS__ACCOUNT_FIELD_NOT_FOUND,\n    CODAMA_ERROR__VISITORS__CANNOT_ADD_DUPLICATED_PDA_NAMES,\n    CODAMA_ERROR__VISITORS__CANNOT_EXTEND_MISSING_VISIT_FUNCTION,\n    CODAMA_ERROR__VISITORS__CANNOT_FLATTEN_STRUCT_WITH_CONFLICTING_ATTRIBUTES,\n    CODAMA_ERROR__VISITORS__CANNOT_REMOVE_LAST_PATH_IN_NODE_STACK,\n    CODAMA_ERROR__VISITORS__CANNOT_USE_OPTIONAL_ACCOUNT_AS_PDA_SEED_VALUE,\n    CODAMA_ERROR__VISITORS__CYCLIC_DEPENDENCY_DETECTED_WHEN_RESOLVING_INSTRUCTION_DEFAULT_VALUES,\n    CODAMA_ERROR__VISITORS__FAILED_TO_VALIDATE_NODE,\n    CODAMA_ERROR__VISITORS__INSTRUCTION_ENUM_ARGUMENT_NOT_FOUND,\n    CODAMA_ERROR__VISITORS__INVALID_INSTRUCTION_DEFAULT_VALUE_DEPENDENCY,\n    CODAMA_ERROR__VISITORS__INVALID_NUMBER_WRAPPER,\n    CODAMA_ERROR__VISITORS__INVALID_PDA_SEED_VALUES,\n    CODAMA_ERROR__VISITORS__RENDER_MAP_KEY_NOT_FOUND,\n    CodamaErrorCode,\n} from './codes';\n\n/**\n * WARNING:\n *   - Don't change the meaning of an error message.\n */\nexport const CodamaErrorMessages: Readonly<{\n    // This type makes this data structure exhaustive with respect to `SolanaErrorCode`.\n    // TypeScript will fail to build this project if add an error code without a message.\n    [P in CodamaErrorCode]: string;\n}> = {\n    [CODAMA_ERROR__ANCHOR__ACCOUNT_TYPE_MISSING]: 'Account type [$name] is missing from the IDL types.',\n    [CODAMA_ERROR__ANCHOR__ARGUMENT_TYPE_MISSING]: 'Argument name [$name] is missing from the instruction definition.',\n    [CODAMA_ERROR__ANCHOR__EVENT_TYPE_MISSING]: 'Event type [$name] is missing from the IDL types.',\n    [CODAMA_ERROR__ANCHOR__GENERIC_TYPE_MISSING]: 'Generic type [$name] is missing from the IDL types.',\n    [CODAMA_ERROR__ANCHOR__PROGRAM_ID_KIND_UNIMPLEMENTED]: 'Program ID kind [$kind] is not implemented.',\n    [CODAMA_ERROR__ANCHOR__SEED_KIND_UNIMPLEMENTED]: 'Seed kind [$kind] is not implemented.',\n    [CODAMA_ERROR__ANCHOR__TYPE_PATH_MISSING]: 'Field type is missing for path [$path] in [$idlType].',\n    [CODAMA_ERROR__ANCHOR__UNRECOGNIZED_IDL_TYPE]: 'Unrecognized Anchor IDL type [$idlType].',\n    [CODAMA_ERROR__DISCRIMINATOR_FIELD_HAS_NO_DEFAULT_VALUE]: 'Discriminator field [$field] has no default value.',\n    [CODAMA_ERROR__DISCRIMINATOR_FIELD_NOT_FOUND]: 'Could not find discriminator field [$field]',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_MISSING]:\n        'Missing account [$accountName] in [$instructionName] instruction.',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__ACCOUNT_RESOLVER_MISSING]:\n        'Resolver [$resolverName] not provided for account [$accountName].',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__ARGUMENT_MISSING]: 'Missing argument [$argumentName] in [$instructionName].',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__CANNOT_CONVERT_TO_ADDRESS]: 'Cannot convert value to Address: [$value].',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__CIRCULAR_ACCOUNT_DEPENDENCY]: 'Circular dependency detected: [$chain].',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__DEFAULT_VALUE_MISSING]:\n        'Default value is missing for argument [$argumentName] in [$instructionName].',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_DERIVE_PDA]: 'Failed to derive PDA for account [$accountName].',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_ENCODE_ARGUMENT]:\n        'Failed to encode argument [$argumentName] in [$instructionName].',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_EXECUTE_RESOLVER]:\n        'Resolver [$resolverName] threw an error while resolving [$targetKind] [$targetName].',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__FAILED_TO_VALIDATE_INPUT]: 'Failed to validate input: [$message].',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__INSTRUCTION_NOT_FOUND]:\n        'Instruction [$instructionName] not found in IDL. Available: [$availableIxs].',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ACCOUNT_ADDRESS]: 'Invalid account address [$accountName]: [$value].',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__INVALID_ARGUMENT_INPUT]:\n        'Invalid argument input [$argumentName]: [$value]. Expected [$expectedType].',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__INVARIANT_VIOLATION]: 'Internal invariant violation: [$message].',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__NODE_REFERENCE_NOT_FOUND]:\n        'Referenced node [$referencedName] not found in [$instructionName].',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__PDA_NOT_FOUND]: 'PDA [$pdaName] not found in IDL. Available: [$available].',\n\n    [CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ADDRESS_TYPE]:\n        'Expected [$expectedType] for account [$accountName], but received [$actualType].',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__UNEXPECTED_ARGUMENT_TYPE]:\n        'Expected [$expectedType] for [$nodeKind], but received [$actualType].',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_NODE]: 'Unsupported node kind [$nodeKind].',\n    [CODAMA_ERROR__DYNAMIC_CLIENT__UNSUPPORTED_OPTIONAL_ACCOUNT_STRATEGY]:\n        'Unsupported optional account strategy [$strategy] for account [$accountName] in [$instructionName].',\n    [CODAMA_ERROR__ENUM_VARIANT_NOT_FOUND]: 'Enum variant [$variant] not found in enum type [$enumName].',\n    [CODAMA_ERROR__LINKED_NODE_NOT_FOUND]: 'Could not find linked node [$name] from [$kind].',\n    [CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE]:\n        'Node.js filesystem function [$fsFunction] is not available in your environment.',\n    [CODAMA_ERROR__RENDERERS__MISSING_DEPENDENCY_VERSIONS]:\n        'No version specified for the following dependencies: [$dependencies]. $message',\n    [CODAMA_ERROR__RENDERERS__UNSUPPORTED_NODE]: 'Cannot render the encountered node of kind [$kind].',\n    [CODAMA_ERROR__UNEXPECTED_NESTED_NODE_KIND]: 'Expected nested node of kind [$expectedKinds], got [$kind]',\n    [CODAMA_ERROR__UNEXPECTED_NODE_KIND]: 'Expected node of kind [$expectedKinds], got [$kind].',\n    [CODAMA_ERROR__UNRECOGNIZED_BYTES_ENCODING]: 'Unrecognized bytes encoding [$encoding].',\n    [CODAMA_ERROR__UNRECOGNIZED_NODE_KIND]: 'Unrecognized node kind [$kind].',\n    [CODAMA_ERROR__UNRECOGNIZED_NUMBER_FORMAT]: 'Unrecognized number format [$format].',\n    [CODAMA_ERROR__VERSION_MISMATCH]:\n        'The provided RootNode version [$rootVersion] is not compatible with the installed Codama version [$codamaVersion].',\n    [CODAMA_ERROR__VISITORS__ACCOUNT_FIELD_NOT_FOUND]: 'Account [$name] does not have a field named [$missingField].',\n    [CODAMA_ERROR__VISITORS__CANNOT_ADD_DUPLICATED_PDA_NAMES]:\n        'Cannot add PDAs to program [$programName] because the following PDA names already exist [$duplicatedPdaNames].',\n    [CODAMA_ERROR__VISITORS__CANNOT_EXTEND_MISSING_VISIT_FUNCTION]:\n        'Cannot extend visitor with function [$visitFunction] as the base visitor does not support it.',\n    [CODAMA_ERROR__VISITORS__CANNOT_FLATTEN_STRUCT_WITH_CONFLICTING_ATTRIBUTES]:\n        'Cannot flatten struct since this would cause the following attributes to conflict [$conflictingAttributes].',\n    [CODAMA_ERROR__VISITORS__CANNOT_REMOVE_LAST_PATH_IN_NODE_STACK]: 'Cannot remove the last path in the node stack.',\n    [CODAMA_ERROR__VISITORS__CANNOT_USE_OPTIONAL_ACCOUNT_AS_PDA_SEED_VALUE]:\n        'Cannot use optional account [$seedValueName] as the [$seedName] PDA seed for the [$instructionAccountName] account of the [$instructionName] instruction.',\n    [CODAMA_ERROR__VISITORS__CYCLIC_DEPENDENCY_DETECTED_WHEN_RESOLVING_INSTRUCTION_DEFAULT_VALUES]:\n        \"Circular dependency detected when resolving the accounts and arguments' default values of the [$instructionName] instruction. Got the following dependency cycle [$formattedCycle].\",\n    [CODAMA_ERROR__VISITORS__FAILED_TO_VALIDATE_NODE]: 'Failed to validate the given node [$formattedHistogram].',\n    [CODAMA_ERROR__VISITORS__INSTRUCTION_ENUM_ARGUMENT_NOT_FOUND]:\n        'Could not find an enum argument named [$argumentName] for instruction [$instructionName].',\n    [CODAMA_ERROR__VISITORS__INVALID_INSTRUCTION_DEFAULT_VALUE_DEPENDENCY]:\n        'Dependency [$dependencyName] of kind [$dependencyKind] is not a valid dependency of [$parentName] of kind [$parentKind] in the [$instructionName] instruction.',\n    [CODAMA_ERROR__VISITORS__INVALID_NUMBER_WRAPPER]: 'Invalid number wrapper kind [$wrapper].',\n    [CODAMA_ERROR__VISITORS__INVALID_PDA_SEED_VALUES]:\n        'Invalid seed values for PDA [$pdaName] in instruction [$instructionName].',\n    [CODAMA_ERROR__VISITORS__RENDER_MAP_KEY_NOT_FOUND]: 'Cannot find key [$key] in RenderMap.',\n};\n"
  },
  {
    "path": "packages/errors/src/stack-trace.ts",
    "content": "/**\n * Heavily inspired by @solana/errors.\n * @see https://github.com/anza-xyz/kit/blob/main/packages/errors\n */\n\nexport function safeCaptureStackTrace(...args: Parameters<typeof Error.captureStackTrace>): void {\n    if ('captureStackTrace' in Error && typeof Error.captureStackTrace === 'function') {\n        Error.captureStackTrace(...args);\n    }\n}\n"
  },
  {
    "path": "packages/errors/src/types/global.d.ts",
    "content": "declare const __BROWSER__: boolean;\ndeclare const __ESM__: boolean;\ndeclare const __NODEJS__: boolean;\ndeclare const __REACTNATIVE__: boolean;\ndeclare const __TEST__: boolean;\ndeclare const __VERSION__: string;\n"
  },
  {
    "path": "packages/errors/test/error.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport {\n    CODAMA_ERROR__UNEXPECTED_NODE_KIND,\n    CODAMA_ERROR__UNRECOGNIZED_NODE_KIND,\n    CodamaError,\n    isCodamaError,\n} from '../src';\n\ntest('it exposes the Codama error context', () => {\n    const error = new CodamaError(CODAMA_ERROR__UNRECOGNIZED_NODE_KIND, { kind: 'missingNode' });\n    expect(error.context.kind).toBe('missingNode');\n});\n\ntest('it exposes the Codama error code', () => {\n    const error = new CodamaError(CODAMA_ERROR__UNRECOGNIZED_NODE_KIND, { kind: 'missingNode' });\n    expect(error.context.__code).toBe(CODAMA_ERROR__UNRECOGNIZED_NODE_KIND);\n});\n\ntest('it calls the message formatter with the code and context', () => {\n    const error = new CodamaError(CODAMA_ERROR__UNRECOGNIZED_NODE_KIND, { kind: 'missingNode' });\n    expect(error.message).toBe('Unrecognized node kind [missingNode].');\n});\n\ntest('it exposes no cause when none is provided', () => {\n    const error = new CodamaError(CODAMA_ERROR__UNRECOGNIZED_NODE_KIND, { kind: 'missingNode' });\n    expect(error.cause).toBeUndefined();\n});\n\ntest('it exposes the cause when provided', () => {\n    const cause = {} as unknown;\n    const error = new CodamaError(CODAMA_ERROR__UNRECOGNIZED_NODE_KIND, { cause, kind: 'missingNode' });\n    expect(error.cause).toBe(cause);\n});\n\ntest('it returns `true` for an instance of `CodamaError`', () => {\n    const error = new CodamaError(CODAMA_ERROR__UNRECOGNIZED_NODE_KIND, { kind: 'missingNode' });\n    expect(isCodamaError(error)).toBe(true);\n});\n\ntest('it returns `false` for an instance of `Error`', () => {\n    expect(isCodamaError(new Error('bad thing'))).toBe(false);\n});\n\ntest('it returns `true` when the error code matches', () => {\n    const error = new CodamaError(CODAMA_ERROR__UNRECOGNIZED_NODE_KIND, { kind: 'missingNode' });\n    expect(isCodamaError(error, CODAMA_ERROR__UNRECOGNIZED_NODE_KIND)).toBe(true);\n});\n\ntest('it returns `false` when the error code does not match', () => {\n    const error = new CodamaError(CODAMA_ERROR__UNRECOGNIZED_NODE_KIND, { kind: 'missingNode' });\n    expect(isCodamaError(error, CODAMA_ERROR__UNEXPECTED_NODE_KIND)).toBe(false);\n});\n"
  },
  {
    "path": "packages/errors/test/error.typetest.ts",
    "content": "import { PublicKeyTypeNode } from '@codama/node-types';\n\nimport { CodamaError, CodamaErrorCode, isCodamaError } from '../src';\nimport * as CodamaErrorCodeModule from '../src/codes';\nimport { CodamaErrorContext } from '../src/context';\n\nconst { CODAMA_ERROR__UNRECOGNIZED_NODE_KIND, CODAMA_ERROR__UNEXPECTED_NODE_KIND } = CodamaErrorCodeModule;\n\n// If this line raises a type error, you might have forgotten to add a new error to the\n// `CodamaErrorCode` union in `src/codes.ts`.\nObject.values(CodamaErrorCodeModule) satisfies CodamaErrorCode[];\n\nconst unexpectedNodeKindError = new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n    expectedKinds: ['numberTypeNode', 'stringTypeNode'],\n    kind: 'publicKeyTypeNode',\n    node: {} as PublicKeyTypeNode,\n});\n\n{\n    const code = unexpectedNodeKindError.context.__code;\n    code satisfies typeof CODAMA_ERROR__UNEXPECTED_NODE_KIND;\n    // @ts-expect-error Wrong error code.\n    code satisfies typeof CODAMA_ERROR__UNRECOGNIZED_NODE_KIND;\n}\n\n{\n    // @ts-expect-error Missing context.\n    new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {});\n    // @ts-expect-error Missing part of the context.\n    new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n        expectedKinds: ['numberTypeNode', 'stringTypeNode'],\n        node: {} as PublicKeyTypeNode,\n    });\n    new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n        // @ts-expect-error Wrong context attribute.\n        foo: 'bar',\n    });\n}\n\nunexpectedNodeKindError.context satisfies CodamaErrorContext[typeof CODAMA_ERROR__UNEXPECTED_NODE_KIND];\n// @ts-expect-error Non existent context property.\nunexpectedNodeKindError.context.feePayer satisfies never;\n\n// @ts-expect-error Missing context.\nnew CodamaError(CODAMA_ERROR__UNRECOGNIZED_NODE_KIND);\n// @ts-expect-error Missing context.\nnew CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND);\n\nconst unknownError = null as unknown as CodamaError;\nif (unknownError.context.__code === CODAMA_ERROR__UNEXPECTED_NODE_KIND) {\n    unknownError.context satisfies CodamaErrorContext[typeof CODAMA_ERROR__UNEXPECTED_NODE_KIND];\n    // @ts-expect-error Context belongs to another error code\n    unknownError.context satisfies CodamaErrorContext[typeof CODAMA_ERROR__UNRECOGNIZED_NODE_KIND];\n}\n\nconst e = null as unknown;\nif (isCodamaError(e)) {\n    e.context satisfies Readonly<{ __code: CodamaErrorCode }>;\n}\nif (isCodamaError(e, CODAMA_ERROR__UNEXPECTED_NODE_KIND)) {\n    e.context satisfies CodamaErrorContext[typeof CODAMA_ERROR__UNEXPECTED_NODE_KIND];\n    // @ts-expect-error Context belongs to another error code\n    e.context satisfies CodamaErrorContext[typeof CODAMA_ERROR__UNRECOGNIZED_NODE_KIND];\n}\n\n// `CodamaErrorContext` must not contain any keys reserved by `ErrorOptions` (eg. `cause`)\nnull as unknown as CodamaErrorContext satisfies {\n    [Code in keyof CodamaErrorContext]: CodamaErrorContext[Code] extends undefined\n        ? undefined\n        : {\n              [PP in keyof CodamaErrorContext[Code]]: PP extends keyof ErrorOptions\n                  ? never\n                  : CodamaErrorContext[Code][PP];\n          };\n};\n"
  },
  {
    "path": "packages/errors/test/types/global.d.ts",
    "content": "declare const __BROWSER__: boolean;\ndeclare const __ESM__: boolean;\ndeclare const __NODEJS__: boolean;\ndeclare const __REACTNATIVE__: boolean;\ndeclare const __TEST__: boolean;\ndeclare const __VERSION__: string;\n"
  },
  {
    "path": "packages/errors/tsconfig.declarations.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"declarationMap\": true,\n        \"emitDeclarationOnly\": true,\n        \"outDir\": \"./dist/types\"\n    },\n    \"extends\": \"./tsconfig.json\",\n    \"include\": [\"src/index.ts\", \"src/types\"]\n}\n"
  },
  {
    "path": "packages/errors/tsconfig.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": {\n        \"lib\": [\"DOM\", \"ES2015\", \"ES2022.Error\"],\n        \"resolveJsonModule\": true\n    },\n    \"display\": \"@codama/errors\",\n    \"extends\": \"../../tsconfig.json\",\n    \"include\": [\"src\", \"test\"]\n}\n"
  },
  {
    "path": "packages/errors/tsup.config.ts",
    "content": "import { defineConfig } from 'tsup';\n\nimport { getCliBuildConfig, getPackageBuildConfigs } from '../../tsup.config.base';\n\nexport default defineConfig([...getPackageBuildConfigs(), getCliBuildConfig()]);\n"
  },
  {
    "path": "packages/errors/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\nimport { getVitestConfig } from '../../vitest.config.base.mjs';\n\nexport default defineConfig({\n    test: {\n        projects: [getVitestConfig('browser'), getVitestConfig('node'), getVitestConfig('react-native')],\n    },\n});\n"
  },
  {
    "path": "packages/library/.gitignore",
    "content": "dist/\n"
  },
  {
    "path": "packages/library/.prettierignore",
    "content": "dist/\ntest/e2e/\ntest-ledger/\ntarget/\nCHANGELOG.md\n"
  },
  {
    "path": "packages/library/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Codama\nCopyright (c) 2024 Metaplex Foundation\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/library/README.md",
    "content": "# Codama ➤ Main Library\n\n[![npm][npm-image]][npm-url]\n[![npm-downloads][npm-downloads-image]][npm-url]\n\n[npm-downloads-image]: https://img.shields.io/npm/dm/codama.svg?style=flat\n[npm-image]: https://img.shields.io/npm/v/codama.svg?style=flat&label=%40codama%2Fnodes\n[npm-url]: https://www.npmjs.com/package/codama\n\nThis package is the main library for Codama. It re-exports most of the other packages in the Codama monorepo and offers a `Codama` type with a few helpers to help bind everything together.\n\n## Installation\n\n```sh\npnpm install codama\n```\n\n## Packages included\n\nThis package includes the following packages. Note that some of them also re-export other packages.\n\n- [`@codama/errors`](../errors)\n- [`@codama/nodes`](../nodes)\n    - [`@codama/node-types`](../node-types)\n- [`@codama/validators`](../validators)\n- [`@codama/visitors`](../visitors)\n    - [`@codama/visitor-core`](../visitor-core)\n\n## The Codama helper\n\nAdditionally, this package offers a `Codama` type and a few helper functions to help you work with Codama IDLs.\n\n### `Codama`\n\nThe `Codama` interface wraps a `RootNode` and offers some helper methods to work with it.\n\n```ts\nexport interface Codama {\n    accept<T>(visitor: Visitor<T>): T;\n    clone(): Codama;\n    getJson(): string;\n    getRoot(): RootNode;\n    update(visitor: Visitor<Node | null>): void;\n}\n```\n\nThe `accept` function allows us to visit the wrapped `RootNode` using the provided visitor.\n\n```ts\n// Log the Codama IDL in the console.\ncodama.accept(consoleLogVisitor(getDebugStringVisitor({ indent: true })));\n```\n\nThe `update` function also accepts a visitor, but it uses the return value of that visitor to update the wrapped `RootNode`. This means that, given a `RootNode`, the provided visitor should also return a `RootNode`. An error will be thrown otherwise.\n\n```ts\n// Delete account nodes named \"mint\".\ncodama.update(deleteNodesVisitor(['[accountNode]mint']));\n\n// Transform all number nodes into u64 number nodes.\ncodama.update(\n    bottomUpTransformerVisitor([\n        {\n            select: '[numberTypeNode]',\n            transform: () => numberTypeNode(u64),\n        },\n    ]),\n);\n```\n\nOther helper functions include:\n\n- `clone()`: Creates a new instance of the `Codama` interface with a deep copy of the wrapped `RootNode`.\n- `getJson()`: Returns the JSON representation of the Codama IDL.\n- `getRoot()`: Returns the wrapped `RootNode`.\n\n```ts\nconst clonedCodama = codama.clone();\nconst jsonIdl = codama.getJson();\nconst rootNode = codama.getRoot();\n```\n\n### `createFromRoot(rootNode)`\n\nThe `createFromRoot` function creates a new instance of the `Codama` interface from a `RootNode`.\n\n```ts\nconst codama = createFromRoot(rootNode(programNode({ ... })));\n```\n\n### `createFromJson(jsonIdl)`\n\nThe `createFromJson` function creates a new instance of the `Codama` interface from a JSON representation of a `RootNode`.\n\n```ts\nconst json: string = fs.readFileSync('path/to/codamaIdl.json', 'utf-8');\nconst codama = createFromJson(json);\n```\n"
  },
  {
    "path": "packages/library/bin/cli.cjs",
    "content": "#!/usr/bin/env -S node\n\nconst run = require('../dist/cli.cjs').run;\n\nrun(process.argv);\n"
  },
  {
    "path": "packages/library/package.json",
    "content": "{\n    \"name\": \"codama\",\n    \"version\": \"1.6.0\",\n    \"description\": \"A Solana framework for building standardised programs\",\n    \"exports\": {\n        \"types\": \"./dist/types/index.d.ts\",\n        \"react-native\": \"./dist/index.react-native.mjs\",\n        \"browser\": {\n            \"import\": \"./dist/index.browser.mjs\",\n            \"require\": \"./dist/index.browser.cjs\"\n        },\n        \"node\": {\n            \"import\": \"./dist/index.node.mjs\",\n            \"require\": \"./dist/index.node.cjs\"\n        }\n    },\n    \"browser\": {\n        \"./dist/index.node.cjs\": \"./dist/index.browser.cjs\",\n        \"./dist/index.node.mjs\": \"./dist/index.browser.mjs\"\n    },\n    \"jsdelivr\": \"./dist/index.production.min.js\",\n    \"umd\": \"./dist/index.production.min.js\",\n    \"unpkg\": \"./dist/index.production.min.js\",\n    \"main\": \"./dist/index.node.cjs\",\n    \"module\": \"./dist/index.node.mjs\",\n    \"react-native\": \"./dist/index.react-native.mjs\",\n    \"types\": \"./dist/types/index.d.ts\",\n    \"type\": \"commonjs\",\n    \"bin\": \"./bin/cli.cjs\",\n    \"files\": [\n        \"./bin\",\n        \"./dist/types\",\n        \"./dist/cli.*\",\n        \"./dist/index.*\"\n    ],\n    \"sideEffects\": false,\n    \"keywords\": [\n        \"solana\",\n        \"framework\",\n        \"standard\",\n        \"specifications\",\n        \"code generation\"\n    ],\n    \"scripts\": {\n        \"build\": \"rimraf dist && tsup && tsc -p ./tsconfig.declarations.json\",\n        \"dev\": \"vitest --project node\",\n        \"lint\": \"eslint . && prettier --check .\",\n        \"lint:fix\": \"eslint --fix . && prettier --write .\",\n        \"test\": \"pnpm test:types && pnpm test:treeshakability && pnpm test:unit\",\n        \"test:treeshakability\": \"for file in dist/index.*.mjs; do agadoo $file; done\",\n        \"test:types\": \"tsc --noEmit\",\n        \"test:unit\": \"vitest run\"\n    },\n    \"dependencies\": {\n        \"@codama/cli\": \"workspace:*\",\n        \"@codama/errors\": \"workspace:*\",\n        \"@codama/nodes\": \"workspace:*\",\n        \"@codama/validators\": \"workspace:*\",\n        \"@codama/visitors\": \"workspace:*\"\n    },\n    \"license\": \"MIT\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/codama-idl/codama\"\n    },\n    \"bugs\": {\n        \"url\": \"http://github.com/codama-idl/codama/issues\"\n    },\n    \"browserslist\": [\n        \"supports bigint and not dead\",\n        \"maintained node versions\"\n    ]\n}\n"
  },
  {
    "path": "packages/library/src/cli/index.ts",
    "content": "import { createProgram, runProgram } from '@codama/cli';\n\nconst program = createProgram();\n\nexport async function run(argv: readonly string[]) {\n    await runProgram(program, argv);\n}\n"
  },
  {
    "path": "packages/library/src/codama.ts",
    "content": "import { CODAMA_ERROR__VERSION_MISMATCH } from '@codama/errors';\nimport { CodamaError } from '@codama/errors';\nimport { assertIsNode, CodamaVersion, Node, RootNode } from '@codama/nodes';\nimport { visit, Visitor } from '@codama/visitors';\n\nexport interface Codama {\n    accept<T>(visitor: Visitor<T, 'rootNode'>): T;\n    clone(): Codama;\n    getJson(): string;\n    getRoot(): RootNode;\n    update(visitor: Visitor<Node | null, 'rootNode'>): void;\n}\n\nexport function createFromRoot(root: RootNode): Codama {\n    let currentRoot = root;\n    validateCodamaVersion(currentRoot.version);\n    return {\n        accept<T>(visitor: Visitor<T, 'rootNode'>): T {\n            return visit(currentRoot, visitor);\n        },\n        clone(): Codama {\n            return createFromRoot({ ...currentRoot });\n        },\n        getJson(): string {\n            return JSON.stringify(currentRoot);\n        },\n        getRoot(): RootNode {\n            return currentRoot;\n        },\n        update(visitor: Visitor<Node | null, 'rootNode'>): void {\n            const newRoot = visit(currentRoot, visitor);\n            assertIsNode(newRoot, 'rootNode');\n            currentRoot = newRoot;\n        },\n    };\n}\n\nexport function createFromJson(json: string): Codama {\n    return createFromRoot(JSON.parse(json) as RootNode);\n}\n\nexport function validateCodamaVersion(rootVersion: CodamaVersion): void {\n    const codamaVersion = __VERSION__;\n    if (rootVersion === codamaVersion) return;\n    const [rootMajor, rootMinor] = rootVersion.split('.').map(Number);\n    const [CodamaMajor, CodamaMinor] = codamaVersion.split('.').map(Number);\n    const isZeroMajor = rootMajor === 0 && CodamaMajor === 0;\n    if (isZeroMajor && rootMinor === CodamaMinor) return;\n    if (rootMajor === CodamaMajor) return;\n    throw new CodamaError(CODAMA_ERROR__VERSION_MISMATCH, { codamaVersion, rootVersion });\n}\n"
  },
  {
    "path": "packages/library/src/index.ts",
    "content": "export * from '@codama/errors';\nexport * from '@codama/nodes';\nexport * from '@codama/validators';\nexport * from '@codama/visitors';\n\nexport * from './codama';\n"
  },
  {
    "path": "packages/library/src/types/global.d.ts",
    "content": "declare const __BROWSER__: boolean;\ndeclare const __ESM__: boolean;\ndeclare const __NODEJS__: boolean;\ndeclare const __REACTNATIVE__: boolean;\ndeclare const __TEST__: boolean;\ndeclare const __VERSION__: string;\n"
  },
  {
    "path": "packages/library/test/index.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { createFromRoot, identityVisitor, programNode, rootNode, rootNodeVisitor, voidVisitor } from '../src';\n\ntest('it exports node helpers', () => {\n    expect(typeof rootNode).toBe('function');\n});\n\ntest('it exports visitors', () => {\n    expect(typeof identityVisitor).toBe('function');\n});\n\ntest('it accepts visitors', () => {\n    const codama = createFromRoot(rootNode(programNode({ name: 'myProgram', publicKey: '1111' })));\n    const visitor = voidVisitor({ keys: ['rootNode'] });\n    const result = codama.accept(visitor) satisfies void;\n    expect(typeof result).toBe('undefined');\n});\n\ntest('it updates the root node returned by visitors', () => {\n    const codama = createFromRoot(rootNode(programNode({ name: 'myProgram', publicKey: '1111' })));\n    const visitor = rootNodeVisitor(node => rootNode(programNode({ ...node.program, name: 'myTransformedProgram' })));\n    codama.update(visitor) satisfies void;\n    expect(codama.getRoot()).toEqual(rootNode(programNode({ name: 'myTransformedProgram', publicKey: '1111' })));\n});\n"
  },
  {
    "path": "packages/library/tsconfig.declarations.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"declarationMap\": true,\n        \"emitDeclarationOnly\": true,\n        \"outDir\": \"./dist/types\"\n    },\n    \"extends\": \"./tsconfig.json\",\n    \"include\": [\"src/index.ts\", \"src/types\"]\n}\n"
  },
  {
    "path": "packages/library/tsconfig.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": {\n        \"lib\": [\"DOM\", \"ES2015\", \"ES2022.Error\"],\n        \"resolveJsonModule\": true\n    },\n    \"display\": \"codama\",\n    \"extends\": \"../../tsconfig.json\",\n    \"include\": [\"src\", \"test\"]\n}\n"
  },
  {
    "path": "packages/library/tsup.config.ts",
    "content": "import { defineConfig } from 'tsup';\n\nimport { getBuildConfig, getCliBuildConfig, getPackageBuildConfigs } from '../../tsup.config.base';\n\nexport default defineConfig([\n    ...getPackageBuildConfigs(),\n    getBuildConfig({ format: 'iife', platform: 'browser' }),\n    getCliBuildConfig(),\n]);\n"
  },
  {
    "path": "packages/library/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\nimport { getVitestConfig } from '../../vitest.config.base.mjs';\n\nexport default defineConfig({\n    test: {\n        projects: [getVitestConfig('browser'), getVitestConfig('node'), getVitestConfig('react-native')],\n    },\n});\n"
  },
  {
    "path": "packages/node-types/.gitignore",
    "content": "dist/\n"
  },
  {
    "path": "packages/node-types/.prettierignore",
    "content": "dist/\ntest/e2e/\ntest-ledger/\ntarget/\nCHANGELOG.md\n"
  },
  {
    "path": "packages/node-types/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Codama\nCopyright (c) 2024 Metaplex Foundation\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/node-types/README.md",
    "content": "# Codama ➤ Node Types\n\n[![npm][npm-image]][npm-url]\n[![npm-downloads][npm-downloads-image]][npm-url]\n\n[npm-downloads-image]: https://img.shields.io/npm/dm/@codama/node-types.svg?style=flat\n[npm-image]: https://img.shields.io/npm/v/@codama/node-types.svg?style=flat&label=%40codama%2Fnode-types\n[npm-url]: https://www.npmjs.com/package/@codama/node-types\n\nThis package is the type-only version of the `@codama/nodes` package. Check out the [nodes documentation](../nodes) for more information.\n\n## Installation\n\n```sh\npnpm install @codama/node-types\n```\n\n> [!NOTE]\n> This package is included in the [`@codama/nodes`](../nodes) package and in the main [`codama`](../library) library. Meaning, you already have access to its content if you are installing Codama in one of these ways.\n>\n> ```sh\n> pnpm install @codama/nodes\n> pnpm install codama\n> ```\n"
  },
  {
    "path": "packages/node-types/package.json",
    "content": "{\n    \"name\": \"@codama/node-types\",\n    \"version\": \"1.6.0\",\n    \"description\": \"Node specifications for the Codama standard\",\n    \"exports\": {\n        \"types\": \"./dist/types/index.d.ts\",\n        \"react-native\": \"./dist/index.react-native.mjs\",\n        \"browser\": {\n            \"import\": \"./dist/index.browser.mjs\",\n            \"require\": \"./dist/index.browser.cjs\"\n        },\n        \"node\": {\n            \"import\": \"./dist/index.node.mjs\",\n            \"require\": \"./dist/index.node.cjs\"\n        }\n    },\n    \"browser\": {\n        \"./dist/index.node.cjs\": \"./dist/index.browser.cjs\",\n        \"./dist/index.node.mjs\": \"./dist/index.browser.mjs\"\n    },\n    \"main\": \"./dist/index.node.cjs\",\n    \"module\": \"./dist/index.node.mjs\",\n    \"react-native\": \"./dist/index.react-native.mjs\",\n    \"types\": \"./dist/types/index.d.ts\",\n    \"type\": \"commonjs\",\n    \"files\": [\n        \"./dist/types\",\n        \"./dist/index.*\"\n    ],\n    \"sideEffects\": false,\n    \"keywords\": [\n        \"solana\",\n        \"framework\",\n        \"standard\",\n        \"specifications\"\n    ],\n    \"scripts\": {\n        \"build\": \"rimraf dist && tsup && tsc -p ./tsconfig.declarations.json\",\n        \"lint\": \"eslint . && prettier --check .\",\n        \"lint:fix\": \"eslint --fix . && prettier --write .\",\n        \"test\": \"pnpm test:types && pnpm test:treeshakability\",\n        \"test:treeshakability\": \"for file in dist/index.*.mjs; do agadoo $file; done\",\n        \"test:types\": \"tsc --noEmit\"\n    },\n    \"license\": \"MIT\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/codama-idl/codama\"\n    },\n    \"bugs\": {\n        \"url\": \"http://github.com/codama-idl/codama/issues\"\n    },\n    \"browserslist\": [\n        \"supports bigint and not dead\",\n        \"maintained node versions\"\n    ]\n}\n"
  },
  {
    "path": "packages/node-types/src/AccountNode.ts",
    "content": "import type { DiscriminatorNode } from './discriminatorNodes';\nimport type { PdaLinkNode } from './linkNodes';\nimport type { CamelCaseString, Docs } from './shared';\nimport type { NestedTypeNode, StructTypeNode } from './typeNodes';\n\nexport interface AccountNode<\n    TData extends NestedTypeNode<StructTypeNode> = NestedTypeNode<StructTypeNode>,\n    TPda extends PdaLinkNode | undefined = PdaLinkNode | undefined,\n    TDiscriminators extends DiscriminatorNode[] | undefined = DiscriminatorNode[] | undefined,\n> {\n    readonly kind: 'accountNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n    readonly size?: number | null;\n    readonly docs?: Docs;\n\n    // Children.\n    readonly data: TData;\n    readonly pda?: TPda;\n    readonly discriminators?: TDiscriminators;\n}\n"
  },
  {
    "path": "packages/node-types/src/DefinedTypeNode.ts",
    "content": "import type { CamelCaseString, Docs } from './shared';\nimport type { TypeNode } from './typeNodes/TypeNode';\n\nexport interface DefinedTypeNode<TType extends TypeNode = TypeNode> {\n    readonly kind: 'definedTypeNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n    readonly docs?: Docs;\n\n    // Children.\n    readonly type: TType;\n}\n"
  },
  {
    "path": "packages/node-types/src/ErrorNode.ts",
    "content": "import type { CamelCaseString, Docs } from './shared';\n\nexport interface ErrorNode {\n    readonly kind: 'errorNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n    readonly code: number;\n    readonly message: string;\n    readonly docs?: Docs;\n}\n"
  },
  {
    "path": "packages/node-types/src/EventNode.ts",
    "content": "import type { DiscriminatorNode } from './discriminatorNodes';\nimport type { CamelCaseString, Docs } from './shared';\nimport type { TypeNode } from './typeNodes';\n\nexport interface EventNode<\n    TData extends TypeNode = TypeNode,\n    TDiscriminators extends DiscriminatorNode[] | undefined = DiscriminatorNode[] | undefined,\n> {\n    readonly kind: 'eventNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n    readonly docs?: Docs;\n\n    // Children.\n    readonly data: TData;\n    readonly discriminators?: TDiscriminators;\n}\n"
  },
  {
    "path": "packages/node-types/src/InstructionAccountNode.ts",
    "content": "import type { InstructionInputValueNode } from './contextualValueNodes';\nimport type { CamelCaseString, Docs } from './shared';\n\nexport interface InstructionAccountNode<\n    TDefaultValue extends InstructionInputValueNode | undefined = InstructionInputValueNode | undefined,\n> {\n    readonly kind: 'instructionAccountNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n    readonly isWritable: boolean;\n    readonly isSigner: boolean | 'either';\n    readonly isOptional?: boolean;\n    readonly docs?: Docs;\n\n    // Children.\n    readonly defaultValue?: TDefaultValue;\n}\n"
  },
  {
    "path": "packages/node-types/src/InstructionArgumentNode.ts",
    "content": "import type { InstructionInputValueNode } from './contextualValueNodes';\nimport type { CamelCaseString, Docs } from './shared';\nimport type { TypeNode } from './typeNodes';\n\nexport interface InstructionArgumentNode<\n    TDefaultValue extends InstructionInputValueNode | undefined = InstructionInputValueNode | undefined,\n> {\n    readonly kind: 'instructionArgumentNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n    readonly defaultValueStrategy?: 'omitted' | 'optional';\n    readonly docs?: Docs;\n\n    // Children.\n    readonly type: TypeNode;\n    readonly defaultValue?: TDefaultValue;\n}\n"
  },
  {
    "path": "packages/node-types/src/InstructionByteDeltaNode.ts",
    "content": "import type { ArgumentValueNode, ResolverValueNode } from './contextualValueNodes';\nimport type { AccountLinkNode } from './linkNodes';\nimport type { NumberValueNode } from './valueNodes';\n\ntype InstructionByteDeltaNodeValue = AccountLinkNode | ArgumentValueNode | NumberValueNode | ResolverValueNode;\n\nexport interface InstructionByteDeltaNode<\n    TValue extends InstructionByteDeltaNodeValue = InstructionByteDeltaNodeValue,\n> {\n    readonly kind: 'instructionByteDeltaNode';\n\n    // Data.\n    readonly withHeader: boolean;\n    readonly subtract?: boolean;\n\n    // Children.\n    readonly value: TValue;\n}\n"
  },
  {
    "path": "packages/node-types/src/InstructionNode.ts",
    "content": "import type { DiscriminatorNode } from './discriminatorNodes';\nimport type { InstructionAccountNode } from './InstructionAccountNode';\nimport type { InstructionArgumentNode } from './InstructionArgumentNode';\nimport type { InstructionByteDeltaNode } from './InstructionByteDeltaNode';\nimport type { InstructionRemainingAccountsNode } from './InstructionRemainingAccountsNode';\nimport type { InstructionStatusNode } from './InstructionStatusNode';\nimport type { CamelCaseString, Docs } from './shared';\n\ntype SubInstructionNode = InstructionNode;\n\nexport type OptionalAccountStrategy = 'omitted' | 'programId';\n\nexport interface InstructionNode<\n    TAccounts extends InstructionAccountNode[] = InstructionAccountNode[],\n    TArguments extends InstructionArgumentNode[] = InstructionArgumentNode[],\n    TExtraArguments extends InstructionArgumentNode[] | undefined = InstructionArgumentNode[] | undefined,\n    TRemainingAccounts extends InstructionRemainingAccountsNode[] | undefined =\n        | InstructionRemainingAccountsNode[]\n        | undefined,\n    TByteDeltas extends InstructionByteDeltaNode[] | undefined = InstructionByteDeltaNode[] | undefined,\n    TDiscriminators extends DiscriminatorNode[] | undefined = DiscriminatorNode[] | undefined,\n    TSubInstructions extends SubInstructionNode[] | undefined = SubInstructionNode[] | undefined,\n> {\n    readonly kind: 'instructionNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n    readonly docs?: Docs;\n    readonly optionalAccountStrategy?: OptionalAccountStrategy;\n\n    // Children.\n    readonly accounts: TAccounts;\n    readonly arguments: TArguments;\n    readonly extraArguments?: TExtraArguments;\n    readonly remainingAccounts?: TRemainingAccounts;\n    readonly byteDeltas?: TByteDeltas;\n    readonly discriminators?: TDiscriminators;\n    readonly status?: InstructionStatusNode;\n    readonly subInstructions?: TSubInstructions;\n}\n"
  },
  {
    "path": "packages/node-types/src/InstructionRemainingAccountsNode.ts",
    "content": "import type { ArgumentValueNode, ResolverValueNode } from './contextualValueNodes';\nimport type { Docs } from './shared';\n\nexport interface InstructionRemainingAccountsNode<\n    TValue extends ArgumentValueNode | ResolverValueNode = ArgumentValueNode | ResolverValueNode,\n> {\n    readonly kind: 'instructionRemainingAccountsNode';\n\n    // Data.\n    readonly isOptional?: boolean;\n    readonly isSigner?: boolean | 'either';\n    readonly isWritable?: boolean;\n    readonly docs?: Docs;\n\n    // Children.\n    readonly value: TValue;\n}\n"
  },
  {
    "path": "packages/node-types/src/InstructionStatusNode.ts",
    "content": "import type { InstructionLifecycle } from './shared';\n\nexport interface InstructionStatusNode {\n    readonly kind: 'instructionStatusNode';\n\n    // Data.\n    readonly lifecycle: InstructionLifecycle;\n    readonly message?: string;\n}\n"
  },
  {
    "path": "packages/node-types/src/Node.ts",
    "content": "import type { AccountNode } from './AccountNode';\nimport type { RegisteredContextualValueNode } from './contextualValueNodes/ContextualValueNode';\nimport type { RegisteredCountNode } from './countNodes/CountNode';\nimport type { DefinedTypeNode } from './DefinedTypeNode';\nimport type { RegisteredDiscriminatorNode } from './discriminatorNodes/DiscriminatorNode';\nimport type { ErrorNode } from './ErrorNode';\nimport type { EventNode } from './EventNode';\nimport type { InstructionAccountNode } from './InstructionAccountNode';\nimport type { InstructionArgumentNode } from './InstructionArgumentNode';\nimport type { InstructionByteDeltaNode } from './InstructionByteDeltaNode';\nimport type { InstructionNode } from './InstructionNode';\nimport type { InstructionRemainingAccountsNode } from './InstructionRemainingAccountsNode';\nimport type { InstructionStatusNode } from './InstructionStatusNode';\nimport type { RegisteredLinkNode } from './linkNodes/LinkNode';\nimport type { PdaNode } from './PdaNode';\nimport type { RegisteredPdaSeedNode } from './pdaSeedNodes/PdaSeedNode';\nimport type { ProgramNode } from './ProgramNode';\nimport type { RootNode } from './RootNode';\nimport type { RegisteredTypeNode } from './typeNodes/TypeNode';\nimport type { RegisteredValueNode } from './valueNodes/ValueNode';\n\n// Node Registration.\nexport type NodeKind = Node['kind'];\nexport type Node =\n    | AccountNode\n    | DefinedTypeNode\n    | ErrorNode\n    | EventNode\n    | InstructionAccountNode\n    | InstructionArgumentNode\n    | InstructionByteDeltaNode\n    | InstructionNode\n    | InstructionRemainingAccountsNode\n    | InstructionStatusNode\n    | PdaNode\n    | ProgramNode\n    | RegisteredContextualValueNode\n    | RegisteredCountNode\n    | RegisteredDiscriminatorNode\n    | RegisteredLinkNode\n    | RegisteredPdaSeedNode\n    | RegisteredTypeNode\n    | RegisteredValueNode\n    | RootNode;\n\n// Node Helpers.\nexport type GetNodeFromKind<TKind extends NodeKind> = Extract<Node, { kind: TKind }>;\n"
  },
  {
    "path": "packages/node-types/src/PdaNode.ts",
    "content": "import type { PdaSeedNode } from './pdaSeedNodes';\nimport type { CamelCaseString, Docs } from './shared';\n\nexport interface PdaNode<TSeeds extends PdaSeedNode[] = PdaSeedNode[]> {\n    readonly kind: 'pdaNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n    readonly docs?: Docs;\n    readonly programId?: string;\n\n    // Children.\n    readonly seeds: TSeeds;\n}\n"
  },
  {
    "path": "packages/node-types/src/ProgramNode.ts",
    "content": "import type { AccountNode } from './AccountNode';\nimport type { DefinedTypeNode } from './DefinedTypeNode';\nimport type { ErrorNode } from './ErrorNode';\nimport type { EventNode } from './EventNode';\nimport type { InstructionNode } from './InstructionNode';\nimport type { PdaNode } from './PdaNode';\nimport type { CamelCaseString, Docs, ProgramVersion } from './shared';\n\nexport interface ProgramNode<\n    TPdas extends PdaNode[] = PdaNode[],\n    TAccounts extends AccountNode[] = AccountNode[],\n    TInstructions extends InstructionNode[] = InstructionNode[],\n    TDefinedTypes extends DefinedTypeNode[] = DefinedTypeNode[],\n    TErrors extends ErrorNode[] = ErrorNode[],\n    TEvents extends EventNode[] = EventNode[],\n> {\n    readonly kind: 'programNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n    readonly publicKey: string;\n    readonly version: ProgramVersion;\n    readonly origin?: 'anchor' | 'shank';\n    readonly docs?: Docs;\n\n    // Children.\n    readonly accounts: TAccounts;\n    readonly instructions: TInstructions;\n    readonly definedTypes: TDefinedTypes;\n    readonly pdas: TPdas;\n    readonly events: TEvents;\n    readonly errors: TErrors;\n}\n"
  },
  {
    "path": "packages/node-types/src/RootNode.ts",
    "content": "import type { ProgramNode } from './ProgramNode';\nimport type { CodamaVersion } from './shared';\n\nexport interface RootNode<\n    TProgram extends ProgramNode = ProgramNode,\n    TAdditionalPrograms extends ProgramNode[] = ProgramNode[],\n> {\n    readonly kind: 'rootNode';\n\n    // Data.\n    readonly standard: 'codama';\n    readonly version: CodamaVersion;\n\n    // Children.\n    readonly program: TProgram;\n    readonly additionalPrograms: TAdditionalPrograms;\n}\n"
  },
  {
    "path": "packages/node-types/src/contextualValueNodes/AccountBumpValueNode.ts",
    "content": "import type { CamelCaseString } from '../shared';\n\nexport interface AccountBumpValueNode {\n    readonly kind: 'accountBumpValueNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n}\n"
  },
  {
    "path": "packages/node-types/src/contextualValueNodes/AccountValueNode.ts",
    "content": "import type { CamelCaseString } from '../shared';\n\nexport interface AccountValueNode {\n    readonly kind: 'accountValueNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n}\n"
  },
  {
    "path": "packages/node-types/src/contextualValueNodes/ArgumentValueNode.ts",
    "content": "import type { CamelCaseString } from '../shared';\n\nexport interface ArgumentValueNode {\n    readonly kind: 'argumentValueNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n}\n"
  },
  {
    "path": "packages/node-types/src/contextualValueNodes/ConditionalValueNode.ts",
    "content": "import type { ValueNode } from '../valueNodes';\nimport type { AccountValueNode } from './AccountValueNode';\nimport type { ArgumentValueNode } from './ArgumentValueNode';\nimport type { InstructionInputValueNode } from './ContextualValueNode';\nimport type { ResolverValueNode } from './ResolverValueNode';\n\ntype ConditionNode = AccountValueNode | ArgumentValueNode | ResolverValueNode;\n\nexport interface ConditionalValueNode<\n    TCondition extends ConditionNode = ConditionNode,\n    TValue extends ValueNode | undefined = ValueNode | undefined,\n    TIfTrue extends InstructionInputValueNode | undefined = InstructionInputValueNode | undefined,\n    TIfFalse extends InstructionInputValueNode | undefined = InstructionInputValueNode | undefined,\n> {\n    readonly kind: 'conditionalValueNode';\n\n    // Children.\n    readonly condition: TCondition;\n    readonly value?: TValue;\n    readonly ifTrue?: TIfTrue;\n    readonly ifFalse?: TIfFalse;\n}\n"
  },
  {
    "path": "packages/node-types/src/contextualValueNodes/ContextualValueNode.ts",
    "content": "import type { ProgramLinkNode } from '../linkNodes/ProgramLinkNode';\nimport type { ValueNode } from '../valueNodes/ValueNode';\nimport type { AccountBumpValueNode } from './AccountBumpValueNode';\nimport type { AccountValueNode } from './AccountValueNode';\nimport type { ArgumentValueNode } from './ArgumentValueNode';\nimport type { ConditionalValueNode } from './ConditionalValueNode';\nimport type { IdentityValueNode } from './IdentityValueNode';\nimport type { PayerValueNode } from './PayerValueNode';\nimport type { PdaSeedValueNode } from './PdaSeedValueNode';\nimport type { PdaValueNode } from './PdaValueNode';\nimport type { ProgramIdValueNode } from './ProgramIdValueNode';\nimport type { ResolverValueNode } from './ResolverValueNode';\n\n// Standalone Contextual Value Node Registration.\nexport type StandaloneContextualValueNode =\n    | AccountBumpValueNode\n    | AccountValueNode\n    | ArgumentValueNode\n    | ConditionalValueNode\n    | IdentityValueNode\n    | PayerValueNode\n    | PdaValueNode\n    | ProgramIdValueNode\n    | ResolverValueNode;\n\n// Contextual Value Node Registration.\nexport type RegisteredContextualValueNode = PdaSeedValueNode | StandaloneContextualValueNode;\n\n// Contextual Value Node Helpers.\nexport type ContextualValueNode = StandaloneContextualValueNode;\nexport type InstructionInputValueNode = ContextualValueNode | ProgramLinkNode | ValueNode;\n"
  },
  {
    "path": "packages/node-types/src/contextualValueNodes/IdentityValueNode.ts",
    "content": "export interface IdentityValueNode {\n    readonly kind: 'identityValueNode';\n}\n"
  },
  {
    "path": "packages/node-types/src/contextualValueNodes/PayerValueNode.ts",
    "content": "export interface PayerValueNode {\n    readonly kind: 'payerValueNode';\n}\n"
  },
  {
    "path": "packages/node-types/src/contextualValueNodes/PdaSeedValueNode.ts",
    "content": "import type { CamelCaseString } from '../shared';\nimport type { ValueNode } from '../valueNodes';\nimport type { AccountValueNode } from './AccountValueNode';\nimport type { ArgumentValueNode } from './ArgumentValueNode';\n\nexport interface PdaSeedValueNode<\n    TValue extends AccountValueNode | ArgumentValueNode | ValueNode = AccountValueNode | ArgumentValueNode | ValueNode,\n> {\n    readonly kind: 'pdaSeedValueNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n\n    // Children.\n    readonly value: TValue;\n}\n"
  },
  {
    "path": "packages/node-types/src/contextualValueNodes/PdaValueNode.ts",
    "content": "import type { PdaLinkNode } from '../linkNodes';\nimport type { PdaNode } from '../PdaNode';\nimport type { AccountValueNode } from './AccountValueNode';\nimport type { ArgumentValueNode } from './ArgumentValueNode';\nimport type { PdaSeedValueNode } from './PdaSeedValueNode';\n\nexport interface PdaValueNode<\n    TSeeds extends PdaSeedValueNode[] = PdaSeedValueNode[],\n    TProgram extends AccountValueNode | ArgumentValueNode | undefined =\n        | AccountValueNode\n        | ArgumentValueNode\n        | undefined,\n> {\n    readonly kind: 'pdaValueNode';\n\n    // Children.\n    readonly pda: PdaLinkNode | PdaNode;\n    readonly seeds: TSeeds;\n    readonly programId?: TProgram;\n}\n"
  },
  {
    "path": "packages/node-types/src/contextualValueNodes/ProgramIdValueNode.ts",
    "content": "export interface ProgramIdValueNode {\n    readonly kind: 'programIdValueNode';\n}\n"
  },
  {
    "path": "packages/node-types/src/contextualValueNodes/ResolverValueNode.ts",
    "content": "import type { CamelCaseString, Docs } from '../shared';\nimport type { AccountValueNode } from './AccountValueNode';\nimport type { ArgumentValueNode } from './ArgumentValueNode';\n\nexport interface ResolverValueNode<\n    TDependsOn extends (AccountValueNode | ArgumentValueNode)[] = (AccountValueNode | ArgumentValueNode)[],\n> {\n    readonly kind: 'resolverValueNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n    readonly docs?: Docs;\n\n    // Children.\n    readonly dependsOn?: TDependsOn;\n}\n"
  },
  {
    "path": "packages/node-types/src/contextualValueNodes/index.ts",
    "content": "export * from './AccountBumpValueNode';\nexport * from './AccountValueNode';\nexport * from './ArgumentValueNode';\nexport * from './ConditionalValueNode';\nexport * from './ContextualValueNode';\nexport * from './IdentityValueNode';\nexport * from './PayerValueNode';\nexport * from './PdaSeedValueNode';\nexport * from './PdaValueNode';\nexport * from './ProgramIdValueNode';\nexport * from './ResolverValueNode';\n"
  },
  {
    "path": "packages/node-types/src/countNodes/CountNode.ts",
    "content": "import type { FixedCountNode } from './FixedCountNode';\nimport type { PrefixedCountNode } from './PrefixedCountNode';\nimport type { RemainderCountNode } from './RemainderCountNode';\n\n// Count Node Registration.\nexport type RegisteredCountNode = FixedCountNode | PrefixedCountNode | RemainderCountNode;\n\n// Count Node Helpers.\nexport type CountNode = RegisteredCountNode;\n"
  },
  {
    "path": "packages/node-types/src/countNodes/FixedCountNode.ts",
    "content": "export interface FixedCountNode {\n    readonly kind: 'fixedCountNode';\n\n    // Data.\n    readonly value: number;\n}\n"
  },
  {
    "path": "packages/node-types/src/countNodes/PrefixedCountNode.ts",
    "content": "import type { NestedTypeNode, NumberTypeNode } from '../typeNodes';\n\nexport interface PrefixedCountNode<TPrefix extends NestedTypeNode<NumberTypeNode> = NestedTypeNode<NumberTypeNode>> {\n    readonly kind: 'prefixedCountNode';\n\n    // Children.\n    readonly prefix: TPrefix;\n}\n"
  },
  {
    "path": "packages/node-types/src/countNodes/RemainderCountNode.ts",
    "content": "export interface RemainderCountNode {\n    readonly kind: 'remainderCountNode';\n}\n"
  },
  {
    "path": "packages/node-types/src/countNodes/index.ts",
    "content": "export * from './CountNode';\nexport * from './FixedCountNode';\nexport * from './PrefixedCountNode';\nexport * from './RemainderCountNode';\n"
  },
  {
    "path": "packages/node-types/src/discriminatorNodes/ConstantDiscriminatorNode.ts",
    "content": "import type { ConstantValueNode } from '../valueNodes';\n\nexport interface ConstantDiscriminatorNode<TConstant extends ConstantValueNode = ConstantValueNode> {\n    readonly kind: 'constantDiscriminatorNode';\n\n    // Data.\n    readonly offset: number;\n\n    // Children.\n    readonly constant: TConstant;\n}\n"
  },
  {
    "path": "packages/node-types/src/discriminatorNodes/DiscriminatorNode.ts",
    "content": "import type { ConstantDiscriminatorNode } from './ConstantDiscriminatorNode';\nimport type { FieldDiscriminatorNode } from './FieldDiscriminatorNode';\nimport type { SizeDiscriminatorNode } from './SizeDiscriminatorNode';\n\n// Discriminator Node Registration.\nexport type RegisteredDiscriminatorNode = ConstantDiscriminatorNode | FieldDiscriminatorNode | SizeDiscriminatorNode;\n\n// Discriminator Node Helpers.\nexport type DiscriminatorNode = RegisteredDiscriminatorNode;\n"
  },
  {
    "path": "packages/node-types/src/discriminatorNodes/FieldDiscriminatorNode.ts",
    "content": "import type { CamelCaseString } from '../shared';\n\nexport interface FieldDiscriminatorNode {\n    readonly kind: 'fieldDiscriminatorNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n    readonly offset: number;\n}\n"
  },
  {
    "path": "packages/node-types/src/discriminatorNodes/SizeDiscriminatorNode.ts",
    "content": "export interface SizeDiscriminatorNode {\n    readonly kind: 'sizeDiscriminatorNode';\n\n    // Data.\n    readonly size: number;\n}\n"
  },
  {
    "path": "packages/node-types/src/discriminatorNodes/index.ts",
    "content": "export * from './ConstantDiscriminatorNode';\nexport * from './DiscriminatorNode';\nexport * from './FieldDiscriminatorNode';\nexport * from './SizeDiscriminatorNode';\n"
  },
  {
    "path": "packages/node-types/src/index.ts",
    "content": "export * from './AccountNode';\nexport * from './DefinedTypeNode';\nexport * from './ErrorNode';\nexport * from './EventNode';\nexport * from './InstructionAccountNode';\nexport * from './InstructionArgumentNode';\nexport * from './InstructionByteDeltaNode';\nexport * from './InstructionNode';\nexport * from './InstructionRemainingAccountsNode';\nexport * from './InstructionStatusNode';\nexport * from './Node';\nexport * from './PdaNode';\nexport * from './ProgramNode';\nexport * from './RootNode';\n\nexport * from './contextualValueNodes';\nexport * from './countNodes';\nexport * from './discriminatorNodes';\nexport * from './linkNodes';\nexport * from './pdaSeedNodes';\nexport * from './shared';\nexport * from './typeNodes';\nexport * from './valueNodes';\n"
  },
  {
    "path": "packages/node-types/src/linkNodes/AccountLinkNode.ts",
    "content": "import type { CamelCaseString } from '../shared';\nimport type { ProgramLinkNode } from './ProgramLinkNode';\n\nexport interface AccountLinkNode<TProgram extends ProgramLinkNode | undefined = ProgramLinkNode | undefined> {\n    readonly kind: 'accountLinkNode';\n\n    // Children.\n    readonly program?: TProgram;\n\n    // Data.\n    readonly name: CamelCaseString;\n}\n"
  },
  {
    "path": "packages/node-types/src/linkNodes/DefinedTypeLinkNode.ts",
    "content": "import type { CamelCaseString } from '../shared';\nimport type { ProgramLinkNode } from './ProgramLinkNode';\n\nexport interface DefinedTypeLinkNode<TProgram extends ProgramLinkNode | undefined = ProgramLinkNode | undefined> {\n    readonly kind: 'definedTypeLinkNode';\n\n    // Children.\n    readonly program?: TProgram;\n\n    // Data.\n    readonly name: CamelCaseString;\n}\n"
  },
  {
    "path": "packages/node-types/src/linkNodes/InstructionAccountLinkNode.ts",
    "content": "import type { CamelCaseString } from '../shared';\nimport type { InstructionLinkNode } from './InstructionLinkNode';\n\nexport interface InstructionAccountLinkNode<\n    TInstruction extends InstructionLinkNode | undefined = InstructionLinkNode | undefined,\n> {\n    readonly kind: 'instructionAccountLinkNode';\n\n    // Children.\n    readonly instruction?: TInstruction;\n\n    // Data.\n    readonly name: CamelCaseString;\n}\n"
  },
  {
    "path": "packages/node-types/src/linkNodes/InstructionArgumentLinkNode.ts",
    "content": "import type { CamelCaseString } from '../shared';\nimport type { InstructionLinkNode } from './InstructionLinkNode';\n\nexport interface InstructionArgumentLinkNode<\n    TInstruction extends InstructionLinkNode | undefined = InstructionLinkNode | undefined,\n> {\n    readonly kind: 'instructionArgumentLinkNode';\n\n    // Children.\n    readonly instruction?: TInstruction;\n\n    // Data.\n    readonly name: CamelCaseString;\n}\n"
  },
  {
    "path": "packages/node-types/src/linkNodes/InstructionLinkNode.ts",
    "content": "import type { CamelCaseString } from '../shared';\nimport type { ProgramLinkNode } from './ProgramLinkNode';\n\nexport interface InstructionLinkNode<TProgram extends ProgramLinkNode | undefined = ProgramLinkNode | undefined> {\n    readonly kind: 'instructionLinkNode';\n\n    // Children.\n    readonly program?: TProgram;\n\n    // Data.\n    readonly name: CamelCaseString;\n}\n"
  },
  {
    "path": "packages/node-types/src/linkNodes/LinkNode.ts",
    "content": "import type { AccountLinkNode } from './AccountLinkNode';\nimport type { DefinedTypeLinkNode } from './DefinedTypeLinkNode';\nimport type { InstructionAccountLinkNode } from './InstructionAccountLinkNode';\nimport type { InstructionArgumentLinkNode } from './InstructionArgumentLinkNode';\nimport type { InstructionLinkNode } from './InstructionLinkNode';\nimport type { PdaLinkNode } from './PdaLinkNode';\nimport type { ProgramLinkNode } from './ProgramLinkNode';\n\n// Link Node Registration.\nexport type RegisteredLinkNode =\n    | AccountLinkNode\n    | DefinedTypeLinkNode\n    | InstructionAccountLinkNode\n    | InstructionArgumentLinkNode\n    | InstructionLinkNode\n    | PdaLinkNode\n    | ProgramLinkNode;\n\n// Link Node Helpers.\nexport type LinkNode = RegisteredLinkNode;\n"
  },
  {
    "path": "packages/node-types/src/linkNodes/PdaLinkNode.ts",
    "content": "import type { CamelCaseString } from '../shared';\nimport type { ProgramLinkNode } from './ProgramLinkNode';\n\nexport interface PdaLinkNode<TProgram extends ProgramLinkNode | undefined = ProgramLinkNode | undefined> {\n    readonly kind: 'pdaLinkNode';\n\n    // Children.\n    readonly program?: TProgram;\n\n    // Data.\n    readonly name: CamelCaseString;\n}\n"
  },
  {
    "path": "packages/node-types/src/linkNodes/ProgramLinkNode.ts",
    "content": "import type { CamelCaseString } from '../shared';\n\nexport interface ProgramLinkNode {\n    readonly kind: 'programLinkNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n}\n"
  },
  {
    "path": "packages/node-types/src/linkNodes/index.ts",
    "content": "export * from './AccountLinkNode';\nexport * from './DefinedTypeLinkNode';\nexport * from './InstructionAccountLinkNode';\nexport * from './InstructionArgumentLinkNode';\nexport * from './InstructionLinkNode';\nexport * from './LinkNode';\nexport * from './PdaLinkNode';\nexport * from './ProgramLinkNode';\n"
  },
  {
    "path": "packages/node-types/src/pdaSeedNodes/ConstantPdaSeedNode.ts",
    "content": "import type { ProgramIdValueNode } from '../contextualValueNodes';\nimport type { TypeNode } from '../typeNodes';\nimport type { ValueNode } from '../valueNodes';\n\nexport interface ConstantPdaSeedNode<\n    TType extends TypeNode = TypeNode,\n    TValue extends ProgramIdValueNode | ValueNode = ProgramIdValueNode | ValueNode,\n> {\n    readonly kind: 'constantPdaSeedNode';\n\n    // Children.\n    readonly type: TType;\n    readonly value: TValue;\n}\n"
  },
  {
    "path": "packages/node-types/src/pdaSeedNodes/PdaSeedNode.ts",
    "content": "import type { ConstantPdaSeedNode } from './ConstantPdaSeedNode';\nimport type { VariablePdaSeedNode } from './VariablePdaSeedNode';\n\n// Pda Seed Node Registration.\nexport type RegisteredPdaSeedNode = ConstantPdaSeedNode | VariablePdaSeedNode;\n\n// Pda Seed Node Helpers.\nexport type PdaSeedNode = RegisteredPdaSeedNode;\n"
  },
  {
    "path": "packages/node-types/src/pdaSeedNodes/VariablePdaSeedNode.ts",
    "content": "import type { CamelCaseString, Docs } from '../shared';\nimport type { TypeNode } from '../typeNodes';\n\nexport interface VariablePdaSeedNode<TType extends TypeNode = TypeNode> {\n    readonly kind: 'variablePdaSeedNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n    readonly docs?: Docs;\n\n    // Children.\n    readonly type: TType;\n}\n"
  },
  {
    "path": "packages/node-types/src/pdaSeedNodes/index.ts",
    "content": "export * from './ConstantPdaSeedNode';\nexport * from './PdaSeedNode';\nexport * from './VariablePdaSeedNode';\n"
  },
  {
    "path": "packages/node-types/src/shared/bytesEncoding.ts",
    "content": "export type BytesEncoding = 'base16' | 'base58' | 'base64' | 'utf8';\n"
  },
  {
    "path": "packages/node-types/src/shared/docs.ts",
    "content": "export type Docs = string[];\n"
  },
  {
    "path": "packages/node-types/src/shared/index.ts",
    "content": "export * from './bytesEncoding';\nexport * from './docs';\nexport * from './instructionLifecycle';\nexport * from './stringCases';\nexport * from './version';\n"
  },
  {
    "path": "packages/node-types/src/shared/instructionLifecycle.ts",
    "content": "export type InstructionLifecycle = 'archived' | 'deprecated' | 'draft' | 'live';\n"
  },
  {
    "path": "packages/node-types/src/shared/stringCases.ts",
    "content": "export type TitleCaseString = string & {\n    readonly ['__stringCase:codama']: 'titleCase';\n};\n\nexport type PascalCaseString = string & {\n    readonly ['__stringCase:codama']: 'pascalCase';\n};\n\nexport type CamelCaseString = string & {\n    readonly ['__stringCase:codama']: 'camelCase';\n};\n\nexport type KebabCaseString = string & {\n    readonly ['__stringCase:codama']: 'kebabCase';\n};\n\nexport type SnakeCaseString = string & {\n    readonly ['__stringCase:codama']: 'snakeCase';\n};\n"
  },
  {
    "path": "packages/node-types/src/shared/version.ts",
    "content": "type SemanticVersion = `${number}.${number}.${number}`;\n\nexport type CodamaVersion = SemanticVersion;\nexport type ProgramVersion = SemanticVersion;\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/AmountTypeNode.ts",
    "content": "import type { NestedTypeNode } from './NestedTypeNode';\nimport type { NumberTypeNode } from './NumberTypeNode';\n\nexport interface AmountTypeNode<TNumber extends NestedTypeNode<NumberTypeNode> = NestedTypeNode<NumberTypeNode>> {\n    readonly kind: 'amountTypeNode';\n\n    // Data.\n    readonly decimals: number;\n    readonly unit?: string;\n\n    // Children.\n    readonly number: TNumber;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/ArrayTypeNode.ts",
    "content": "import type { CountNode } from '../countNodes';\nimport type { TypeNode } from './TypeNode';\n\nexport interface ArrayTypeNode<TItem extends TypeNode = TypeNode, TCount extends CountNode = CountNode> {\n    readonly kind: 'arrayTypeNode';\n\n    // Children.\n    readonly item: TItem;\n    readonly count: TCount;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/BooleanTypeNode.ts",
    "content": "import type { NestedTypeNode } from './NestedTypeNode';\nimport type { NumberTypeNode } from './NumberTypeNode';\n\nexport interface BooleanTypeNode<TSize extends NestedTypeNode<NumberTypeNode> = NestedTypeNode<NumberTypeNode>> {\n    readonly kind: 'booleanTypeNode';\n\n    // Children.\n    readonly size: TSize;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/BytesTypeNode.ts",
    "content": "export interface BytesTypeNode {\n    readonly kind: 'bytesTypeNode';\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/DateTimeTypeNode.ts",
    "content": "import type { NestedTypeNode } from './NestedTypeNode';\nimport type { NumberTypeNode } from './NumberTypeNode';\n\nexport interface DateTimeTypeNode<TNumber extends NestedTypeNode<NumberTypeNode> = NestedTypeNode<NumberTypeNode>> {\n    readonly kind: 'dateTimeTypeNode';\n\n    // Children.\n    readonly number: TNumber;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/EnumEmptyVariantTypeNode.ts",
    "content": "import type { CamelCaseString } from '../shared';\n\nexport interface EnumEmptyVariantTypeNode {\n    readonly kind: 'enumEmptyVariantTypeNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n    readonly discriminator?: number;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/EnumStructVariantTypeNode.ts",
    "content": "import type { CamelCaseString } from '../shared';\nimport type { NestedTypeNode } from './NestedTypeNode';\nimport type { StructTypeNode } from './StructTypeNode';\n\nexport interface EnumStructVariantTypeNode<\n    TStruct extends NestedTypeNode<StructTypeNode> = NestedTypeNode<StructTypeNode>,\n> {\n    readonly kind: 'enumStructVariantTypeNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n    readonly discriminator?: number;\n\n    // Children.\n    readonly struct: TStruct;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/EnumTupleVariantTypeNode.ts",
    "content": "import type { CamelCaseString } from '../shared';\nimport type { NestedTypeNode } from './NestedTypeNode';\nimport type { TupleTypeNode } from './TupleTypeNode';\n\nexport interface EnumTupleVariantTypeNode<\n    TTuple extends NestedTypeNode<TupleTypeNode> = NestedTypeNode<TupleTypeNode>,\n> {\n    readonly kind: 'enumTupleVariantTypeNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n    readonly discriminator?: number;\n\n    // Children.\n    readonly tuple: TTuple;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/EnumTypeNode.ts",
    "content": "import type { EnumVariantTypeNode } from './EnumVariantTypeNode';\nimport type { NestedTypeNode } from './NestedTypeNode';\nimport type { NumberTypeNode } from './NumberTypeNode';\n\nexport interface EnumTypeNode<\n    TVariants extends EnumVariantTypeNode[] = EnumVariantTypeNode[],\n    TSize extends NestedTypeNode<NumberTypeNode> = NestedTypeNode<NumberTypeNode>,\n> {\n    readonly kind: 'enumTypeNode';\n\n    // Children.\n    readonly variants: TVariants;\n    readonly size: TSize;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/EnumVariantTypeNode.ts",
    "content": "import type { EnumEmptyVariantTypeNode } from './EnumEmptyVariantTypeNode';\nimport type { EnumStructVariantTypeNode } from './EnumStructVariantTypeNode';\nimport type { EnumTupleVariantTypeNode } from './EnumTupleVariantTypeNode';\n\nexport type EnumVariantTypeNode = EnumEmptyVariantTypeNode | EnumStructVariantTypeNode | EnumTupleVariantTypeNode;\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/FixedSizeTypeNode.ts",
    "content": "import type { TypeNode } from './TypeNode';\n\nexport interface FixedSizeTypeNode<TType extends TypeNode = TypeNode> {\n    readonly kind: 'fixedSizeTypeNode';\n\n    // Data.\n    readonly size: number;\n\n    // Children.\n    readonly type: TType;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/HiddenPrefixTypeNode.ts",
    "content": "import type { ConstantValueNode } from '../valueNodes';\nimport type { TypeNode } from './TypeNode';\n\nexport interface HiddenPrefixTypeNode<\n    TType extends TypeNode = TypeNode,\n    TPrefix extends ConstantValueNode[] = ConstantValueNode[],\n> {\n    readonly kind: 'hiddenPrefixTypeNode';\n\n    // Children.\n    readonly type: TType;\n    readonly prefix: TPrefix;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/HiddenSuffixTypeNode.ts",
    "content": "import type { ConstantValueNode } from '../valueNodes';\nimport type { TypeNode } from './TypeNode';\n\nexport interface HiddenSuffixTypeNode<\n    TType extends TypeNode = TypeNode,\n    TSuffix extends ConstantValueNode[] = ConstantValueNode[],\n> {\n    readonly kind: 'hiddenSuffixTypeNode';\n\n    // Children.\n    readonly type: TType;\n    readonly suffix: TSuffix;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/MapTypeNode.ts",
    "content": "import type { CountNode } from '../countNodes';\nimport type { TypeNode } from './TypeNode';\n\nexport interface MapTypeNode<\n    TKey extends TypeNode = TypeNode,\n    TValue extends TypeNode = TypeNode,\n    TCount extends CountNode = CountNode,\n> {\n    readonly kind: 'mapTypeNode';\n\n    // Children.\n    readonly key: TKey;\n    readonly value: TValue;\n    readonly count: TCount;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/NestedTypeNode.ts",
    "content": "import type { FixedSizeTypeNode } from './FixedSizeTypeNode';\nimport type { HiddenPrefixTypeNode } from './HiddenPrefixTypeNode';\nimport type { HiddenSuffixTypeNode } from './HiddenSuffixTypeNode';\nimport type { PostOffsetTypeNode } from './PostOffsetTypeNode';\nimport type { PreOffsetTypeNode } from './PreOffsetTypeNode';\nimport type { SentinelTypeNode } from './SentinelTypeNode';\nimport type { SizePrefixTypeNode } from './SizePrefixTypeNode';\nimport type { TypeNode } from './TypeNode';\n\nexport type NestedTypeNode<TType extends TypeNode> =\n    | FixedSizeTypeNode<NestedTypeNode<TType>>\n    | HiddenPrefixTypeNode<NestedTypeNode<TType>>\n    | HiddenSuffixTypeNode<NestedTypeNode<TType>>\n    | PostOffsetTypeNode<NestedTypeNode<TType>>\n    | PreOffsetTypeNode<NestedTypeNode<TType>>\n    | SentinelTypeNode<NestedTypeNode<TType>>\n    | SizePrefixTypeNode<NestedTypeNode<TType>>\n    | TType;\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/NumberTypeNode.ts",
    "content": "export type NumberFormat =\n    | 'f32'\n    | 'f64'\n    | 'i8'\n    | 'i16'\n    | 'i32'\n    | 'i64'\n    | 'i128'\n    | 'shortU16'\n    | 'u8'\n    | 'u16'\n    | 'u32'\n    | 'u64'\n    | 'u128';\n\nexport interface NumberTypeNode<TFormat extends NumberFormat = NumberFormat> {\n    readonly kind: 'numberTypeNode';\n\n    // Data.\n    readonly format: TFormat;\n    readonly endian: 'be' | 'le';\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/OptionTypeNode.ts",
    "content": "import type { NestedTypeNode } from './NestedTypeNode';\nimport type { NumberTypeNode } from './NumberTypeNode';\nimport type { TypeNode } from './TypeNode';\n\nexport interface OptionTypeNode<\n    TItem extends TypeNode = TypeNode,\n    TPrefix extends NestedTypeNode<NumberTypeNode> = NestedTypeNode<NumberTypeNode>,\n> {\n    readonly kind: 'optionTypeNode';\n\n    // Data.\n    readonly fixed?: boolean;\n\n    // Children.\n    readonly item: TItem;\n    readonly prefix: TPrefix;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/PostOffsetTypeNode.ts",
    "content": "import type { TypeNode } from './TypeNode';\n\nexport interface PostOffsetTypeNode<TType extends TypeNode = TypeNode> {\n    readonly kind: 'postOffsetTypeNode';\n\n    // Data.\n    readonly offset: number;\n    readonly strategy: 'absolute' | 'padded' | 'preOffset' | 'relative';\n\n    // Children.\n    readonly type: TType;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/PreOffsetTypeNode.ts",
    "content": "import type { TypeNode } from './TypeNode';\n\nexport interface PreOffsetTypeNode<TType extends TypeNode = TypeNode> {\n    readonly kind: 'preOffsetTypeNode';\n\n    // Data.\n    readonly offset: number;\n    readonly strategy: 'absolute' | 'padded' | 'relative';\n\n    // Children.\n    readonly type: TType;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/PublicKeyTypeNode.ts",
    "content": "export interface PublicKeyTypeNode {\n    readonly kind: 'publicKeyTypeNode';\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/RemainderOptionTypeNode.ts",
    "content": "import type { TypeNode } from './TypeNode';\n\nexport interface RemainderOptionTypeNode<TItem extends TypeNode = TypeNode> {\n    readonly kind: 'remainderOptionTypeNode';\n\n    // Children.\n    readonly item: TItem;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/SentinelTypeNode.ts",
    "content": "import type { ConstantValueNode } from '../valueNodes';\nimport type { TypeNode } from './TypeNode';\n\nexport interface SentinelTypeNode<\n    TType extends TypeNode = TypeNode,\n    TSentinel extends ConstantValueNode = ConstantValueNode,\n> {\n    readonly kind: 'sentinelTypeNode';\n\n    // Children.\n    readonly type: TType;\n    readonly sentinel: TSentinel;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/SetTypeNode.ts",
    "content": "import type { CountNode } from '../countNodes';\nimport type { TypeNode } from './TypeNode';\n\nexport interface SetTypeNode<TItem extends TypeNode = TypeNode, TCount extends CountNode = CountNode> {\n    readonly kind: 'setTypeNode';\n\n    // Children.\n    readonly item: TItem;\n    readonly count: TCount;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/SizePrefixTypeNode.ts",
    "content": "import type { NestedTypeNode } from './NestedTypeNode';\nimport type { NumberTypeNode } from './NumberTypeNode';\nimport type { TypeNode } from './TypeNode';\n\nexport interface SizePrefixTypeNode<\n    TType extends TypeNode = TypeNode,\n    TPrefix extends NestedTypeNode<NumberTypeNode> = NestedTypeNode<NumberTypeNode>,\n> {\n    readonly kind: 'sizePrefixTypeNode';\n\n    // Children.\n    readonly type: TType;\n    readonly prefix: TPrefix;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/SolAmountTypeNode.ts",
    "content": "import type { NestedTypeNode } from './NestedTypeNode';\nimport type { NumberTypeNode } from './NumberTypeNode';\n\nexport interface SolAmountTypeNode<TNumber extends NestedTypeNode<NumberTypeNode> = NestedTypeNode<NumberTypeNode>> {\n    readonly kind: 'solAmountTypeNode';\n\n    // Children.\n    readonly number: TNumber;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/StringTypeNode.ts",
    "content": "import type { BytesEncoding } from '../shared';\n\nexport interface StringTypeNode<TEncoding extends BytesEncoding = BytesEncoding> {\n    readonly kind: 'stringTypeNode';\n\n    // Data.\n    readonly encoding: TEncoding;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/StructFieldTypeNode.ts",
    "content": "import type { CamelCaseString, Docs } from '../shared';\nimport type { ValueNode } from '../valueNodes';\nimport type { TypeNode } from './TypeNode';\n\nexport interface StructFieldTypeNode<\n    TType extends TypeNode = TypeNode,\n    TDefaultValue extends ValueNode | undefined = ValueNode | undefined,\n> {\n    readonly kind: 'structFieldTypeNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n    readonly defaultValueStrategy?: 'omitted' | 'optional';\n    readonly docs?: Docs;\n\n    // Children.\n    readonly type: TType;\n    readonly defaultValue?: TDefaultValue;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/StructTypeNode.ts",
    "content": "import type { StructFieldTypeNode } from './StructFieldTypeNode';\n\nexport interface StructTypeNode<TFields extends StructFieldTypeNode[] = StructFieldTypeNode[]> {\n    readonly kind: 'structTypeNode';\n\n    // Children.\n    readonly fields: TFields;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/TupleTypeNode.ts",
    "content": "import type { TypeNode } from './TypeNode';\n\nexport interface TupleTypeNode<TItems extends TypeNode[] = TypeNode[]> {\n    readonly kind: 'tupleTypeNode';\n\n    // Children.\n    readonly items: TItems;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/TypeNode.ts",
    "content": "import type { DefinedTypeLinkNode } from '../linkNodes/DefinedTypeLinkNode';\nimport type { AmountTypeNode } from './AmountTypeNode';\nimport type { ArrayTypeNode } from './ArrayTypeNode';\nimport type { BooleanTypeNode } from './BooleanTypeNode';\nimport type { BytesTypeNode } from './BytesTypeNode';\nimport type { DateTimeTypeNode } from './DateTimeTypeNode';\nimport type { EnumEmptyVariantTypeNode } from './EnumEmptyVariantTypeNode';\nimport type { EnumStructVariantTypeNode } from './EnumStructVariantTypeNode';\nimport type { EnumTupleVariantTypeNode } from './EnumTupleVariantTypeNode';\nimport type { EnumTypeNode } from './EnumTypeNode';\nimport type { FixedSizeTypeNode } from './FixedSizeTypeNode';\nimport type { HiddenPrefixTypeNode } from './HiddenPrefixTypeNode';\nimport type { HiddenSuffixTypeNode } from './HiddenSuffixTypeNode';\nimport type { MapTypeNode } from './MapTypeNode';\nimport type { NumberTypeNode } from './NumberTypeNode';\nimport type { OptionTypeNode } from './OptionTypeNode';\nimport type { PostOffsetTypeNode } from './PostOffsetTypeNode';\nimport type { PreOffsetTypeNode } from './PreOffsetTypeNode';\nimport type { PublicKeyTypeNode } from './PublicKeyTypeNode';\nimport type { RemainderOptionTypeNode } from './RemainderOptionTypeNode';\nimport type { SentinelTypeNode } from './SentinelTypeNode';\nimport type { SetTypeNode } from './SetTypeNode';\nimport type { SizePrefixTypeNode } from './SizePrefixTypeNode';\nimport type { SolAmountTypeNode } from './SolAmountTypeNode';\nimport type { StringTypeNode } from './StringTypeNode';\nimport type { StructFieldTypeNode } from './StructFieldTypeNode';\nimport type { StructTypeNode } from './StructTypeNode';\nimport type { TupleTypeNode } from './TupleTypeNode';\nimport type { ZeroableOptionTypeNode } from './ZeroableOptionTypeNode';\n\n// Standalone Type Node Registration.\nexport type StandaloneTypeNode =\n    | AmountTypeNode\n    | ArrayTypeNode\n    | BooleanTypeNode\n    | BytesTypeNode\n    | DateTimeTypeNode\n    | EnumTypeNode\n    | FixedSizeTypeNode\n    | HiddenPrefixTypeNode\n    | HiddenSuffixTypeNode\n    | MapTypeNode\n    | NumberTypeNode\n    | OptionTypeNode\n    | PostOffsetTypeNode\n    | PreOffsetTypeNode\n    | PublicKeyTypeNode\n    | RemainderOptionTypeNode\n    | SentinelTypeNode\n    | SetTypeNode\n    | SizePrefixTypeNode\n    | SolAmountTypeNode\n    | StringTypeNode\n    | StructTypeNode\n    | TupleTypeNode\n    | ZeroableOptionTypeNode;\n\n// Type Node Registration.\nexport type RegisteredTypeNode =\n    | EnumEmptyVariantTypeNode\n    | EnumStructVariantTypeNode\n    | EnumTupleVariantTypeNode\n    | StandaloneTypeNode\n    | StructFieldTypeNode;\n\n/**\n * Type Node Helper.\n * This only includes type nodes that can be used as standalone types.\n * E.g. this excludes structFieldTypeNode, enumEmptyVariantTypeNode, etc.\n * It also includes the definedTypeLinkNode to compose types.\n */\nexport type TypeNode = DefinedTypeLinkNode | StandaloneTypeNode;\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/ZeroableOptionTypeNode.ts",
    "content": "import type { ConstantValueNode } from '../valueNodes';\nimport type { TypeNode } from './TypeNode';\n\nexport interface ZeroableOptionTypeNode<\n    TItem extends TypeNode = TypeNode,\n    TZeroValue extends ConstantValueNode | undefined = ConstantValueNode | undefined,\n> {\n    readonly kind: 'zeroableOptionTypeNode';\n\n    // Children.\n    readonly item: TItem;\n    readonly zeroValue?: TZeroValue;\n}\n"
  },
  {
    "path": "packages/node-types/src/typeNodes/index.ts",
    "content": "export * from './AmountTypeNode';\nexport * from './ArrayTypeNode';\nexport * from './BooleanTypeNode';\nexport * from './BytesTypeNode';\nexport * from './DateTimeTypeNode';\nexport * from './EnumEmptyVariantTypeNode';\nexport * from './EnumStructVariantTypeNode';\nexport * from './EnumTupleVariantTypeNode';\nexport * from './EnumTypeNode';\nexport * from './EnumVariantTypeNode';\nexport * from './FixedSizeTypeNode';\nexport * from './HiddenPrefixTypeNode';\nexport * from './HiddenSuffixTypeNode';\nexport * from './MapTypeNode';\nexport * from './NestedTypeNode';\nexport * from './NumberTypeNode';\nexport * from './OptionTypeNode';\nexport * from './PostOffsetTypeNode';\nexport * from './PreOffsetTypeNode';\nexport * from './PublicKeyTypeNode';\nexport * from './RemainderOptionTypeNode';\nexport * from './SentinelTypeNode';\nexport * from './SetTypeNode';\nexport * from './SizePrefixTypeNode';\nexport * from './SolAmountTypeNode';\nexport * from './StringTypeNode';\nexport * from './StructFieldTypeNode';\nexport * from './StructTypeNode';\nexport * from './TupleTypeNode';\nexport * from './TypeNode';\nexport * from './ZeroableOptionTypeNode';\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/ArrayValueNode.ts",
    "content": "import type { ValueNode } from './ValueNode';\n\nexport interface ArrayValueNode<TItems extends ValueNode[] = ValueNode[]> {\n    readonly kind: 'arrayValueNode';\n\n    // Children.\n    readonly items: TItems;\n}\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/BooleanValueNode.ts",
    "content": "export interface BooleanValueNode {\n    readonly kind: 'booleanValueNode';\n\n    // Data.\n    readonly boolean: boolean;\n}\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/BytesValueNode.ts",
    "content": "import type { BytesEncoding } from '../shared';\n\nexport interface BytesValueNode {\n    readonly kind: 'bytesValueNode';\n\n    // Data.\n    readonly data: string;\n    readonly encoding: BytesEncoding;\n}\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/ConstantValueNode.ts",
    "content": "import type { TypeNode } from '../typeNodes/TypeNode';\nimport type { ValueNode } from './ValueNode';\n\nexport interface ConstantValueNode<TType extends TypeNode = TypeNode, TValue extends ValueNode = ValueNode> {\n    readonly kind: 'constantValueNode';\n\n    // Children.\n    readonly type: TType;\n    readonly value: TValue;\n}\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/EnumValueNode.ts",
    "content": "import type { DefinedTypeLinkNode } from '../linkNodes';\nimport type { CamelCaseString } from '../shared';\nimport type { StructValueNode } from './StructValueNode';\nimport type { TupleValueNode } from './TupleValueNode';\n\nexport interface EnumValueNode<\n    TEnum extends DefinedTypeLinkNode = DefinedTypeLinkNode,\n    TValue extends StructValueNode | TupleValueNode | undefined = StructValueNode | TupleValueNode | undefined,\n> {\n    readonly kind: 'enumValueNode';\n\n    // Data.\n    readonly variant: CamelCaseString;\n\n    // Children.\n    readonly enum: TEnum;\n    readonly value?: TValue;\n}\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/MapEntryValueNode.ts",
    "content": "import type { ValueNode } from './ValueNode';\n\nexport interface MapEntryValueNode<TKey extends ValueNode = ValueNode, TValue extends ValueNode = ValueNode> {\n    readonly kind: 'mapEntryValueNode';\n\n    // Children.\n    readonly key: TKey;\n    readonly value: TValue;\n}\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/MapValueNode.ts",
    "content": "import type { MapEntryValueNode } from './MapEntryValueNode';\n\nexport interface MapValueNode<TEntries extends MapEntryValueNode[] = MapEntryValueNode[]> {\n    readonly kind: 'mapValueNode';\n\n    // Children.\n    readonly entries: TEntries;\n}\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/NoneValueNode.ts",
    "content": "export interface NoneValueNode {\n    readonly kind: 'noneValueNode';\n}\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/NumberValueNode.ts",
    "content": "export interface NumberValueNode {\n    readonly kind: 'numberValueNode';\n\n    // Data.\n    readonly number: number;\n}\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/PublicKeyValueNode.ts",
    "content": "import type { CamelCaseString } from '../shared';\n\nexport interface PublicKeyValueNode {\n    readonly kind: 'publicKeyValueNode';\n\n    // Data.\n    readonly publicKey: string;\n    readonly identifier?: CamelCaseString;\n}\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/SetValueNode.ts",
    "content": "import type { ValueNode } from './ValueNode';\n\nexport interface SetValueNode<TItems extends ValueNode[] = ValueNode[]> {\n    readonly kind: 'setValueNode';\n\n    // Children.\n    readonly items: TItems;\n}\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/SomeValueNode.ts",
    "content": "import type { ValueNode } from './ValueNode';\n\nexport interface SomeValueNode<TValue extends ValueNode = ValueNode> {\n    readonly kind: 'someValueNode';\n\n    // Children.\n    readonly value: TValue;\n}\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/StringValueNode.ts",
    "content": "export interface StringValueNode {\n    readonly kind: 'stringValueNode';\n\n    // Data.\n    readonly string: string;\n}\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/StructFieldValueNode.ts",
    "content": "import type { CamelCaseString } from '../shared';\nimport type { ValueNode } from './ValueNode';\n\nexport interface StructFieldValueNode<TValue extends ValueNode = ValueNode> {\n    readonly kind: 'structFieldValueNode';\n\n    // Data.\n    readonly name: CamelCaseString;\n\n    // Children.\n    readonly value: TValue;\n}\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/StructValueNode.ts",
    "content": "import type { StructFieldValueNode } from './StructFieldValueNode';\n\nexport interface StructValueNode<TFields extends StructFieldValueNode[] = StructFieldValueNode[]> {\n    readonly kind: 'structValueNode';\n\n    // Children.\n    readonly fields: TFields;\n}\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/TupleValueNode.ts",
    "content": "import type { ValueNode } from './ValueNode';\n\nexport interface TupleValueNode<TItems extends ValueNode[] = ValueNode[]> {\n    readonly kind: 'tupleValueNode';\n\n    // Children.\n    readonly items: TItems;\n}\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/ValueNode.ts",
    "content": "import type { ArrayValueNode } from './ArrayValueNode';\nimport type { BooleanValueNode } from './BooleanValueNode';\nimport type { BytesValueNode } from './BytesValueNode';\nimport type { ConstantValueNode } from './ConstantValueNode';\nimport type { EnumValueNode } from './EnumValueNode';\nimport type { MapEntryValueNode } from './MapEntryValueNode';\nimport type { MapValueNode } from './MapValueNode';\nimport type { NoneValueNode } from './NoneValueNode';\nimport type { NumberValueNode } from './NumberValueNode';\nimport type { PublicKeyValueNode } from './PublicKeyValueNode';\nimport type { SetValueNode } from './SetValueNode';\nimport type { SomeValueNode } from './SomeValueNode';\nimport type { StringValueNode } from './StringValueNode';\nimport type { StructFieldValueNode } from './StructFieldValueNode';\nimport type { StructValueNode } from './StructValueNode';\nimport type { TupleValueNode } from './TupleValueNode';\n\n// Standalone Value Node Registration.\nexport type StandaloneValueNode =\n    | ArrayValueNode\n    | BooleanValueNode\n    | BytesValueNode\n    | ConstantValueNode\n    | EnumValueNode\n    | MapValueNode\n    | NoneValueNode\n    | NumberValueNode\n    | PublicKeyValueNode\n    | SetValueNode\n    | SomeValueNode\n    | StringValueNode\n    | StructValueNode\n    | TupleValueNode;\n\n// Value Node Registration.\nexport type RegisteredValueNode = MapEntryValueNode | StandaloneValueNode | StructFieldValueNode;\n\n// Value Node Helper.\nexport type ValueNode = StandaloneValueNode;\n"
  },
  {
    "path": "packages/node-types/src/valueNodes/index.ts",
    "content": "export * from './ArrayValueNode';\nexport * from './BooleanValueNode';\nexport * from './BytesValueNode';\nexport * from './ConstantValueNode';\nexport * from './EnumValueNode';\nexport * from './MapEntryValueNode';\nexport * from './MapValueNode';\nexport * from './NoneValueNode';\nexport * from './NumberValueNode';\nexport * from './PublicKeyValueNode';\nexport * from './SetValueNode';\nexport * from './SomeValueNode';\nexport * from './StringValueNode';\nexport * from './StructFieldValueNode';\nexport * from './StructValueNode';\nexport * from './TupleValueNode';\nexport * from './ValueNode';\n"
  },
  {
    "path": "packages/node-types/test/GetNodeFromKind.typetest.ts",
    "content": "import type { GetNodeFromKind, PublicKeyTypeNode, StringTypeNode } from '../src';\n\n// [DESCRIBE] GetNodeFromKind.\n{\n    // It extracts the node from the kind.\n    {\n        const node = {} as GetNodeFromKind<'publicKeyTypeNode'>;\n        node satisfies PublicKeyTypeNode;\n    }\n\n    // It extracts node unions from multiple kinds.\n    {\n        const node = {} as GetNodeFromKind<'publicKeyTypeNode' | 'stringTypeNode'>;\n        node satisfies PublicKeyTypeNode | StringTypeNode;\n    }\n}\n"
  },
  {
    "path": "packages/node-types/tsconfig.declarations.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"declarationMap\": true,\n        \"emitDeclarationOnly\": true,\n        \"outDir\": \"./dist/types\"\n    },\n    \"extends\": \"./tsconfig.json\",\n    \"include\": [\"src/index.ts\", \"src/types\"]\n}\n"
  },
  {
    "path": "packages/node-types/tsconfig.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": { \"lib\": [] },\n    \"display\": \"@codama/node-types\",\n    \"extends\": \"../../tsconfig.json\",\n    \"include\": [\"src\", \"test\"]\n}\n"
  },
  {
    "path": "packages/node-types/tsup.config.ts",
    "content": "import { defineConfig } from 'tsup';\n\nimport { getPackageBuildConfigs } from '../../tsup.config.base';\n\nexport default defineConfig(getPackageBuildConfigs());\n"
  },
  {
    "path": "packages/nodes/.gitignore",
    "content": "dist/\n"
  },
  {
    "path": "packages/nodes/.prettierignore",
    "content": "dist/\ntest/e2e/\ntest-ledger/\ntarget/\nCHANGELOG.md\n"
  },
  {
    "path": "packages/nodes/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Codama\nCopyright (c) 2024 Metaplex Foundation\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/nodes/README.md",
    "content": "# Codama ➤ Nodes\n\n[![npm][npm-image]][npm-url]\n[![npm-downloads][npm-downloads-image]][npm-url]\n\n[npm-downloads-image]: https://img.shields.io/npm/dm/@codama/nodes.svg?style=flat\n[npm-image]: https://img.shields.io/npm/v/@codama/nodes.svg?style=flat&label=%40codama%2Fnodes\n[npm-url]: https://www.npmjs.com/package/@codama/nodes\n\nThis package defines the various nodes that make up the Codama IDL. It provides types and helper functions to work with these nodes. If you are looking for a type-only version of these nodes, you can find them in the [`@codama/node-types`](../node-types) package.\n\n## Installation\n\n```sh\npnpm install @codama/nodes\n```\n\n> [!NOTE]\n> This package is included in the main [`codama`](../library) package. Meaning, you already have access to its content if you are installing Codama this way.\n>\n> ```sh\n> pnpm install codama\n> ```\n\n## All available nodes\n\nThe Codama IDL is composed of various nodes that describe different aspects of a Solana program. Some nodes are categorised together as they share a similar purpose. For instance, all the nodes that describe a data structure that can be encoded and decoded into buffers are grouped under the `TypeNode` category.\n\nBelow are all of the available nodes and their documentation. Also note that you can refer to any node using the [`Node`](./docs/README.md) helper type.\n\n- [`AccountNode`](./docs/AccountNode.md)\n- [`DefinedTypeNode`](./docs/DefinedTypeNode.md)\n- [`ErrorNode`](./docs/ErrorNode.md)\n- [`EventNode`](./docs/EventNode.md)\n- [`InstructionAccountNode`](./docs/InstructionAccountNode.md)\n- [`InstructionArgumentNode`](./docs/InstructionArgumentNode.md)\n- [`InstructionByteDeltaNode`](./docs/InstructionByteDeltaNode.md)\n- [`InstructionNode`](./docs/InstructionNode.md)\n- [`InstructionRemainingAccountsNode`](./docs/InstructionRemainingAccountsNode.md)\n- [`PdaNode`](./docs/PdaNode.md)\n- [`ProgramNode`](./docs/ProgramNode.md)\n- [`RootNode`](./docs/RootNode.md)\n- [`ContextualValueNode`](./docs/contextualValueNodes/README.md) (abstract)\n    - [`AccountBumpValueNode`](./docs/contextualValueNodes/AccountBumpValueNode.md)\n    - [`AccountValueNode`](./docs/contextualValueNodes/AccountValueNode.md)\n    - [`ArgumentValueNode`](./docs/contextualValueNodes/ArgumentValueNode.md)\n    - [`ConditionalValueNode`](./docs/contextualValueNodes/ConditionalValueNode.md)\n    - [`IdentityValueNode`](./docs/contextualValueNodes/IdentityValueNode.md)\n    - [`PayerValueNode`](./docs/contextualValueNodes/PayerValueNode.md)\n    - [`PdaSeedValueNode`](./docs/contextualValueNodes/PdaSeedValueNode.md)\n    - [`PdaValueNode`](./docs/contextualValueNodes/PdaValueNode.md)\n    - [`ProgramIdValueNode`](./docs/contextualValueNodes/ProgramIdValueNode.md)\n    - [`ResolverValueNode`](./docs/contextualValueNodes/ResolverValueNodemds)\n- [`CountNode`](./docs/countNodes/README.md) (abstract)\n    - [`FixedCountNode`](./docs/countNodes/FixedCountNode.md)\n    - [`PrefixedCountNode`](./docs/countNodes/PrefixedCountNode.md)\n    - [`RemainderCountNode`](./docs/countNodes/RemainderCountNodemds)\n- [`DiscriminatorNode`](./docs/discriminatorNodes/README.md) (abstract)\n    - [`ConstantDiscriminatorNode`](./docs/discriminatorNodes/ConstantDiscriminatorNode.md)\n    - [`FieldDiscriminatorNode`](./docs/discriminatorNodes/FieldDiscriminatorNode.md)\n    - [`SizeDiscriminatorNode`](./docs/discriminatorNodes/SizeDiscriminatorNodemds)\n- [`LinkNode`](./docs/linkNodes/README.md) (abstract)\n    - [`AccountLinkNode`](./docs/linkNodes/AccountLinkNode.md)\n    - [`DefinedTypeLinkNode`](./docs/linkNodes/DefinedTypeLinkNode.md)\n    - [`InstructionAccountLinkNode`](./docs/linkNodes/InstructionAccountLinkNode.md)\n    - [`InstructionArgumentLinkNode`](./docs/linkNodes/InstructionArgumentLinkNode.md)\n    - [`InstructionLinkNode`](./docs/linkNodes/InstructionLinkNode.md)\n    - [`PdaLinkNode`](./docs/linkNodes/PdaLinkNode.md)\n    - [`ProgramLinkNode`](./docs/linkNodes/ProgramLinkNode.md)\n- [`PdaSeedNode`](./docs/pdaSeedNodes/README.md) (abstract)\n    - [`ConstantPdaSeedNode`](./docs/pdaSeedNodes/ConstantPdaSeedNode.md)\n    - [`VariablePdaSeedNode`](./docs/pdaSeedNodes/VariablePdaSeedNode.md)\n- [`TypeNode`](./docs/typeNodes/README.md) (abstract)\n    - [`AmountTypeNode`](./docs/typeNodes/AmountTypeNode.md)\n    - [`ArrayTypeNode`](./docs/typeNodes/ArrayTypeNode.md)\n    - [`BooleanTypeNode`](./docs/typeNodes/BooleanTypeNode.md)\n    - [`BytesTypeNode`](./docs/typeNodes/BytesTypeNode.md)\n    - [`DateTimeTypeNode`](./docs/typeNodes/DateTimeTypeNode.md)\n    - [`EnumEmptyVariantTypeNode`](./docs/typeNodes/EnumEmptyVariantTypeNode.md)\n    - [`EnumStructVariantTypeNode`](./docs/typeNodes/EnumStructVariantTypeNode.md)\n    - [`EnumTupleVariantTypeNode`](./docs/typeNodes/EnumTupleVariantTypeNode.md)\n    - [`EnumTypeNode`](./docs/typeNodes/EnumTypeNode.md)\n    - [`EnumVariantTypeNode`](./docs/typeNodes/EnumVariantTypeNode.md) (abstract)\n    - [`FixedSizeTypeNode`](./docs/typeNodes/FixedSizeTypeNode.md)\n    - [`HiddenPrefixTypeNode`](./docs/typeNodes/HiddenPrefixTypeNode.md)\n    - [`HiddenSuffixTypeNode`](./docs/typeNodes/HiddenSuffixTypeNode.md)\n    - [`MapTypeNode`](./docs/typeNodes/MapTypeNode.md)\n    - [`NestedTypeNode`](./docs/typeNodes/NestedTypeNode.md) (helper)\n    - [`NumberTypeNode`](./docs/typeNodes/NumberTypeNode.md)\n    - [`OptionTypeNode`](./docs/typeNodes/OptionTypeNode.md)\n    - [`PostOffsetTypeNode`](./docs/typeNodes/PostOffsetTypeNode.md)\n    - [`PreOffsetTypeNode`](./docs/typeNodes/PreOffsetTypeNode.md)\n    - [`PublicKeyTypeNode`](./docs/typeNodes/PublicKeyTypeNode.md)\n    - [`RemainderOptionTypeNode`](./docs/typeNodes/RemainderOptionTypeNode.md)\n    - [`SentinelTypeNode`](./docs/typeNodes/SentinelTypeNode.md)\n    - [`SetTypeNode`](./docs/typeNodes/SetTypeNode.md)\n    - [`SizePrefixTypeNode`](./docs/typeNodes/SizePrefixTypeNode.md)\n    - [`SolAmountTypeNode`](./docs/typeNodes/SolAmountTypeNode.md)\n    - [`StringTypeNode`](./docs/typeNodes/StringTypeNode.md)\n    - [`StructFieldTypeNode`](./docs/typeNodes/StructFieldTypeNode.md)\n    - [`StructTypeNode`](./docs/typeNodes/StructTypeNode.md)\n    - [`TupleTypeNode`](./docs/typeNodes/TupleTypeNode.md)\n    - [`ZeroableOptionTypeNod`](./docs/typeNodes/ZeroableOptionTypeNod.md)\n- [`ValueNode`](./docs/valueNodes/README.md) (abstract)\n    - [`ArrayValueNode`](./docs/valueNodes/ArrayValueNode.md)\n    - [`BooleanValueNode`](./docs/valueNodes/BooleanValueNode.md)\n    - [`BytesValueNode`](./docs/valueNodes/BytesValueNode.md)\n    - [`ConstantValueNode`](./docs/valueNodes/ConstantValueNode.md)\n    - [`EnumValueNode`](./docs/valueNodes/EnumValueNode.md)\n    - [`MapEntryValueNode`](./docs/valueNodes/MapEntryValueNode.md)\n    - [`MapValueNode`](./docs/valueNodes/MapValueNode.md)\n    - [`NoneValueNode`](./docs/valueNodes/NoneValueNode.md)\n    - [`NumberValueNode`](./docs/valueNodes/NumberValueNode.md)\n    - [`PublicKeyValueNode`](./docs/valueNodes/PublicKeyValueNode.md)\n    - [`SetValueNode`](./docs/valueNodes/SetValueNode.md)\n    - [`SomeValueNode`](./docs/valueNodes/SomeValueNode.md)\n    - [`StringValueNode`](./docs/valueNodes/StringValueNode.md)\n    - [`StructFieldValueNode`](./docs/valueNodes/StructFieldValueNode.md)\n    - [`StructValueNode`](./docs/valueNodes/StructValueNode.md)\n    - [`TupleValueNode`](./docs/valueNodes/TupleValueNode.md)\n"
  },
  {
    "path": "packages/nodes/docs/AccountNode.md",
    "content": "# `AccountNode`\n\nThis node defines an on-chain account. It is characterized by its name, data structure, and optional attributes such as PDA definition and account discriminators.\n\n![Diagram](https://github.com/codama-idl/codama/assets/3642397/77974dad-212e-49b1-8e41-5d466c273a02)\n\n## Attributes\n\n### Data\n\n| Attribute | Type              | Description                                                                         |\n| --------- | ----------------- | ----------------------------------------------------------------------------------- |\n| `kind`    | `\"accountNode\"`   | The node discriminator.                                                             |\n| `name`    | `CamelCaseString` | The name of the account.                                                            |\n| `docs`    | `string[]`        | Markdown documentation for the account.                                             |\n| `size`    | `number`          | (Optional) The size of the account in bytes, if the account's data length is fixed. |\n\n### Children\n\n| Attribute        | Type                                                                                                 | Description                                                                                                                                                              |\n| ---------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `data`           | [`NestedTypeNode`](./typeNodes/NestedTypeNode.md)<[`StructTypeNode`](./typeNodes/StructTypeNode.md)> | The type node that describes the account's data. Note that it must be a struct so we can access its fields via other nodes.                                              |\n| `pda`            | [`PdaLinkNode`](./linkNodes/PdaLinkNode.md)                                                          | (Optional) The link node that describes the account's PDA, if its address is derived from one.                                                                           |\n| `discriminators` | [`DiscriminatorNode`](./discriminatorNodes/README.md)[]                                              | (Optional) The nodes that distinguish this account from others in the program. If multiple discriminators are provided, they are combined using a logical AND operation. |\n\n## Functions\n\n### `accountNode(input)`\n\nHelper function that creates a `AccountNode` object from an input object.\n\n```ts\nconst node = accountNode({\n    name: 'myCounter',\n    data: structTypeNode([\n        structFieldTypeNode({ name: 'authority', type: publicKeyTypeNode() }),\n        structFieldTypeNode({ name: 'value', type: numberTypeNode('u64') }),\n    ]),\n});\n```\n\n## Examples\n\n### A fixed-size account\n\n```ts\nconst node = accountNode({\n    name: 'token',\n    data: structTypeNode([\n        structFieldTypeNode({ name: 'mint', type: publicKeyTypeNode() }),\n        structFieldTypeNode({ name: 'owner', type: publicKeyTypeNode() }),\n        structFieldTypeNode({ name: 'amount', type: numberTypeNode('u64') }),\n    ]),\n    discriminators: [sizeDiscriminatorNode(72)],\n    size: 72,\n});\n```\n\n### An account with a linked PDA\n\n```ts\nprogramNode({\n    name: 'myProgram',\n    accounts: [\n        accountNode({\n            name: 'token',\n            data: structTypeNode([structFieldTypeNode({ name: 'authority', type: publicKeyTypeNode() })]),\n            pda: pdaLinkNode('myPda'),\n        }),\n    ],\n    pdas: [\n        pdaNode({\n            name: 'myPda',\n            seeds: [\n                constantPdaSeedNodeFromString('utf8', 'token'),\n                variablePdaSeedNode('authority', publicKeyTypeNode()),\n            ],\n        }),\n    ],\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/DefinedTypeNode.md",
    "content": "# `DefinedTypeNode`\n\nThis node defines a named type that can be reused in other types using a [`DefinedTypeLinkNode`](./linkNodes/DefinedTypeLinkNode.md).\n\n![Diagram](https://github.com/codama-idl/codama/assets/3642397/6049cf77-9a70-4915-8276-dd571d2f8828)\n\n## Attributes\n\n### Data\n\n| Attribute | Type                | Description                          |\n| --------- | ------------------- | ------------------------------------ |\n| `kind`    | `\"definedTypeNode\"` | The node discriminator.              |\n| `name`    | `CamelCaseString`   | The name of the reusable type.       |\n| `docs`    | `string[]`          | Markdown documentation for the type. |\n\n### Children\n\n| Attribute | Type                                | Description                   |\n| --------- | ----------------------------------- | ----------------------------- |\n| `type`    | [`TypeNode`](./typeNodes/README.md) | The concrete type definition. |\n\n## Functions\n\n### `definedTypeNode(input)`\n\nHelper function that creates a `DefinedTypeNode` object from an input object.\n\n```ts\nconst node = definedTypeNode({\n    name: 'person',\n    docs: ['This type describes a Person.'],\n    type: structTypeNode([\n        structFieldTypeNode({ name: 'name', type: stringTypeNode('utf8') }),\n        structFieldTypeNode({ name: 'age', type: numberTypeNode('u8') }),\n    ]),\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/ErrorNode.md",
    "content": "# `ErrorNode`\n\nThis node defines an error that can be returned by a program.\n\n![Diagram](https://github.com/codama-idl/codama/assets/3642397/0bde98ea-0327-404b-bf38-137d105826b0)\n\n## Attributes\n\n### Data\n\n| Attribute | Type              | Description                                      |\n| --------- | ----------------- | ------------------------------------------------ |\n| `kind`    | `\"errorNode\"`     | The node discriminator.                          |\n| `name`    | `CamelCaseString` | The name of the error.                           |\n| `code`    | `number`          | The error code.                                  |\n| `message` | `string`          | A human-friendly message describing the error.   |\n| `docs`    | `string[]`        | Additional Markdown documentation for the error. |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `errorNode(input)`\n\nHelper function that creates a `ErrorNode` object from an input object.\n\n```ts\nconst node = errorNode({\n    name: 'invalidAmountArgument',\n    code: 1,\n    message: 'The amount argument is invalid.',\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/EventNode.md",
    "content": "# `EventNode`\n\nThis node represents an event emitted by a program.\n\n## Attributes\n\n### Data\n\n| Attribute | Type              | Description                                      |\n| --------- | ----------------- | ------------------------------------------------ |\n| `kind`    | `\"eventNode\"`     | The node discriminator.                          |\n| `name`    | `CamelCaseString` | The name of the event.                           |\n| `docs`    | `string[]`        | Additional Markdown documentation for the event. |\n\n### Children\n\n| Attribute        | Type                                                    | Description                                                                                                                                                            |\n| ---------------- | ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `data`           | [`TypeNode`](./typeNodes/README.md)                     | The type node that describes the event payload.                                                                                                                        |\n| `discriminators` | [`DiscriminatorNode`](./discriminatorNodes/README.md)[] | (Optional) The nodes that distinguish this event from others in the program. If multiple discriminators are provided, they are combined using a logical AND operation. |\n\n## Functions\n\n### `eventNode(input)`\n\nHelper function that creates an `EventNode` object from an input object.\n\n```ts\nconst node = eventNode({\n    name: 'transferEvent',\n    data: structTypeNode([\n        structFieldTypeNode({ name: 'authority', type: publicKeyTypeNode() }),\n        structFieldTypeNode({ name: 'amount', type: numberTypeNode('u64') }),\n    ]),\n});\n```\n\n## Examples\n\n### An event with a struct payload\n\n```ts\neventNode({\n    name: 'transferEvent',\n    data: structTypeNode([\n        structFieldTypeNode({ name: 'authority', type: publicKeyTypeNode() }),\n        structFieldTypeNode({ name: 'amount', type: numberTypeNode('u64') }),\n    ]),\n});\n```\n\n### An event with a hidden prefix discriminator\n\n```ts\neventNode({\n    name: 'transferEvent',\n    data: hiddenPrefixTypeNode(structTypeNode([structFieldTypeNode({ name: 'amount', type: numberTypeNode('u64') })]), [\n        constantValueNode(fixedSizeTypeNode(bytesTypeNode(), 8), bytesValueNode('base16', '0102030405060708')),\n    ]),\n    discriminators: [\n        constantDiscriminatorNode(\n            constantValueNode(fixedSizeTypeNode(bytesTypeNode(), 8), bytesValueNode('base16', '0102030405060708')),\n        ),\n    ],\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/InstructionAccountNode.md",
    "content": "# `InstructionAccountNode`\n\nThis node defines an account used by an instruction. It is characterized by its name and various requirements such as whether it needs to be writable or a signer.\n\n![Diagram](https://github.com/codama-idl/codama/assets/3642397/4656a08b-2f89-49c2-b428-5378cb1a0b9e)\n\n## Attributes\n\n### Data\n\n| Attribute    | Type                       | Description                                                                                                                                                                                                                                            |\n| ------------ | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `kind`       | `\"instructionAccountNode\"` | The node discriminator.                                                                                                                                                                                                                                |\n| `name`       | `CamelCaseString`          | The name of the instruction account.                                                                                                                                                                                                                   |\n| `isWritable` | `boolean`                  | Whether of not the account needs to be writable.                                                                                                                                                                                                       |\n| `isSigner`   | `boolean` \\| `\"either\"`    | Whether or not the account needs to be a signer. If the value `\"either\"` is provided, the account can be either a signer or not depending on the context.                                                                                              |\n| `isOptional` | `boolean`                  | (Optional) Whether or not the account is optional. If this is `true`, the account should be handled as an optional account according to the `optionalAccountStrategy` attribute of the [`InstructionNode`.](./InstructionNode.md) Defaults to `false`. |\n| `docs`       | `string[]`                 | Markdown documentation for the instruction account.                                                                                                                                                                                                    |\n\n### Children\n\n| Attribute      | Type                                                                               | Description                                                                                                       |\n| -------------- | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |\n| `defaultValue` | [`InstructionInputValueNode`](./contextualValueNodes/InstructionInputValueNode.md) | (Optional) A default value for the account should this account not be provided when constructing the instruction. |\n\n## Functions\n\n### `instructionAccountNode(input)`\n\nHelper function that creates a `InstructionAccountNode` object from an input object.\n\n```ts\nconst node = instructionAccountNode({\n    name: 'authority',\n    isWritable: false,\n    isSigner: true,\n    docs: ['This account that has the authority to perform this instruction.'],\n});\n```\n\n## Examples\n\n### An optional account\n\n```ts\ninstructionAccountNode({\n    name: 'freezeAuthority',\n    isWritable: false,\n    isSigner: false,\n    isOptional: true,\n    docs: ['The freeze authority to set on the asset, if any.'],\n});\n```\n\n### An optional signer account\n\n```ts\ninstructionAccountNode({\n    name: 'owner',\n    isWritable: true,\n    isSigner: 'either',\n    docs: ['The owner of the asset. The owner must only sign the transaction if the asset is being updated.'],\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/InstructionArgumentNode.md",
    "content": "# `InstructionArgumentNode`\n\nThis node defines an argument that is passed to an instruction. When all arguments are combined and serialized next to each other, they form the instruction's data.\n\n![Diagram](https://github.com/codama-idl/codama/assets/3642397/7e2def82-949a-4663-bdc3-ac599d39d2d2)\n\n## Attributes\n\n### Data\n\n| Attribute              | Type                        | Description                                                                                                                                                                                                                                                                                                                        |\n| ---------------------- | --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `kind`                 | `\"instructionArgumentNode\"` | The node discriminator.                                                                                                                                                                                                                                                                                                            |\n| `name`                 | `CamelCaseString`           | The name of the instruction argument.                                                                                                                                                                                                                                                                                              |\n| `docs`                 | `string[]`                  | Markdown documentation for the instruction argument.                                                                                                                                                                                                                                                                               |\n| `defaultValueStrategy` | `\"optional\"` \\| `\"omitted\"` | (Optional) The strategy to use when a default value is provided for the argument. `\"optional\"` means that the argument's default value may be overriden by a provided argument, while `\"omitted\"` means that no argument should be provided and the default value should always be the argument's value. Defaults to `\"optional\"`. |\n\n### Children\n\n| Attribute      | Type                                                                               | Description                                                                                                         |\n| -------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |\n| `type`         | [`TypeNode`](./typeNodes/README.md)                                                | The `TypeNode` that describes the argument's data.                                                                  |\n| `defaultValue` | [`InstructionInputValueNode`](./contextualValueNodes/InstructionInputValueNode.md) | (Optional) A default value for the argument should this argument not be provided when constructing the instruction. |\n\n## Functions\n\n### `instructionArgumentNode(input)`\n\nHelper function that creates a `InstructionArgumentNode` object from an input object.\n\n```ts\nconst node = instructionArgumentNode({\n    name: 'amount',\n    type: numberTypeNode('u64'),\n    docs: ['This amount of tokens to transfer.'],\n});\n```\n\n## Examples\n\n### An argument with a default value\n\n```ts\ninstructionArgumentNode({\n    name: 'amount',\n    type: numberTypeNode('u64'),\n    defaultValue: numberValueNode(0),\n});\n```\n\n### An argument with an omitted default value\n\n```ts\ninstructionArgumentNode({\n    name: 'instructionDiscriminator',\n    type: numberTypeNode('u8'),\n    defaultValue: numberValueNode(42),\n    defaultValueStrategy: 'omitted',\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/InstructionByteDeltaNode.md",
    "content": "# `InstructionByteDeltaNode`\n\nThis node represents a difference in bytes stored on-chain from executing an instruction. For instance, if an instruction creates a new account of 42 bytes, this node can provide this information. This enables clients to allocate the right amount of lamports to cover the cost of executing the instruction.\n\n## Attributes\n\n### Data\n\n| Attribute    | Type                         | Description                                                                                                                                                                       |\n| ------------ | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `kind`       | `\"instructionByteDeltaNode\"` | The node discriminator.                                                                                                                                                           |\n| `withHeader` | `boolean`                    | (Optional) Whether or not we should add the account header size — i.e. 128 bytes — to the value. Default to `false` when the value is a `ResolverValueNode` and `true` otherwise. |\n| `subtract`   | `boolean`                    | (Optional) Whether or not the provided value should be subtracted from the total byte delta. Defaults to `false`.                                                                 |\n\n### Children\n\n| Attribute | Type                                                                                                                                                                                                                                                    | Description                                                                                                                                                                                                                                                                                                                                                        |\n| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `value`   | [`AccountLinkNode`](./linkNodes/AccountLinkNode.md) \\| [`ArgumentValueNode`](./contextualValueNodes/ArgumentValueNode.md) \\| [`NumberValueNode`](./valueNodes/NumberValueNode.md) \\| [`ResolverValueNode`](./contextualValueNodes/ResolverValueNode.md) | The value representing the byte delta. If an `AccountLinkNode` is used, the size of the linked account will be used. If an `ArgumentValueNode` is used, the value of the instruction argument will be used. If a `NumberValueNode` is used, that explicit number will be used. Otherwise, a `ResolverValueNode` can be used as a fallback for more complex values. |\n\n## Functions\n\n### `instructionByteDeltaNode(value, options?)`\n\nHelper function that creates a `InstructionByteDeltaNode` object from a value node and some options.\n\n```ts\nconst node = instructionByteDeltaNode(numberValueNode(42), { withHeader: false });\n```\n\n## Examples\n\n### A byte delta that represents a new account\n\n```ts\ninstructionByteDeltaNode(accountLinkNode('token'));\n```\n\n### A byte delta that represents an account deletion\n\n```ts\ninstructionByteDeltaNode(accountLinkNode('token'), { subtract: true });\n```\n\n### A byte delta that uses an argument value to increase the space of an account\n\n```ts\ninstructionByteDeltaNode(argumentValueNode('additionalSpace'), { withHeader: false });\n```\n"
  },
  {
    "path": "packages/nodes/docs/InstructionNode.md",
    "content": "# `InstructionNode`\n\nThis node represents an instruction in a program.\n\n![Diagram](https://github.com/codama-idl/codama/assets/3642397/0d8edced-cfa4-4500-b80c-ebc56181a338)\n\n## Attributes\n\n### Data\n\n| Attribute                 | Type                         | Description                                                                                                                                                                                                                                                                                                             |\n| ------------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `kind`                    | `\"instructionNode\"`          | The node discriminator.                                                                                                                                                                                                                                                                                                 |\n| `name`                    | `CamelCaseString`            | The name of the instruction.                                                                                                                                                                                                                                                                                            |\n| `docs`                    | `string[]`                   | Markdown documentation for the instruction.                                                                                                                                                                                                                                                                             |\n| `optionalAccountStrategy` | `\"omitted\"` \\| `\"programId\"` | (Optional) Determines how to handle optional accounts. `\"omitted\"` means optional accounts that are not provided will be omitted from the list of accounts, `\"programId\"` means they will be replaced by the address of the program to ensure account ordering with only 1 byte of overhead. Defaults to `\"programId\"`. |\n\n### Children\n\n| Attribute           | Type                                                                          | Description                                                                                                                                                                             |\n| ------------------- | ----------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `accounts`          | [`InstructionAccountNode`](./InstructionAccountNode.md)[]                     | The list of accounts that the instruction uses and their requirements.                                                                                                                  |\n| `arguments`         | [`InstructionArgumentNode`](./InstructionArgumentNode.md)[]                   | The arguments the constitute the instruction's data.                                                                                                                                    |\n| `extraArguments`    | [`InstructionArgumentNode`](./InstructionArgumentNode.md)[]                   | (Optional) Additional arguments that do not contribute to the instruction's data but may help when defining default values.                                                             |\n| `remainingAccounts` | [`InstructionRemainingAccountsNode`](./InstructionRemainingAccountsNode.md)[] | (Optional) The list of dynamic remaining accounts requirements for the instruction. For instance, an instruction may have a variable number of signers at the end of the accounts list. |\n| `byteDeltas`        | [`InstructionByteDeltaNode`](./InstructionByteDeltaNode.md)[]                 | (Optional) The list of byte variations that the instruction causes. They should all be added together unless the `subtract` attribute is used.                                          |\n| `discriminators`    | [`DiscriminatorNode`](./DiscriminatorNode.md)[]                               | (Optional) The nodes that distinguish this instruction from others in the program. If multiple discriminators are provided, they are combined using a logical AND operation.            |\n| `status`            | [`InstructionStatusNode`](./InstructionStatusNode.md)                         | (Optional) The status of the instruction and an optional message about that status.                                                                                                     |\n| `subInstructions`   | [`InstructionNode`](./InstructionNode.md)[]                                   | (Optional) A list of nested instructions should this instruction be split into multiple sub-instructions to define distinct scenarios.                                                  |\n\n## Functions\n\n### `instructionNode(input)`\n\nHelper function that creates a `InstructionNode` object from an input object.\n\n```ts\nconst node = instructionNode({\n    name: 'increment',\n    accounts: [\n        instructionAccountNode({ name: 'counter', isWritable: true, isSigner: false }),\n        instructionAccountNode({ name: 'authority', isWritable: false, isSigner: true }),\n    ],\n    arguments: [instructionArgumentNode({ name: 'amount', type: numberTypeNode('u8') })],\n});\n```\n\n### `getAllInstructionArguments(instruction)`\n\nHelper function that returns all arguments — including extra arguments — of an instruction as a `InstructionArgumentNode[]`.\n\n```ts\nconst allArguments = getAllInstructionArguments(instruction);\n```\n\n### `getAllInstructionsWithSubs()`\n\nHelper function that returns all instructions with their nested sub-instructions, if any. It can be called on a `RootNode`, `ProgramNode`, or `InstructionNode`.\n\n```ts\nconst allInstructionsFromTheRoot = getAllInstructionsWithSubs(rootNode);\nconst allInstructionsFromThisProgram = getAllInstructionsWithSubs(programNode);\nconst allInstructionsFromThisInstruction = getAllInstructionsWithSubs(instructionNode);\n```\n\n## Examples\n\n### An instruction with a u8 discriminator\n\n```ts\ninstructionNode({\n    name: 'increment',\n    accounts: [\n        instructionAccountNode({ name: 'counter', isWritable: true, isSigner: true }),\n        instructionAccountNode({ name: 'authority', isWritable: false, isSigner: false }),\n    ],\n    arguments: [\n        instructionArgumentNode({\n            name: 'discriminator',\n            type: numberTypeNode('u8'),\n            defaultValue: numberValueNode(42),\n            defaultValueStrategy: 'omitted',\n        }),\n    ],\n});\n```\n\n### An instruction that creates a new account\n\n```ts\ninstructionNode({\n    name: 'createCounter',\n    accounts: [\n        instructionAccountNode({ name: 'counter', isWritable: true, isSigner: true }),\n        instructionAccountNode({ name: 'authority', isWritable: false, isSigner: false }),\n    ],\n    byteDeltas: [instructionByteDeltaNode(accountLinkNode('counter'))],\n});\n```\n\n### An instruction with omitted optional accounts\n\n```ts\ninstructionNode({\n    name: 'initialize',\n    accounts: [\n        instructionAccountNode({ name: 'counter', isWritable: true, isSigner: true }),\n        instructionAccountNode({ name: 'authority', isWritable: false, isSigner: false }),\n        instructionAccountNode({ name: 'freezeAuthority', isWritable: false, isSigner: false, isOptional: true }),\n    ],\n    optionalAccountStrategy: 'omitted',\n});\n```\n\n### An instruction with remaining signers\n\n```ts\ninstructionNode({\n    name: 'multisigIncrement',\n    accounts: [instructionAccountNode({ name: 'counter', isWritable: true, isSigner: false })],\n    remainingAccounts: [instructionRemainingAccountsNode(argumentValueNode('authorities'), { isSigner: true })],\n});\n```\n\n### An instruction with nested versioned instructions\n\n```ts\ninstructionNode({\n    name: 'increment',\n    accounts: [\n        instructionAccountNode({ name: 'counter', isWritable: true, isSigner: 'either' }),\n        instructionAccountNode({ name: 'authority', isWritable: false, isSigner: true }),\n    ],\n    arguments: [\n        instructionArgumentNode({ name: 'version', type: numberTypeNode('u8') }),\n        instructionArgumentNode({ name: 'amount', type: numberTypeNode('u8') }),\n    ],\n    subInstructions: [\n        instructionNode({\n            name: 'incrementV1',\n            accounts: [instructionAccountNode({ name: 'counter', isWritable: true, isSigner: true })],\n            arguments: [\n                instructionArgumentNode({\n                    name: 'version',\n                    type: numberTypeNode('u8'),\n                    defaultValue: numberValueNode(0),\n                    defaultValueStrategy: 'omitted',\n                }),\n                instructionArgumentNode({ name: 'amount', type: numberTypeNode('u8') }),\n            ],\n        }),\n        instructionNode({\n            name: 'incrementV2',\n            accounts: [\n                instructionAccountNode({ name: 'counter', isWritable: true, isSigner: false }),\n                instructionAccountNode({ name: 'authority', isWritable: false, isSigner: true }),\n            ],\n            arguments: [\n                instructionArgumentNode({\n                    name: 'version',\n                    type: numberTypeNode('u8'),\n                    defaultValue: numberValueNode(1),\n                    defaultValueStrategy: 'omitted',\n                }),\n                instructionArgumentNode({ name: 'amount', type: numberTypeNode('u8') }),\n            ],\n        }),\n    ],\n});\n```\n\n### A deprecated instruction\n\n```ts\ninstructionNode({\n    name: 'oldIncrement',\n    status: instructionStatusNode(\n        'deprecated',\n        'Use the `increment` instruction instead. This will be removed in v3.0.0.',\n    ),\n    accounts: [instructionAccountNode({ name: 'counter', isWritable: true, isSigner: false })],\n    arguments: [instructionArgumentNode({ name: 'amount', type: numberTypeNode('u8') })],\n});\n```\n\n### An archived instruction\n\n```ts\ninstructionNode({\n    name: 'legacyTransfer',\n    status: instructionStatusNode(\n        'archived',\n        'This instruction was removed in v2.0.0. It is kept here for historical parsing.',\n    ),\n    accounts: [\n        instructionAccountNode({ name: 'source', isWritable: true, isSigner: true }),\n        instructionAccountNode({ name: 'destination', isWritable: true, isSigner: false }),\n    ],\n    arguments: [instructionArgumentNode({ name: 'amount', type: numberTypeNode('u64') })],\n});\n```\n\n### A draft instruction\n\n```ts\ninstructionNode({\n    name: 'experimentalFeature',\n    status: instructionStatusNode('draft', 'This instruction is under development and may change.'),\n    accounts: [instructionAccountNode({ name: 'config', isWritable: true, isSigner: true })],\n    arguments: [],\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/InstructionRemainingAccountsNode.md",
    "content": "# `InstructionRemainingAccountsNode`\n\nThis node represents a list of remaining accounts for an instruction. It can be used to represent a dynamic list of accounts that are not explicitly defined in the instruction but may be required for the instruction to execute.\n\n## Attributes\n\n### Data\n\n| Attribute    | Type                                 | Description                                                                                                                                                                   |\n| ------------ | ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `kind`       | `\"instructionRemainingAccountsNode\"` | The node discriminator.                                                                                                                                                       |\n| `docs`       | `string[]`                           | Markdown documentation explaining the remaining accounts of an instruction.                                                                                                   |\n| `isOptional` | `boolean`                            | (Optional) Whether the remaining accounts are optional. Defaults to `false`.                                                                                                  |\n| `isSigner`   | `boolean` \\| `\"either\"`              | (Optional) Whether the remaining accounts are signers. If `true`, all are. If `false`, none are. If `\"either\"`, they may each either be a signer or not. Defaults to `false`. |\n\n### Children\n\n| Attribute | Type                                                                                                                                     | Description                                                                                                                                                                                                                                                                                    |\n| --------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `value`   | [`ArgumentValueNode`](./contextualValueNodes/ArgumentValueNode.md) \\| [`ResolverValueNode`](./contextualValueNodes/ResolverValueNode.md) | The node representing how these remaining accounts are gathered. If a `ArgumentValueNode` is provided, a new argument will be used to represent this array of accounts from the provided name. Otherwise, a `ResolverValueNode` can be used as a fallback to represent more complex scenarios. |\n\n## Functions\n\n### `instructionRemainingAccountsNode(value, options?)`\n\nHelper function that creates a `InstructionRemainingAccountsNode` object from a value node and some options.\n\n```ts\nconst node = instructionRemainingAccountsNode(argumentValueNode('signers'), {\n    isSigner: true,\n    isOptional: true,\n});\n```\n\n## Examples\n\n### Optional remaining signers\n\n```ts\ninstructionRemainingAccountsNode(argumentValueNode('authorities'), {\n    isSigner: true,\n    isOptional: true,\n});\n```\n\n### Remaining accounts that may or may not be signers\n\n```ts\ninstructionRemainingAccountsNode(argumentValueNode('authorities'), {\n    isSigner: 'either',\n});\n```\n\n### Remaining accounts using a resolver\n\n```ts\ninstructionRemainingAccountsNode(\n    resolverValueNode('resolveTransferRemainingAccounts', {\n        docs: ['Provide authorities as remaining accounts if and only if the asset has a multisig set up.'],\n        dependsOn: [argumentValueNode('hasMultisig'), argumentValueNode('authorities')],\n    }),\n);\n```\n"
  },
  {
    "path": "packages/nodes/docs/InstructionStatusNode.md",
    "content": "# `InstructionStatusNode`\n\nThis node represents the status of an instruction along with an optional message.\n\n## Attributes\n\n### Data\n\n| Attribute   | Type                                                    | Description                                                                                                                                                                                                                                      |\n| ----------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `kind`      | `\"instructionStatusNode\"`                               | The node discriminator.                                                                                                                                                                                                                          |\n| `lifecycle` | `\"live\"` \\| `\"deprecated\"` \\| `\"archived\"` \\| `\"draft\"` | The lifecycle status of the instruction. `\"live\"` means accessible (the default), `\"deprecated\"` means about to be archived, `\"archived\"` means no longer accessible but kept for historical parsing, `\"draft\"` means not fully implemented yet. |\n| `message`   | `string`                                                | (Optional) Additional information about the current status for program consumers.                                                                                                                                                                |\n\n## Functions\n\n### `instructionStatusNode(lifecycle, message?)`\n\nHelper function that creates an `InstructionStatusNode` object.\n\n```ts\nconst statusNode = instructionStatusNode('deprecated', 'Use the newInstruction instead');\n```\n\n## Examples\n\n### A live instruction (no status needed)\n\nFor live instructions, you typically don't need to set a status at all:\n\n```ts\ninstructionNode({\n    name: 'transfer',\n    accounts: [...],\n    arguments: [...],\n});\n```\n\n### A deprecated instruction\n\n```ts\ninstructionNode({\n    name: 'oldTransfer',\n    status: instructionStatusNode('deprecated', 'Use the `transfer` instruction instead. This will be removed in v3.0.0.'),\n    accounts: [...],\n    arguments: [...],\n});\n```\n\n### An archived instruction\n\n```ts\ninstructionNode({\n    name: 'legacyTransfer',\n    status: instructionStatusNode('archived', 'This instruction was removed in v2.0.0. It is kept here for historical parsing.'),\n    accounts: [...],\n    arguments: [...],\n});\n```\n\n### A draft instruction\n\n```ts\ninstructionNode({\n    name: 'experimentalFeature',\n    status: instructionStatusNode('draft', 'This instruction is under development and may change.'),\n    accounts: [...],\n    arguments: [...],\n});\n```\n\n### Status without a message\n\n```ts\ninstructionNode({\n    name: 'someInstruction',\n    status: instructionStatusNode('deprecated'),\n    accounts: [...],\n    arguments: [...],\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/PdaNode.md",
    "content": "# `PdaNode`\n\nThis node provides a definition for a specific Program-Derived Address (PDA). It is characterized by a name and a list of seeds that can either be constant or variable.\n\n![Diagram](https://github.com/codama-idl/codama/assets/3642397/4f7c9718-1ffa-4f2c-aa45-71b3ce204219)\n\n## Attributes\n\n### Data\n\n| Attribute   | Type              | Description                                                                                                                      |\n| ----------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------- |\n| `kind`      | `\"pdaNode\"`       | The node discriminator.                                                                                                          |\n| `name`      | `CamelCaseString` | The name of the PDA.                                                                                                             |\n| `docs`      | `string[]`        | Markdown documentation for the PDA.                                                                                              |\n| `programId` | `string`          | (Optional) The address of the program the PDA should derive from. Defaults to the address of the nearest `ProgramNode` ancestor. |\n\n### Children\n\n| Attribute | Type                                        | Description           |\n| --------- | ------------------------------------------- | --------------------- |\n| `seeds`   | [`PdaSeedNode`](./pdaSeedNodes/README.md)[] | The seeds of the PDA. |\n\n## Functions\n\n### `pdaNode(input)`\n\nHelper function that creates a `pdaNode` object from an input object.\n\n```ts\nconst node = pdaNode({\n    name: 'counter',\n    seeds: [variablePdaSeedNode('authority', publicKeyTypeNode())],\n    docs: ['The counter PDA derived from its authority.'],\n});\n```\n\n## Examples\n\n### A PDA with constant and variable seeds\n\n```ts\npdaNode({\n    name: 'ticket',\n    seeds: [\n        constantPdaSeedNodeFromString('utf8', 'raffles'),\n        variablePdaSeedNode('raffle', publicKeyTypeNode()),\n        constantPdaSeedNodeFromString('utf8', 'tickets'),\n        variablePdaSeedNode('ticketNumber', numberTypeNode('u32')),\n    ],\n});\n```\n\n### A PDA with no seeds\n\n```ts\npdaNode({\n    name: 'seedlessPda',\n    seeds: [],\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/ProgramNode.md",
    "content": "# `ProgramNode`\n\nThis node represents an entire program deployed on-chain. It defines all elements of a program such as accounts, instructions, PDAs, events, errors, etc.\n\n![Diagram](https://github.com/codama-idl/codama/assets/3642397/37ec38ea-66df-4c08-81c3-822ef4388580)\n\n## Attributes\n\n### Data\n\n| Attribute   | Type                    | Description                                                                  |\n| ----------- | ----------------------- | ---------------------------------------------------------------------------- |\n| `kind`      | `\"programNode\"`         | The node discriminator.                                                      |\n| `name`      | `CamelCaseString`       | The name of the program.                                                     |\n| `publicKey` | `string`                | The 32-bytes address of the program base58 encoded.                          |\n| `version`   | `\\d.\\d.\\d`              | The semantic version of the program being defined.                           |\n| `docs`      | `string[]`              | Markdown documentation for the program.                                      |\n| `origin`    | `\"anchor\"` \\| `\"shank\"` | (Optional) An optional attribute tells us how this program node was created. |\n\n### Children\n\n| Attribute      | Type                                        | Description                                                   |\n| -------------- | ------------------------------------------- | ------------------------------------------------------------- |\n| `accounts`     | [`AccountNode`](./AccountNode.md)[]         | The accounts created and managed by the program.              |\n| `instructions` | [`InstructionNode`](./InstructionNode.md)[] | The instructions that allows us to interact with the program. |\n| `definedTypes` | [`DefinedTypeNode`](./DefinedTypeNode.md)[] | Some reusable types defined by the program.                   |\n| `pdas`         | [`PdaNode`](./PdaNode.md)[]                 | The Program-Derived Addresses (PDAs) used by the program.     |\n| `events`       | [`EventNode`](./EventNode.md)[]             | The events that can be emitted by the program.                |\n| `errors`       | [`ErrorNode`](./ErrorNode.md)[]             | The errors that can be thrown by the program.                 |\n\n## Functions\n\n### `programNode(input)`\n\nHelper function that creates a `ProgramNode` object from an input object\n\n```ts\nconst node = programNode({\n    name: 'counter',\n    publicKey: '7ovtg4pFqjQdSwFAUCu8gTnh5thZHzAyJFXy3Ssnj3yK',\n    version: '1.42.6',\n    accounts: [],\n    instructions: [],\n    definedTypes: [],\n    pdas: [],\n    events: [],\n    errors: [],\n});\n```\n\n### `getAllPrograms(node)`\n\nHelper function that returns all `ProgramNodes` under a given node. This can be a `RootNode`, a `ProgramNode` — returning itself in an array — or an array of `ProgramNode`.\n\n```ts\nconst allPrograms = getAllPrograms(rootNode);\n```\n\n### `getAllPdas(node)`\n\nHelper function that returns all `PdaNodes` under a given node. This can be a `RootNode`, a `ProgramNode` or an array of `ProgramNode`.\n\n```ts\nconst allPdas = getAllPdas(rootNode);\n```\n\n### `getAllAccounts(node)`\n\nHelper function that returns all `AccountNodes` under a given node. This can be a `RootNode`, a `ProgramNode` or an array of `ProgramNode`.\n\n```ts\nconst allAccounts = getAllAccounts(rootNode);\n```\n\n### `getAllEvents(node)`\n\nHelper function that returns all `EventNodes` under a given node. This can be a `RootNode`, a `ProgramNode` or an array of `ProgramNode`.\n\n```ts\nconst allEvents = getAllEvents(rootNode);\n```\n\n### `getAllDefinedTypes(node)`\n\nHelper function that returns all `DefinedTypeNodes` under a given node. This can be a `RootNode`, a `ProgramNode` or an array of `ProgramNode`.\n\n```ts\nconst allDefinedTypes = getAllDefinedTypes(rootNode);\n```\n\n### `getAllInstructions(node)`\n\nHelper function that returns all `InstructionNodes` under a given node. This can be a `RootNode`, a `ProgramNode` or an array of `ProgramNode`.\n\n```ts\nconst allInstructions = getAllInstructions(rootNode);\n```\n\n### `getAllErrors(node)`\n\nHelper function that returns all `ErrorNodes` under a given node. This can be a `RootNode`, a `ProgramNode` or an array of `ProgramNode`.\n\n```ts\nconst allErrors = getAllErrors(rootNode);\n```\n"
  },
  {
    "path": "packages/nodes/docs/README.md",
    "content": "# `Node` (abstract)\n\nThe `Node` type helper represents all available nodes. Note that `Node` is a type alias and cannot be used directly as a node. Instead you may use any node to satisfy the `Node` type. You can [see all available nodes here](../README.md#documentation).\n\n## Functions\n\nSome helper functions are also available to work with nodes.\n\n### `isNode(node, kind)`\n\nType guard that checks if a node is of a specific kind or part of a list of kinds. If the provided node is `null` or `undefined`, the function returns `false`.\n\n```ts\nisNode(stringTypeNode('utf8'), 'stringTypeNode'); // true.\nisNode(stringTypeNode('utf8'), 'numberTypeNode'); // false.\nisNode(stringTypeNode('utf8'), ['stringTypeNode', 'numberTypeNode']); // true.\nisNode(null, 'stringTypeNode'); // false.\nisNode(undefined, 'stringTypeNode'); // false.\n```\n\n### `assertIsNode(node, kind)`\n\nType guard that asserts that a node is of a specific kind or part of a list of kinds. If the provided node is `null` or `undefined`, the function throws an error.\n\n```ts\nassertIsNode(stringTypeNode('utf8'), 'stringTypeNode'); // Ok.\nassertIsNode(stringTypeNode('utf8'), 'numberTypeNode'); // Throws an error.\nassertIsNode(stringTypeNode('utf8'), ['stringTypeNode', 'numberTypeNode']); // Ok.\nassertIsNode(null, 'stringTypeNode'); // Throws an error.\nassertIsNode(undefined, 'stringTypeNode'); // Throws an error.\n```\n\n### `isNodeFilter(kind)`\n\nThis function returns a function that acts as the `isNode` function but with a predefined kind or list of kinds to check against. This is a useful function to use in combination with array functions like `filter`.\n\n```ts\nmyNodes.filter(isNodeFilter('stringTypeNode')); // Keep only string type nodes.\nmyNodes.filter(isNodeFilter(['stringTypeNode', 'numberTypeNode'])); // Keep only string and number type nodes.\n```\n\n### `assertIsNodeFilter(kind)`\n\nThis function returns a function that acts as the `assertIsNode` function but with a predefined kind or list of kinds to check against. This is a useful function to use in combination with array functions like `filter`.\n\n```ts\nmyNodes.filter(assertIsNodeFilter('stringTypeNode')); // Fail if there are non-string type node.\nmyNodes.filter(assertIsNodeFilter(['stringTypeNode', 'numberTypeNode'])); // Fail if there are nodes that are not string or number type nodes.\n```\n\n### `removeNullAndAssertIsNodeFilter(kind)`\n\nThis function acts like the `assertIsNodeFilter` function below but removes `null` and `undefined` values before asserting the kind or kinds.\n\n```ts\nconst myNodes = [null, stringTypeNode('utf8'), undefined, stringTypeNode('base58')];\n\nmyNodes.filter(removeNullAndAssertIsNodeFilter('stringTypeNode')); // Ok and removes null and undefined values.\nmyNodes.filter(removeNullAndAssertIsNodeFilter('numberTypeNode')); // Throws an error.\nmyNodes.filter(removeNullAndAssertIsNodeFilter(['stringTypeNode', 'numberTypeNode'])); // Ok and removes null and undefined values.\n```\n"
  },
  {
    "path": "packages/nodes/docs/RootNode.md",
    "content": "# `RootNode`\n\nThis node represents the starting point of the Codama IDL. It contains a single `ProgramNode` which the Codama IDL is describing as well as any additional programs that may be referenced by the main program. This node is also responsible for setting the standard and version of the IDL.\n\n![Diagram](https://github.com/codama-idl/codama/assets/3642397/96c43c75-5925-4b6b-a1e0-8b8c61317cfe)\n\n## Attributes\n\n### Data\n\n| Attribute  | Type         | Description                                                                                                                                                                                   |\n| ---------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `kind`     | `\"rootNode\"` | The node discriminator.                                                                                                                                                                       |\n| `standard` | `\"codama\"`   | The IDL standard used by the `RootNode` which is always `\"codama\"`. This can help other communities fork the Codama standard.                                                                 |\n| `version`  | `\\d.\\d.\\d`   | The semantic version of the standard used by the `RootNode`. That is — unless a different standard is used — this will be the Codama version from which this entire tree of node was created. |\n\n### Children\n\n| Attribute            | Type                                | Description                                                             |\n| -------------------- | ----------------------------------- | ----------------------------------------------------------------------- |\n| `program`            | [`ProgramNode`](./ProgramNode.md)   | The main program being described.                                       |\n| `additionalPrograms` | [`ProgramNode`](./ProgramNode.md)[] | (Optional) Additional programs that are referenced by the main program. |\n\n## Functions\n\n### `rootNode(program, additionalPrograms?)`\n\nHelper function that creates a `RootNode` object from a `ProgramNode` and an optional array of additional `ProgramNodes`. Note that the `standard` is automatically set to `\"codama\"` and the `version` is set to the Codama version installed.\n\n```ts\nconst node = rootNode(programNode({ ... }));\n```\n\n## Examples\n\n### A root node with a single program\n\n```ts\nconst node = rootNode(\n    programNode({\n        name: 'counter',\n        publicKey: '2R3Ui2TVUUCyGcZdopxJauk8ZBzgAaHHZCVUhm5ifPaC',\n        version: '1.0.0',\n        accounts: [\n            accountNode({\n                name: 'counter',\n                data: structTypeNode([\n                    structFieldTypeNode({ name: 'authority', type: publicKeyTypeNode() }),\n                    structFieldTypeNode({ name: 'value', type: numberTypeNode('u32') }),\n                ]),\n            }),\n        ],\n        instructions: [\n            instructionNode({ name: 'create' /* ... */ }),\n            instructionNode({ name: 'increment' /* ... */ }),\n            instructionNode({ name: 'transferAuthority' /* ... */ }),\n            instructionNode({ name: 'delete' /* ... */ }),\n        ],\n    }),\n);\n```\n"
  },
  {
    "path": "packages/nodes/docs/_template.md",
    "content": "# `SomeNode`\n\nThis node represents TODO.\n\n## Attributes\n\n### Data\n\n| Attribute | Type              | Description                          |\n| --------- | ----------------- | ------------------------------------ |\n| `kind`    | `\"someNode\"`      | The node discriminator.              |\n| `name`    | `CamelCaseString` | The name of the node.                |\n| `docs`    | `string[]`        | Markdown documentation for the type. |\n\n### Children\n\n| Attribute | Type                                 | Description             |\n| --------- | ------------------------------------ | ----------------------- |\n| `child`   | [`TypeNode`](../typeNodes/README.md) | The child of some node. |\n\nOR\n\n_This node has no children._\n\n## Functions\n\n### `someNode(input)`\n\nHelper function that creates a `SomeNode` object from TODO.\n\n```ts\nconst node = someNode(TODO);\n```\n\n## Examples\n\n### Some example title\n\n```ts\nsomeNode(TODO);\n\n// 0.01 USD   => 0x01000000\n// 10 USD     => 0x03E80000\n// 400.60 USD => 0x9C7C0000\n```\n"
  },
  {
    "path": "packages/nodes/docs/contextualValueNodes/AccountBumpValueNode.md",
    "content": "# `AccountBumpValueNode`\n\nA node that refers to the seed bump of a PDA account.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                     | Description              |\n| --------- | ------------------------ | ------------------------ |\n| `kind`    | `\"accountBumpValueNode\"` | The node discriminator.  |\n| `name`    | `CamelCaseString`        | The name of the account. |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `accountBumpValueNode(name)`\n\nHelper function that creates a `AccountBumpValueNode` object from the account name.\n\n```ts\nconst node = accountBumpValueNode('associatedTokenAccount');\n```\n\n## Examples\n\n### An instruction argument defaulting to the bump derivation of an instruction account\n\n```ts\ninstructionNode({\n    name: 'transfer',\n    accounts: [\n        instructionAccountNode({\n            name: 'associatedTokenAccount',\n            isSigner: false,\n            isWritable: true,\n        }),\n        // ...\n    ],\n    arguments: [\n        instructionArgumentNode({\n            name: 'bump',\n            type: numberTypeNode('u8'),\n            defaultValue: accountBumpValueNode('associatedTokenAccount'),\n        }),\n        // ...\n    ],\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/contextualValueNodes/AccountValueNode.md",
    "content": "# `AccountValueNode`\n\nA node that refers to an account — e.g. an instruction account in the context of an instruction.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                 | Description              |\n| --------- | -------------------- | ------------------------ |\n| `kind`    | `\"accountValueNode\"` | The node discriminator.  |\n| `name`    | `CamelCaseString`    | The name of the account. |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `accountValueNode(name)`\n\nHelper function that creates a `AccountValueNode` object from the account name.\n\n```ts\nconst node = accountValueNode('mint');\n```\n\n## Examples\n\n### An instruction account defaulting to another account\n\n```ts\ninstructionNode({\n    name: 'mint',\n    accounts: [\n        instructionAccountNode({\n            name: 'payer',\n            isSigner: true,\n            isWritable: false,\n        }),\n        instructionAccountNode({\n            name: 'authority',\n            isSigner: false,\n            isWritable: true,\n            defaultValue: accountValueNode('payer'),\n        }),\n        // ...\n    ],\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/contextualValueNodes/ArgumentValueNode.md",
    "content": "# `ArgumentValueNode`\n\nA node that refers to an argument — e.g. an instruction argument in the context of an instruction.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                  | Description               |\n| --------- | --------------------- | ------------------------- |\n| `kind`    | `\"argumentValueNode\"` | The node discriminator.   |\n| `name`    | `CamelCaseString`     | The name of the argument. |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `argumentValueNode(name)`\n\nHelper function that creates a `ArgumentValueNode` object from the argument name.\n\n```ts\nconst node = argumentValueNode('amount');\n```\n\n## Examples\n\n### An instruction argument defaulting to another argument\n\n```ts\ninstructionNode({\n    name: 'mint',\n    arguments: [\n        instructionArgumentNode({\n            name: 'amount',\n            type: numberTypeNode('u64'),\n        }),\n        instructionArgumentNode({\n            name: 'amountToDelegate',\n            type: numberTypeNode('u64'),\n            defaultValue: argumentValueNode('amount'),\n        }),\n        // ...\n    ],\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/contextualValueNodes/ConditionalValueNode.md",
    "content": "# `ConditionalValueNode`\n\nA value node that differs based on a condition.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                     | Description             |\n| --------- | ------------------------ | ----------------------- |\n| `kind`    | `\"conditionalValueNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute   | Type                                                                                                                                          | Description                                                                                                                          |\n| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |\n| `condition` | [`AccountValueNode`](./AccountValueNode.md) \\| [`ArgumentValueNode`](./ArgumentValueNode.md) \\| [`ResolverValueNode`](./ResolverValueNode.md) | The condition that must be met. If it is an argument or value node, the `value` attribute may be used to assert on a specific value. |\n| `value`     | [`ValueNode`](../valueNodes/README.md)                                                                                                        | (Optional) If provided, the `condition` must be equal to this value. Otherwise, the `condition` must simply exist.                   |\n| `ifTrue`    | [`InstructionInputValueNode`](./InstructionInputValueNode.md)                                                                                 | (Optional) The value to use if the condition is true.                                                                                |\n| `ifFalse`   | [`InstructionInputValueNode`](./InstructionInputValueNode.md)                                                                                 | (Optional) The value to use if the condition is false.                                                                               |\n\n## Functions\n\n### `conditionalValueNode(input)`\n\nHelper function that creates a `ConditionalValueNode` object from an input object.\n\n```ts\nconst node = conditionalValueNode({\n    condition: argumentValueNode('amount'),\n    value: numberValueNode(0),\n    ifTrue: accountValueNode('mint'),\n    ifFalse: programIdValueNode(),\n});\n```\n\n## Examples\n\n### An instruction account that defaults to another account if a condition is met\n\n```ts\ninstructionNode({\n    name: 'transfer',\n    accounts: [\n        instructionAccountNode({\n            name: 'source',\n            isSigner: false,\n            isWritable: true,\n        }),\n        instructionAccountNode({\n            name: 'destination',\n            isSigner: false,\n            isWritable: true,\n            isOptional: true,\n            defaultValue: conditionalValueNode({\n                condition: argumentValueNode('amount'),\n                value: numberValueNode(0),\n                ifTrue: accountValueNode('source'),\n            }),\n        }),\n        // ...\n    ],\n    arguments: [\n        instructionArgumentNode({\n            name: 'amount',\n            type: numberTypeNode('u64'),\n        }),\n    ],\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/contextualValueNodes/IdentityValueNode.md",
    "content": "# `IdentityValueNode`\n\nA node that represents the main wallet that should **own things**.\n\nFor instance, in an web application, the identity would be the user's wallet; in a terminal, the identity would be the wallet identitied by `solana address`; etc.\n\nNote that a similar node exists for representing the main wallet that should **pay for things** — the [`PayerValueNode`](./PayerValueNode.md). In practice, the identity and the payer are often the same but allowing the program maintainer to offer this distinction can be useful should they be different.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                  | Description             |\n| --------- | --------------------- | ----------------------- |\n| `kind`    | `\"identityValueNode\"` | The node discriminator. |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `identityValueNode()`\n\nHelper function that creates a `IdentityValueNode` object.\n\n```ts\nconst node = identityValueNode();\n```\n\n## Examples\n\n### An instruction account defaulting to the identity value\n\n```ts\ninstructionNode({\n    name: 'transfer',\n    accounts: [\n        instructionAccountNode({\n            name: 'authority',\n            isSigner: true,\n            isWritable: false,\n            defaultValue: identityValueNode(),\n        }),\n        // ...\n    ],\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/contextualValueNodes/InstructionInputValueNode.md",
    "content": "# `InstructionInputValueNode` (abstract)\n\nThe `InstructionInputValueNode` type helper represents all values that can be used as a default value for an instruction account or an instruction argument. Note that `InstructionInputValueNode` is a type alias and cannot be used directly as a node. Instead you may use one of the following nodes:\n\n- [`ContextualValueNode`](./README.md) (abstract)\n- [`ProgramLinkNode`](../linkNodes/ProgramLinkNode.md)\n- [`ValueNode`](../valueNodes/README.md) (abstract)\n"
  },
  {
    "path": "packages/nodes/docs/contextualValueNodes/PayerValueNode.md",
    "content": "# `PayerValueNode`\n\nA node that represents the main wallet that should **pay for things**.\n\nFor instance, in an web application, the payer would be the user's wallet; in a terminal, the payer would be the wallet identitied by `solana address`; etc.\n\nNote that a similar node exists for representing the main wallet that should **own things** — the [`IdentityValueNode`](./IdentityValueNode.md). In practice, the payer and the identity are often the same but allowing the program maintainer to offer this distinction can be useful should they be different.\n\n## Attributes\n\n### Data\n\n| Attribute | Type               | Description             |\n| --------- | ------------------ | ----------------------- |\n| `kind`    | `\"payerValueNode\"` | The node discriminator. |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `payerValueNode()`\n\nHelper function that creates a `PayerValueNode` object.\n\n```ts\nconst node = payerValueNode();\n```\n\n## Examples\n\n### An instruction account defaulting to the payer value\n\n```ts\ninstructionNode({\n    name: 'transfer',\n    accounts: [\n        instructionAccountNode({\n            name: 'payer',\n            isSigner: true,\n            isWritable: false,\n            defaultValue: payerValueNode(),\n        }),\n        // ...\n    ],\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/contextualValueNodes/PdaSeedValueNode.md",
    "content": "# `PdaSeedValueNode`\n\nA node that represents the value of a variable PDA seed.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                 | Description                    |\n| --------- | -------------------- | ------------------------------ |\n| `kind`    | `\"pdaSeedValueNode\"` | The node discriminator.        |\n| `name`    | `CamelCaseString`    | The name of the variable seed. |\n\n### Children\n\n| Attribute | Type                                                                                                                                   | Description                                                                                                                         |\n| --------- | -------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |\n| `value`   | [`AccountValueNode`](./AccountValueNode.md) \\| [`ArgumentValueNode`](./ArgumentValueNode.md) \\| [`ValueNode`](../valueNodes/README.md) | The value of the variable PDA seed. This can be a simple `ValueNode` or a contextual value pointing to another account or argument. |\n\n## Functions\n\n### `pdaSeedValueNode(name, value)`\n\nHelper function that creates a `PdaSeedValueNode` object from the name of the variable seed and its value.\n\n```ts\nconst node = pdaSeedValueNode('mint', accountValueNode('mint'));\n```\n"
  },
  {
    "path": "packages/nodes/docs/contextualValueNodes/PdaValueNode.md",
    "content": "# `PdaValueNode`\n\nA node that represents a PDA value. It alone can be used to derive the PDA address.\n\n## Attributes\n\n### Data\n\n| Attribute | Type             | Description             |\n| --------- | ---------------- | ----------------------- |\n| `kind`    | `\"pdaValueNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                                                                       | Description                                                                                                                                                                                          |\n| --------- | -------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `pda`     | [`PdaLinkNode`](../linkNodes/PdaLinkNode.md) \\| [`PdaNode`](../PdaNode.md) | The PDA definition to use. It can either be a `PdaLinkNode` — therefore pointing to an existing PDA definition on the `ProgramNode` — or a direct `PdaNode` if we want to inline the PDA definition. |\n| `seeds`   | [`PdaSeedValueNode`](./PdaSeedValueNode.md)[]                              | The values of all variable seeds in the PDA.                                                                                                                                                         |\n\n## Functions\n\n### `pdaValueNode(pda, seeds)`\n\nHelper function that creates a `PdaValueNode` object from a PDA definition and an array of seed values. When a `string` is provided as the `pda` definition, it is used as a `PdaLinkNode`.\n\n```ts\nconst node = pdaValueNode('associatedToken', [\n    pdaSeedValueNode('mint', publicKeyValueNode('G345gmp34svbGxyXuCvKVVHDbqJQ66y65vVrx7m7FmBE')),\n    pdaSeedValueNode('owner', publicKeyValueNode('Nzgr9bYfMRq5768bHfXsXoPTnLWAXgQNosRBxK63jRH')),\n]);\n```\n\n## Examples\n\n### A PDA value whose seeds point to other accounts\n\n```ts\npdaValueNode('associatedToken', [\n    pdaSeedValueNode('mint', accountValueNode('mint')),\n    pdaSeedValueNode('owner', accountValueNode('authority')),\n]);\n```\n\n### A PDA value with an inlined PDA definition\n\n```ts\nconst inlinedPdaNode = pdaNode({\n    name: 'associatedToken',\n    seeds: [\n        variablePdaSeedNode('mint', publicKeyTypeNode()),\n        constantPdaSeedNode(publicKeyTypeNode(), publicKeyValueNode('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA')),\n        variablePdaSeedNode('owner', publicKeyTypeNode()),\n    ],\n});\n\npdaValueNode(inlinedPdaNode, [\n    pdaSeedValueNode('mint', accountValueNode('mint')),\n    pdaSeedValueNode('owner', accountValueNode('authority')),\n]);\n```\n"
  },
  {
    "path": "packages/nodes/docs/contextualValueNodes/ProgramIdValueNode.md",
    "content": "# `ProgramIdValueNode`\n\nA node that represents the public key of the current program. That is, the address of the `ProgramNode` from which this node descends.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                   | Description             |\n| --------- | ---------------------- | ----------------------- |\n| `kind`    | `\"programIdValueNode\"` | The node discriminator. |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `programIdValueNode()`\n\nHelper function that creates a `ProgramIdValueNode` object.\n\n```ts\nconst node = programIdValueNode();\n```\n"
  },
  {
    "path": "packages/nodes/docs/contextualValueNodes/README.md",
    "content": "# `ContextualValueNode` (abstract)\n\nThe `ContextualValueNode` type helper represents all the available contextual value nodes. Note that `ContextualValueNode` is a type alias and cannot be used directly as a node. Instead you may use one of the following nodes:\n\n- [`AccountBumpValueNode`](./AccountBumpValueNode.md)\n- [`AccountValueNode`](./AccountValueNode.md)\n- [`ArgumentValueNode`](./ArgumentValueNode.md)\n- [`ConditionalValueNode`](./ConditionalValueNode.md)\n- [`IdentityValueNode`](./IdentityValueNode.md)\n- [`PayerValueNode`](./PayerValueNode.md)\n- [`PdaValueNode`](./PdaValueNode.md)\n- [`ProgramIdValueNode`](./ProgramIdValueNode.md)\n- [`ResolverValueNode`](./ResolverValueNode.md)\n"
  },
  {
    "path": "packages/nodes/docs/contextualValueNodes/ResolverValueNode.md",
    "content": "# `ResolverValueNode`\n\nA node that represents any custom value or logic described by some documentation.\n\nThis node acts as a fallback node for any value or logic that cannot easily be described by the other nodes. Instead, the program maintainer can use this node to describe the value or logic in detail. Visitors that render code from Codama IDLs will treat these `ResolverValueNodes` as functions that can be injected into the generated code.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                  | Description                                                                                                            |\n| --------- | --------------------- | ---------------------------------------------------------------------------------------------------------------------- |\n| `kind`    | `\"resolverValueNode\"` | The node discriminator.                                                                                                |\n| `name`    | `CamelCaseString`     | A unique name for the resolver. This will typically be the name of the function that the renderers will try to invoke. |\n| `docs`    | `string[]`            | Detailed Markdown documentation for the resolver.                                                                      |\n\n### Children\n\n| Attribute   | Type                                                                                             | Description                                                                                                                                                                  |\n| ----------- | ------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `dependsOn` | ([`AccountValueNode`](./AccountValueNode.md) \\| [`ArgumentValueNode`](./ArgumentValueNode.md))[] | (Optional) The list of accounts or arguments that this custom value depends on. This is useful for code renderers to know in which order they should resolve default values. |\n\n## Functions\n\n### `resolverValueNode(name, options)`\n\nHelper function that creates a `ResolverValueNode` object from the resolver name and some options.\n\n```ts\nconst node = resolverValueNode('resolveCustomTokenProgram', {\n    docs: [\n        'If the mint account has more than 0 decimals and the ',\n        'delegated amount is greater than zero, than we use our ',\n        'own custom token program. Otherwise, we use Token 2022.',\n    ],\n    dependsOn: [accountValueNode('mint'), argumentValueNode('delegatedAmount')],\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/countNodes/FixedCountNode.md",
    "content": "# `FixedCountNode`\n\nA node that represents a count strategy where **the number of items is known and fixed**. This enables nodes such as [`ArrayTypeNode`](../typeNodes/ArrayTypeNode.md) to represent arrays of a fixed length.\n\n## Attributes\n\n### Data\n\n| Attribute | Type               | Description               |\n| --------- | ------------------ | ------------------------- |\n| `kind`    | `\"fixedCountNode\"` | The node discriminator.   |\n| `value`   | `number`           | The fixed count of items. |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `fixedCountNode(value)`\n\nHelper function that creates a `FixedCountNode` object from a number.\n\n```ts\nconst node = fixedCountNode(42);\n```\n\n## Examples\n\n### An array of three public keys\n\n```ts\narrayTypeNode(publicKeyTypeNode(), fixedCountNode(3));\n```\n"
  },
  {
    "path": "packages/nodes/docs/countNodes/PrefixedCountNode.md",
    "content": "# `PrefixedCountNode`\n\nA node that represents a count strategy where **the number of items is stored as a number prefix**. This enables nodes such as [`ArrayTypeNode`](../typeNodes/ArrayTypeNode.md) to represent arrays such that their length is stored as a prefix.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                  | Description             |\n| --------- | --------------------- | ----------------------- |\n| `kind`    | `\"prefixedCountNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                                                                                                   | Description                                   |\n| --------- | ------------------------------------------------------------------------------------------------------ | --------------------------------------------- |\n| `prefix`  | [`NestedTypeNode`](../typeNodes/NestedTypeNode.md)<[`NumberTypeNode`](../typeNodes/NumberTypeNode.md)> | The node that determines the number of items. |\n\n## Functions\n\n### `prefixedCountNode(prefix)`\n\nHelper function that creates a `PrefixedCountNode` object from a number node.\n\n```ts\nconst node = prefixedCountNode(numberTypeNode(u32));\n```\n\n## Examples\n\n### An variable array of public keys prefixed with a u32\n\n```ts\narrayTypeNode(publicKeyTypeNode(), prefixedCountNode(numberTypeNode(u32)));\n```\n"
  },
  {
    "path": "packages/nodes/docs/countNodes/README.md",
    "content": "# `CountNode` (abstract)\n\nThe `CountNode` type helper represents all available strategies that determine the size of a collection. Note that `CountNode` is a type alias and cannot be used directly as a node. Instead you may use one of the following nodes:\n\n- [`FixedCountNode`](./FixedCountNode.md)\n- [`PrefixedCountNode`](./PrefixedCountNode.md)\n- [`RemainderCountNode`](./RemainderCountNode.md)\n"
  },
  {
    "path": "packages/nodes/docs/countNodes/RemainderCountNode.md",
    "content": "# `RemainderCountNode`\n\nA node that represents a count strategy where **the number of items is unknown and inferred by the remainder of the bytes**. When encoding, the items are encoded as-is without storing the total count. When decoding, items are decoded one by one until the end of the buffer is reached.\n\nThis enables nodes such as [`ArrayTypeNode`](../typeNodes/ArrayTypeNode.md) to represent variable arrays at the end of buffers.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                   | Description             |\n| --------- | ---------------------- | ----------------------- |\n| `kind`    | `\"remainderCountNode\"` | The node discriminator. |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `remainderCountNode()`\n\nHelper function that creates a `RemainderCountNode` object.\n\n```ts\nconst node = remainderCountNode();\n```\n\n## Examples\n\n### A remainder array of public keys\n\n```ts\narrayTypeNode(publicKeyTypeNode(), remainderCountNode());\n```\n"
  },
  {
    "path": "packages/nodes/docs/discriminatorNodes/ConstantDiscriminatorNode.md",
    "content": "# `ConstantDiscriminatorNode`\n\nThis node represents a byte discrimination strategy where the data is **identified by a constant value** at a given offset. Discriminator nodes are used to distinguish between different types of accounts or instructions in a program.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                          | Description                                       |\n| --------- | ----------------------------- | ------------------------------------------------- |\n| `kind`    | `\"constantDiscriminatorNode\"` | The node discriminator.                           |\n| `offset`  | `number`                      | The byte at which the constant should be located. |\n\n### Children\n\n| Attribute  | Type                                                     | Description                                  |\n| ---------- | -------------------------------------------------------- | -------------------------------------------- |\n| `constant` | [`ConstantValueNode`](./valueNodes/ConstantValueNode.md) | The constant value that identifies the data. |\n\n## Functions\n\n### `constantDiscriminatorNode(constant, offset?)`\n\nHelper function that creates a `ConstantDiscriminatorNode` object from a constant value node and an optional offset.\n\n```ts\nconst node = constantDiscriminatorNode(constantValueNodeFromString('utf8', 'Hello'), 64);\n```\n\n## Examples\n\n### An account distinguished by a u32 number equal to 42 at offset 0\n\n```ts\naccountNode({\n    discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode('u32'), numberValueNode(42)))],\n    // ...\n});\n```\n\n### An instruction disctinguished by an 8-byte hash at offset 0\n\n```ts\ninstructionNode({\n    discriminators: [constantValueNodeFromBytes('base16', '0011223344556677')],\n    // ...\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/discriminatorNodes/FieldDiscriminatorNode.md",
    "content": "# `FieldDiscriminatorNode`\n\nThis node represents a byte discrimination strategy where the data is **identified by the default value of a struct field** at a given offset. Discriminator nodes are used to distinguish between different types of accounts or instructions in a program.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                       | Description                                                                                                      |\n| --------- | -------------------------- | ---------------------------------------------------------------------------------------------------------------- |\n| `kind`    | `\"fieldDiscriminatorNode\"` | The node discriminator.                                                                                          |\n| `field`   | `CamelCaseString`          | The name of the [`StructFieldTypeNode`](../typeNodes/StructFieldTypeNode.md) we should use to identify the data. |\n| `offset`  | `number`                   | The byte at which the field should be located.                                                                   |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `fieldDiscriminatorNode(field, offset?)`\n\nHelper function that creates a `FieldDiscriminatorNode` object from a field name and an optional offset.\n\n```ts\nconst node = fieldDiscriminatorNode('accountState', 64);\n```\n\n## Examples\n\n### An account distinguished by a u32 field at offset 0\n\n```ts\naccountNode({\n    data: structTypeNode([\n        structFieldTypeNode({\n            name: 'discriminator',\n            type: numberTypeNode('u32'),\n            defaultValue: numberValueNode(42),\n            defaultValueStrategy: 'omitted',\n        }),\n        // ...\n    ]),\n    discriminators: [fieldDiscriminatorNode('discriminator')],\n    // ...\n});\n```\n\n### An instruction disctinguished by an 8-byte argument at offset 0\n\n```ts\ninstructionNode({\n    arguments: [\n        instructionArgumentNode({\n            name: 'discriminator',\n            type: fixedSizeTypeNode(bytesTypeNode(), 8),\n            defaultValue: bytesValueNode('base16', '0011223344556677'),\n            defaultValueStrategy: 'omitted',\n        }),\n        // ...\n    ],\n    discriminators: [fieldDiscriminatorNode('discriminator')],\n    // ...\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/discriminatorNodes/README.md",
    "content": "# `DiscriminatorNode` (abstract)\n\nThe `DiscriminatorNode` type helper represents all available strategies that help distinguish blocks of data — such as accounts and instructions. Note that `DiscriminatorNode` is a type alias and cannot be used directly as a node. Instead you may use one of the following nodes:\n\n- [`ConstantDiscriminatorNode`](./ConstantDiscriminatorNode.md)\n- [`FieldDiscriminatorNode`](./FieldDiscriminatorNode.md)\n- [`SizeDiscriminatorNode`](./SizeDiscriminatorNode.md)\n"
  },
  {
    "path": "packages/nodes/docs/discriminatorNodes/SizeDiscriminatorNode.md",
    "content": "# `SizeDiscriminatorNode`\n\nThis node represents a byte discrimination strategy where the data is **identified by being equal to a given size**. Discriminator nodes are used to distinguish between different types of accounts or instructions in a program.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                      | Description                        |\n| --------- | ------------------------- | ---------------------------------- |\n| `kind`    | `\"sizeDiscriminatorNode\"` | The node discriminator.            |\n| `size`    | `number`                  | The size that identifies the data. |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `sizeDiscriminatorNode(size)`\n\nHelper function that creates a `SizeDiscriminatorNode` object from a size.\n\n```ts\nconst node = sizeDiscriminatorNode(165);\n```\n\n## Examples\n\n### An account distinguished by its size being equal to 42\n\n```ts\naccountNode({\n    discriminators: [sizeDiscriminatorNode(42)],\n    // ...\n});\n```\n\n### An instruction disctinguished by its size being equal to 42\n\n```ts\ninstructionNode({\n    discriminators: [sizeDiscriminatorNode(42)],\n    // ...\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/linkNodes/AccountLinkNode.md",
    "content": "# `AccountLinkNode`\n\nThis node represents a reference to an existing [`AccountNode`](../AccountNode.md) in the Codama IDL.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                | Description                                                             |\n| --------- | ------------------- | ----------------------------------------------------------------------- |\n| `kind`    | `\"accountLinkNode\"` | The node discriminator.                                                 |\n| `name`    | `CamelCaseString`   | The name of the [`AccountNode`](../AccountNode.md) we are referring to. |\n\n### Children\n\n| Attribute | Type                                      | Description                                                                                                     |\n| --------- | ----------------------------------------- | --------------------------------------------------------------------------------------------------------------- |\n| `program` | [`ProgramLinkNode`](./ProgramLinkNode.md) | (Optional) The program associated with the linked account. Default to using the program we are currently under. |\n\n## Functions\n\n### `accountLinkNode(name, program?)`\n\nHelper function that creates an `AccountLinkNode` object from the name of the `AccountNode` we are referring to. If the account is from another program, the `program` parameter must be provided as either a `string` or a `ProgramLinkNode`.\n\n```ts\nconst node = accountLinkNode('myAccount');\nconst nodeFromAnotherProgram = accountLinkNode('myAccount', 'myOtherProgram');\n```\n"
  },
  {
    "path": "packages/nodes/docs/linkNodes/DefinedTypeLinkNode.md",
    "content": "# `DefinedTypeLinkNode`\n\nThis node represents a reference to an existing [`DefinedTypeNode`](../DefinedTypeNode.md) in the Codama IDL.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                    | Description                                                                     |\n| --------- | ----------------------- | ------------------------------------------------------------------------------- |\n| `kind`    | `\"definedTypeLinkNode\"` | The node discriminator.                                                         |\n| `name`    | `CamelCaseString`       | The name of the [`DefinedTypeNode`](../DefinedTypeNode.md) we are referring to. |\n\n### Children\n\n| Attribute | Type                                      | Description                                                                                                  |\n| --------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------ |\n| `program` | [`ProgramLinkNode`](./ProgramLinkNode.md) | (Optional) The program associated with the linked type. Default to using the program we are currently under. |\n\n## Functions\n\n### `definedTypeLinkNode(name, program?)`\n\nHelper function that creates a `DefinedTypeLinkNode` object from the name of the `DefinedTypeNode` we are referring to. If the defined type is from another program, the `program` parameter must be provided as either a `string` or a `ProgramLinkNode`.\n\n```ts\nconst node = definedTypeLinkNode('myDefinedType');\nconst nodeFromAnotherProgram = definedTypeLinkNode('myDefinedType', 'myOtherProgram');\n```\n"
  },
  {
    "path": "packages/nodes/docs/linkNodes/InstructionAccountLinkNode.md",
    "content": "# `InstructionAccountLinkNode`\n\nThis node represents a reference to an existing [`InstructionAccountNode`](../InstructionAccountNode.md) in the Codama IDL.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                           | Description                                                                                   |\n| --------- | ------------------------------ | --------------------------------------------------------------------------------------------- |\n| `kind`    | `\"instructionAccountLinkNode\"` | The node discriminator.                                                                       |\n| `name`    | `CamelCaseString`              | The name of the [`InstructionAccountNode`](../InstructionAccountNode.md) we are referring to. |\n\n### Children\n\n| Attribute     | Type                                              | Description                                                                                                                                                                                          |\n| ------------- | ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `instruction` | [`InstructionLinkNode`](./InstructionLinkNode.md) | (Optional) The instruction associated with the linked account. Default to using the instruction we are currently under. Note that the instruction itself can point to a different program is needed. |\n\n## Functions\n\n### `instructionAccountLinkNode(name, instruction?)`\n\nHelper function that creates an `InstructionAccountLinkNode` object from the name of the `InstructionAccountNode` we are referring to. If the account is from another instruction, the `instruction` parameter must be provided as either a `string` or a `InstructionLinkNode`. When providing an `InstructionLinkNode`, we can also provide a `ProgramLinkNode` to point to a different program.\n\n```ts\n// Links to an account in the current instruction.\nconst node = instructionAccountLinkNode('myAccount');\n\n// Links to an account in another instruction but within the same program.\nconst nodeFromAnotherInstruction = instructionAccountLinkNode('myAccount', 'myOtherInstruction');\n\n// Links to an account in another instruction from another program.\nconst nodeFromAnotherProgram = instructionAccountLinkNode(\n    'myAccount',\n    instructionLinkNode('myOtherInstruction', 'myOtherProgram'),\n);\n```\n"
  },
  {
    "path": "packages/nodes/docs/linkNodes/InstructionArgumentLinkNode.md",
    "content": "# `InstructionArgumentLinkNode`\n\nThis node represents a reference to an existing [`InstructionArgumentNode`](../InstructionArgumentNode.md) in the Codama IDL.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                            | Description                                                                                     |\n| --------- | ------------------------------- | ----------------------------------------------------------------------------------------------- |\n| `kind`    | `\"instructionArgumentLinkNode\"` | The node discriminator.                                                                         |\n| `name`    | `CamelCaseString`               | The name of the [`InstructionArgumentNode`](../InstructionArgumentNode.md) we are referring to. |\n\n### Children\n\n| Attribute     | Type                                              | Description                                                                                                                                                                                           |\n| ------------- | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `instruction` | [`InstructionLinkNode`](./InstructionLinkNode.md) | (Optional) The instruction associated with the linked argument. Default to using the instruction we are currently under. Note that the instruction itself can point to a different program is needed. |\n\n## Functions\n\n### `instructionArgumentLinkNode(name, instruction?)`\n\nHelper function that creates an `InstructionArgumentLinkNode` object from the name of the `InstructionArgumentNode` we are referring to. If the argument is from another instruction, the `instruction` parameter must be provided as either a `string` or a `InstructionLinkNode`. When providing an `InstructionLinkNode`, we can also provide a `ProgramLinkNode` to point to a different program.\n\n```ts\n// Links to an argument in the current instruction.\nconst node = instructionArgumentLinkNode('myArgument');\n\n// Links to an argument in another instruction but within the same program.\nconst nodeFromAnotherInstruction = instructionArgumentLinkNode('myArgument', 'myOtherInstruction');\n\n// Links to an argument in another instruction from another program.\nconst nodeFromAnotherProgram = instructionArgumentLinkNode(\n    'myArgument',\n    instructionLinkNode('myOtherInstruction', 'myOtherProgram'),\n);\n```\n"
  },
  {
    "path": "packages/nodes/docs/linkNodes/InstructionLinkNode.md",
    "content": "# `InstructionLinkNode`\n\nThis node represents a reference to an existing [`InstructionNode`](../InstructionNode.md) in the Codama IDL.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                    | Description                                                                     |\n| --------- | ----------------------- | ------------------------------------------------------------------------------- |\n| `kind`    | `\"instructionLinkNode\"` | The node discriminator.                                                         |\n| `name`    | `CamelCaseString`       | The name of the [`InstructionNode`](../InstructionNode.md) we are referring to. |\n\n### Children\n\n| Attribute | Type                                      | Description                                                                                                         |\n| --------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |\n| `program` | [`ProgramLinkNode`](./ProgramLinkNode.md) | (Optional) The program associated with the linked instruction. Default to using the program we are currently under. |\n\n## Functions\n\n### `instructionLinkNode(name, program?)`\n\nHelper function that creates an `InstructionLinkNode` object from the name of the `InstructionNode` we are referring to. If the instruction is from another program, the `program` parameter must be provided as either a `string` or a `ProgramLinkNode`.\n\n```ts\nconst node = instructionLinkNode('myInstruction');\nconst nodeFromAnotherProgram = instructionLinkNode('myInstruction', 'myOtherProgram');\n```\n"
  },
  {
    "path": "packages/nodes/docs/linkNodes/PdaLinkNode.md",
    "content": "# `PdaLinkNode`\n\nThis node represents a reference to an existing [`PdaNode`](../PdaNode.md) in the Codama IDL.\n\n## Attributes\n\n### Data\n\n| Attribute | Type              | Description                                                     |\n| --------- | ----------------- | --------------------------------------------------------------- |\n| `kind`    | `\"pdaLinkNode\"`   | The node discriminator.                                         |\n| `name`    | `CamelCaseString` | The name of the [`PdaNode`](../PdaNode.md) we are referring to. |\n\n### Children\n\n| Attribute | Type                                      | Description                                                                                                 |\n| --------- | ----------------------------------------- | ----------------------------------------------------------------------------------------------------------- |\n| `program` | [`ProgramLinkNode`](./ProgramLinkNode.md) | (Optional) The program associated with the linked PDA. Default to using the program we are currently under. |\n\n## Functions\n\n### `pdaLinkNode(name, program?)`\n\nHelper function that creates a `PdaLinkNode` object from the name of the `PdaNode` we are referring to. If the PDA is from another program, the `program` parameter must be provided as either a `string` or a `ProgramLinkNode`.\n\n```ts\nconst node = pdaLinkNode('myPda');\nconst nodeFromAnotherProgram = pdaLinkNode('myPda', 'myOtherProgram');\n```\n"
  },
  {
    "path": "packages/nodes/docs/linkNodes/ProgramLinkNode.md",
    "content": "# `ProgramLinkNode`\n\nThis node represents a reference to an existing [`ProgramNode`](../ProgramNode.md) in the Codama IDL.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                | Description                                                             |\n| --------- | ------------------- | ----------------------------------------------------------------------- |\n| `kind`    | `\"programLinkNode\"` | The node discriminator.                                                 |\n| `name`    | `CamelCaseString`   | The name of the [`ProgramNode`](../ProgramNode.md) we are referring to. |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `programLinkNode(name)`\n\nHelper function that creates a `ProgramLinkNode` object from the name of the `ProgramNode` we are referring to.\n\n```ts\nconst node = programLinkNode('myProgram');\n```\n"
  },
  {
    "path": "packages/nodes/docs/linkNodes/README.md",
    "content": "# `LinkNode` (abstract)\n\nThe `LinkNode` type helper represents all nodes that link to other nodes. Note that `LinkNode` is a type alias and cannot be used directly as a node. Instead you may use one of the following nodes:\n\n- [`AccountLinkNode`](./AccountLinkNode.md)\n- [`DefinedTypeLinkNode`](./DefinedTypeLinkNode.md)\n- [`InstructionAccountLinkNode`](./InstructionAccountLinkNode.md)\n- [`InstructionArgumentLinkNode`](./InstructionArgumentLinkNode.md)\n- [`InstructionLinkNode`](./InstructionLinkNode.md)\n- [`PdaLinkNode`](./PdaLinkNode.md)\n- [`ProgramLinkNode`](./ProgramLinkNode.md)\n"
  },
  {
    "path": "packages/nodes/docs/pdaSeedNodes/ConstantPdaSeedNode.md",
    "content": "# `ConstantPdaSeedNode`\n\nThis node represents a constant seed for a program-derived address (PDA).\n\n## Attributes\n\n### Data\n\n| Attribute | Type                    | Description             |\n| --------- | ----------------------- | ----------------------- |\n| `kind`    | `\"constantPdaSeedNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                                                                                                            | Description                     |\n| --------- | --------------------------------------------------------------------------------------------------------------- | ------------------------------- |\n| `type`    | [`TypeNode`](../typeNodes/README.md)                                                                            | The type of the constant seed.  |\n| `value`   | [`ValueNode`](../valueNodes/README.md) \\| [`ProgramIdValueNode`](../contextualValueNodes/ProgramIdValueNode.md) | The value of the constant seed. |\n\n## Functions\n\n### `constantPdaSeedNode(type, value)`\n\nHelper function that creates a `ConstantPdaSeedNode` object from a type node and a value node.\n\n```ts\nconst node = constantPdaSeedNode(numberTypeNode('u32'), numberValueNode(42));\n```\n\n### `constantPdaSeedNodeFromString(encoding, data)`\n\nHelper function that creates a `ConstantPdaSeedNode` object of type `StringTypeNode` from an encoding and a string of data.\n\n```ts\nconstantPdaSeedNodeFromString('utf8', 'Hello');\n\n// Equivalent to:\nconstantPdaSeedNode(stringTypeNode('utf8'), stringValueNode('Hello'));\n```\n\n### `constantValueNodeFromBytes(encoding, data)`\n\nHelper function that creates a `ConstantValueNode` object of type `BytesTypeNode` from an encoding and a string of data.\n\n```ts\nconstantValueNodeFromBytes('base16', 'FF99CC');\n\n// Equivalent to:\nconstantValueNode(bytesTypeNode(), bytesValueNode('base16', 'FF99CC'));\n```\n\n## Examples\n\n### A PDA node with a UTF-8 constant seed\n\n```ts\npdaNode({\n    name: 'tickets',\n    seeds: [constantPdaSeedNodeFromString('utf8', 'tickets')],\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/pdaSeedNodes/README.md",
    "content": "# `PdaSeedNode` (abstract)\n\nThe `PdaSeedNode` type helper represents all ways to define a PDA seed. Note that `PdaSeedNode` is a type alias and cannot be used directly as a node. Instead you may use one of the following nodes:\n\n- [`ConstantPdaSeedNode`](./ConstantPdaSeedNode.md)\n- [`VariablePdaSeedNode`](./VariablePdaSeedNode.md)\n"
  },
  {
    "path": "packages/nodes/docs/pdaSeedNodes/VariablePdaSeedNode.md",
    "content": "# `VariablePdaSeedNode`\n\nThis node represents a variable seed for a program-derived address (PDA). It is characterized by a name and a type.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                    | Description                                   |\n| --------- | ----------------------- | --------------------------------------------- |\n| `kind`    | `\"variablePdaSeedNode\"` | The node discriminator.                       |\n| `name`    | `CamelCaseString`       | The name of the variable seed.                |\n| `docs`    | `string[]`              | Markdown documentation for the variable seed. |\n\n### Children\n\n| Attribute | Type                                 | Description                    |\n| --------- | ------------------------------------ | ------------------------------ |\n| `type`    | [`TypeNode`](../typeNodes/README.md) | The type of the variable seed. |\n\n## Functions\n\n### `variablePdaSeedNode(name, type, docs?)`\n\nHelper function that creates a `VariablePdaSeedNode` object from a name, a type node and optional documentation.\n\n```ts\nconst node = variablePdaSeedNode('amount', numberTypeNode('u32'));\n```\n\n## Examples\n\n### A PDA node with a public key variable seed\n\n```ts\npdaNode({\n    name: 'ticket',\n    seeds: [variablePdaSeedNode('authority', publicKeyTypeNode())],\n});\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/AmountTypeNode.md",
    "content": "# `AmountTypeNode`\n\nA node that wraps a [`NumberTypeNode`](./NumberTypeNode.md) to provide additional context such as its unit and decimal places.\n\n## Attributes\n\n### Data\n\n| Attribute  | Type               | Description                                                                                                                                                                                                                                                                                           |\n| ---------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `kind`     | `\"amountTypeNode\"` | The node discriminator.                                                                                                                                                                                                                                                                               |\n| `decimals` | `number`           | The number of decimal places the wrapped integer has. For instance, if the wrapper number is a `12345` and `decimals === 2`, then the amount should be interpreted as `123.45`. This is particularly useful to represent financial values as floating points are notoriously unsafe for that purpose. |\n| `unit`     | `string`           | (Optional) The unit of the amount — e.g. `\"USD\"` or `\"%\"`.                                                                                                                                                                                                                                            |\n\n### Children\n\n| Attribute | Type                                                                             | Description              |\n| --------- | -------------------------------------------------------------------------------- | ------------------------ |\n| `number`  | [`NestedTypeNode`](./NestedTypeNode.md)<[`NumberTypeNode`](./NumberTypeNode.md)> | The number node to wrap. |\n\n## Functions\n\n### `amountTypeNode(number, decimals, unit?)`\n\nHelper function that creates a `AmountTypeNode` object from a `NumberTypeNode`, a number of decimals and an optional unit.\n\n```ts\nconst node = amountTypeNode(numberTypeNode('u64'), 2, 'USD');\nconst nodeWithoutUnits = amountTypeNode(numberTypeNode('u16'), 2);\n```\n\n## Examples\n\n### 2-decimals USD amount\n\n```ts\namountTypeNode(numberTypeNode('u32'), 2, 'USD');\n\n// 0.01 USD   => 0x01000000\n// 10 USD     => 0xE8030000\n// 400.60 USD => 0x7C9C0000\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/ArrayTypeNode.md",
    "content": "# `ArrayTypeNode`\n\nA node that represents an array of items. The type of each item is defined by the `item` child node and the length of the array is determined by the `count` child node.\n\n## Attributes\n\n### Data\n\n| Attribute | Type              | Description             |\n| --------- | ----------------- | ----------------------- |\n| `kind`    | `\"arrayTypeNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                                   | Description                                      |\n| --------- | -------------------------------------- | ------------------------------------------------ |\n| `item`    | [`TypeNode`](./README.md)              | The type of each item in the array.              |\n| `count`   | [`CountNode`](../countNodes/README.md) | The strategy to determine the size of the array. |\n\n## Functions\n\n### `arrayTypeNode(item, count)`\n\nHelper function that creates a `ArrayTypeNode` object from a `TypeNode` and a `CountNode`.\n\n```ts\nconst node = arrayTypeNode(publicKeyTypeNode(), prefixedCountNode(numberTypeNode('u32')));\n```\n\n## Examples\n\n### u32 prefixed array of u8 numbers\n\n![Diagram](https://github.com/codama-idl/codama/assets/3642397/1bbd3ecb-e06a-42fa-94a7-74c9302286e6)\n\n```ts\narrayTypeNode(numberTypeNode('u8'), prefixedCountNode(numberTypeNode('u32')));\n\n// [1, 2, 3] => 0x03000000010203\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/BooleanTypeNode.md",
    "content": "# `BooleanTypeNode`\n\nA node that represents a boolean value using a `NumberTypeNode`. If the number is `1`, then the boolean is `true`, otherwise it is `false`.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                | Description             |\n| --------- | ------------------- | ----------------------- |\n| `kind`    | `\"booleanTypeNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                                                                             | Description                                    |\n| --------- | -------------------------------------------------------------------------------- | ---------------------------------------------- |\n| `size`    | [`NestedTypeNode`](./NestedTypeNode.md)<[`NumberTypeNode`](./NumberTypeNode.md)> | The number node used to represent the boolean. |\n\n## Functions\n\n### `booleanTypeNode(size?)`\n\nHelper function that creates a `BooleanTypeNode` object from a `NumberTypeNode` (defaulting to `u8` if not provided).\n\n```ts\nconst node = booleanTypeNode(numberTypeNode('u32'));\nconst implicitU8Node = booleanTypeNode(); // u8 by default\n```\n\n## Examples\n\n### u8 booleans\n\n```ts\nbooleanTypeNode();\n\n// true  => 0x01\n// false => 0x00\n```\n\n### u32 booleans\n\n```ts\nbooleanTypeNode(numberTypeNode('u32'));\n\n// true  => 0x01000000\n// false => 0x00000000\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/BytesTypeNode.md",
    "content": "# `BytesTypeNode`\n\nA node that represents data as raw bytes. This can be useful for representing data that doesn't have a specific type or structure. It can also be shaped in size using nodes such as the [`SizePrefixTypeNode`](./SizePrefixTypeNode.md) or the [`FixedSizeTypeNode`](./FixedSizeTypeNode.md).\n\n## Attributes\n\n### Data\n\n| Attribute | Type              | Description             |\n| --------- | ----------------- | ----------------------- |\n| `kind`    | `\"bytesTypeNode\"` | The node discriminator. |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `bytesTypeNode()`\n\nHelper function that creates a `BytesTypeNode` object.\n\n```ts\nconst node = bytesTypeNode();\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/DateTimeTypeNode.md",
    "content": "# `DateTimeTypeNode`\n\nA node that wraps a [`NumberTypeNode`](./NumberTypeNode.md) to make it a datetime such that the number represents the number of seconds since the Unix epoch.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                 | Description             |\n| --------- | -------------------- | ----------------------- |\n| `kind`    | `\"dateTimeTypeNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                                                                             | Description              |\n| --------- | -------------------------------------------------------------------------------- | ------------------------ |\n| `number`  | [`NestedTypeNode`](./NestedTypeNode.md)<[`NumberTypeNode`](./NumberTypeNode.md)> | The number node to wrap. |\n\n## Functions\n\n### `dateTimeTypeNode(number)`\n\nHelper function that creates a `DateTimeTypeNode` object from a `NumberTypeNode`.\n\n```ts\nconst node = dateTimeTypeNode(numberTypeNode('u64'));\n```\n\n## Examples\n\n### u64 unix datetime\n\n```ts\ndateTimeTypeNode(numberTypeNode('u64'));\n\n// 2024-06-27T14:57:56Z => 0x667D7DF400000000\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/EnumEmptyVariantTypeNode.md",
    "content": "# `EnumEmptyVariantTypeNode`\n\nA node that defines an enum variant with no data.\n\n## Attributes\n\n### Data\n\n| Attribute       | Type                         | Description                                                                                                     |\n| --------------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------- |\n| `kind`          | `\"enumEmptyVariantTypeNode\"` | The node discriminator.                                                                                         |\n| `name`          | `CamelCaseString`            | The name of the enum variant.                                                                                   |\n| `discriminator` | `number`                     | (Optional) The variant's discriminator value. Defaults to the index of the variant in the enum (starting at 0). |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `enumEmptyVariantTypeNode(name)`\n\nHelper function that creates a `EnumEmptyVariantTypeNode` object from its name.\n\n```ts\nconst node = enumEmptyVariantTypeNode('myVariantName');\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/EnumStructVariantTypeNode.md",
    "content": "# `EnumStructVariantTypeNode`\n\nA node that defines an enum variant with a struct data type.\n\n## Attributes\n\n### Data\n\n| Attribute       | Type                          | Description                                                                                                     |\n| --------------- | ----------------------------- | --------------------------------------------------------------------------------------------------------------- |\n| `kind`          | `\"enumStructVariantTypeNode\"` | The node discriminator.                                                                                         |\n| `name`          | `CamelCaseString`             | The name of the enum variant.                                                                                   |\n| `discriminator` | `number`                      | (Optional) The variant's discriminator value. Defaults to the index of the variant in the enum (starting at 0). |\n\n### Children\n\n| Attribute | Type                                                                             | Description                           |\n| --------- | -------------------------------------------------------------------------------- | ------------------------------------- |\n| `struct`  | [`NestedTypeNode`](./NestedTypeNode.md)<[`StructTypeNode`](./StructTypeNode.md)> | The struct data type for the variant. |\n\n## Functions\n\n### `enumStructVariantTypeNode(name, struct, discriminator?)`\n\nHelper function that creates a `EnumStructVariantTypeNode` object from its name and data.\n\n```ts\nconst node = enumStructVariantTypeNode(\n    'coordinates',\n    structTypeNode([\n        structFieldTypeNode({ name: 'x', type: numberTypeNode('u32') }),\n        structFieldTypeNode({ name: 'y', type: numberTypeNode('u32') }),\n    ]),\n);\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/EnumTupleVariantTypeNode.md",
    "content": "# `EnumTupleVariantTypeNode`\n\nA node that defines an enum variant with a tuple data type.\n\n## Attributes\n\n### Data\n\n| Attribute       | Type                         | Description                                                                                                     |\n| --------------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------- |\n| `kind`          | `\"enumTupleVariantTypeNode\"` | The node discriminator.                                                                                         |\n| `name`          | `CamelCaseString`            | The name of the enum variant.                                                                                   |\n| `discriminator` | `number`                     | (Optional) The variant's discriminator value. Defaults to the index of the variant in the enum (starting at 0). |\n\n### Children\n\n| Attribute | Type                                                                           | Description                          |\n| --------- | ------------------------------------------------------------------------------ | ------------------------------------ |\n| `tuple`   | [`NestedTypeNode`](./NestedTypeNode.md)<[`TupleTypeNode`](./TupleTypeNode.md)> | The tuple data type for the variant. |\n\n## Functions\n\n### `enumTupleVariantTypeNode(name, tuple, discriminator?)`\n\nHelper function that creates a `EnumTupleVariantTypeNode` object from its name and data.\n\n```ts\nconst node = enumTupleVariantTypeNode('coordinates', tupleTypeNode([numberTypeNode('u32'), numberTypeNode('u32')]));\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/EnumTypeNode.md",
    "content": "# `EnumTypeNode`\n\nA node that can represent data in various states using enum variants. Each variant has a unique name and can have associated data.\n\n## Attributes\n\n### Data\n\n| Attribute | Type             | Description             |\n| --------- | ---------------- | ----------------------- |\n| `kind`    | `\"enumTypeNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute  | Type                                                                             | Description                                                                                                                                                                                                                                                                                                                                  |\n| ---------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `variants` | [`EnumVariantTypeNode`](./EnumVariantTypeNode)[]                                 | All variants the node can represent.                                                                                                                                                                                                                                                                                                         |\n| `size`     | [`NestedTypeNode`](./NestedTypeNode.md)<[`NumberTypeNode`](./NumberTypeNode.md)> | The size of the enum discriminator as a `NumberTypeNode`. This number will prepend the serialised enum variant in order to identify which variant was selected. By default, the index of the variant (starting at 0) is used as a variant discriminator. However, each variant can optionally provide their own custom discriminator number. |\n\n## Functions\n\n### `enumTypeNode(variants, options?)`\n\nHelper function that creates a `EnumTypeNode` object from an array of `EnumVariantTypeNode` objects and an optional `size` attribute that can be passed in the `options` object as a second argument.\n\n```ts\nconst node = enumTypeNode(variants);\nconst nodeWithU32Discriminator = enumTypeNode(variants, { size: numberTypeNode('u32') });\n```\n\n## Examples\n\n### Enum with u8 discriminator\n\n```ts\nenumTypeNode([\n    enumEmptyVariantTypeNode('flip'),\n    enumTupleVariantTypeNode('rotate', tupleTypeNode([numberTypeNode('u32')])),\n    enumStructVariantTypeNode(\n        'move',\n        structTypeNode([\n            structFieldTypeNode({ name: 'x', type: numberTypeNode('u16') }),\n            structFieldTypeNode({ name: 'y', type: numberTypeNode('u16') }),\n        ]),\n    ),\n]);\n\n// Flip                => 0x00\n// Rotate (42)         => 0x012A000000\n// Move { x: 1, y: 2 } => 0x0201000200\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/EnumVariantTypeNode.md",
    "content": "# `EnumVariantTypeNode` (abstract)\n\nThe `EnumVariantTypeNode` type helper represents any of the available enum variant types. Note that it cannot be used directly as a node. Instead you may use one of the following types:\n\n- [`EnumEmptyVariantTypeNode`](./EnumEmptyVariantTypeNode.md)\n- [`EnumStructVariantTypeNode`](./EnumStructVariantTypeNode.md)\n- [`EnumTupleVariantTypeNode`](./EnumTupleVariantTypeNode.md)\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/FixedSizeTypeNode.md",
    "content": "# `FixedSizeTypeNode`\n\nA node that takes another type node as a child and fixes its byte length to the provided size. It will pad or truncate the data to match the fixed size.\n\nThis node can be used to create [`NestedTypeNodes`](./NestedTypeNode.md).\n\n## Attributes\n\n### Data\n\n| Attribute | Type                  | Description                        |\n| --------- | --------------------- | ---------------------------------- |\n| `kind`    | `\"fixedSizeTypeNode\"` | The node discriminator.            |\n| `size`    | `number`              | The fixed byte length of the type. |\n\n### Children\n\n| Attribute | Type                      | Description                                               |\n| --------- | ------------------------- | --------------------------------------------------------- |\n| `type`    | [`TypeNode`](./README.md) | The node type from which the byte length should be fixed. |\n\n## Functions\n\n### `fixedSizeTypeNode(type, size)`\n\nHelper function that creates a `FixedSizeTypeNode` object from a type node and a fixed byte length.\n\n```ts\nconst node = fixedSizeTypeNode(stringTypeNode('utf8'), 32);\n```\n\n## Examples\n\n### Fixed UTF-8 strings\n\n```ts\nfixedSizeTypeNode(stringTypeNode('utf8'), 10);\n\n// Hello => 0x48656C6C6F0000000000\n```\n\n### Fixed byte arrays\n\n```ts\nfixedSizeTypeNode(bytesTypeNode(), 4);\n\n// [1, 2]          => 0x01020000\n// [1, 2, 3, 4, 5] => 0x01020304\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/HiddenPrefixTypeNode.md",
    "content": "# `HiddenPrefixTypeNode`\n\nA node that wraps a type node and whilst silently consuming a prefix of constant values.\n\nWhen encoding, the constant values are written before the child node. When decoding, the prefixed constant values are consumed and checked against the expected values before being discarded.\n\nThis node can be used to create [`NestedTypeNodes`](./NestedTypeNode.md).\n\n## Attributes\n\n### Data\n\n| Attribute | Type                     | Description             |\n| --------- | ------------------------ | ----------------------- |\n| `kind`    | `\"hiddenPrefixTypeNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                                                       | Description                                |\n| --------- | ---------------------------------------------------------- | ------------------------------------------ |\n| `type`    | [`TypeNode`](./README.md)                                  | The type node to wrap.                     |\n| `prefix`  | [`ConstantValueNode`](./valueNodes/ConstantValueNode.md)[] | The array of constant prefixes to consume. |\n\n## Functions\n\n### `hiddenPrefixTypeNode(type, prefix)`\n\nHelper function that creates a `HiddenPrefixTypeNode` object from a type node and an array of constant value nodes.\n\n```ts\nconst node = hiddenPrefixTypeNode(numberTypeNode('u32'), [\n    constantValueNode(bytesTypeNode(), bytesValueNode('base16', 'ffff')),\n]);\n```\n\n## Examples\n\n### A number prefixed with 0xFFFF\n\n```ts\nhiddenPrefixTypeNode(numberTypeNode('u32'), [constantValueNode(bytesTypeNode(), bytesValueNode('base16', 'ffff'))]);\n\n// 42 => 0xFFFF2A000000\n```\n\n### A fixed UTF-8 string prefixed with \"Hello\"\n\n```ts\nhiddenPrefixTypeNode(fixedSizeTypeNode(stringTypeNode('utf8'), 10), [\n    constantValueNode(stringTypeNode('utf8'), stringValueNode('Hello')),\n]);\n\n// World => 0x48656C6C6F576F726C640000000000\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/HiddenSuffixTypeNode.md",
    "content": "# `HiddenSuffixTypeNode`\n\nA node that wraps a type node and whilst silently consuming a suffix of constant values.\n\nWhen encoding, the constant values are written after the child node. When decoding, the suffixed constant values are consumed and checked against the expected values before being discarded.\n\nThis node can be used to create [`NestedTypeNodes`](./NestedTypeNode.md).\n\n## Attributes\n\n### Data\n\n| Attribute | Type                     | Description             |\n| --------- | ------------------------ | ----------------------- |\n| `kind`    | `\"hiddenSuffixTypeNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                                                       | Description                                |\n| --------- | ---------------------------------------------------------- | ------------------------------------------ |\n| `type`    | [`TypeNode`](./README.md)                                  | The type node to wrap.                     |\n| `suffix`  | [`ConstantValueNode`](./valueNodes/ConstantValueNode.md)[] | The array of constant suffixes to consume. |\n\n## Functions\n\n### `hiddenSuffixTypeNode(type, suffix)`\n\nHelper function that creates a `HiddenSuffixTypeNode` object from a type node and an array of constant value nodes.\n\n```ts\nconst node = hiddenSuffixTypeNode(numberTypeNode('u32'), [\n    constantValueNode(bytesTypeNode(), bytesValueNode('base16', 'ffff')),\n]);\n```\n\n## Examples\n\n### A number suffixed with 0xFFFF\n\n```ts\nhiddenSuffixTypeNode(numberTypeNode('u32'), [constantValueNode(bytesTypeNode(), bytesValueNode('base16', 'ffff'))]);\n\n// 42 => 0x2A000000FFFF\n```\n\n### A fixed UTF-8 string suffixed with \"Hello\"\n\n```ts\nhiddenSuffixTypeNode(fixedSizeTypeNode(stringTypeNode('utf8'), 10), [\n    constantValueNode(stringTypeNode('utf8'), stringValueNode('Hello')),\n]);\n\n// World => 0x576F726C64000000000048656c6c6F\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/MapTypeNode.md",
    "content": "# `MapTypeNode`\n\nA node that represents key/value pairs. A key `TypeNode` and a value `TypeNode` are used to define every keys and values in the map. Map entries are encoded one after the other, with the key first followed by the value — e.g. Key A, Value A, Key B, Value B, etc.\n\nThe number of entries in the map is determined by the `count` child node.\n\n## Attributes\n\n### Data\n\n| Attribute | Type            | Description             |\n| --------- | --------------- | ----------------------- |\n| `kind`    | `\"mapTypeNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                                   | Description                               |\n| --------- | -------------------------------------- | ----------------------------------------- |\n| `key`     | [`TypeNode`](./README.md)              | The type of every key in the map.         |\n| `value`   | [`TypeNode`](./README.md)              | The type of every value in the map.       |\n| `count`   | [`CountNode`](../countNodes/README.md) | The strategy to determine the map length. |\n\n## Functions\n\n### `mapTypeNode(key, value, count)`\n\nHelper function that creates a `MapTypeNode` object from a key `TypeNode`, a value `TypeNode` and a `CountNode`.\n\n```ts\nconst node = mapTypeNode(publicKeyTypeNode(), numberTypeNode('u32'), prefixedCountNode(numberTypeNode('u32')));\n```\n\n## Examples\n\n### An histogram that counts letters\n\n```ts\nmapTypeNode(\n    fixedSizeTypeNode(stringTypeNode('utf8'), 1), // Key: Single UTF-8 character.\n    numberTypeNode('u16'), // Value: 16-bit unsigned integer.\n    prefixedCountNode(numberTypeNode('u8')), // Count: map length is prefixed with a u8.\n);\n\n// { A: 42, B: 1, C: 16 } => 0x03000000412A00420100431000\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/NestedTypeNode.md",
    "content": "# `NestedTypeNode<T>` (helper)\n\nThe `NestedTypeNode` type is a generic helper type that allows us to define nested requirements for a child node. The requirement `NestedTypeNode<T>` – where `T` is any `TypeNode` — tells us that the child node may be wrapped however they want but, eventually, we should end up with a `T` type node.\n\nFor instance, say we have the following requirement: `NestedTypeNode<StringTypeNode>`. This requirement can be fulfilled by a simple `StringTypeNode` but it can also be fulfilled by a `FixedSizeTypeNode` that wraps a `StringTypeNode` and fixes its byte length, since the end result is still a `StringTypeNode`. We can even go further and nest multiple wrappers, as long as the final node is a `StringTypeNode` — e.g. `HiddenPrefixTypeNode<PreOffsetTypeNode<FixedSizeTypeNode<StringTypeNode>>>`.\n\n## Available wrappers\n\nTherefore, when encountering a `NestedTypeNode<T>` requirement, we can either provide the type `T` itself or any nested combination of nodes that includes the following wrappers:\n\n- [`FixedSizeTypeNode`](./FixedSizeTypeNode.md)\n- [`HiddenPrefixTypeNode`](./HiddenPrefixTypeNode.md)\n- [`HiddenSuffixTypeNode`](./HiddenSuffixTypeNode.md)\n- [`PostOffsetTypeNode`](./PostOffsetTypeNode.md)\n- [`PreOffsetTypeNode`](./PreOffsetTypeNode.md)\n- [`SentinelTypeNode`](./SentinelTypeNode.md)\n- [`SizePrefixTypeNode`](./SizePrefixTypeNode.md)\n\n## Functions\n\nSome helper functions are available to work with `NestedTypeNodes`.\n\n### `resolveNestedTypeNode(nestedTypeNode)`\n\nThis function returns the final `TypeNode` of a nested type node. In other words, given a `NestedTypeNode<T>`, it will return the `T`.\n\n```ts\nconst nestedNode = fixedSizeTypeNode(stringTypeNode('utf8'), 10);\nconst resolvedNode = resolveNestedTypeNode(nestedNode);\n// ^ stringTypeNode('utf8')\n```\n\n### `transformNestedTypeNode(nestedTypeNode, map)`\n\nThis function transforms the final `TypeNode` of a nested type node from a provided function. In other words, given a `NestedTypeNode<T>` and a `T => U` function, it will return a `NestedTypeNode<U>`.\n\n```ts\nconst nestedNode = fixedSizeTypeNode(stringTypeNode('utf8'), 10);\nconst transformedNode = transformNestedTypeNode(nestedNode, () => stringTypeNode('base64'));\n// ^ fixedSizeTypeNode(stringTypeNode('base64'), 10);\n```\n\n### `isNestedTypeNode(node, kind)`\n\nThis function checks if the final `TypeNode` of a nested type node is of the given kind or kinds.\n\n```ts\nconst nestedNode = fixedSizeTypeNode(stringTypeNode('utf8'), 10);\n\nisNestedTypeNode(nestedNode, 'stringTypeNode'); // true\nisNestedTypeNode(nestedNode, 'numberTypeNode'); // false\nisNestedTypeNode(nestedNode, ['stringTypeNode', 'numberTypeNode']); // true\n```\n\n### `assertIsNestedTypeNode(node, kind)`\n\nThis function asserts that the final `TypeNode` of a nested type node is of the given kind or kinds. It throws an error if the assertion fails.\n\n```ts\nconst nestedNode = fixedSizeTypeNode(stringTypeNode('utf8'), 10);\n\nassertIsNestedTypeNode(nestedNode, 'stringTypeNode'); // Ok\nassertIsNestedTypeNode(nestedNode, 'numberTypeNode'); // Throws an error\nassertIsNestedTypeNode(nestedNode, ['stringTypeNode', 'numberTypeNode']); // Ok\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/NumberTypeNode.md",
    "content": "# `NumberTypeNode`\n\nA type node representing a number with a specific format and endianess.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                              | Description                                                                      |\n| --------- | --------------------------------- | -------------------------------------------------------------------------------- |\n| `kind`    | `\"numberTypeNode\"`                | The node discriminator.                                                          |\n| `format`  | [`NumberFormat`](#number-formats) | The format of the number (see below for more details).                           |\n| `endian`  | `\"le\" \\| \"be\"`                    | The endianess of the number. `\"le\"` for little-endian and `\"be\"` for big-endian. |\n\n### Children\n\n_This node has no children._\n\n## Number Formats\n\nA number can be encoded in many different ways. The following formats are supported.\n\n### Integers\n\nIf your number is an integer, you may choose to encode it as a signed or unsigned integer using different byte lengths. We currently support encoding integers in 1, 2, 4, 8, and 16 bytes.\n\n| Length  | Signed integer | Unsigned integer |\n| ------- | -------------- | ---------------- |\n| 8-bit   | `'i8'`         | `'u8'`           |\n| 16-bit  | `'i16'`        | `'u16'`          |\n| 32-bit  | `'i32'`        | `'u32'`          |\n| 64-bit  | `'i64'`        | `'u64'`          |\n| 128-bit | `'i128'`       | `'u128'`         |\n\n### Floating Point Numbers\n\nIf your number is a floating point number, you may choose to encode it as a 32-bit or 64-bit floating point number.\n\n| Precision | Decimal number |\n| --------- | -------------- |\n| 32-bit    | `'f32'`        |\n| 64-bit    | `'f64'`        |\n\n### Variable Length Integers\n\nWe also support encoding integers using variable byte lengths. Currently, we support the `shortU16` encoding which works as follows:\n\n| Format     | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n| ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `shortU16` | Stores an unsigned integer using between 1 to 3 bytes depending on the value of that integer. If the provided integer is equal to or lower than `0x7f`, it will be stored as-is, using a single byte. However, if the integer is above `0x7f`, then the top bit is set and the remaining value is stored in the next bytes. Each byte follows the same pattern until the third byte. The third byte, if needed, uses all 8 bits to store the last byte of the original value. |\n\n## Functions\n\n### `numberTypeNode(format, endian)`\n\nHelper function that creates a `NumberTypeNode` object from a provided format and endianess.\n\n```ts\nconst littleEndianNode = numberTypeNode('u32'); // Little-endian by default.\n\nconst bigEndianNode = numberTypeNode('u32', 'be');\n```\n\n### `isSignedInteger(node)`\n\nChecks if the provided `NumberTypeNode` represents a signed integer.\n\n```ts\nisSignedInteger(numberTypeNode('u32')); // false\nisSignedInteger(numberTypeNode('i32')); // true\n```\n\n### `isUnsignedInteger(node)`\n\nChecks if the provided `NumberTypeNode` represents an unsigned integer.\n\n```ts\nisUnsignedInteger(numberTypeNode('u32')); // true\nisUnsignedInteger(numberTypeNode('i32')); // false\n```\n\n### `isInteger(node)`\n\nChecks if the provided `NumberTypeNode` represents an integer.\n\n```ts\nisInteger(numberTypeNode('u32')); // true\nisInteger(numberTypeNode('i32')); // true\nisInteger(numberTypeNode('f32')); // false\n```\n\n### `isDecimal(node)`\n\nChecks if the provided `NumberTypeNode` represents a decimal number.\n\n```ts\nisDecimal(numberTypeNode('u32')); // false\nisDecimal(numberTypeNode('i32')); // false\nisDecimal(numberTypeNode('f32')); // true\n```\n\n## Examples\n\n### Encoding `u32` integers\n\n![Diagram](https://github.com/codama-idl/codama/assets/3642397/4bb1ae23-c69f-4c9f-a7ec-8f971d061667)\n\n```ts\nnumberTypeNode('u32');\n\n// 5     => 0x00000000\n// 42    => 0x2A000000\n// 65535 => 0xFFFF0000\n```\n\n### Encoding `f32` big-endian decimal numbers\n\n![Diagram](https://github.com/codama-idl/codama/assets/3642397/d9cbfd3c-b8a2-4c13-a8a8-a11e7ed5d422)\n\n```ts\nnumberTypeNode('f32', 'be');\n\n// 1      => 0x3F800000\n// -42    => 0xC2280000\n// 3.1415 => 0x40490E56\n```\n\n### Encoding `shortU16` integers\n\n![Diagram](https://github.com/codama-idl/codama/assets/3642397/73e12166-cdaa-4fca-ae2a-67937f8b130e)\n\n```ts\nnumberTypeNode('shortU16');\n\n// 42    => 0x2A\n// 128   => 0x8001\n// 16384 => 0x808001\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/OptionTypeNode.md",
    "content": "# `OptionTypeNode`\n\nA node that represents an optional item using a child `TypeNode`. The item can either be present — i.e. `Some<T>` — or absent — i.e. `None` — depending on the value of a prefixed `NumberTypeNode`. If the prefixed value is `1`, the item is present and the child node should be encoded/decoded accordingly. However, if the prefixed value is `0`, the item is absent and no further encoding/decoding should be performed.\n\nHowever, if the `fixed` option is set to `true`, the encoded `None` value will be padded with zeroes matching the length of the fixed-size item to ensure the option type is fixed-size regardless of the presence of the item.\n\n## Attributes\n\n### Data\n\n| Attribute | Type               | Description                                                                                                                                                                                                  |\n| --------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `kind`    | `\"optionTypeNode\"` | The node discriminator.                                                                                                                                                                                      |\n| `fixed`   | `boolean`          | (Optional) Whether or not we should pad the `None` value with zeroes matching the fixed length of the item. This option must only be set to `true` if the `item` node is of fixed-size. Defaults to `false`. |\n\n### Children\n\n| Attribute | Type                                                                             | Description                                 |\n| --------- | -------------------------------------------------------------------------------- | ------------------------------------------- |\n| `item`    | [`TypeNode`](./README.md)                                                        | The item that may exist.                    |\n| `prefix`  | [`NestedTypeNode`](./NestedTypeNode.md)<[`NumberTypeNode`](./NumberTypeNode.md)> | The number type node to use for the prefix. |\n\n## Functions\n\n### `optionTypeNode(item, options?)`\n\nHelper function that creates a `OptionTypeNode` object from the item `TypeNode` and an optional configuration object.\n\n```ts\nconst node = optionTypeNode(publicKeyTypeNode());\nconst nodeWithCustomPrefix = optionTypeNode(publicKeyTypeNode(), { prefix: numberTypeNode('u16') });\nconst fixedNode = optionTypeNode(publicKeyTypeNode(), { fixed: true });\n```\n\n## Examples\n\n### An optional UTF-8 with a u16 prefix\n\n```ts\noptionTypeNode(stringTypeNode('UTF-8'), { prefix: numberTypeNode('u16') });\n\n// None          => 0x0000\n// Some(\"Hello\") => 0x010048656C6C6F\n```\n\n### A fixed optional u32 number\n\n```ts\noptionTypeNode(numberTypeNode('u32'), { fixed: true });\n\n// None     => 0x0000000000\n// Some(42) => 0x012A000000\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/PostOffsetTypeNode.md",
    "content": "# `PostOffsetTypeNode`\n\nA node that wraps another type node and offsets the encoding/decoding cursor by a provided amount using a [provided strategy](#offset-strategies).\n\nSince this is the `PostOffsetTypeNode`, the offset is applied _after_ the child node has been encoded/decoded. Therefore, this node is useful to move the cursor around after the child node has been processed. See the [`PreOffsetTypeNode`](./PreOffsetTypeNode.md) for the opposite behavior.\n\nThis node can be used to create [`NestedTypeNodes`](./NestedTypeNode.md).\n\n## Attributes\n\n### Data\n\n| Attribute  | Type                                                  | Description                                       |\n| ---------- | ----------------------------------------------------- | ------------------------------------------------- |\n| `kind`     | `\"postOffsetTypeNode\"`                                | The node discriminator.                           |\n| `offset`   | `number`                                              | The offset amount in bytes.                       |\n| `strategy` | `\"absolute\" \\| \"padded\" \\| \"preOffset\" \\| \"relative\"` | The offset strategy (see below for more details). |\n\n### Children\n\n| Attribute | Type                      | Description               |\n| --------- | ------------------------- | ------------------------- |\n| `type`    | [`TypeNode`](./README.md) | The child node to offset. |\n\n## Offset strategies\n\nIn order to illustrate the behavior of each strategy, we will use the following buffer as an example. The `99` bytes represent the child node's encoded value and the `FF` bytes represent the next bytes to be encoded (after the child node) in order to illustrate the _post_ cursor position.\n\n```\n0x00000099FF000000;\n        | └-- Initial post-offset\n        └-- Pre-offset\n```\n\nThe following offset strategies are available.\n\n### `relative`\n\nThe cursor is moved to the right by the provided offset.\n\n```\noffset = 2\n0x000000990000FF00;\n              └-- Post-offset\n```\n\nWhen a negative offset is provided, the cursor is moved the left instead.\n\n```\noffset = -2\n0x0000FF9900000000;\n      └-- Post-offset\n```\n\n### `absolute`\n\nThe cursor is moved to an absolute position in the buffer.\n\n```\noffset = 0\n0xFF00009900000000;\n  └-- Post-offset\n```\n\nWhen a negative offset is provided, the cursor is moved backwards from the end of the buffer.\n\n```\noffset = -2\n0x000000990000FF00;\n              └-- Post-offset\n```\n\n> [!IMPORTANT]  \n> Please note that some `TypeNodes` affect the buffer that is available to us which means, depending on where we are in the `TypeNode` tree, we may not have access to the entire buffer.\n>\n> For instance, say you are inside a `FixedSizeTypeNode`. Once the content of the `FixedSizeTypeNode` has been encoded/decoded, the buffer will be truncated or padded to match the provided fixed size. This means, when inside that node, we are essentially \"boxed\" in a sub-buffer. This sub-buffer is the one that will be affected by the `absolute` offset.\n>\n> Here is an exhaustive list of all `TypeNodes` that create sub-buffers:\n>\n> - [`FixedSizeTypeNode`](./FixedSizeTypeNode.md)\n> - [`SentinelTypeNode`](./SentinelTypeNode.md)\n> - [`SizePrefixTypeNode`](./SizePrefixTypeNode.md)\n\n### `padded`\n\nThe cursor is moved to the right by the provided offset **and the buffer size is increased** by the offset amount. This allows us to add padding bytes to the buffer.\n\n```\noffset = 2\n0x000000990000FF000000; <- Size = 10 (initially 8)\n              └-- Post-offset\n```\n\nReciprocally, when a negative offset is provided, the cursor is moved the left and the buffer size is decreased.\n\n```\noffset = -2\n0x0000FF990000; <- Size = 6 (initially 8)\n      └-- Post-offset\n```\n\n### `preOffset`\n\nThe cursor is moved **to the right of the pre-offset** by the provided offset.\n\n```\noffset = 2\n0x0000009900FF0000;\n        |   └-- Post-offset = Pre-offset + 2\n        └-- Pre-offset\n```\n\nWhen a negative offset is provided, the cursor is moved the left of the pre-offset instead.\n\n```\noffset = -2\n0x00FF009900000000;\n    |   └-- Pre-offset\n    └-- Post-offset = Pre-offset - 2\n```\n\n## Functions\n\n### `postOffsetTypeNode(type, offset, strategy?)`\n\nHelper function that creates a `PostOffsetTypeNode` object from a child `TypeNode`, an offset and — optionally — a strategy which defaults to `\"relative\"`.\n\n```ts\nconst relativeOffsetNode = postOffsetTypeNode(numberTypeNode('u32'), 2);\nconst absoluteOffsetNode = postOffsetTypeNode(numberTypeNode('u32'), -2, 'absolute');\n```\n\n## Examples\n\n### A right-padded u32 number\n\n```ts\npostOffsetTypeNode(numberTypeNode('u32'), 4, 'padded');\n\n// 42 => 0x2A00000000000000\n```\n\n### A u32 number overwritten by a u16 number\n\n```ts\ntupleTypleNode([postOffsetTypeNode(numberTypeNode('u32'), -2), numberTypeNode('u16')]);\n\n// [1, 2]           => 0x01000200\n// [0xFFFFFFFF, 42] => 0xFFFF2A00\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/PreOffsetTypeNode.md",
    "content": "# `PreOffsetTypeNode`\n\nA node that wraps another type node and offsets the encoding/decoding cursor by a provided amount using a [provided strategy](#offset-strategies).\n\nSince this is the `PreOffsetTypeNode`, the offset is applied _before_ the child node has been encoded/decoded. Therefore, this node is useful to move encoded value of the child node itself. See the [`PostOffsetTypeNode`](./PostOffsetTypeNode.md) for the opposite behavior.\n\nThis node can be used to create [`NestedTypeNodes`](./NestedTypeNode.md).\n\n## Attributes\n\n### Data\n\n| Attribute  | Type                                   | Description                                       |\n| ---------- | -------------------------------------- | ------------------------------------------------- |\n| `kind`     | `\"preOffsetTypeNode\"`                  | The node discriminator.                           |\n| `offset`   | `number`                               | The offset amount in bytes.                       |\n| `strategy` | `\"absolute\" \\| \"padded\" \\| \"relative\"` | The offset strategy (see below for more details). |\n\n### Children\n\n| Attribute | Type                      | Description               |\n| --------- | ------------------------- | ------------------------- |\n| `type`    | [`TypeNode`](./README.md) | The child node to offset. |\n\n## Offset strategies\n\nIn order to illustrate the behavior of each strategy, we will use the following buffer as an example. The `99` bytes represent some previously encoded value for reference and the `FF` bytes represent the child node's encoded value which we will be moving by changing its pre-offset.\n\n```\n0x00000099FF000000;\n          └-- Initial pre-offset\n```\n\nThe following offset strategies are available.\n\n### `relative`\n\nThe cursor is moved to the right by the provided offset.\n\n```\noffset = 2\n0x000000990000FF00;\n              └-- Pre-offset\n```\n\nWhen a negative offset is provided, the cursor is moved the left instead.\n\n```\noffset = -2\n0x0000FF9900000000;\n      └-- Pre-offset\n```\n\n### `absolute`\n\nThe cursor is moved to an absolute position in the buffer.\n\n```\noffset = 0\n0xFF00009900000000;\n  └-- Pre-offset\n```\n\nWhen a negative offset is provided, the cursor is moved backwards from the end of the buffer.\n\n```\noffset = -2\n0x000000990000FF00;\n              └-- Pre-offset\n```\n\n> [!IMPORTANT]  \n> Please note that some `TypeNodes` affect the buffer that is available to us which means, depending on where we are in the `TypeNode` tree, we may not have access to the entire buffer.\n>\n> For instance, say you are inside a `FixedSizeTypeNode`. Once the content of the `FixedSizeTypeNode` has been encoded/decoded, the buffer will be truncated or padded to match the provided fixed size. This means, when inside that node, we are essentially \"boxed\" in a sub-buffer. This sub-buffer is the one that will be affected by the `absolute` offset.\n>\n> Here is an exhaustive list of all `TypeNodes` that create sub-buffers:\n>\n> - [`FixedSizeTypeNode`](./FixedSizeTypeNode.md)\n> - [`SentinelTypeNode`](./SentinelTypeNode.md)\n> - [`SizePrefixTypeNode`](./SizePrefixTypeNode.md)\n\n### `padded`\n\nThe cursor is moved to the right by the provided offset **and the buffer size is increased** by the offset amount. This allows us to add padding bytes to the buffer.\n\n```\noffset = 2\n0x000000990000FF000000; <- Size = 10 (initially 8)\n              └-- Pre-offset\n```\n\nReciprocally, when a negative offset is provided, the cursor is moved the left and the buffer size is decreased.\n\n```\noffset = -2\n0x0000FF990000; <- Size = 6 (initially 8)\n      └-- Pre-offset\n```\n\n## Functions\n\n### `preOffsetTypeNode(type, offset, strategy?)`\n\nHelper function that creates a `PreOffsetTypeNode` object from a child `TypeNode`, an offset and — optionally — a strategy which defaults to `\"relative\"`.\n\n```ts\nconst relativeOffsetNode = preOffsetTypeNode(numberTypeNode('u32'), 2);\nconst absoluteOffsetNode = preOffsetTypeNode(numberTypeNode('u32'), -2, 'absolute');\n```\n\n## Examples\n\n### A left-padded u32 number\n\n```ts\npreOffsetTypeNode(numberTypeNode('u32'), 4, 'padded');\n\n// 42 => 0x000000002A000000\n```\n\n### A u32 number overwritten by a u16 number\n\n```ts\ntupleTypleNode([numberTypeNode('u32'), preOffsetTypeNode(numberTypeNode('u16'), -2)]);\n\n// [1, 2]           => 0x01000200\n// [0xFFFFFFFF, 42] => 0xFFFF2A00\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/PublicKeyTypeNode.md",
    "content": "# `PublicKeyTypeNode`\n\nA node that represents a 32-byte public key.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                  | Description             |\n| --------- | --------------------- | ----------------------- |\n| `kind`    | `\"publicKeyTypeNode\"` | The node discriminator. |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `publicKeyTypeNode()`\n\nHelper function that creates a `PublicKeyTypeNode` object.\n\n```ts\nconst node = publicKeyTypeNode();\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/README.md",
    "content": "# `TypeNode` (abstract)\n\nThe `TypeNode` type helper represents all the available type nodes as well as the `DefinedTypeLinkNode` which allows us to reuse a pre-defined type node. Note that `TypeNode` is a type alias and cannot be used directly as a node. Instead you may use one of the following nodes:\n\n- [`AmountTypeNode`](./AmountTypeNode.md)\n- [`ArrayTypeNode`](./ArrayTypeNode.md)\n- [`BooleanTypeNode`](./BooleanTypeNode.md)\n- [`BytesTypeNode`](./BytesTypeNode.md)\n- [`DateTimeTypeNode`](./DateTimeTypeNode.md)\n- [`DefinedTypeLinkNode`](../linkNodes/DefinedTypeLinkNode.md)\n- [`EnumTypeNode`](./EnumTypeNode.md)\n- [`FixedSizeTypeNode`](./FixedSizeTypeNode.md)\n- [`HiddenPrefixTypeNode`](./HiddenPrefixTypeNode.md)\n- [`HiddenSuffixTypeNode`](./HiddenSuffixTypeNode.md)\n- [`MapTypeNode`](./MapTypeNode.md)\n- [`NumberTypeNode`](./NumberTypeNode.md)\n- [`OptionTypeNode`](./OptionTypeNode.md)\n- [`PostOffsetTypeNode`](./PostOffsetTypeNode.md)\n- [`PreOffsetTypeNode`](./PreOffsetTypeNode.md)\n- [`PublicKeyTypeNode`](./PublicKeyTypeNode.md)\n- [`RemainderOptionTypeNode`](./RemainderOptionTypeNode.md)\n- [`SentinelTypeNode`](./SentinelTypeNode.md)\n- [`SetTypeNode`](./SetTypeNode.md)\n- [`SizePrefixTypeNode`](./SizePrefixTypeNode.md)\n- [`SolAmountTypeNode`](./SolAmountTypeNode.md)\n- [`StringTypeNode`](./StringTypeNode.md)\n- [`StructTypeNode`](./StructTypeNode.md)\n- [`TupleTypeNode`](./TupleTypeNode.md)\n- [`ZeroableOptionTypeNode`](./ZeroableOptionTypeNode.md)\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/RemainderOptionTypeNode.md",
    "content": "# `RemainderOptionTypeNode`\n\nA node that represents an optional item using a child `TypeNode`. The item can either be present — i.e. `Some<T>` — or absent — i.e. `None` — depending on whether or not there are remaining bytes in the buffer. If there are remaining bytes, the item is present and the child node should be encoded/decoded accordingly. However, if there are no remaining bytes, the item is absent and no further encoding/decoding should be performed.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                        | Description             |\n| --------- | --------------------------- | ----------------------- |\n| `kind`    | `\"remainderOptionTypeNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                      | Description              |\n| --------- | ------------------------- | ------------------------ |\n| `item`    | [`TypeNode`](./README.md) | The item that may exist. |\n\n## Functions\n\n### `remainderOptionTypeNode(item)`\n\nHelper function that creates a `RemainderOptionTypeNode` object from the item `TypeNode`.\n\n```ts\nconst node = remainderOptionTypeNode(publicKeyTypeNode());\n```\n\n## Examples\n\n### An optional UTF-8 string using remaining bytes\n\n```ts\nremainderOptionTypeNode(stringTypeNode('UTF-8'));\n\n// None          => 0x\n// Some(\"Hello\") => 0x48656C6C6F\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/SentinelTypeNode.md",
    "content": "# `SentinelTypeNode`\n\nA node that limits the size of a child node using a sentinel value. The sentinel value is a constant value that is used to determine the end of the child node.\n\nWhen encoding, the sentinel value is written after the child node. When decoding, the child node is decoded until the sentinel value is encountered, at which point the decoding stops and the sentinel value is discarded.\n\nNote that, for the `SentinelTypeNode` to work, the sentinel value must not be included in the child node's encoding.\n\nThis node can be used to create [`NestedTypeNodes`](./NestedTypeNode.md).\n\n## Attributes\n\n### Data\n\n| Attribute | Type                 | Description             |\n| --------- | -------------------- | ----------------------- |\n| `kind`    | `\"sentinelTypeNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute  | Type                                                     | Description                                           |\n| ---------- | -------------------------------------------------------- | ----------------------------------------------------- |\n| `type`     | [`TypeNode`](./README.md)                                | The child node to limit.                              |\n| `sentinel` | [`ConstantValueNode`](./valueNodes/ConstantValueNode.md) | The sentinel value marking the end of the child node. |\n\n## Functions\n\n### `sentinelTypeNode(type, sentinel)`\n\nHelper function that creates a `SentinelTypeNode` object from a type node and a constant value node.\n\n```ts\nconst sentinel = constantValueNode(bytesTypeNode(), bytesValueNode('base16', 'ff'));\nconst node = sentinelTypeNode(stringTypeNode('utf8'), sentinel);\n```\n\n## Examples\n\n### A UTF-8 string terminated by 0xFF\n\n```ts\nsentinelTypeNode(stringTypeNode('utf8'), constantValueNode(bytesTypeNode(), bytesValueNode('base16', 'ff')));\n\n// Hello => 0x48656C6C6FFF\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/SetTypeNode.md",
    "content": "# `SetTypeNode`\n\nA node that represents a set of unique items. The type of each item is defined by the `item` child node and the length of the set is determined by the `count` child node.\n\n## Attributes\n\n### Data\n\n| Attribute | Type            | Description             |\n| --------- | --------------- | ----------------------- |\n| `kind`    | `\"setTypeNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                                   | Description                                    |\n| --------- | -------------------------------------- | ---------------------------------------------- |\n| `item`    | [`TypeNode`](./README.md)              | The type of each item in the set.              |\n| `count`   | [`CountNode`](../countNodes/README.md) | The strategy to determine the size of the set. |\n\n## Functions\n\n### `setTypeNode(item, count)`\n\nHelper function that creates a `SetTypeNode` object from a `TypeNode` and a `CountNode`.\n\n```ts\nconst node = setTypeNode(publicKeyTypeNode(), prefixedCountNode(numberTypeNode('u32')));\n```\n\n## Examples\n\n### u32 prefixed array of u8 numbers\n\n```ts\nsetTypeNode(numberTypeNode('u8'), prefixedCountNode(numberTypeNode('u32')));\n\n// Set (1, 2, 3) => 0x03000000010203\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/SizePrefixTypeNode.md",
    "content": "# `SizePrefixTypeNode`\n\nA node that limits the size of a child node using a size prefix that stores the size of the child node in bytes.\n\nWhen encoding, the size of the child node is written before the child node itself. When decoding, the size is read first and used to determine the length of the child node.\n\nThis node can be used to create [`NestedTypeNodes`](./NestedTypeNode.md).\n\n## Attributes\n\n### Data\n\n| Attribute | Type                   | Description             |\n| --------- | ---------------------- | ----------------------- |\n| `kind`    | `\"sizePrefixTypeNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                                                                             | Description                                            |\n| --------- | -------------------------------------------------------------------------------- | ------------------------------------------------------ |\n| `type`    | [`TypeNode`](./README.md)                                                        | The child node to size.                                |\n| `prefix`  | [`NestedTypeNode`](./NestedTypeNode.md)<[`NumberTypeNode`](./NumberTypeNode.md)> | The node used to determine the size of the child node. |\n\n## Functions\n\n### `sizePrefixTypeNode(type, prefix)`\n\nHelper function that creates a `SizePrefixTypeNode` object from a type node and a `NumberTypeNode` prefix.\n\n```ts\nconst node = sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u32'));\n```\n\n## Examples\n\n### A UTF-8 string prefixed with a u16 size\n\n```ts\nsizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u16'));\n\n// \"\"      => 0x0000\n// \"Hello\" => 0x050048656C6C6F\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/SolAmountTypeNode.md",
    "content": "# `SolAmountTypeNode`\n\nA node that wraps a [`NumberTypeNode`](./NumberTypeNode.md) to mark it as representing a Solana amount in lamports.\n\nNote that this node is equivalent to using a [`AmountTypeNode`](./AmountTypeNode.md) with 9 decimals and `SOL` as the unit.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                  | Description             |\n| --------- | --------------------- | ----------------------- |\n| `kind`    | `\"solAmountTypeNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                                                                             | Description              |\n| --------- | -------------------------------------------------------------------------------- | ------------------------ |\n| `number`  | [`NestedTypeNode`](./NestedTypeNode.md)<[`NumberTypeNode`](./NumberTypeNode.md)> | The number node to wrap. |\n\n## Functions\n\n### `solAmountTypeNode(number)`\n\nHelper function that creates a `SolAmountTypeNode` object from a `NumberTypeNode`.\n\n```ts\nconst node = solAmountTypeNode(numberTypeNode('u64'));\n```\n\n## Examples\n\n### u64 Solana amounts\n\n```ts\nsolAmountTypeNode(numberTypeNode('u64'));\n\n// 1.5 SOL => 0x002F685900000000\n// 300 SOL => 0x00B864D945000000\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/StringTypeNode.md",
    "content": "# `StringTypeNode`\n\nA node that represents an unbounded string from a given encoding. It can be shaped in size using nodes such as the [`SizePrefixTypeNode`](./SizePrefixTypeNode.md) or the [`FixedSizeTypeNode`](./FixedSizeTypeNode.md).\n\n## Attributes\n\n### Data\n\n| Attribute  | Type                                         | Description                 |\n| ---------- | -------------------------------------------- | --------------------------- |\n| `kind`     | `\"stringTypeNode\"`                           | The node discriminator.     |\n| `encoding` | `\"base16\" \\| \"base58\" \\| \"base64\" \\| \"utf8\"` | The encoding of the string. |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `stringTypeNode(encoding)`\n\nHelper function that creates a `StringTypeNode` object from an encoding.\n\n```ts\nconst node = stringTypeNode('utf8');\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/StructFieldTypeNode.md",
    "content": "# `StructFieldTypeNode`\n\nA node that describes a field in a object or struct. It contains a name, a type, and optionally a default value.\n\n## Attributes\n\n### Data\n\n| Attribute              | Type                      | Description                                                            |\n| ---------------------- | ------------------------- | ---------------------------------------------------------------------- |\n| `kind`                 | `\"structFieldTypeNode\"`   | The node discriminator.                                                |\n| `name`                 | `CamelCaseString`         | The name of the field.                                                 |\n| `docs`                 | `string[]`                | Markdown documentation for the type.                                   |\n| `defaultValueStrategy` | `\"omitted\" \\| \"optional\"` | (Optional) The strategy to use for the default value node if provided. |\n\n### Children\n\n| Attribute      | Type                                   | Description                                |\n| -------------- | -------------------------------------- | ------------------------------------------ |\n| `type`         | [`TypeNode`](./README.md)              | The data type of the field.                |\n| `defaultValue` | [`ValueNode`](../valueNodes/README.md) | (Optional) The default value of the field. |\n\n## Functions\n\n### `structFieldTypeNode(input)`\n\nHelper function that creates a `StructFieldTypeNode` object from an input object.\n\n```ts\nconst authorityField = structFieldTypeNode({\n    name: 'authority',\n    type: publicKeyTypeNode(),\n});\n\nconst ageFieldWithDefaultValue = structFieldTypeNode({\n    name: 'age',\n    type: numberTypeNode('u8'),\n    defaultValue: numberValueNode(42),\n});\n```\n\n## Examples\n\n### A struct field with a default value\n\n```ts\nstructFieldTypeNode({\n    name: 'age',\n    type: numberTypeNode('u8'),\n    defaultValue: numberValueNode(42),\n});\n\n// {}          => 0x2A\n// { age: 29 } => 0x1D\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/StructTypeNode.md",
    "content": "# `StructTypeNode`\n\nA node representing an object or struct with named fields. Each field is represented by a dedicated [`StructFieldTypeNode`](./StructFieldTypeNode.md). Each field is encoded and decoded in the order they are defined.\n\n## Attributes\n\n### Data\n\n| Attribute | Type               | Description             |\n| --------- | ------------------ | ----------------------- |\n| `kind`    | `\"structTypeNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                                                | Description               |\n| --------- | --------------------------------------------------- | ------------------------- |\n| `fields`  | [`StructFieldTypeNode`](./StructFieldTypeNode.md)[] | The fields of the struct. |\n\n## Functions\n\n### `structTypeNode(fields)`\n\nHelper function that creates a `StructTypeNode` object from an array of `StructFieldTypeNode` objects.\n\n```ts\nconst node = structTypeNode([\n    structFieldTypeNode({ name: 'authority', type: publicKeyTypeNode() }),\n    structFieldTypeNode({ name: 'amount', type: numberTypeNode('u64') }),\n]);\n```\n\n## Examples\n\n### A struct storing a person's name and age\n\n```ts\nstructTypeNode([\n    structFieldTypeNode({ name: 'name', type: fixedSizeTypeNode(stringTypeNode('utf8'), 10) }),\n    structFieldTypeNode({ name: 'age', type: numberTypeNode('u8') }),\n]);\n\n// { name: Alice, age: 42 } => 0x416C69636500000000002A\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/TupleTypeNode.md",
    "content": "# `TupleTypeNode`\n\nA node that represents a tuple of types such that each element in the tuple is represented by a dedicated [`TypeNode`](./TypeNode.md). Each item is encoded and decoded in the order they are defined.\n\n## Attributes\n\n### Data\n\n| Attribute | Type              | Description             |\n| --------- | ----------------- | ----------------------- |\n| `kind`    | `\"tupleTypeNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                        | Description                         |\n| --------- | --------------------------- | ----------------------------------- |\n| `items`   | [`TypeNode`](./README.md)[] | The type of each item in the tuple. |\n\n## Functions\n\n### `tupleTypeNode(items)`\n\nHelper function that creates a `TupleTypeNode` object from an array of `TypeNodes`.\n\n```ts\nconst node = tupleTypeNode([publicKeyTypeNode(), numberTypeNode('u64')]);\n```\n\n## Examples\n\n### A tuple storing a person's name and age\n\n```ts\ntupleTypeNode([fixedSizeTypeNode(stringTypeNode('utf8'), 10), numberTypeNode('u8')]);\n\n// (Alice, 42) => 0x416C69636500000000002A\n```\n"
  },
  {
    "path": "packages/nodes/docs/typeNodes/ZeroableOptionTypeNode.md",
    "content": "# `ZeroableOptionTypeNode`\n\nA node that represents an optional item using a child `TypeNode` of fixed-size. Contrary to the [`OptionTypeNode`](./OptionTypeNode.md), this node does not use a number prefix to determine if the item is present or not. Instead, it checks whether the fixed-size item is filled with zeroes. If it is, then we consider the item to be absent — i.e. `None` — otherwise, it is present — i.e. `Some<T>` — and the child node should be encoded/decoded accordingly.\n\nAn optional `zeroValue` constant node can also be provided to determine the customise the zero value of the fixed-size item. For instance if the `zeroValue` is `0xFFFFFFFF`, then a buffer with this value will be considered as `None` and anyting else will be considered as `Some<T>`.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                       | Description             |\n| --------- | -------------------------- | ----------------------- |\n| `kind`    | `\"zeroableOptionTypeNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute   | Type                                                     | Description                                                                                              |\n| ----------- | -------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |\n| `item`      | [`TypeNode`](./README.md)                                | The item that may exist. Must be of fixed-size.                                                          |\n| `zeroValue` | [`ConstantValueNode`](./valueNodes/ConstantValueNode.md) | (Optional) The constant value representing `None`. Defaults to filling the size of the item with zeroes. |\n\n## Functions\n\n### `zeroableOptionTypeNode(item, zeroValue?)`\n\nHelper function that creates a `ZeroableOptionTypeNode` object from a `TypeNode` and an optional zero value.\n\n```ts\nconst node = zeroableOptionTypeNode(publicKeyTypeNode());\n\nconst nodeWithZeroValue = zeroableOptionTypeNode(\n    numbetypeNode('u32'),\n    constantValueNode(bytesTypeNode(), bytesValueNode('base16', 'ffffffff')),\n);\n```\n\n## Examples\n\n### a u32 zeroable option\n\n```ts\nzeroableOptionTypeNode(numbetypeNode('u32'));\n\n// None     => 0x00000000\n// Some(42) => 0x2A000000\n```\n\n### a u32 zeroable option with a custom zero value\n\n```ts\nzeroableOptionTypeNode(numbetypeNode('u32'), constantValueNode(bytesTypeNode(), bytesValueNode('base16', 'ffffffff')));\n\n// None     => 0xFFFFFFFF\n// Some(42) => 0x2A000000\n```\n"
  },
  {
    "path": "packages/nodes/docs/valueNodes/ArrayValueNode.md",
    "content": "# `ArrayValueNode`\n\nA node that represents an array of values — e.g. `[1, 2, 3]`.\n\n## Attributes\n\n### Data\n\n| Attribute | Type               | Description             |\n| --------- | ------------------ | ----------------------- |\n| `kind`    | `\"arrayValueNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                         | Description                      |\n| --------- | ---------------------------- | -------------------------------- |\n| `items`   | [`ValueNode`](./README.md)[] | The value of all items in array. |\n\n## Functions\n\n### `arrayValueNode(items)`\n\nHelper function that creates a `ArrayValueNode` object from an array of value nodes.\n\n```ts\nconst node = arrayValueNode([numberValueNode(1), numberValueNode(2), numberValueNode(3)]);\n```\n"
  },
  {
    "path": "packages/nodes/docs/valueNodes/BooleanValueNode.md",
    "content": "# `BooleanValueNode`\n\nA node that represents a boolean value — e.g. `true`.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                 | Description             |\n| --------- | -------------------- | ----------------------- |\n| `kind`    | `\"booleanValueNode\"` | The node discriminator. |\n| `boolean` | `boolean`            | The boolean value.      |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `booleanValueNode(items)`\n\nHelper function that creates a `BooleanValueNode` object from a boolean.\n\n```ts\nconst node = booleanValueNode(true);\n```\n"
  },
  {
    "path": "packages/nodes/docs/valueNodes/BytesValueNode.md",
    "content": "# `BytesValueNode`\n\nA node that represents a value in bytes — e.g. `0x010203`.\n\n## Attributes\n\n### Data\n\n| Attribute  | Type                                         | Description                           |\n| ---------- | -------------------------------------------- | ------------------------------------- |\n| `kind`     | `\"bytesValueNode\"`                           | The node discriminator.               |\n| `encoding` | `\"base16\" \\| \"base58\" \\| \"base64\" \\| \"utf8\"` | The encoding of the `data` attribute. |\n| `data`     | `string`                                     | The encoded data.                     |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `bytesValueNode(encoding, data)`\n\nHelper function that creates a `BytesValueNode` object from an encoding and an encoded data string.\n\n```ts\nconst node = bytesValueNode('base16', '010203');\nconst utf8Node = bytesValueNode('utf8', 'Hello');\n```\n"
  },
  {
    "path": "packages/nodes/docs/valueNodes/ConstantValueNode.md",
    "content": "# `ConstantValueNode`\n\nA node that represents a constant value from a [`TypeNode`](../typeNodes/README.md) and a [`ValueNode`](./README.md).\n\n## Attributes\n\n### Data\n\n| Attribute | Type                  | Description             |\n| --------- | --------------------- | ----------------------- |\n| `kind`    | `\"constantValueNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                                 | Description                |\n| --------- | ------------------------------------ | -------------------------- |\n| `type`    | [`TypeNode`](../typeNodes/README.md) | The type of the constant.  |\n| `value`   | [`ValueNode`](./README.md)           | The value of the constant. |\n\n## Functions\n\n### `constantValueNode(type, value)`\n\nHelper function that creates a `ConstantValueNode` object from a type and a value node\n\n```ts\nconst node = constantValueNode(numberTypeNode('u32'), numberValueNode(42));\n```\n\n### `constantValueNodeFromString(encoding, data)`\n\nHelper function that creates a `ConstantValueNode` object of type `StringTypeNode` from an encoding and a string of data.\n\n```ts\nconstantValueNodeFromString('utf8', 'Hello');\n\n// Equivalent to:\nconstantValueNode(stringTypeNode('utf8'), stringValueNode('Hello'));\n```\n\n### `constantValueNodeFromBytes(encoding, data)`\n\nHelper function that creates a `ConstantValueNode` object of type `BytesTypeNode` from an encoding and a string of data.\n\n```ts\nconstantValueNodeFromBytes('base16', 'FF99CC');\n\n// Equivalent to:\nconstantValueNode(bytesTypeNode(), bytesValueNode('base16', 'FF99CC'));\n```\n"
  },
  {
    "path": "packages/nodes/docs/valueNodes/EnumValueNode.md",
    "content": "# `EnumValueNode`\n\nA node representing a value of an enum type. That is, it selects a specific variant and optionally provides the data associated with that variant.\n\n## Attributes\n\n### Data\n\n| Attribute | Type              | Description                        |\n| --------- | ----------------- | ---------------------------------- |\n| `kind`    | `\"enumValueNode\"` | The node discriminator.            |\n| `variant` | `CamelCaseString` | The name of the variant to select. |\n\n### Children\n\n| Attribute | Type                                                                                 | Description                                                                                        |\n| --------- | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------- |\n| `enum`    | [`DefinedTypeLinkNode`](./typeNodes/DefinedTypeLinkNode.md)                          | The linked enum type definition. The `DefinedTypeNode` it links to must contain an `EnumTypeNode`. |\n| `value`   | [`StructValueNode`](./StructValueNode.md) \\| [`TupleValueNode`](./TupleValueNode.md) | (Optional) The data of the enum variant if required.                                               |\n\n## Functions\n\n### `enumValueNode(enum, variant, value?)`\n\nHelper function that creates a `EnumValueNode` object from an enum type, a variant name, and an optional value node for its data. The first argument can be a `DefinedTypeLinkNode` or a `string` matching the name of the defined enum type.\n\n```ts\nconst node = enumValueNode('myEnum', 'myVariant');\nconst nodeWithExplicitEnum = enumValueNode(definedTypeLinkNode('myEnum'), 'myVariant');\n\nconst nodeWithData = enumValueNode(\n    'myEnum',\n    'myVariantWithData',\n    structValueNode([\n        structFieldValueNode('name', stringValueNode('Alice')),\n        structFieldValueNode('age', numberValueNode(42)),\n    ]),\n);\n```\n"
  },
  {
    "path": "packages/nodes/docs/valueNodes/MapEntryValueNode.md",
    "content": "# `MapEntryValueNode`\n\nA node that represents the concrete value of a map entry. For example, the map `{ total: 42 }` has only one entry such that its key is a `\"total\"` string and its value is a `42` number.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                  | Description             |\n| --------- | --------------------- | ----------------------- |\n| `kind`    | `\"mapEntryValueNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                       | Description             |\n| --------- | -------------------------- | ----------------------- |\n| `key`     | [`ValueNode`](./README.md) | The key of the entry.   |\n| `value`   | [`ValueNode`](./README.md) | The value of the entry. |\n\n## Functions\n\n### `mapEntryValueNode(key, value)`\n\nHelper function that creates a `MapEntryValueNode` object from two `ValueNode` objects. The first one represents the key of the entry, and the second one represents the value of the entry.\n\n```ts\nconst node = mapEntryValueNode(stringValueNode('total'), numberValueNode(42));\n```\n"
  },
  {
    "path": "packages/nodes/docs/valueNodes/MapValueNode.md",
    "content": "# `MapValueNode`\n\nA node that represents the value of a map.\n\n## Attributes\n\n### Data\n\n| Attribute | Type             | Description             |\n| --------- | ---------------- | ----------------------- |\n| `kind`    | `\"mapValueNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                                            | Description                          |\n| --------- | ----------------------------------------------- | ------------------------------------ |\n| `entries` | [`MapEntryValueNode`](./MapEntryValueNode.md)[] | The value of all entries in the map. |\n\n## Functions\n\n### `mapValueNode(entries)`\n\nHelper function that creates a `MapValueNode` object from an array of `MapEntryValueNode` objects. Each object represents a key-value pair in the map.\n\n```ts\nconst node = mapValueNode([\n    mapEntryValueNode(stringValueNode('apples'), numberValueNode(12)),\n    mapEntryValueNode(stringValueNode('bananas'), numberValueNode(34)),\n    mapEntryValueNode(stringValueNode('carrots'), numberValueNode(56)),\n]);\n```\n"
  },
  {
    "path": "packages/nodes/docs/valueNodes/NoneValueNode.md",
    "content": "# `NoneValueNode`\n\nA node that represents the absence of a value. For instance, this could be set as a default value for a field of type [`OptionTypeNode`](../typeNodes/OptionTypeNode.md).\n\n## Attributes\n\n### Data\n\n| Attribute | Type              | Description             |\n| --------- | ----------------- | ----------------------- |\n| `kind`    | `\"noneValueNode\"` | The node discriminator. |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `noneValueNode()`\n\nHelper function that creates a `NoneValueNode` object.\n\n```ts\nconst node = noneValueNode();\n```\n"
  },
  {
    "path": "packages/nodes/docs/valueNodes/NumberValueNode.md",
    "content": "# `NumberValueNode`\n\nA node that represents a number value — e.g. `42`.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                | Description             |\n| --------- | ------------------- | ----------------------- |\n| `kind`    | `\"numberValueNode\"` | The node discriminator. |\n| `number`  | `number`            | The number value.       |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `numberValueNode(number)`\n\nHelper function that creates a `NumberValueNode` object from any `number`.\n\n```ts\nconst node = numberValueNode(42);\n```\n"
  },
  {
    "path": "packages/nodes/docs/valueNodes/PublicKeyValueNode.md",
    "content": "# `PublicKeyValueNode`\n\nA node that represents the value of a 32-bytes public key.\n\n## Attributes\n\n### Data\n\n| Attribute    | Type                   | Description                                  |\n| ------------ | ---------------------- | -------------------------------------------- |\n| `kind`       | `\"publicKeyValueNode\"` | The node discriminator.                      |\n| `publicKey`  | `string`               | The base58 encoded public key.               |\n| `identifier` | `string`               | (Optional) An identifier for the public key. |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `publicKeyValueNode(publicKey, identifier?)`\n\nHelper function that creates a `PublicKeyValueNode` object from a base58 encoded public key and an optional identifier.\n\n```ts\nconst node = publicKeyValueNode('7rA1KcBdW5hKmMasQdRVBFsD6T1nLtYuR6y59TJNgevR');\n```\n"
  },
  {
    "path": "packages/nodes/docs/valueNodes/README.md",
    "content": "# `ValueNode` (abstract)\n\nThe `ValueNode` type helper represents all the available value nodes. Note that `ValueNode` is a type alias and cannot be used directly as a node. Instead you may use one of the following nodes:\n\n- [`ArrayValueNode`](./ArrayValueNode.md)\n- [`BytesValueNode`](./BytesValueNode.md)\n- [`BooleanValueNode`](./BooleanValueNode.md)\n- [`ConstantValueNode`](./ConstantValueNode.md)\n- [`EnumValueNode`](./EnumValueNode.md)\n- [`MapValueNode`](./MapValueNode.md)\n- [`NoneValueNode`](./NoneValueNode.md)\n- [`NumberValueNode`](./NumberValueNode.md)\n- [`PublicKeyValueNode`](./PublicKeyValueNode.md)\n- [`SetValueNode`](./SetValueNode.md)\n- [`SomeValueNode`](./SomeValueNode.md)\n- [`StringValueNode`](./StringValueNode.md)\n- [`StructValueNode`](./StructValueNode.md)\n- [`TupleValueNode`](./TupleValueNode.md)\n"
  },
  {
    "path": "packages/nodes/docs/valueNodes/SetValueNode.md",
    "content": "# `SetValueNode`\n\nA node that represents a set of values — e.g. `{1, 2, 3}`.\n\n## Attributes\n\n### Data\n\n| Attribute | Type             | Description             |\n| --------- | ---------------- | ----------------------- |\n| `kind`    | `\"setValueNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                         | Description                        |\n| --------- | ---------------------------- | ---------------------------------- |\n| `items`   | [`ValueNode`](./README.md)[] | The value of all items in the set. |\n\n## Functions\n\n### `setValueNode(items)`\n\nHelper function that creates a `SetValueNode` object from an array of value nodes.\n\n```ts\nconst node = setValueNode([numberValueNode(1), numberValueNode(2), numberValueNode(3)]);\n```\n"
  },
  {
    "path": "packages/nodes/docs/valueNodes/SomeValueNode.md",
    "content": "# `SomeValueNode`\n\nA node that represents the presence of a value. For instance, this could be set as a default value for a field of type [`OptionTypeNode`](../typeNodes/OptionTypeNode.md).\n\n## Attributes\n\n### Data\n\n| Attribute | Type              | Description             |\n| --------- | ----------------- | ----------------------- |\n| `kind`    | `\"someValueNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                       | Description                          |\n| --------- | -------------------------- | ------------------------------------ |\n| `value`   | [`ValueNode`](./README.md) | The value that is marked as present. |\n\n## Functions\n\n### `someValueNode(value)`\n\nHelper function that creates a `SomeValueNode` object from a value node\n\n```ts\nconst node = someValueNode(numberValueNode(42));\n```\n"
  },
  {
    "path": "packages/nodes/docs/valueNodes/StringValueNode.md",
    "content": "# `StringValueNode`\n\nA node that represents a string value — e.g. `\"Hello\"`.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                | Description             |\n| --------- | ------------------- | ----------------------- |\n| `kind`    | `\"stringValueNode\"` | The node discriminator. |\n| `string`  | `string`            | The string value.       |\n\n### Children\n\n_This node has no children._\n\n## Functions\n\n### `stringValueNode(string)`\n\nHelper function that creates a `StringValueNode` object from a string value.\n\n```ts\nconst node = stringValueNode('Hello');\n```\n"
  },
  {
    "path": "packages/nodes/docs/valueNodes/StructFieldValueNode.md",
    "content": "# `StructFieldValueNode`\n\nA node that represents a field value in a struct — e.g. `age: 42`.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                     | Description             |\n| --------- | ------------------------ | ----------------------- |\n| `kind`    | `\"structFieldValueNode\"` | The node discriminator. |\n| `name`    | `CamelCaseString`        | The name of the field.  |\n\n### Children\n\n| Attribute | Type                       | Description             |\n| --------- | -------------------------- | ----------------------- |\n| `value`   | [`ValueNode`](./README.md) | The value of the field. |\n\n## Functions\n\n### `structFieldValueNode(name, value)`\n\nHelper function that creates a `StructFieldValueNode` object from a field name and a value node.\n\n```ts\nconst node = structFieldValueNode('age', numberValueNode(42));\n```\n"
  },
  {
    "path": "packages/nodes/docs/valueNodes/StructValueNode.md",
    "content": "# `StructValueNode`\n\nA node that represents the value of a struct.\n\n## Attributes\n\n### Data\n\n| Attribute | Type                | Description             |\n| --------- | ------------------- | ----------------------- |\n| `kind`    | `\"structValueNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                                                  | Description                            |\n| --------- | ----------------------------------------------------- | -------------------------------------- |\n| `fields`  | [`StructFieldValueNode`](./StructFieldValueNode.md)[] | The value of all fields in the struct. |\n\n## Functions\n\n### `structValueNode(fields)`\n\nHelper function that creates a `StructValueNode` object from an array of field value nodes.\n\n```ts\nconst node = structValueNode([\n    structFieldValueNode('name', stringValueNode('Alice')),\n    structFieldValueNode('age', numberValueNode(42)),\n]);\n```\n"
  },
  {
    "path": "packages/nodes/docs/valueNodes/TupleValueNode.md",
    "content": "# `TupleValueNode`\n\nA node that represents the value of a tuple — e.g. `(\"Alice\", 42)`.\n\n## Attributes\n\n### Data\n\n| Attribute | Type               | Description             |\n| --------- | ------------------ | ----------------------- |\n| `kind`    | `\"tupleValueNode\"` | The node discriminator. |\n\n### Children\n\n| Attribute | Type                         | Description                          |\n| --------- | ---------------------------- | ------------------------------------ |\n| `items`   | [`ValueNode`](./README.md)[] | The value of all items in the tuple. |\n\n## Functions\n\n### `tupleValueNode(items)`\n\nHelper function that creates a `TupleValueNode` object from an array of value nodes.\n\n```ts\nconst node = tupleValueNode([stringValueNode('Alice'), numberValueNode(42)]);\n```\n"
  },
  {
    "path": "packages/nodes/package.json",
    "content": "{\n    \"name\": \"@codama/nodes\",\n    \"version\": \"1.6.0\",\n    \"description\": \"Node specifications and helpers for the Codama standard\",\n    \"exports\": {\n        \"types\": \"./dist/types/index.d.ts\",\n        \"react-native\": \"./dist/index.react-native.mjs\",\n        \"browser\": {\n            \"import\": \"./dist/index.browser.mjs\",\n            \"require\": \"./dist/index.browser.cjs\"\n        },\n        \"node\": {\n            \"import\": \"./dist/index.node.mjs\",\n            \"require\": \"./dist/index.node.cjs\"\n        }\n    },\n    \"browser\": {\n        \"./dist/index.node.cjs\": \"./dist/index.browser.cjs\",\n        \"./dist/index.node.mjs\": \"./dist/index.browser.mjs\"\n    },\n    \"main\": \"./dist/index.node.cjs\",\n    \"module\": \"./dist/index.node.mjs\",\n    \"react-native\": \"./dist/index.react-native.mjs\",\n    \"types\": \"./dist/types/index.d.ts\",\n    \"type\": \"commonjs\",\n    \"files\": [\n        \"./dist/types\",\n        \"./dist/index.*\"\n    ],\n    \"sideEffects\": false,\n    \"keywords\": [\n        \"solana\",\n        \"framework\",\n        \"standard\",\n        \"specifications\"\n    ],\n    \"scripts\": {\n        \"build\": \"rimraf dist && tsup && tsc -p ./tsconfig.declarations.json\",\n        \"dev\": \"vitest --project node\",\n        \"lint\": \"eslint . && prettier --check .\",\n        \"lint:fix\": \"eslint --fix . && prettier --write .\",\n        \"test\": \"pnpm test:types && pnpm test:treeshakability && pnpm test:unit\",\n        \"test:treeshakability\": \"for file in dist/index.*.mjs; do agadoo $file; done\",\n        \"test:types\": \"tsc --noEmit\",\n        \"test:unit\": \"vitest run\"\n    },\n    \"dependencies\": {\n        \"@codama/errors\": \"workspace:*\",\n        \"@codama/node-types\": \"workspace:*\"\n    },\n    \"license\": \"MIT\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/codama-idl/codama\"\n    },\n    \"bugs\": {\n        \"url\": \"http://github.com/codama-idl/codama/issues\"\n    },\n    \"browserslist\": [\n        \"supports bigint and not dead\",\n        \"maintained node versions\"\n    ]\n}\n"
  },
  {
    "path": "packages/nodes/src/AccountNode.ts",
    "content": "import type { AccountNode, DiscriminatorNode, NestedTypeNode, PdaLinkNode, StructTypeNode } from '@codama/node-types';\n\nimport { camelCase, DocsInput, parseDocs } from './shared';\nimport { structTypeNode } from './typeNodes';\n\nexport type AccountNodeInput<\n    TData extends NestedTypeNode<StructTypeNode> = NestedTypeNode<StructTypeNode>,\n    TPda extends PdaLinkNode | undefined = PdaLinkNode | undefined,\n    TDiscriminators extends DiscriminatorNode[] | undefined = DiscriminatorNode[] | undefined,\n> = Omit<AccountNode<TData, TPda, TDiscriminators>, 'data' | 'docs' | 'kind' | 'name'> & {\n    readonly data?: TData;\n    readonly docs?: DocsInput;\n    readonly name: string;\n};\n\nexport function accountNode<\n    TData extends NestedTypeNode<StructTypeNode> = StructTypeNode<[]>,\n    TPda extends PdaLinkNode | undefined = undefined,\n    const TDiscriminators extends DiscriminatorNode[] | undefined = undefined,\n>(input: AccountNodeInput<TData, TPda, TDiscriminators>): AccountNode<TData, TPda, TDiscriminators> {\n    return Object.freeze({\n        kind: 'accountNode',\n\n        // Data.\n        name: camelCase(input.name),\n        ...(input.size === undefined ? {} : { size: input.size }),\n        docs: parseDocs(input.docs),\n\n        // Children.\n        data: (input.data ?? structTypeNode([])) as TData,\n        ...(input.pda !== undefined && { pda: input.pda }),\n        ...(input.discriminators !== undefined && { discriminators: input.discriminators }),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/DefinedTypeNode.ts",
    "content": "import type { DefinedTypeNode, TypeNode } from '@codama/node-types';\n\nimport { camelCase, DocsInput, parseDocs } from './shared';\n\nexport type DefinedTypeNodeInput<TType extends TypeNode = TypeNode> = Omit<\n    DefinedTypeNode<TType>,\n    'docs' | 'kind' | 'name'\n> & {\n    readonly docs?: DocsInput;\n    readonly name: string;\n};\n\nexport function definedTypeNode<TType extends TypeNode>(input: DefinedTypeNodeInput<TType>): DefinedTypeNode<TType> {\n    return Object.freeze({\n        kind: 'definedTypeNode',\n\n        // Data.\n        name: camelCase(input.name),\n        docs: parseDocs(input.docs),\n\n        // Children.\n        type: input.type,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/ErrorNode.ts",
    "content": "import type { ErrorNode } from '@codama/node-types';\n\nimport { camelCase, DocsInput, parseDocs } from './shared';\n\nexport type ErrorNodeInput = Omit<ErrorNode, 'docs' | 'kind' | 'name'> & {\n    readonly docs?: DocsInput;\n    readonly name: string;\n};\n\nexport function errorNode(input: ErrorNodeInput): ErrorNode {\n    return Object.freeze({\n        kind: 'errorNode',\n\n        // Data.\n        name: camelCase(input.name),\n        code: input.code,\n        message: input.message,\n        docs: parseDocs(input.docs),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/EventNode.ts",
    "content": "import type { DiscriminatorNode, EventNode, TypeNode } from '@codama/node-types';\n\nimport { camelCase, DocsInput, parseDocs } from './shared';\nimport { structTypeNode } from './typeNodes';\n\nexport type EventNodeInput<\n    TData extends TypeNode = TypeNode,\n    TDiscriminators extends DiscriminatorNode[] | undefined = DiscriminatorNode[] | undefined,\n> = Omit<EventNode<TData, TDiscriminators>, 'docs' | 'kind' | 'name'> & {\n    readonly docs?: DocsInput;\n    readonly name: string;\n};\n\nexport function eventNode<\n    TData extends TypeNode = ReturnType<typeof structTypeNode>,\n    const TDiscriminators extends DiscriminatorNode[] | undefined = undefined,\n>(input: EventNodeInput<TData, TDiscriminators>): EventNode<TData, TDiscriminators> {\n    return Object.freeze({\n        kind: 'eventNode',\n\n        // Data.\n        name: camelCase(input.name),\n        docs: parseDocs(input.docs),\n\n        // Children.\n        data: input.data,\n        ...(input.discriminators !== undefined && { discriminators: input.discriminators }),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/InstructionAccountNode.ts",
    "content": "import type { InstructionAccountNode, InstructionInputValueNode } from '@codama/node-types';\n\nimport { camelCase, DocsInput, parseDocs } from './shared';\n\nexport type InstructionAccountNodeInput<\n    TDefaultValue extends InstructionInputValueNode | undefined = InstructionInputValueNode | undefined,\n> = Omit<InstructionAccountNode<TDefaultValue>, 'docs' | 'isOptional' | 'kind' | 'name'> & {\n    readonly docs?: DocsInput;\n    readonly isOptional?: boolean;\n    readonly name: string;\n};\n\nexport function instructionAccountNode<TDefaultValue extends InstructionInputValueNode | undefined = undefined>(\n    input: InstructionAccountNodeInput<TDefaultValue>,\n): InstructionAccountNode<TDefaultValue> {\n    return Object.freeze({\n        kind: 'instructionAccountNode',\n\n        // Data.\n        name: camelCase(input.name),\n        isWritable: input.isWritable,\n        isSigner: input.isSigner,\n        isOptional: input.isOptional ?? false,\n        docs: parseDocs(input.docs),\n\n        // Children.\n        ...(input.defaultValue !== undefined && { defaultValue: input.defaultValue }),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/InstructionArgumentNode.ts",
    "content": "import type { InstructionArgumentNode, InstructionInputValueNode } from '@codama/node-types';\n\nimport { isNode } from './Node';\nimport { camelCase, DocsInput, parseDocs } from './shared';\nimport { structFieldTypeNode } from './typeNodes/StructFieldTypeNode';\nimport { structTypeNode } from './typeNodes/StructTypeNode';\nimport { VALUE_NODES } from './valueNodes';\n\nexport type InstructionArgumentNodeInput<\n    TDefaultValue extends InstructionInputValueNode | undefined = InstructionInputValueNode | undefined,\n> = Omit<InstructionArgumentNode<TDefaultValue>, 'docs' | 'kind' | 'name'> & {\n    readonly docs?: DocsInput;\n    readonly name: string;\n};\n\nexport function instructionArgumentNode<TDefaultValue extends InstructionInputValueNode | undefined = undefined>(\n    input: InstructionArgumentNodeInput<TDefaultValue>,\n): InstructionArgumentNode<TDefaultValue> {\n    return Object.freeze({\n        kind: 'instructionArgumentNode',\n\n        // Data.\n        name: camelCase(input.name),\n        ...(input.defaultValueStrategy !== undefined && { defaultValueStrategy: input.defaultValueStrategy }),\n        docs: parseDocs(input.docs),\n\n        // Children.\n        type: input.type,\n        ...(input.defaultValue !== undefined && { defaultValue: input.defaultValue }),\n    });\n}\n\nexport function structTypeNodeFromInstructionArgumentNodes(nodes: InstructionArgumentNode[]) {\n    return structTypeNode(nodes.map(structFieldTypeNodeFromInstructionArgumentNode));\n}\n\nexport function structFieldTypeNodeFromInstructionArgumentNode(node: InstructionArgumentNode) {\n    if (isNode(node.defaultValue, VALUE_NODES)) {\n        return structFieldTypeNode({ ...node, defaultValue: node.defaultValue });\n    }\n    return structFieldTypeNode({\n        ...node,\n        defaultValue: undefined,\n        defaultValueStrategy: undefined,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/InstructionByteDeltaNode.ts",
    "content": "import type { InstructionByteDeltaNode } from '@codama/node-types';\n\nimport { isNode } from './Node';\n\nexport function instructionByteDeltaNode<TValue extends InstructionByteDeltaNode['value']>(\n    value: TValue,\n    options: {\n        subtract?: boolean;\n        withHeader?: boolean;\n    } = {},\n): InstructionByteDeltaNode<TValue> {\n    return Object.freeze({\n        kind: 'instructionByteDeltaNode',\n\n        // Data.\n        withHeader: options.withHeader ?? !isNode(value, 'resolverValueNode'),\n        ...(options.subtract !== undefined && { subtract: options.subtract }),\n\n        // Children.\n        value,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/InstructionNode.ts",
    "content": "import type {\n    DiscriminatorNode,\n    InstructionAccountNode,\n    InstructionArgumentNode,\n    InstructionByteDeltaNode,\n    InstructionNode,\n    InstructionRemainingAccountsNode,\n    OptionalAccountStrategy,\n    ProgramNode,\n    RootNode,\n} from '@codama/node-types';\n\nimport { isNode } from './Node';\nimport { getAllInstructions } from './ProgramNode';\nimport { camelCase, DocsInput, parseDocs } from './shared';\n\ntype SubInstructionNode = InstructionNode;\n\nexport type InstructionNodeInput<\n    TAccounts extends InstructionAccountNode[] = InstructionAccountNode[],\n    TArguments extends InstructionArgumentNode[] = InstructionArgumentNode[],\n    TExtraArguments extends InstructionArgumentNode[] | undefined = InstructionArgumentNode[] | undefined,\n    TRemainingAccounts extends InstructionRemainingAccountsNode[] | undefined =\n        | InstructionRemainingAccountsNode[]\n        | undefined,\n    TByteDeltas extends InstructionByteDeltaNode[] | undefined = InstructionByteDeltaNode[] | undefined,\n    TDiscriminators extends DiscriminatorNode[] | undefined = DiscriminatorNode[] | undefined,\n    TSubInstructions extends SubInstructionNode[] | undefined = SubInstructionNode[] | undefined,\n> = Omit<\n    Partial<\n        InstructionNode<\n            TAccounts,\n            TArguments,\n            TExtraArguments,\n            TRemainingAccounts,\n            TByteDeltas,\n            TDiscriminators,\n            TSubInstructions\n        >\n    >,\n    'docs' | 'kind' | 'name'\n> & {\n    readonly docs?: DocsInput;\n    readonly name: string;\n};\n\nexport function instructionNode<\n    const TAccounts extends InstructionAccountNode[] = [],\n    const TArguments extends InstructionArgumentNode[] = [],\n    const TExtraArguments extends InstructionArgumentNode[] | undefined = undefined,\n    const TRemainingAccounts extends InstructionRemainingAccountsNode[] | undefined = undefined,\n    const TByteDeltas extends InstructionByteDeltaNode[] | undefined = undefined,\n    const TDiscriminators extends DiscriminatorNode[] | undefined = undefined,\n    const TSubInstructions extends SubInstructionNode[] | undefined = undefined,\n>(\n    input: InstructionNodeInput<\n        TAccounts,\n        TArguments,\n        TExtraArguments,\n        TRemainingAccounts,\n        TByteDeltas,\n        TDiscriminators,\n        TSubInstructions\n    >,\n): InstructionNode<\n    TAccounts,\n    TArguments,\n    TExtraArguments,\n    TRemainingAccounts,\n    TByteDeltas,\n    TDiscriminators,\n    TSubInstructions\n> {\n    return Object.freeze({\n        kind: 'instructionNode',\n\n        // Data.\n        name: camelCase(input.name),\n        docs: parseDocs(input.docs),\n        optionalAccountStrategy: parseOptionalAccountStrategy(input.optionalAccountStrategy),\n        ...(input.status !== undefined && { status: input.status }),\n\n        // Children.\n        accounts: (input.accounts ?? []) as TAccounts,\n        arguments: (input.arguments ?? []) as TArguments,\n        extraArguments: input.extraArguments,\n        remainingAccounts: input.remainingAccounts,\n        byteDeltas: input.byteDeltas,\n        discriminators: input.discriminators,\n        subInstructions: input.subInstructions,\n    });\n}\n\nexport function parseOptionalAccountStrategy(\n    optionalAccountStrategy: OptionalAccountStrategy | undefined,\n): OptionalAccountStrategy {\n    return optionalAccountStrategy ?? 'programId';\n}\n\nexport function getAllInstructionArguments(node: InstructionNode): InstructionArgumentNode[] {\n    return [...node.arguments, ...(node.extraArguments ?? [])];\n}\n\nexport function getAllInstructionsWithSubs(\n    node: InstructionNode | ProgramNode | RootNode,\n    config: { leavesOnly?: boolean; subInstructionsFirst?: boolean } = {},\n): InstructionNode[] {\n    const { leavesOnly = false, subInstructionsFirst = false } = config;\n    if (isNode(node, 'instructionNode')) {\n        if (!node.subInstructions || node.subInstructions.length === 0) return [node];\n        const subInstructions = node.subInstructions.flatMap(sub => getAllInstructionsWithSubs(sub, config));\n        if (leavesOnly) return subInstructions;\n        return subInstructionsFirst ? [...subInstructions, node] : [node, ...subInstructions];\n    }\n\n    const instructions = isNode(node, 'programNode') ? node.instructions : getAllInstructions(node);\n\n    return instructions.flatMap(instruction => getAllInstructionsWithSubs(instruction, config));\n}\n"
  },
  {
    "path": "packages/nodes/src/InstructionRemainingAccountsNode.ts",
    "content": "import type { ArgumentValueNode, InstructionRemainingAccountsNode, ResolverValueNode } from '@codama/node-types';\n\nimport { DocsInput, parseDocs } from './shared';\n\nexport function instructionRemainingAccountsNode<TValue extends ArgumentValueNode | ResolverValueNode>(\n    value: TValue,\n    options: {\n        docs?: DocsInput;\n        isOptional?: boolean;\n        isSigner?: boolean | 'either';\n        isWritable?: boolean;\n    } = {},\n): InstructionRemainingAccountsNode<TValue> {\n    return Object.freeze({\n        kind: 'instructionRemainingAccountsNode',\n\n        // Data.\n        ...(options.isOptional !== undefined && { isOptional: options.isOptional }),\n        ...(options.isSigner !== undefined && { isSigner: options.isSigner }),\n        ...(options.isWritable !== undefined && { isWritable: options.isWritable }),\n        docs: parseDocs(options.docs),\n\n        // Children.\n        value,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/InstructionStatusNode.ts",
    "content": "import type { InstructionLifecycle, InstructionStatusNode } from '@codama/node-types';\n\nexport function instructionStatusNode(lifecycle: InstructionLifecycle, message?: string): InstructionStatusNode {\n    return Object.freeze({\n        kind: 'instructionStatusNode',\n\n        // Data.\n        lifecycle,\n        ...(message !== undefined && { message }),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/Node.ts",
    "content": "import { CODAMA_ERROR__UNEXPECTED_NODE_KIND, CodamaError } from '@codama/errors';\nimport type { GetNodeFromKind, Node, NodeKind } from '@codama/node-types';\n\nimport { REGISTERED_CONTEXTUAL_VALUE_NODE_KINDS } from './contextualValueNodes/ContextualValueNode';\nimport { REGISTERED_COUNT_NODE_KINDS } from './countNodes/CountNode';\nimport { REGISTERED_DISCRIMINATOR_NODE_KINDS } from './discriminatorNodes/DiscriminatorNode';\nimport { REGISTERED_LINK_NODE_KINDS } from './linkNodes/LinkNode';\nimport { REGISTERED_PDA_SEED_NODE_KINDS } from './pdaSeedNodes/PdaSeedNode';\nimport { REGISTERED_TYPE_NODE_KINDS } from './typeNodes/TypeNode';\nimport { REGISTERED_VALUE_NODE_KINDS } from './valueNodes/ValueNode';\n\n// Node Registration.\nexport const REGISTERED_NODE_KINDS = [\n    ...REGISTERED_CONTEXTUAL_VALUE_NODE_KINDS,\n    ...REGISTERED_DISCRIMINATOR_NODE_KINDS,\n    ...REGISTERED_LINK_NODE_KINDS,\n    ...REGISTERED_PDA_SEED_NODE_KINDS,\n    ...REGISTERED_COUNT_NODE_KINDS,\n    ...REGISTERED_TYPE_NODE_KINDS,\n    ...REGISTERED_VALUE_NODE_KINDS,\n    'rootNode' as const,\n    'programNode' as const,\n    'pdaNode' as const,\n    'accountNode' as const,\n    'eventNode' as const,\n    'instructionAccountNode' as const,\n    'instructionArgumentNode' as const,\n    'instructionByteDeltaNode' as const,\n    'instructionNode' as const,\n    'instructionRemainingAccountsNode' as const,\n    'instructionStatusNode' as const,\n    'errorNode' as const,\n    'definedTypeNode' as const,\n];\n\n// Node Helpers.\n\nexport function isNode<TKind extends NodeKind>(\n    node: Node | null | undefined,\n    kind: TKind | TKind[],\n): node is GetNodeFromKind<TKind> {\n    const kinds = Array.isArray(kind) ? kind : [kind];\n    return !!node && (kinds as NodeKind[]).includes(node.kind);\n}\n\nexport function assertIsNode<TKind extends NodeKind>(\n    node: Node | null | undefined,\n    kind: TKind | TKind[],\n): asserts node is GetNodeFromKind<TKind> {\n    const kinds = Array.isArray(kind) ? kind : [kind];\n    if (!isNode(node, kinds)) {\n        throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NODE_KIND, {\n            expectedKinds: kinds,\n            kind: node?.kind ?? null,\n            node,\n        });\n    }\n}\n\nexport function isNodeFilter<TKind extends NodeKind>(\n    kind: TKind | TKind[],\n): (node: Node | null | undefined) => node is GetNodeFromKind<TKind> {\n    return (node): node is GetNodeFromKind<TKind> => isNode(node, kind);\n}\n\nexport function assertIsNodeFilter<TKind extends NodeKind>(\n    kind: TKind | TKind[],\n): (node: Node | null | undefined) => node is GetNodeFromKind<TKind> {\n    return (node): node is GetNodeFromKind<TKind> => {\n        assertIsNode(node, kind);\n        return true;\n    };\n}\n\nexport function removeNullAndAssertIsNodeFilter<TKind extends NodeKind>(\n    kind: TKind | TKind[],\n): (node: Node | null | undefined) => node is GetNodeFromKind<TKind> {\n    return (node): node is GetNodeFromKind<TKind> => {\n        if (node) assertIsNode(node, kind);\n        return node != null;\n    };\n}\n"
  },
  {
    "path": "packages/nodes/src/PdaNode.ts",
    "content": "import type { PdaNode, PdaSeedNode } from '@codama/node-types';\n\nimport { camelCase, DocsInput, parseDocs } from './shared';\n\nexport type PdaNodeInput<TSeeds extends PdaSeedNode[] = PdaSeedNode[]> = Omit<\n    PdaNode<TSeeds>,\n    'docs' | 'kind' | 'name'\n> & {\n    readonly docs?: DocsInput;\n    readonly name: string;\n};\n\nexport function pdaNode<const TSeeds extends PdaSeedNode[]>(input: PdaNodeInput<TSeeds>): PdaNode<TSeeds> {\n    return Object.freeze({\n        kind: 'pdaNode',\n\n        // Data.\n        name: camelCase(input.name),\n        docs: parseDocs(input.docs),\n        ...(input.programId && { programId: input.programId }),\n\n        // Children.\n        seeds: input.seeds,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/ProgramNode.ts",
    "content": "import type {\n    AccountNode,\n    DefinedTypeNode,\n    ErrorNode,\n    EventNode,\n    InstructionNode,\n    PdaNode,\n    ProgramNode,\n    RootNode,\n} from '@codama/node-types';\n\nimport { camelCase, DocsInput, parseDocs } from './shared';\n\nexport type ProgramNodeInput<\n    TPdas extends PdaNode[] = PdaNode[],\n    TAccounts extends AccountNode[] = AccountNode[],\n    TInstructions extends InstructionNode[] = InstructionNode[],\n    TDefinedTypes extends DefinedTypeNode[] = DefinedTypeNode[],\n    TErrors extends ErrorNode[] = ErrorNode[],\n    TEvents extends EventNode[] = EventNode[],\n> = Omit<\n    Partial<ProgramNode<TPdas, TAccounts, TInstructions, TDefinedTypes, TErrors, TEvents>>,\n    'docs' | 'kind' | 'name' | 'publicKey'\n> & {\n    readonly docs?: DocsInput;\n    readonly name: string;\n    readonly publicKey: ProgramNode['publicKey'];\n};\n\nexport function programNode<\n    const TPdas extends PdaNode[] = [],\n    const TAccounts extends AccountNode[] = [],\n    const TInstructions extends InstructionNode[] = [],\n    const TDefinedTypes extends DefinedTypeNode[] = [],\n    const TErrors extends ErrorNode[] = [],\n    const TEvents extends EventNode[] = [],\n>(\n    input: ProgramNodeInput<TPdas, TAccounts, TInstructions, TDefinedTypes, TErrors, TEvents>,\n): ProgramNode<TPdas, TAccounts, TInstructions, TDefinedTypes, TErrors, TEvents> {\n    return Object.freeze({\n        kind: 'programNode',\n\n        // Data.\n        name: camelCase(input.name),\n        publicKey: input.publicKey,\n        version: input.version ?? '0.0.0',\n        ...(input.origin !== undefined && { origin: input.origin }),\n        docs: parseDocs(input.docs),\n\n        // Children.\n        accounts: (input.accounts ?? []) as TAccounts,\n        instructions: (input.instructions ?? []) as TInstructions,\n        definedTypes: (input.definedTypes ?? []) as TDefinedTypes,\n        pdas: (input.pdas ?? []) as TPdas,\n        events: (input.events ?? []) as TEvents,\n        errors: (input.errors ?? []) as TErrors,\n    });\n}\n\nexport function getAllPrograms(node: ProgramNode | ProgramNode[] | RootNode): ProgramNode[] {\n    if (Array.isArray(node)) return node;\n    if (node.kind === 'programNode') return [node];\n    return [node.program, ...node.additionalPrograms];\n}\n\nexport function getAllPdas(node: ProgramNode | ProgramNode[] | RootNode): PdaNode[] {\n    return getAllPrograms(node).flatMap(program => program.pdas);\n}\n\nexport function getAllAccounts(node: ProgramNode | ProgramNode[] | RootNode): AccountNode[] {\n    return getAllPrograms(node).flatMap(program => program.accounts);\n}\n\nexport function getAllEvents(node: ProgramNode | ProgramNode[] | RootNode): EventNode[] {\n    return getAllPrograms(node).flatMap(program => program.events);\n}\n\nexport function getAllDefinedTypes(node: ProgramNode | ProgramNode[] | RootNode): DefinedTypeNode[] {\n    return getAllPrograms(node).flatMap(program => program.definedTypes);\n}\n\nexport function getAllInstructions(node: ProgramNode | ProgramNode[] | RootNode): InstructionNode[] {\n    return getAllPrograms(node).flatMap(program => program.instructions);\n}\n\nexport function getAllErrors(node: ProgramNode | ProgramNode[] | RootNode): ErrorNode[] {\n    return getAllPrograms(node).flatMap(program => program.errors);\n}\n"
  },
  {
    "path": "packages/nodes/src/RootNode.ts",
    "content": "import type { CodamaVersion, ProgramNode, RootNode } from '@codama/node-types';\n\nexport function rootNode<TProgram extends ProgramNode, const TAdditionalPrograms extends ProgramNode[] = []>(\n    program: TProgram,\n    additionalPrograms?: TAdditionalPrograms,\n): RootNode<TProgram, TAdditionalPrograms> {\n    return Object.freeze({\n        kind: 'rootNode',\n\n        // Data.\n        standard: 'codama',\n        version: __VERSION__ as CodamaVersion,\n\n        // Children.\n        program,\n        additionalPrograms: (additionalPrograms ?? []) as TAdditionalPrograms,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/contextualValueNodes/AccountBumpValueNode.ts",
    "content": "import type { AccountBumpValueNode } from '@codama/node-types';\n\nimport { camelCase } from '../shared';\n\nexport function accountBumpValueNode(name: string): AccountBumpValueNode {\n    return Object.freeze({\n        kind: 'accountBumpValueNode',\n\n        // Data.\n        name: camelCase(name),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/contextualValueNodes/AccountValueNode.ts",
    "content": "import type { AccountValueNode } from '@codama/node-types';\n\nimport { camelCase } from '../shared';\n\nexport function accountValueNode(name: string): AccountValueNode {\n    return Object.freeze({\n        kind: 'accountValueNode',\n\n        // Data.\n        name: camelCase(name),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/contextualValueNodes/ArgumentValueNode.ts",
    "content": "import type { ArgumentValueNode } from '@codama/node-types';\n\nimport { camelCase } from '../shared';\n\nexport function argumentValueNode(name: string): ArgumentValueNode {\n    return Object.freeze({\n        kind: 'argumentValueNode',\n\n        // Data.\n        name: camelCase(name),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/contextualValueNodes/ConditionalValueNode.ts",
    "content": "import type {\n    AccountValueNode,\n    ArgumentValueNode,\n    ConditionalValueNode,\n    InstructionInputValueNode,\n    ResolverValueNode,\n    ValueNode,\n} from '@codama/node-types';\n\ntype ConditionNode = AccountValueNode | ArgumentValueNode | ResolverValueNode;\n\nexport function conditionalValueNode<\n    TCondition extends ConditionNode,\n    TValue extends ValueNode | undefined = undefined,\n    TIfTrue extends InstructionInputValueNode | undefined = undefined,\n    TIfFalse extends InstructionInputValueNode | undefined = undefined,\n>(input: {\n    condition: TCondition;\n    ifFalse?: TIfFalse;\n    ifTrue?: TIfTrue;\n    value?: TValue;\n}): ConditionalValueNode<TCondition, TValue, TIfTrue, TIfFalse> {\n    return Object.freeze({\n        kind: 'conditionalValueNode',\n\n        // Children.\n        condition: input.condition,\n        ...(input.value !== undefined && { value: input.value }),\n        ...(input.ifTrue !== undefined && { ifTrue: input.ifTrue }),\n        ...(input.ifFalse !== undefined && { ifFalse: input.ifFalse }),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/contextualValueNodes/ContextualValueNode.ts",
    "content": "import { VALUE_NODES } from '../valueNodes/ValueNode';\n\n// Standalone Contextual Value Node Registration.\nexport const STANDALONE_CONTEXTUAL_VALUE_NODE_KINDS = [\n    'accountBumpValueNode' as const,\n    'accountValueNode' as const,\n    'argumentValueNode' as const,\n    'conditionalValueNode' as const,\n    'identityValueNode' as const,\n    'payerValueNode' as const,\n    'pdaValueNode' as const,\n    'programIdValueNode' as const,\n    'resolverValueNode' as const,\n];\n\n// Contextual Value Node Registration.\nexport const REGISTERED_CONTEXTUAL_VALUE_NODE_KINDS = [\n    ...STANDALONE_CONTEXTUAL_VALUE_NODE_KINDS,\n    'pdaSeedValueNode' as const,\n];\n\n// Contextual Value Node Helpers.\nexport const CONTEXTUAL_VALUE_NODES = STANDALONE_CONTEXTUAL_VALUE_NODE_KINDS;\nexport const INSTRUCTION_INPUT_VALUE_NODES = [...VALUE_NODES, ...CONTEXTUAL_VALUE_NODES, 'programLinkNode' as const];\n"
  },
  {
    "path": "packages/nodes/src/contextualValueNodes/IdentityValueNode.ts",
    "content": "import type { IdentityValueNode } from '@codama/node-types';\n\nexport function identityValueNode(): IdentityValueNode {\n    return Object.freeze({ kind: 'identityValueNode' });\n}\n"
  },
  {
    "path": "packages/nodes/src/contextualValueNodes/PayerValueNode.ts",
    "content": "import type { PayerValueNode } from '@codama/node-types';\n\nexport function payerValueNode(): PayerValueNode {\n    return Object.freeze({ kind: 'payerValueNode' });\n}\n"
  },
  {
    "path": "packages/nodes/src/contextualValueNodes/PdaSeedValueNode.ts",
    "content": "import type { AccountValueNode, ArgumentValueNode, PdaSeedValueNode, ValueNode } from '@codama/node-types';\n\nimport { camelCase } from '../shared';\n\nexport function pdaSeedValueNode<\n    TValue extends AccountValueNode | ArgumentValueNode | ValueNode = AccountValueNode | ArgumentValueNode | ValueNode,\n>(name: string, value: TValue): PdaSeedValueNode<TValue> {\n    return Object.freeze({\n        kind: 'pdaSeedValueNode',\n\n        // Data.\n        name: camelCase(name),\n\n        // Children.\n        value,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/contextualValueNodes/PdaValueNode.ts",
    "content": "import type {\n    AccountValueNode,\n    ArgumentValueNode,\n    PdaLinkNode,\n    PdaNode,\n    PdaSeedValueNode,\n    PdaValueNode,\n} from '@codama/node-types';\n\nimport { pdaLinkNode } from '../linkNodes';\n\nexport function pdaValueNode<\n    const TSeeds extends PdaSeedValueNode[] = [],\n    const TProgram extends AccountValueNode | ArgumentValueNode | undefined = undefined,\n>(\n    pda: PdaLinkNode | PdaNode | string,\n    seeds: TSeeds = [] as PdaSeedValueNode[] as TSeeds,\n    programId: TProgram = undefined as TProgram,\n): PdaValueNode<TSeeds, TProgram> {\n    return Object.freeze({\n        kind: 'pdaValueNode',\n\n        // Children.\n        pda: typeof pda === 'string' ? pdaLinkNode(pda) : pda,\n        seeds,\n        ...(programId ? { programId } : {}),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/contextualValueNodes/ProgramIdValueNode.ts",
    "content": "import type { ProgramIdValueNode } from '@codama/node-types';\n\nexport function programIdValueNode(): ProgramIdValueNode {\n    return Object.freeze({ kind: 'programIdValueNode' });\n}\n"
  },
  {
    "path": "packages/nodes/src/contextualValueNodes/ResolverValueNode.ts",
    "content": "import type { AccountValueNode, ArgumentValueNode, ResolverValueNode } from '@codama/node-types';\n\nimport { camelCase, DocsInput, parseDocs } from '../shared';\n\nexport function resolverValueNode<const TDependsOn extends (AccountValueNode | ArgumentValueNode)[] = []>(\n    name: string,\n    options: {\n        dependsOn?: TDependsOn;\n        docs?: DocsInput;\n    } = {},\n): ResolverValueNode<TDependsOn> {\n    return Object.freeze({\n        kind: 'resolverValueNode',\n\n        // Data.\n        name: camelCase(name),\n        docs: parseDocs(options.docs),\n\n        // Children.\n        dependsOn: options.dependsOn,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/contextualValueNodes/index.ts",
    "content": "export * from './AccountBumpValueNode';\nexport * from './AccountValueNode';\nexport * from './ArgumentValueNode';\nexport * from './ConditionalValueNode';\nexport * from './ContextualValueNode';\nexport * from './IdentityValueNode';\nexport * from './PayerValueNode';\nexport * from './PdaSeedValueNode';\nexport * from './PdaValueNode';\nexport * from './ProgramIdValueNode';\nexport * from './ResolverValueNode';\n"
  },
  {
    "path": "packages/nodes/src/countNodes/CountNode.ts",
    "content": "// Count Node Registration.\nexport const REGISTERED_COUNT_NODE_KINDS = [\n    'fixedCountNode' as const,\n    'remainderCountNode' as const,\n    'prefixedCountNode' as const,\n];\n\n// Count Node Helpers.\nexport const COUNT_NODES = REGISTERED_COUNT_NODE_KINDS;\n"
  },
  {
    "path": "packages/nodes/src/countNodes/FixedCountNode.ts",
    "content": "import type { FixedCountNode } from '@codama/node-types';\n\nexport function fixedCountNode(value: number): FixedCountNode {\n    return Object.freeze({\n        kind: 'fixedCountNode',\n\n        // Data.\n        value,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/countNodes/PrefixedCountNode.ts",
    "content": "import type { NestedTypeNode, NumberTypeNode, PrefixedCountNode } from '@codama/node-types';\n\nexport function prefixedCountNode<TPrefix extends NestedTypeNode<NumberTypeNode>>(\n    prefix: TPrefix,\n): PrefixedCountNode<TPrefix> {\n    return Object.freeze({\n        kind: 'prefixedCountNode',\n\n        // Children.\n        prefix,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/countNodes/RemainderCountNode.ts",
    "content": "import type { RemainderCountNode } from '@codama/node-types';\n\nexport function remainderCountNode(): RemainderCountNode {\n    return Object.freeze({ kind: 'remainderCountNode' });\n}\n"
  },
  {
    "path": "packages/nodes/src/countNodes/index.ts",
    "content": "export * from './CountNode';\nexport * from './FixedCountNode';\nexport * from './PrefixedCountNode';\nexport * from './RemainderCountNode';\n"
  },
  {
    "path": "packages/nodes/src/discriminatorNodes/ConstantDiscriminatorNode.ts",
    "content": "import type { ConstantDiscriminatorNode, ConstantValueNode } from '@codama/node-types';\n\nexport function constantDiscriminatorNode<TConstant extends ConstantValueNode>(\n    constant: TConstant,\n    offset: number = 0,\n): ConstantDiscriminatorNode {\n    return Object.freeze({\n        kind: 'constantDiscriminatorNode',\n\n        // Data.\n        offset,\n\n        // Children.\n        constant,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/discriminatorNodes/DiscriminatorNode.ts",
    "content": "// Discriminator Node Registration.\nexport const REGISTERED_DISCRIMINATOR_NODE_KINDS = [\n    'constantDiscriminatorNode' as const,\n    'fieldDiscriminatorNode' as const,\n    'sizeDiscriminatorNode' as const,\n];\n\n// Discriminator Node Helpers.\nexport const DISCRIMINATOR_NODES = REGISTERED_DISCRIMINATOR_NODE_KINDS;\n"
  },
  {
    "path": "packages/nodes/src/discriminatorNodes/FieldDiscriminatorNode.ts",
    "content": "import type { FieldDiscriminatorNode } from '@codama/node-types';\n\nimport { camelCase } from '../shared';\n\nexport function fieldDiscriminatorNode(name: string, offset: number = 0): FieldDiscriminatorNode {\n    return Object.freeze({\n        kind: 'fieldDiscriminatorNode',\n\n        // Data.\n        name: camelCase(name),\n        offset,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/discriminatorNodes/SizeDiscriminatorNode.ts",
    "content": "import type { SizeDiscriminatorNode } from '@codama/node-types';\n\nexport function sizeDiscriminatorNode(size: number): SizeDiscriminatorNode {\n    return Object.freeze({\n        kind: 'sizeDiscriminatorNode',\n\n        // Data.\n        size,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/discriminatorNodes/index.ts",
    "content": "export * from './ConstantDiscriminatorNode';\nexport * from './DiscriminatorNode';\nexport * from './FieldDiscriminatorNode';\nexport * from './SizeDiscriminatorNode';\n"
  },
  {
    "path": "packages/nodes/src/index.ts",
    "content": "export * from '@codama/node-types';\n\nexport * from './contextualValueNodes';\nexport * from './countNodes';\nexport * from './discriminatorNodes';\nexport * from './linkNodes';\nexport * from './pdaSeedNodes';\nexport * from './typeNodes';\nexport * from './valueNodes';\n\nexport * from './shared';\n\nexport * from './AccountNode';\nexport * from './DefinedTypeNode';\nexport * from './EventNode';\nexport * from './ErrorNode';\nexport * from './InstructionAccountNode';\nexport * from './InstructionArgumentNode';\nexport * from './InstructionByteDeltaNode';\nexport * from './InstructionNode';\nexport * from './InstructionRemainingAccountsNode';\nexport * from './InstructionStatusNode';\nexport * from './Node';\nexport * from './PdaNode';\nexport * from './ProgramNode';\nexport * from './RootNode';\n"
  },
  {
    "path": "packages/nodes/src/linkNodes/AccountLinkNode.ts",
    "content": "import type { AccountLinkNode, ProgramLinkNode } from '@codama/node-types';\n\nimport { camelCase } from '../shared';\nimport { programLinkNode } from './ProgramLinkNode';\n\nexport function accountLinkNode(name: string, program?: ProgramLinkNode | string): AccountLinkNode {\n    return Object.freeze({\n        kind: 'accountLinkNode',\n\n        // Children.\n        ...(program === undefined ? {} : { program: typeof program === 'string' ? programLinkNode(program) : program }),\n\n        // Data.\n        name: camelCase(name),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/linkNodes/DefinedTypeLinkNode.ts",
    "content": "import type { DefinedTypeLinkNode, ProgramLinkNode } from '@codama/node-types';\n\nimport { camelCase } from '../shared';\nimport { programLinkNode } from './ProgramLinkNode';\n\nexport function definedTypeLinkNode(name: string, program?: ProgramLinkNode | string): DefinedTypeLinkNode {\n    return Object.freeze({\n        kind: 'definedTypeLinkNode',\n\n        // Children.\n        ...(program === undefined ? {} : { program: typeof program === 'string' ? programLinkNode(program) : program }),\n\n        // Data.\n        name: camelCase(name),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/linkNodes/InstructionAccountLinkNode.ts",
    "content": "import type { InstructionAccountLinkNode, InstructionLinkNode } from '@codama/node-types';\n\nimport { camelCase } from '../shared';\nimport { instructionLinkNode } from './InstructionLinkNode';\n\nexport function instructionAccountLinkNode(\n    name: string,\n    instruction?: InstructionLinkNode | string,\n): InstructionAccountLinkNode {\n    return Object.freeze({\n        kind: 'instructionAccountLinkNode',\n\n        // Children.\n        ...(instruction === undefined\n            ? {}\n            : { instruction: typeof instruction === 'string' ? instructionLinkNode(instruction) : instruction }),\n\n        // Data.\n        name: camelCase(name),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/linkNodes/InstructionArgumentLinkNode.ts",
    "content": "import type { InstructionArgumentLinkNode, InstructionLinkNode } from '@codama/node-types';\n\nimport { camelCase } from '../shared';\nimport { instructionLinkNode } from './InstructionLinkNode';\n\nexport function instructionArgumentLinkNode(\n    name: string,\n    instruction?: InstructionLinkNode | string,\n): InstructionArgumentLinkNode {\n    return Object.freeze({\n        kind: 'instructionArgumentLinkNode',\n\n        // Children.\n        ...(instruction === undefined\n            ? {}\n            : { instruction: typeof instruction === 'string' ? instructionLinkNode(instruction) : instruction }),\n\n        // Data.\n        name: camelCase(name),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/linkNodes/InstructionLinkNode.ts",
    "content": "import type { InstructionLinkNode, ProgramLinkNode } from '@codama/node-types';\n\nimport { camelCase } from '../shared';\nimport { programLinkNode } from './ProgramLinkNode';\n\nexport function instructionLinkNode(name: string, program?: ProgramLinkNode | string): InstructionLinkNode {\n    return Object.freeze({\n        kind: 'instructionLinkNode',\n\n        // Children.\n        ...(program === undefined ? {} : { program: typeof program === 'string' ? programLinkNode(program) : program }),\n\n        // Data.\n        name: camelCase(name),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/linkNodes/LinkNode.ts",
    "content": "// Link Node Registration.\nexport const REGISTERED_LINK_NODE_KINDS = [\n    'accountLinkNode' as const,\n    'definedTypeLinkNode' as const,\n    'instructionAccountLinkNode' as const,\n    'instructionArgumentLinkNode' as const,\n    'instructionLinkNode' as const,\n    'pdaLinkNode' as const,\n    'programLinkNode' as const,\n];\n\n// Link Node Helpers.\nexport const LINK_NODES = REGISTERED_LINK_NODE_KINDS;\n"
  },
  {
    "path": "packages/nodes/src/linkNodes/PdaLinkNode.ts",
    "content": "import type { PdaLinkNode, ProgramLinkNode } from '@codama/node-types';\n\nimport { camelCase } from '../shared';\nimport { programLinkNode } from './ProgramLinkNode';\n\nexport function pdaLinkNode(name: string, program?: ProgramLinkNode | string): PdaLinkNode {\n    return Object.freeze({\n        kind: 'pdaLinkNode',\n\n        // Children.\n        ...(program === undefined ? {} : { program: typeof program === 'string' ? programLinkNode(program) : program }),\n\n        // Data.\n        name: camelCase(name),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/linkNodes/ProgramLinkNode.ts",
    "content": "import type { ProgramLinkNode } from '@codama/node-types';\n\nimport { camelCase } from '../shared';\n\nexport function programLinkNode(name: string): ProgramLinkNode {\n    return Object.freeze({\n        kind: 'programLinkNode',\n\n        // Data.\n        name: camelCase(name),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/linkNodes/index.ts",
    "content": "export * from './AccountLinkNode';\nexport * from './DefinedTypeLinkNode';\nexport * from './InstructionAccountLinkNode';\nexport * from './InstructionArgumentLinkNode';\nexport * from './InstructionLinkNode';\nexport * from './LinkNode';\nexport * from './PdaLinkNode';\nexport * from './ProgramLinkNode';\n"
  },
  {
    "path": "packages/nodes/src/pdaSeedNodes/ConstantPdaSeedNode.ts",
    "content": "import type { BytesEncoding, ConstantPdaSeedNode, ProgramIdValueNode, TypeNode, ValueNode } from '@codama/node-types';\n\nimport { programIdValueNode } from '../contextualValueNodes/ProgramIdValueNode';\nimport { bytesTypeNode } from '../typeNodes/BytesTypeNode';\nimport { publicKeyTypeNode } from '../typeNodes/PublicKeyTypeNode';\nimport { stringTypeNode } from '../typeNodes/StringTypeNode';\nimport { bytesValueNode } from '../valueNodes/BytesValueNode';\nimport { stringValueNode } from '../valueNodes/StringValueNode';\n\nexport function constantPdaSeedNode<TType extends TypeNode, TValue extends ProgramIdValueNode | ValueNode>(\n    type: TType,\n    value: TValue,\n): ConstantPdaSeedNode<TType, TValue> {\n    return Object.freeze({\n        kind: 'constantPdaSeedNode',\n\n        // Children.\n        type,\n        value,\n    });\n}\n\nexport function constantPdaSeedNodeFromProgramId() {\n    return constantPdaSeedNode(publicKeyTypeNode(), programIdValueNode());\n}\n\nexport function constantPdaSeedNodeFromString<TEncoding extends BytesEncoding>(encoding: TEncoding, string: string) {\n    return constantPdaSeedNode(stringTypeNode(encoding), stringValueNode(string));\n}\n\nexport function constantPdaSeedNodeFromBytes<TEncoding extends BytesEncoding>(encoding: TEncoding, data: string) {\n    return constantPdaSeedNode(bytesTypeNode(), bytesValueNode(encoding, data));\n}\n"
  },
  {
    "path": "packages/nodes/src/pdaSeedNodes/PdaSeedNode.ts",
    "content": "// Pda Seed Node Registration.\nexport const REGISTERED_PDA_SEED_NODE_KINDS = ['constantPdaSeedNode' as const, 'variablePdaSeedNode' as const];\n\n// Pda Seed Node Helpers.\nexport const PDA_SEED_NODES = REGISTERED_PDA_SEED_NODE_KINDS;\n"
  },
  {
    "path": "packages/nodes/src/pdaSeedNodes/VariablePdaSeedNode.ts",
    "content": "import type { TypeNode, VariablePdaSeedNode } from '@codama/node-types';\n\nimport { camelCase, DocsInput, parseDocs } from '../shared';\n\nexport function variablePdaSeedNode<TType extends TypeNode>(\n    name: string,\n    type: TType,\n    docs?: DocsInput,\n): VariablePdaSeedNode<TType> {\n    return Object.freeze({\n        kind: 'variablePdaSeedNode',\n\n        // Data.\n        name: camelCase(name),\n        docs: parseDocs(docs),\n\n        // Children.\n        type,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/pdaSeedNodes/index.ts",
    "content": "export * from './ConstantPdaSeedNode';\nexport * from './PdaSeedNode';\nexport * from './VariablePdaSeedNode';\n"
  },
  {
    "path": "packages/nodes/src/shared/docs.ts",
    "content": "import type { Docs } from '@codama/node-types';\n\nexport type DocsInput = string[] | string;\n\nexport function parseDocs(docs: DocsInput | null | undefined): Docs {\n    if (docs === null || docs === undefined) return [];\n    return Array.isArray(docs) ? docs : [docs];\n}\n"
  },
  {
    "path": "packages/nodes/src/shared/index.ts",
    "content": "export * from './docs';\nexport * from './stringCases';\n"
  },
  {
    "path": "packages/nodes/src/shared/stringCases.ts",
    "content": "import type {\n    CamelCaseString,\n    KebabCaseString,\n    PascalCaseString,\n    SnakeCaseString,\n    TitleCaseString,\n} from '@codama/node-types';\n\nexport function capitalize(str: string): string {\n    if (str.length === 0) return str;\n    return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n}\n\nexport function titleCase(str: string): TitleCaseString {\n    return str\n        .replace(/([A-Z])/g, ' $1')\n        .split(/[^a-zA-Z0-9]+/)\n        .filter(word => word.length > 0)\n        .map(capitalize)\n        .join(' ') as TitleCaseString;\n}\n\nexport function pascalCase(str: string): PascalCaseString {\n    return titleCase(str).split(' ').join('') as PascalCaseString;\n}\n\nexport function camelCase(str: string): CamelCaseString {\n    if (str.length === 0) return str as CamelCaseString;\n    const pascalStr = pascalCase(str);\n    return (pascalStr.charAt(0).toLowerCase() + pascalStr.slice(1)) as CamelCaseString;\n}\n\nexport function kebabCase(str: string): KebabCaseString {\n    return titleCase(str).split(' ').join('-').toLowerCase() as KebabCaseString;\n}\n\nexport function snakeCase(str: string): SnakeCaseString {\n    return titleCase(str).split(' ').join('_').toLowerCase() as SnakeCaseString;\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/AmountTypeNode.ts",
    "content": "import type { AmountTypeNode, NestedTypeNode, NumberTypeNode } from '@codama/node-types';\n\nexport function amountTypeNode<TNumber extends NestedTypeNode<NumberTypeNode>>(\n    number: TNumber,\n    decimals: number,\n    unit?: string,\n): AmountTypeNode<TNumber> {\n    return Object.freeze({\n        kind: 'amountTypeNode',\n\n        // Data.\n        decimals,\n        ...(unit !== undefined && { unit }),\n\n        // Children.\n        number,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/ArrayTypeNode.ts",
    "content": "import type { ArrayTypeNode, CountNode, TypeNode } from '@codama/node-types';\n\nexport function arrayTypeNode<TItem extends TypeNode, TCount extends CountNode>(\n    item: TItem,\n    count: TCount,\n): ArrayTypeNode<TItem, TCount> {\n    return Object.freeze({\n        kind: 'arrayTypeNode',\n\n        // Children.\n        item,\n        count,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/BooleanTypeNode.ts",
    "content": "import type { BooleanTypeNode, NestedTypeNode, NumberTypeNode } from '@codama/node-types';\n\nimport { numberTypeNode } from './NumberTypeNode';\n\nexport function booleanTypeNode<TSize extends NestedTypeNode<NumberTypeNode> = NumberTypeNode<'u8'>>(\n    size?: TSize,\n): BooleanTypeNode<TSize> {\n    return Object.freeze({\n        kind: 'booleanTypeNode',\n\n        // Children.\n        size: (size ?? numberTypeNode('u8')) as TSize,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/BytesTypeNode.ts",
    "content": "import type { BytesTypeNode } from '@codama/node-types';\n\nexport function bytesTypeNode(): BytesTypeNode {\n    return Object.freeze({ kind: 'bytesTypeNode' });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/DateTimeTypeNode.ts",
    "content": "import type { DateTimeTypeNode, NestedTypeNode, NumberTypeNode } from '@codama/node-types';\n\nexport function dateTimeTypeNode<TNumber extends NestedTypeNode<NumberTypeNode> = NestedTypeNode<NumberTypeNode>>(\n    number: TNumber,\n): DateTimeTypeNode<TNumber> {\n    return Object.freeze({\n        kind: 'dateTimeTypeNode',\n\n        // Children.\n        number,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/EnumEmptyVariantTypeNode.ts",
    "content": "import type { EnumEmptyVariantTypeNode } from '@codama/node-types';\n\nimport { camelCase } from '../shared';\n\nexport function enumEmptyVariantTypeNode(name: string, discriminator?: number): EnumEmptyVariantTypeNode {\n    return Object.freeze({\n        kind: 'enumEmptyVariantTypeNode',\n\n        // Data.\n        name: camelCase(name),\n        discriminator,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/EnumStructVariantTypeNode.ts",
    "content": "import type { EnumStructVariantTypeNode, NestedTypeNode, StructTypeNode } from '@codama/node-types';\n\nimport { camelCase } from '../shared';\n\nexport function enumStructVariantTypeNode<TStruct extends NestedTypeNode<StructTypeNode>>(\n    name: string,\n    struct: TStruct,\n    discriminator?: number,\n): EnumStructVariantTypeNode<TStruct> {\n    return Object.freeze({\n        kind: 'enumStructVariantTypeNode',\n\n        // Data.\n        name: camelCase(name),\n        ...(discriminator !== undefined && { discriminator }),\n\n        // Children.\n        struct,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/EnumTupleVariantTypeNode.ts",
    "content": "import type { EnumTupleVariantTypeNode, NestedTypeNode, TupleTypeNode } from '@codama/node-types';\n\nimport { camelCase } from '../shared';\n\nexport function enumTupleVariantTypeNode<TTuple extends NestedTypeNode<TupleTypeNode>>(\n    name: string,\n    tuple: TTuple,\n    discriminator?: number,\n): EnumTupleVariantTypeNode<TTuple> {\n    return Object.freeze({\n        kind: 'enumTupleVariantTypeNode',\n\n        // Data.\n        name: camelCase(name),\n        ...(discriminator !== undefined && { discriminator }),\n\n        // Children.\n        tuple,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/EnumTypeNode.ts",
    "content": "import type { EnumTypeNode, EnumVariantTypeNode, NestedTypeNode, NumberTypeNode } from '@codama/node-types';\n\nimport { numberTypeNode } from './NumberTypeNode';\n\nexport function enumTypeNode<\n    const TVariants extends EnumVariantTypeNode[],\n    TSize extends NestedTypeNode<NumberTypeNode> = NumberTypeNode<'u8'>,\n>(variants: TVariants, options: { size?: TSize } = {}): EnumTypeNode<TVariants, TSize> {\n    return Object.freeze({\n        kind: 'enumTypeNode',\n\n        // Children.\n        variants,\n        size: (options.size ?? numberTypeNode('u8')) as TSize,\n    });\n}\n\nexport function isScalarEnum(node: EnumTypeNode): boolean {\n    return node.variants.every(variant => variant.kind === 'enumEmptyVariantTypeNode');\n}\n\nexport function isDataEnum(node: EnumTypeNode): boolean {\n    return !isScalarEnum(node);\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/EnumVariantTypeNode.ts",
    "content": "export const ENUM_VARIANT_TYPE_NODES = [\n    'enumEmptyVariantTypeNode' as const,\n    'enumStructVariantTypeNode' as const,\n    'enumTupleVariantTypeNode' as const,\n];\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/FixedSizeTypeNode.ts",
    "content": "import type { FixedSizeTypeNode, TypeNode } from '@codama/node-types';\n\nexport function fixedSizeTypeNode<TType extends TypeNode>(type: TType, size: number): FixedSizeTypeNode<TType> {\n    return Object.freeze({\n        kind: 'fixedSizeTypeNode',\n\n        // Data.\n        size,\n\n        // Children.\n        type,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/HiddenPrefixTypeNode.ts",
    "content": "import type { ConstantValueNode, HiddenPrefixTypeNode, TypeNode } from '@codama/node-types';\n\nexport function hiddenPrefixTypeNode<TType extends TypeNode, const TPrefix extends ConstantValueNode[]>(\n    type: TType,\n    prefix: TPrefix,\n): HiddenPrefixTypeNode<TType, TPrefix> {\n    return Object.freeze({\n        kind: 'hiddenPrefixTypeNode',\n\n        // Children.\n        type,\n        prefix,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/HiddenSuffixTypeNode.ts",
    "content": "import type { ConstantValueNode, HiddenSuffixTypeNode, TypeNode } from '@codama/node-types';\n\nexport function hiddenSuffixTypeNode<TType extends TypeNode, const TSuffix extends ConstantValueNode[]>(\n    type: TType,\n    suffix: TSuffix,\n): HiddenSuffixTypeNode<TType, TSuffix> {\n    return Object.freeze({\n        kind: 'hiddenSuffixTypeNode',\n\n        // Children.\n        type,\n        suffix,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/MapTypeNode.ts",
    "content": "import type { CountNode, MapTypeNode, TypeNode } from '@codama/node-types';\n\nexport function mapTypeNode<TKey extends TypeNode, TValue extends TypeNode, TCount extends CountNode>(\n    key: TKey,\n    value: TValue,\n    count: TCount,\n): MapTypeNode<TKey, TValue, TCount> {\n    return Object.freeze({\n        kind: 'mapTypeNode',\n\n        // Children.\n        key,\n        value,\n        count,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/NestedTypeNode.ts",
    "content": "import { CODAMA_ERROR__UNEXPECTED_NESTED_NODE_KIND, CodamaError } from '@codama/errors';\nimport type { NestedTypeNode, Node, TypeNode } from '@codama/node-types';\n\nimport { isNode } from '../Node';\nimport { TYPE_NODES } from './TypeNode';\n\nexport function resolveNestedTypeNode<TType extends TypeNode>(typeNode: NestedTypeNode<TType>): TType {\n    switch (typeNode.kind) {\n        case 'fixedSizeTypeNode':\n        case 'hiddenPrefixTypeNode':\n        case 'hiddenSuffixTypeNode':\n        case 'postOffsetTypeNode':\n        case 'preOffsetTypeNode':\n        case 'sentinelTypeNode':\n        case 'sizePrefixTypeNode':\n            return resolveNestedTypeNode<TType>(typeNode.type as NestedTypeNode<TType>);\n        default:\n            return typeNode;\n    }\n}\n\nexport function transformNestedTypeNode<TFrom extends TypeNode, TTo extends TypeNode>(\n    typeNode: NestedTypeNode<TFrom>,\n    map: (type: TFrom) => TTo,\n): NestedTypeNode<TTo> {\n    switch (typeNode.kind) {\n        case 'fixedSizeTypeNode':\n        case 'hiddenPrefixTypeNode':\n        case 'hiddenSuffixTypeNode':\n        case 'postOffsetTypeNode':\n        case 'preOffsetTypeNode':\n        case 'sentinelTypeNode':\n        case 'sizePrefixTypeNode':\n            return Object.freeze({\n                ...typeNode,\n                type: transformNestedTypeNode(typeNode.type as NestedTypeNode<TFrom>, map),\n            } as NestedTypeNode<TTo>);\n        default:\n            return map(typeNode);\n    }\n}\n\nexport function isNestedTypeNode<TKind extends TypeNode['kind']>(\n    node: Node | null | undefined,\n    kind: TKind | TKind[],\n): node is NestedTypeNode<Extract<TypeNode, { kind: TKind }>> {\n    if (!isNode(node, TYPE_NODES)) return false;\n    const kinds = Array.isArray(kind) ? kind : [kind];\n    const resolved = resolveNestedTypeNode(node);\n    return !!node && kinds.includes(resolved.kind as TKind);\n}\n\nexport function assertIsNestedTypeNode<TKind extends TypeNode['kind']>(\n    node: Node | null | undefined,\n    kind: TKind | TKind[],\n): asserts node is NestedTypeNode<Extract<TypeNode, { kind: TKind }>> {\n    const kinds = Array.isArray(kind) ? kind : [kind];\n    if (!isNestedTypeNode(node, kinds)) {\n        throw new CodamaError(CODAMA_ERROR__UNEXPECTED_NESTED_NODE_KIND, {\n            expectedKinds: kinds,\n            kind: node?.kind ?? null,\n            node,\n        });\n    }\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/NumberTypeNode.ts",
    "content": "import type { NumberFormat, NumberTypeNode } from '@codama/node-types';\n\nexport function numberTypeNode<TFormat extends NumberFormat = NumberFormat>(\n    format: TFormat,\n    endian: 'be' | 'le' = 'le',\n): NumberTypeNode<TFormat> {\n    return Object.freeze({\n        kind: 'numberTypeNode',\n\n        // Data.\n        format,\n        endian,\n    });\n}\n\nexport function isSignedInteger(node: NumberTypeNode): boolean {\n    return node.format.startsWith('i');\n}\n\nexport function isUnsignedInteger(node: NumberTypeNode): boolean {\n    return node.format.startsWith('u') || node.format === 'shortU16';\n}\n\nexport function isInteger(node: NumberTypeNode): boolean {\n    return !node.format.startsWith('f');\n}\n\nexport function isDecimal(node: NumberTypeNode): boolean {\n    return node.format.startsWith('f');\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/OptionTypeNode.ts",
    "content": "import type { NestedTypeNode, NumberTypeNode, OptionTypeNode, TypeNode } from '@codama/node-types';\n\nimport { numberTypeNode } from './NumberTypeNode';\n\nexport function optionTypeNode<\n    TItem extends TypeNode,\n    TPrefix extends NestedTypeNode<NumberTypeNode> = NumberTypeNode<'u8'>,\n>(\n    item: TItem,\n    options: {\n        readonly fixed?: boolean;\n        readonly prefix?: TPrefix;\n    } = {},\n): OptionTypeNode<TItem, TPrefix> {\n    return Object.freeze({\n        kind: 'optionTypeNode',\n\n        // Data.\n        fixed: options.fixed ?? false,\n\n        // Children.\n        item,\n        prefix: (options.prefix ?? numberTypeNode('u8')) as TPrefix,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/PostOffsetTypeNode.ts",
    "content": "import type { PostOffsetTypeNode, TypeNode } from '@codama/node-types';\n\nexport function postOffsetTypeNode<TType extends TypeNode>(\n    type: TType,\n    offset: number,\n    strategy?: PostOffsetTypeNode['strategy'],\n): PostOffsetTypeNode<TType> {\n    return Object.freeze({\n        kind: 'postOffsetTypeNode',\n\n        // Data.\n        offset,\n        strategy: strategy ?? 'relative',\n\n        // Children.\n        type,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/PreOffsetTypeNode.ts",
    "content": "import type { PreOffsetTypeNode, TypeNode } from '@codama/node-types';\n\nexport function preOffsetTypeNode<TType extends TypeNode>(\n    type: TType,\n    offset: number,\n    strategy?: PreOffsetTypeNode['strategy'],\n): PreOffsetTypeNode<TType> {\n    return Object.freeze({\n        kind: 'preOffsetTypeNode',\n\n        // Data.\n        offset,\n        strategy: strategy ?? 'relative',\n\n        // Children.\n        type,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/PublicKeyTypeNode.ts",
    "content": "import type { PublicKeyTypeNode } from '@codama/node-types';\n\nexport function publicKeyTypeNode(): PublicKeyTypeNode {\n    return Object.freeze({ kind: 'publicKeyTypeNode' });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/RemainderOptionTypeNode.ts",
    "content": "import type { RemainderOptionTypeNode, TypeNode } from '@codama/node-types';\n\nexport function remainderOptionTypeNode<TItem extends TypeNode>(item: TItem): RemainderOptionTypeNode<TItem> {\n    return Object.freeze({\n        kind: 'remainderOptionTypeNode',\n\n        // Children.\n        item,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/SentinelTypeNode.ts",
    "content": "import type { ConstantValueNode, SentinelTypeNode, TypeNode } from '@codama/node-types';\n\nexport function sentinelTypeNode<TType extends TypeNode, TSentinel extends ConstantValueNode>(\n    type: TType,\n    sentinel: TSentinel,\n): SentinelTypeNode<TType, TSentinel> {\n    return Object.freeze({\n        kind: 'sentinelTypeNode',\n\n        // Children.\n        type,\n        sentinel,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/SetTypeNode.ts",
    "content": "import type { CountNode, SetTypeNode, TypeNode } from '@codama/node-types';\n\nexport function setTypeNode<TItem extends TypeNode, TCount extends CountNode>(\n    item: TItem,\n    count: TCount,\n): SetTypeNode<TItem, TCount> {\n    return Object.freeze({\n        kind: 'setTypeNode',\n\n        // Children.\n        item,\n        count,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/SizePrefixTypeNode.ts",
    "content": "import type { NestedTypeNode, NumberTypeNode, SizePrefixTypeNode, TypeNode } from '@codama/node-types';\n\nexport function sizePrefixTypeNode<\n    TType extends TypeNode = TypeNode,\n    TPrefix extends NestedTypeNode<NumberTypeNode> = NestedTypeNode<NumberTypeNode>,\n>(type: TType, prefix: TPrefix): SizePrefixTypeNode<TType, TPrefix> {\n    return Object.freeze({\n        kind: 'sizePrefixTypeNode',\n\n        // Children.\n        type,\n        prefix,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/SolAmountTypeNode.ts",
    "content": "import type { NestedTypeNode, NumberTypeNode, SolAmountTypeNode } from '@codama/node-types';\n\nexport function solAmountTypeNode<TNumber extends NestedTypeNode<NumberTypeNode>>(\n    number: TNumber,\n): SolAmountTypeNode<TNumber> {\n    return Object.freeze({\n        kind: 'solAmountTypeNode',\n\n        // Children.\n        number,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/StringTypeNode.ts",
    "content": "import type { BytesEncoding, StringTypeNode } from '@codama/node-types';\n\nexport function stringTypeNode<TEncoding extends BytesEncoding>(encoding: TEncoding): StringTypeNode<TEncoding> {\n    return Object.freeze({\n        kind: 'stringTypeNode',\n\n        // Data.\n        encoding,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/StructFieldTypeNode.ts",
    "content": "import type { StructFieldTypeNode, TypeNode, ValueNode } from '@codama/node-types';\n\nimport { camelCase, DocsInput, parseDocs } from '../shared';\n\nexport type StructFieldTypeNodeInput<\n    TType extends TypeNode = TypeNode,\n    TDefaultValue extends ValueNode | undefined = ValueNode | undefined,\n> = Omit<StructFieldTypeNode<TType, TDefaultValue>, 'docs' | 'kind' | 'name'> & {\n    readonly docs?: DocsInput;\n    readonly name: string;\n};\n\nexport function structFieldTypeNode<TType extends TypeNode, TDefaultValue extends ValueNode | undefined = undefined>(\n    input: StructFieldTypeNodeInput<TType, TDefaultValue>,\n): StructFieldTypeNode<TType, TDefaultValue> {\n    return Object.freeze({\n        kind: 'structFieldTypeNode',\n\n        // Data.\n        name: camelCase(input.name),\n        ...(input.defaultValueStrategy !== undefined && { defaultValueStrategy: input.defaultValueStrategy }),\n        docs: parseDocs(input.docs),\n\n        // Children.\n        type: input.type,\n        ...(input.defaultValue !== undefined && { defaultValue: input.defaultValue }),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/StructTypeNode.ts",
    "content": "import type { StructFieldTypeNode, StructTypeNode } from '@codama/node-types';\n\nexport function structTypeNode<const TFields extends StructFieldTypeNode[] = StructFieldTypeNode[]>(\n    fields: TFields,\n): StructTypeNode<TFields> {\n    return Object.freeze({\n        kind: 'structTypeNode',\n\n        // Children.\n        fields,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/TupleTypeNode.ts",
    "content": "import type { TupleTypeNode, TypeNode } from '@codama/node-types';\n\nexport function tupleTypeNode<const TItems extends TypeNode[] = TypeNode[]>(items: TItems): TupleTypeNode<TItems> {\n    return Object.freeze({\n        kind: 'tupleTypeNode',\n\n        // Children.\n        items,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/TypeNode.ts",
    "content": "// Standalone Type Node Registration.\nexport const STANDALONE_TYPE_NODE_KINDS = [\n    'amountTypeNode' as const,\n    'arrayTypeNode' as const,\n    'booleanTypeNode' as const,\n    'bytesTypeNode' as const,\n    'dateTimeTypeNode' as const,\n    'enumTypeNode' as const,\n    'fixedSizeTypeNode' as const,\n    'hiddenPrefixTypeNode' as const,\n    'hiddenSuffixTypeNode' as const,\n    'mapTypeNode' as const,\n    'numberTypeNode' as const,\n    'optionTypeNode' as const,\n    'postOffsetTypeNode' as const,\n    'preOffsetTypeNode' as const,\n    'publicKeyTypeNode' as const,\n    'remainderOptionTypeNode' as const,\n    'sentinelTypeNode' as const,\n    'setTypeNode' as const,\n    'sizePrefixTypeNode' as const,\n    'solAmountTypeNode' as const,\n    'stringTypeNode' as const,\n    'structTypeNode' as const,\n    'tupleTypeNode' as const,\n    'zeroableOptionTypeNode' as const,\n];\n\n// Type Node Registration.\nexport const REGISTERED_TYPE_NODE_KINDS = [\n    ...STANDALONE_TYPE_NODE_KINDS,\n    'structFieldTypeNode' as const,\n    'enumEmptyVariantTypeNode' as const,\n    'enumStructVariantTypeNode' as const,\n    'enumTupleVariantTypeNode' as const,\n];\n\n/**\n * Type Node Helpers.\n * This only includes type nodes that can be used as standalone types.\n * E.g. this excludes structFieldTypeNode, enumEmptyVariantTypeNode, etc.\n * It also includes the definedTypeLinkNode to compose types.\n */\nexport const TYPE_NODES = [...STANDALONE_TYPE_NODE_KINDS, 'definedTypeLinkNode' as const];\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/ZeroableOptionTypeNode.ts",
    "content": "import type { ConstantValueNode, TypeNode, ZeroableOptionTypeNode } from '@codama/node-types';\n\nexport function zeroableOptionTypeNode<TItem extends TypeNode, TZeroValue extends ConstantValueNode | undefined>(\n    item: TItem,\n    zeroValue?: TZeroValue,\n): ZeroableOptionTypeNode<TItem, TZeroValue> {\n    return Object.freeze({\n        kind: 'zeroableOptionTypeNode',\n\n        // Children.\n        item,\n        ...(zeroValue !== undefined && { zeroValue }),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/typeNodes/index.ts",
    "content": "export * from './AmountTypeNode';\nexport * from './ArrayTypeNode';\nexport * from './BooleanTypeNode';\nexport * from './BytesTypeNode';\nexport * from './DateTimeTypeNode';\nexport * from './EnumEmptyVariantTypeNode';\nexport * from './EnumStructVariantTypeNode';\nexport * from './EnumTupleVariantTypeNode';\nexport * from './EnumTypeNode';\nexport * from './EnumVariantTypeNode';\nexport * from './FixedSizeTypeNode';\nexport * from './HiddenPrefixTypeNode';\nexport * from './HiddenSuffixTypeNode';\nexport * from './MapTypeNode';\nexport * from './NestedTypeNode';\nexport * from './NumberTypeNode';\nexport * from './OptionTypeNode';\nexport * from './PostOffsetTypeNode';\nexport * from './PreOffsetTypeNode';\nexport * from './PublicKeyTypeNode';\nexport * from './RemainderOptionTypeNode';\nexport * from './SentinelTypeNode';\nexport * from './SetTypeNode';\nexport * from './SizePrefixTypeNode';\nexport * from './SolAmountTypeNode';\nexport * from './StringTypeNode';\nexport * from './StructFieldTypeNode';\nexport * from './StructTypeNode';\nexport * from './TupleTypeNode';\nexport * from './TypeNode';\nexport * from './ZeroableOptionTypeNode';\n"
  },
  {
    "path": "packages/nodes/src/types/global.d.ts",
    "content": "declare const __BROWSER__: boolean;\ndeclare const __ESM__: boolean;\ndeclare const __NODEJS__: boolean;\ndeclare const __REACTNATIVE__: boolean;\ndeclare const __TEST__: boolean;\ndeclare const __VERSION__: string;\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/ArrayValueNode.ts",
    "content": "import type { ArrayValueNode, ValueNode } from '@codama/node-types';\n\nexport function arrayValueNode<const TItems extends ValueNode[]>(items: TItems): ArrayValueNode<TItems> {\n    return Object.freeze({\n        kind: 'arrayValueNode',\n\n        // Children.\n        items,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/BooleanValueNode.ts",
    "content": "import { BooleanValueNode } from '@codama/node-types';\n\nexport function booleanValueNode(boolean: boolean): BooleanValueNode {\n    return Object.freeze({\n        kind: 'booleanValueNode',\n\n        // Data.\n        boolean,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/BytesValueNode.ts",
    "content": "import type { BytesEncoding, BytesValueNode } from '@codama/node-types';\n\nexport function bytesValueNode(encoding: BytesEncoding, data: string): BytesValueNode {\n    return Object.freeze({\n        kind: 'bytesValueNode',\n\n        // Data.\n        data,\n        encoding,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/ConstantValueNode.ts",
    "content": "import type { BytesEncoding, ConstantValueNode, TypeNode, ValueNode } from '@codama/node-types';\n\nimport { bytesTypeNode, stringTypeNode } from '../typeNodes';\nimport { bytesValueNode } from './BytesValueNode';\nimport { stringValueNode } from './StringValueNode';\n\nexport function constantValueNode<TType extends TypeNode, TValue extends ValueNode>(\n    type: TType,\n    value: TValue,\n): ConstantValueNode<TType, TValue> {\n    return Object.freeze({\n        kind: 'constantValueNode',\n\n        // Children.\n        type,\n        value,\n    });\n}\n\nexport function constantValueNodeFromString<TEncoding extends BytesEncoding>(encoding: TEncoding, string: string) {\n    return constantValueNode(stringTypeNode(encoding), stringValueNode(string));\n}\n\nexport function constantValueNodeFromBytes<TEncoding extends BytesEncoding>(encoding: TEncoding, data: string) {\n    return constantValueNode(bytesTypeNode(), bytesValueNode(encoding, data));\n}\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/EnumValueNode.ts",
    "content": "import type { DefinedTypeLinkNode, EnumValueNode, StructValueNode, TupleValueNode } from '@codama/node-types';\n\nimport { definedTypeLinkNode } from '../linkNodes';\nimport { camelCase } from '../shared';\n\nexport function enumValueNode<\n    TEnum extends DefinedTypeLinkNode = DefinedTypeLinkNode,\n    TValue extends StructValueNode | TupleValueNode | undefined = undefined,\n>(enumLink: TEnum | string, variant: string, value?: TValue): EnumValueNode<TEnum, TValue> {\n    return Object.freeze({\n        kind: 'enumValueNode',\n\n        // Data.\n        variant: camelCase(variant),\n\n        // Children.\n        enum: (typeof enumLink === 'string' ? definedTypeLinkNode(enumLink) : enumLink) as TEnum,\n        ...(value !== undefined && { value }),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/MapEntryValueNode.ts",
    "content": "import type { MapEntryValueNode, ValueNode } from '@codama/node-types';\n\nexport function mapEntryValueNode<TKey extends ValueNode, TValue extends ValueNode>(\n    key: TKey,\n    value: TValue,\n): MapEntryValueNode<TKey, TValue> {\n    return Object.freeze({\n        kind: 'mapEntryValueNode',\n\n        // Children.\n        key,\n        value,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/MapValueNode.ts",
    "content": "import type { MapEntryValueNode, MapValueNode } from '@codama/node-types';\n\nexport function mapValueNode<const TEntries extends MapEntryValueNode[]>(entries: TEntries): MapValueNode<TEntries> {\n    return Object.freeze({\n        kind: 'mapValueNode',\n\n        // Children.\n        entries,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/NoneValueNode.ts",
    "content": "import type { NoneValueNode } from '@codama/node-types';\n\nexport function noneValueNode(): NoneValueNode {\n    return Object.freeze({ kind: 'noneValueNode' });\n}\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/NumberValueNode.ts",
    "content": "import type { NumberValueNode } from '@codama/node-types';\n\nexport function numberValueNode(number: number): NumberValueNode {\n    return Object.freeze({\n        kind: 'numberValueNode',\n\n        // Data.\n        number,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/PublicKeyValueNode.ts",
    "content": "import type { PublicKeyValueNode } from '@codama/node-types';\n\nimport { camelCase } from '../shared';\n\nexport function publicKeyValueNode(publicKey: string, identifier?: string): PublicKeyValueNode {\n    return Object.freeze({\n        kind: 'publicKeyValueNode',\n\n        // Data.\n        publicKey,\n        ...(identifier !== undefined && { identifier: camelCase(identifier) }),\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/SetValueNode.ts",
    "content": "import type { SetValueNode, ValueNode } from '@codama/node-types';\n\nexport function setValueNode<const TItems extends ValueNode[]>(items: TItems): SetValueNode<TItems> {\n    return Object.freeze({\n        kind: 'setValueNode',\n\n        // Children.\n        items,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/SomeValueNode.ts",
    "content": "import type { SomeValueNode, ValueNode } from '@codama/node-types';\n\nexport function someValueNode<TValue extends ValueNode>(value: TValue): SomeValueNode<TValue> {\n    return Object.freeze({\n        kind: 'someValueNode',\n\n        // Children.\n        value,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/StringValueNode.ts",
    "content": "import type { StringValueNode } from '@codama/node-types';\n\nexport function stringValueNode(string: string): StringValueNode {\n    return Object.freeze({\n        kind: 'stringValueNode',\n\n        // Data.\n        string,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/StructFieldValueNode.ts",
    "content": "import type { StructFieldValueNode, ValueNode } from '@codama/node-types';\n\nimport { camelCase } from '../shared';\n\nexport function structFieldValueNode<TValue extends ValueNode>(\n    name: string,\n    value: TValue,\n): StructFieldValueNode<TValue> {\n    return Object.freeze({\n        kind: 'structFieldValueNode',\n\n        // Data.\n        name: camelCase(name),\n\n        // Children.\n        value,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/StructValueNode.ts",
    "content": "import type { StructFieldValueNode, StructValueNode } from '@codama/node-types';\n\nexport function structValueNode<const TFields extends StructFieldValueNode[]>(\n    fields: TFields,\n): StructValueNode<TFields> {\n    return Object.freeze({\n        kind: 'structValueNode',\n\n        // Children.\n        fields,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/TupleValueNode.ts",
    "content": "import type { TupleValueNode, ValueNode } from '@codama/node-types';\n\nexport function tupleValueNode<const TItems extends ValueNode[]>(items: TItems): TupleValueNode<TItems> {\n    return Object.freeze({\n        kind: 'tupleValueNode',\n\n        // Children.\n        items,\n    });\n}\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/ValueNode.ts",
    "content": "// Standalone Value Node Registration.\nexport const STANDALONE_VALUE_NODE_KINDS = [\n    'arrayValueNode' as const,\n    'bytesValueNode' as const,\n    'booleanValueNode' as const,\n    'constantValueNode' as const,\n    'enumValueNode' as const,\n    'mapValueNode' as const,\n    'noneValueNode' as const,\n    'numberValueNode' as const,\n    'setValueNode' as const,\n    'someValueNode' as const,\n    'structValueNode' as const,\n    'tupleValueNode' as const,\n    'publicKeyValueNode' as const,\n    'stringValueNode' as const,\n];\n\n// Value Node Registration.\nexport const REGISTERED_VALUE_NODE_KINDS = [\n    ...STANDALONE_VALUE_NODE_KINDS,\n    'mapEntryValueNode' as const,\n    'structFieldValueNode' as const,\n];\n\n// Value Node Helpers.\nexport const VALUE_NODES = STANDALONE_VALUE_NODE_KINDS;\n"
  },
  {
    "path": "packages/nodes/src/valueNodes/index.ts",
    "content": "export * from './ArrayValueNode';\nexport * from './BooleanValueNode';\nexport * from './BytesValueNode';\nexport * from './ConstantValueNode';\nexport * from './EnumValueNode';\nexport * from './MapEntryValueNode';\nexport * from './MapValueNode';\nexport * from './NoneValueNode';\nexport * from './NumberValueNode';\nexport * from './PublicKeyValueNode';\nexport * from './SetValueNode';\nexport * from './SomeValueNode';\nexport * from './StringValueNode';\nexport * from './StructFieldValueNode';\nexport * from './StructValueNode';\nexport * from './TupleValueNode';\nexport * from './ValueNode';\n"
  },
  {
    "path": "packages/nodes/test/AccountNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { accountNode } from '../src';\n\ntest('it returns the right node kind', () => {\n    const node = accountNode({ name: 'foo' });\n    expect(node.kind).toBe('accountNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = accountNode({ name: 'foo' });\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/DefinedTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { definedTypeNode, structTypeNode } from '../src';\n\ntest('it returns the right node kind', () => {\n    const node = definedTypeNode({ name: 'foo', type: structTypeNode([]) });\n    expect(node.kind).toBe('definedTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = definedTypeNode({ name: 'foo', type: structTypeNode([]) });\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/ErrorNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { errorNode } from '../src';\n\ntest('it returns the right node kind', () => {\n    const node = errorNode({ name: 'foo', code: 42, message: 'error message' });\n    expect(node.kind).toBe('errorNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = errorNode({ name: 'foo', code: 42, message: 'error message' });\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/EventNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { structTypeNode } from '../src';\nimport { eventNode } from '../src';\n\ntest('it returns the right node kind', () => {\n    const node = eventNode({ data: structTypeNode([]), name: 'foo' });\n    expect(node.kind).toBe('eventNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = eventNode({ data: structTypeNode([]), name: 'foo' });\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/InstructionAccountNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { instructionAccountNode } from '../src';\n\ntest('it returns the right node kind', () => {\n    const node = instructionAccountNode({ name: 'foo', isSigner: false, isWritable: false });\n    expect(node.kind).toBe('instructionAccountNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = instructionAccountNode({ name: 'foo', isSigner: false, isWritable: false });\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/InstructionArgumentNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { instructionArgumentNode, structTypeNode } from '../src';\n\ntest('it returns the right node kind', () => {\n    const node = instructionArgumentNode({ name: 'foo', type: structTypeNode([]) });\n    expect(node.kind).toBe('instructionArgumentNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = instructionArgumentNode({ name: 'foo', type: structTypeNode([]) });\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/InstructionByteDeltaNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { instructionByteDeltaNode, numberValueNode } from '../src';\n\ntest('it returns the right node kind', () => {\n    const node = instructionByteDeltaNode(numberValueNode(42));\n    expect(node.kind).toBe('instructionByteDeltaNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = instructionByteDeltaNode(numberValueNode(42));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/InstructionNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { instructionNode, instructionStatusNode } from '../src';\n\ntest('it returns the right node kind', () => {\n    const node = instructionNode({ name: 'foo' });\n    expect(node.kind).toBe('instructionNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = instructionNode({ name: 'foo' });\n    expect(Object.isFrozen(node)).toBe(true);\n});\n\ntest('it defaults to no status', () => {\n    const node = instructionNode({ name: 'foo' });\n    expect(node.status).toBeUndefined();\n});\n\ntest('it can have a live status', () => {\n    const statusMode = instructionStatusNode('live');\n    const node = instructionNode({ name: 'foo', status: statusMode });\n    expect(node.status).toBe(statusMode);\n    expect(node.status?.lifecycle).toBe('live');\n});\n\ntest('it can have a deprecated status with message', () => {\n    const statusMode = instructionStatusNode('deprecated', 'Use the newFoo instruction instead.');\n    const node = instructionNode({ name: 'foo', status: statusMode });\n    expect(node.status).toBe(statusMode);\n    expect(node.status?.lifecycle).toBe('deprecated');\n    expect(node.status?.message).toBe('Use the newFoo instruction instead.');\n});\n\ntest('it can have an archived status with message', () => {\n    const statusMode = instructionStatusNode('archived', 'This instruction was removed in v2.0.0.');\n    const node = instructionNode({ name: 'foo', status: statusMode });\n    expect(node.status).toBe(statusMode);\n    expect(node.status?.lifecycle).toBe('archived');\n    expect(node.status?.message).toBe('This instruction was removed in v2.0.0.');\n});\n\ntest('it can have a draft status with message', () => {\n    const statusMode = instructionStatusNode('draft', 'This instruction is under development.');\n    const node = instructionNode({ name: 'foo', status: statusMode });\n    expect(node.status).toBe(statusMode);\n    expect(node.status?.lifecycle).toBe('draft');\n    expect(node.status?.message).toBe('This instruction is under development.');\n});\n\ntest('it can have a status without a message', () => {\n    const statusMode = instructionStatusNode('deprecated');\n    const node = instructionNode({ name: 'foo', status: statusMode });\n    expect(node.status).toBe(statusMode);\n    expect(node.status?.lifecycle).toBe('deprecated');\n    expect(node.status?.message).toBeUndefined();\n});\n\ntest('it can have an empty message', () => {\n    const statusMode = instructionStatusNode('deprecated', '');\n    const node = instructionNode({ name: 'foo', status: statusMode });\n    expect(node.status).toBe(statusMode);\n    expect(node.status?.lifecycle).toBe('deprecated');\n    expect(node.status?.message).toBe('');\n});\n"
  },
  {
    "path": "packages/nodes/test/InstructionRemainingAccountsNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { argumentValueNode, instructionRemainingAccountsNode } from '../src';\n\ntest('it returns the right node kind', () => {\n    const node = instructionRemainingAccountsNode(argumentValueNode('foo'));\n    expect(node.kind).toBe('instructionRemainingAccountsNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = instructionRemainingAccountsNode(argumentValueNode('foo'));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/InstructionStatusNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { instructionStatusNode } from '../src';\n\ntest('it returns the right node kind', () => {\n    const node = instructionStatusNode('live');\n    expect(node.kind).toBe('instructionStatusNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = instructionStatusNode('live');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n\ntest('it can have a status with message', () => {\n    const node = instructionStatusNode('deprecated', 'Use newInstruction');\n    expect(node.lifecycle).toBe('deprecated');\n    expect(node.message).toBe('Use newInstruction');\n});\n\ntest('it can have a status without message', () => {\n    const node = instructionStatusNode('archived');\n    expect(node.lifecycle).toBe('archived');\n    expect(node.message).toBeUndefined();\n});\n"
  },
  {
    "path": "packages/nodes/test/Node.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport {\n    assertIsNode,\n    assertIsNodeFilter,\n    isNode,\n    isNodeFilter,\n    numberTypeNode,\n    publicKeyTypeNode,\n    removeNullAndAssertIsNodeFilter,\n    tupleTypeNode,\n} from '../src';\n\ndescribe('isNode', () => {\n    test('it checks if a given node is of the given kind', () => {\n        expect(isNode(tupleTypeNode([]), 'tupleTypeNode')).toBe(true);\n        expect(isNode(publicKeyTypeNode(), 'tupleTypeNode')).toBe(false);\n        expect(isNode(null, 'tupleTypeNode')).toBe(false);\n    });\n\n    test('it checks if a given node is part of the given kinds', () => {\n        expect(isNode(tupleTypeNode([]), ['tupleTypeNode', 'publicKeyTypeNode'])).toBe(true);\n        expect(isNode(publicKeyTypeNode(), ['tupleTypeNode', 'publicKeyTypeNode'])).toBe(true);\n        expect(isNode(numberTypeNode('u8'), ['tupleTypeNode', 'publicKeyTypeNode'])).toBe(false);\n        expect(isNode(null, ['tupleTypeNode', 'publicKeyTypeNode'])).toBe(false);\n    });\n});\n\ndescribe('assertIsNode', () => {\n    test('it asserts that a given node is of the given kind', () => {\n        expect(() => assertIsNode(tupleTypeNode([]), 'tupleTypeNode')).not.toThrow();\n        expect(() => assertIsNode(publicKeyTypeNode(), 'tupleTypeNode')).toThrowError(\n            'Expected node of kind [tupleTypeNode], got [publicKeyTypeNode].',\n        );\n        expect(() => assertIsNode(null, 'tupleTypeNode')).toThrowError(\n            'Expected node of kind [tupleTypeNode], got [null].',\n        );\n    });\n\n    test('it asserts that a given node is part of the given kinds', () => {\n        expect(() => assertIsNode(tupleTypeNode([]), ['tupleTypeNode', 'publicKeyTypeNode'])).not.toThrow();\n        expect(() => assertIsNode(publicKeyTypeNode(), ['tupleTypeNode', 'publicKeyTypeNode'])).not.toThrow();\n        expect(() => assertIsNode(numberTypeNode('u8'), ['tupleTypeNode', 'publicKeyTypeNode'])).toThrowError(\n            'Expected node of kind [tupleTypeNode,publicKeyTypeNode], got [numberTypeNode].',\n        );\n        expect(() => assertIsNode(null, ['tupleTypeNode', 'publicKeyTypeNode'])).toThrowError(\n            'Expected node of kind [tupleTypeNode,publicKeyTypeNode], got [null].',\n        );\n    });\n});\n\ndescribe('isNodeFilter', () => {\n    test('it returns a callback that checks the node is of the given kind', () => {\n        const filter = isNodeFilter('tupleTypeNode');\n        expect(filter(tupleTypeNode([]))).toBe(true);\n        expect(filter(publicKeyTypeNode())).toBe(false);\n        expect(filter(null)).toBe(false);\n    });\n\n    test('it returns a callback that checks the node is part of the given kinds', () => {\n        const filter = isNodeFilter(['tupleTypeNode', 'publicKeyTypeNode']);\n        expect(filter(tupleTypeNode([]))).toBe(true);\n        expect(filter(publicKeyTypeNode())).toBe(true);\n        expect(filter(numberTypeNode('u8'))).toBe(false);\n        expect(filter(null)).toBe(false);\n    });\n});\n\ndescribe('assertIsNodeFilter', () => {\n    test('it returns a callback that asserts the node is of the given kind', () => {\n        const filter = assertIsNodeFilter('tupleTypeNode');\n        expect(() => filter(tupleTypeNode([]))).not.toThrow();\n        expect(() => filter(publicKeyTypeNode())).toThrowError(\n            'Expected node of kind [tupleTypeNode], got [publicKeyTypeNode].',\n        );\n        expect(() => filter(null)).toThrowError('Expected node of kind [tupleTypeNode], got [null].');\n    });\n\n    test('it returns a callback that asserts the node is part of the given kinds', () => {\n        const filter = assertIsNodeFilter(['tupleTypeNode', 'publicKeyTypeNode']);\n        expect(() => filter(tupleTypeNode([]))).not.toThrow();\n        expect(() => filter(publicKeyTypeNode())).not.toThrow();\n        expect(() => filter(numberTypeNode('u8'))).toThrowError(\n            'Expected node of kind [tupleTypeNode,publicKeyTypeNode], got [numberTypeNode].',\n        );\n        expect(() => filter(null)).toThrowError('Expected node of kind [tupleTypeNode,publicKeyTypeNode], got [null].');\n    });\n});\n\ndescribe('removeNullAndAssertIsNodeFilter', () => {\n    test('it returns a callback that filters out null values and asserts the node is of the given kind', () => {\n        const filter = removeNullAndAssertIsNodeFilter('tupleTypeNode');\n        expect([tupleTypeNode([]), null].filter(filter)).toEqual([tupleTypeNode([])]);\n        expect(() => [tupleTypeNode([]), publicKeyTypeNode(), null].filter(filter)).toThrowError(\n            'Expected node of kind [tupleTypeNode], got [publicKeyTypeNode].',\n        );\n    });\n\n    test('it returns a callback that filters out null values and asserts the node is part of the given kinds', () => {\n        const filter = removeNullAndAssertIsNodeFilter(['tupleTypeNode', 'publicKeyTypeNode']);\n        expect([tupleTypeNode([]), publicKeyTypeNode(), null].filter(filter)).toEqual([\n            tupleTypeNode([]),\n            publicKeyTypeNode(),\n        ]);\n        expect(() => [tupleTypeNode([]), numberTypeNode('u8'), null].filter(filter)).toThrowError(\n            'Expected node of kind [tupleTypeNode,publicKeyTypeNode], got [numberTypeNode].',\n        );\n    });\n});\n"
  },
  {
    "path": "packages/nodes/test/Node.typetest.ts",
    "content": "import type { Node, PublicKeyTypeNode, TupleTypeNode } from '@codama/node-types';\n\nimport {\n    assertIsNode,\n    assertIsNodeFilter,\n    isNode,\n    isNodeFilter,\n    REGISTERED_NODE_KINDS,\n    removeNullAndAssertIsNodeFilter,\n} from '../src';\n\n// [DESCRIBE] Registered node kinds.\n{\n    // It matches exactly with Node['kind'].\n    {\n        REGISTERED_NODE_KINDS satisfies readonly Node['kind'][];\n        null as unknown as Node['kind'] satisfies (typeof REGISTERED_NODE_KINDS)[number];\n    }\n}\n\n// [DESCRIBE] isNode.\n{\n    // It narrows the type of a node to the given kind.\n    {\n        const node = {} as Node | null;\n        if (isNode(node, 'tupleTypeNode')) {\n            node satisfies TupleTypeNode;\n            // @ts-expect-error Expected TupleTypeNode.\n            node satisfies PublicKeyTypeNode;\n        }\n    }\n\n    // It narrows the type of a node to union of the given kinds.\n    {\n        const node = {} as Node | null;\n        if (isNode(node, ['tupleTypeNode', 'publicKeyTypeNode'])) {\n            node satisfies PublicKeyTypeNode | TupleTypeNode;\n            // @ts-expect-error Expected PublicKeyTypeNode | TupleTypeNode.\n            node satisfies TupleTypeNode;\n            // @ts-expect-error Expected PublicKeyTypeNode | TupleTypeNode.\n            node satisfies PublicKeyTypeNode;\n        }\n    }\n}\n\n// [DESCRIBE] assertIsNode.\n{\n    // It narrows the type of a node to the given kind.\n    {\n        const node = {} as Node | null;\n        assertIsNode(node, 'tupleTypeNode');\n        node satisfies TupleTypeNode;\n        // @ts-expect-error Expected TupleTypeNode.\n        node satisfies PublicKeyTypeNode;\n    }\n\n    // It narrows the type of a node to union of the given kinds.\n    {\n        const node = {} as Node | null;\n        assertIsNode(node, ['tupleTypeNode', 'publicKeyTypeNode']);\n        node satisfies PublicKeyTypeNode | TupleTypeNode;\n        // @ts-expect-error Expected PublicKeyTypeNode | TupleTypeNode.\n        node satisfies TupleTypeNode;\n        // @ts-expect-error Expected PublicKeyTypeNode | TupleTypeNode.\n        node satisfies PublicKeyTypeNode;\n    }\n}\n\n// [DESCRIBE] isNodeFilter.\n{\n    // It narrows the type of an array of nodes to the given kind.\n    {\n        const nodes = ([] as (Node | null)[]).filter(isNodeFilter('tupleTypeNode'));\n        nodes satisfies TupleTypeNode[];\n        // @ts-expect-error Expected TupleTypeNode.\n        nodes satisfies PublicKeyTypeNode[];\n    }\n\n    // It narrows the type of an array of nodes to union of the given kinds.\n    {\n        const nodes = ([] as (Node | null)[]).filter(isNodeFilter(['tupleTypeNode', 'publicKeyTypeNode']));\n        nodes satisfies (PublicKeyTypeNode | TupleTypeNode)[];\n        // @ts-expect-error Expected PublicKeyTypeNode | TupleTypeNode.\n        nodes satisfies TupleTypeNode[];\n        // @ts-expect-error Expected PublicKeyTypeNode | TupleTypeNode.\n        nodes satisfies PublicKeyTypeNode[];\n    }\n}\n\n// [DESCRIBE] assertIsNodeFilter.\n{\n    // It narrows the type of an array of nodes to the given kind.\n    {\n        const nodes = ([] as (Node | null)[]).filter(assertIsNodeFilter('tupleTypeNode'));\n        nodes satisfies TupleTypeNode[];\n        // @ts-expect-error Expected TupleTypeNode.\n        nodes satisfies PublicKeyTypeNode[];\n    }\n\n    // It narrows the type of an array of nodes to union of the given kinds.\n    {\n        const nodes = ([] as (Node | null)[]).filter(assertIsNodeFilter(['tupleTypeNode', 'publicKeyTypeNode']));\n        nodes satisfies (PublicKeyTypeNode | TupleTypeNode)[];\n        // @ts-expect-error Expected PublicKeyTypeNode | TupleTypeNode.\n        nodes satisfies TupleTypeNode[];\n        // @ts-expect-error Expected PublicKeyTypeNode | TupleTypeNode.\n        nodes satisfies PublicKeyTypeNode[];\n    }\n}\n\n// [DESCRIBE] removeNullAndAssertIsNodeFilter.\n{\n    // It narrows the type of an array of nodes to the given kind.\n    {\n        const nodes = ([] as (Node | null)[]).filter(removeNullAndAssertIsNodeFilter('tupleTypeNode'));\n        nodes satisfies TupleTypeNode[];\n        // @ts-expect-error Expected TupleTypeNode[]\n        nodes satisfies PublicKeyTypeNode[];\n    }\n\n    // It narrows the type of an array of nodes to union of the given kinds.\n    {\n        const nodes = ([] as (Node | null)[]).filter(\n            removeNullAndAssertIsNodeFilter(['tupleTypeNode', 'publicKeyTypeNode']),\n        );\n        nodes satisfies (PublicKeyTypeNode | TupleTypeNode)[];\n        // @ts-expect-error Expected (PublicKeyTypeNode | TupleTypeNode)[]\n        nodes satisfies TupleTypeNode[];\n        // @ts-expect-error Expected (PublicKeyTypeNode | TupleTypeNode)[]\n        nodes satisfies PublicKeyTypeNode[];\n    }\n}\n"
  },
  {
    "path": "packages/nodes/test/PdaNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { pdaNode } from '../src';\n\ntest('it returns the right node kind', () => {\n    const node = pdaNode({ name: 'foo', seeds: [] });\n    expect(node.kind).toBe('pdaNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = pdaNode({ name: 'foo', seeds: [] });\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/ProgramNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { programNode } from '../src';\n\ntest('it returns the right node kind', () => {\n    const node = programNode({ name: 'foo', publicKey: '1111' });\n    expect(node.kind).toBe('programNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = programNode({ name: 'foo', publicKey: '1111' });\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/RootNode.test.ts",
    "content": "import type { CodamaVersion } from '@codama/node-types';\nimport { expect, expectTypeOf, test } from 'vitest';\n\nimport { programNode, rootNode } from '../src';\n\ntest('it returns the right node kind', () => {\n    const root = rootNode(programNode({ name: 'foo', publicKey: '1111' }));\n    expect(root.kind).toBe('rootNode');\n});\n\ntest('it returns the right Codama standard', () => {\n    const root = rootNode(programNode({ name: 'foo', publicKey: '1111' }));\n    expect(root.standard).toBe('codama');\n});\n\ntest('it returns the right Codama version', () => {\n    const root = rootNode(programNode({ name: 'foo', publicKey: '1111' }));\n    expect(root.version).toBe(__VERSION__);\n    expectTypeOf(root.version).toMatchTypeOf<CodamaVersion>();\n});\n\ntest('it returns a frozen object', () => {\n    const root = rootNode(programNode({ name: 'foo', publicKey: '1111' }));\n    expect(Object.isFrozen(root)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/contextualValueNodes/AccountBumpValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { accountBumpValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = accountBumpValueNode('associatedToken');\n    expect(node.kind).toBe('accountBumpValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = accountBumpValueNode('associatedToken');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/contextualValueNodes/AccountValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { accountValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = accountValueNode('mint');\n    expect(node.kind).toBe('accountValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = accountValueNode('mint');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/contextualValueNodes/ArgumentValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { argumentValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = argumentValueNode('space');\n    expect(node.kind).toBe('argumentValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = argumentValueNode('space');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/contextualValueNodes/ConditionalValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { accountValueNode, argumentValueNode, conditionalValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = conditionalValueNode({ condition: accountValueNode('token'), ifTrue: argumentValueNode('space') });\n    expect(node.kind).toBe('conditionalValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = conditionalValueNode({ condition: accountValueNode('token'), ifTrue: argumentValueNode('space') });\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/contextualValueNodes/ContextualValueNode.typetest.ts",
    "content": "import type { RegisteredContextualValueNode } from '@codama/node-types';\n\nimport { REGISTERED_CONTEXTUAL_VALUE_NODE_KINDS } from '../../src';\n\n// [DESCRIBE] Registered contextual value node kinds.\n{\n    // It matches exactly with RegisteredContextualValueNode['kind'].\n    {\n        REGISTERED_CONTEXTUAL_VALUE_NODE_KINDS satisfies readonly RegisteredContextualValueNode['kind'][];\n        null as unknown as RegisteredContextualValueNode['kind'] satisfies (typeof REGISTERED_CONTEXTUAL_VALUE_NODE_KINDS)[number];\n    }\n}\n"
  },
  {
    "path": "packages/nodes/test/contextualValueNodes/IdentityValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { identityValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = identityValueNode();\n    expect(node.kind).toBe('identityValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = identityValueNode();\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/contextualValueNodes/PayerValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { payerValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = payerValueNode();\n    expect(node.kind).toBe('payerValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = payerValueNode();\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/contextualValueNodes/PdaSeedValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { accountValueNode, pdaSeedValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = pdaSeedValueNode('token', accountValueNode('token'));\n    expect(node.kind).toBe('pdaSeedValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = pdaSeedValueNode('token', accountValueNode('token'));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/contextualValueNodes/PdaValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { pdaValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = pdaValueNode('associatedToken', []);\n    expect(node.kind).toBe('pdaValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = pdaValueNode('associatedToken', []);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/contextualValueNodes/ProgramIdValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { programIdValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = programIdValueNode();\n    expect(node.kind).toBe('programIdValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = programIdValueNode();\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/contextualValueNodes/ResolverValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { resolverValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = resolverValueNode('foo');\n    expect(node.kind).toBe('resolverValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = resolverValueNode('foo');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/countNodes/CountNode.typetest.ts",
    "content": "import type { RegisteredCountNode } from '@codama/node-types';\n\nimport { REGISTERED_COUNT_NODE_KINDS } from '../../src';\n\n// [DESCRIBE] Registered count node kinds.\n{\n    // It matches exactly with RegisteredCountNode['kind'].\n    {\n        REGISTERED_COUNT_NODE_KINDS satisfies readonly RegisteredCountNode['kind'][];\n        null as unknown as RegisteredCountNode['kind'] satisfies (typeof REGISTERED_COUNT_NODE_KINDS)[number];\n    }\n}\n"
  },
  {
    "path": "packages/nodes/test/countNodes/FixedCountNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { fixedCountNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = fixedCountNode(42);\n    expect(node.kind).toBe('fixedCountNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = fixedCountNode(42);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/countNodes/PrefixedCountNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { numberTypeNode, prefixedCountNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = prefixedCountNode(numberTypeNode('u32'));\n    expect(node.kind).toBe('prefixedCountNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = prefixedCountNode(numberTypeNode('u32'));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/countNodes/RemainderCountNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { remainderCountNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = remainderCountNode();\n    expect(node.kind).toBe('remainderCountNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = remainderCountNode();\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/discriminatorNodes/ConstantDiscriminatorNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { constantDiscriminatorNode, constantValueNodeFromBytes } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = constantDiscriminatorNode(constantValueNodeFromBytes('base16', 'aabbccdd'));\n    expect(node.kind).toBe('constantDiscriminatorNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = constantDiscriminatorNode(constantValueNodeFromBytes('base16', 'aabbccdd'));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/discriminatorNodes/DiscriminatorNode.typetest.ts",
    "content": "import type { RegisteredDiscriminatorNode } from '@codama/node-types';\n\nimport { REGISTERED_DISCRIMINATOR_NODE_KINDS } from '../../src';\n\n// [DESCRIBE] Registered discriminator node kinds.\n{\n    // It matches exactly with RegisteredDiscriminatorNode['kind'].\n    {\n        REGISTERED_DISCRIMINATOR_NODE_KINDS satisfies readonly RegisteredDiscriminatorNode['kind'][];\n        null as unknown as RegisteredDiscriminatorNode['kind'] satisfies (typeof REGISTERED_DISCRIMINATOR_NODE_KINDS)[number];\n    }\n}\n"
  },
  {
    "path": "packages/nodes/test/discriminatorNodes/FieldDiscriminatorNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { fieldDiscriminatorNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = fieldDiscriminatorNode('discriminator');\n    expect(node.kind).toBe('fieldDiscriminatorNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = fieldDiscriminatorNode('discriminator');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/discriminatorNodes/SizeDiscriminatorNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { sizeDiscriminatorNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = sizeDiscriminatorNode(42);\n    expect(node.kind).toBe('sizeDiscriminatorNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = sizeDiscriminatorNode(42);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/linkNodes/AccountLinkNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { accountLinkNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = accountLinkNode('token');\n    expect(node.kind).toBe('accountLinkNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = accountLinkNode('token');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/linkNodes/DefinedTypeLinkNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { definedTypeLinkNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = definedTypeLinkNode('config');\n    expect(node.kind).toBe('definedTypeLinkNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = definedTypeLinkNode('config');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/linkNodes/InstructionAccountLinkNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { instructionAccountLinkNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = instructionAccountLinkNode('mint');\n    expect(node.kind).toBe('instructionAccountLinkNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = instructionAccountLinkNode('mint');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/linkNodes/InstructionArgumentLinkNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { instructionArgumentLinkNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = instructionArgumentLinkNode('amount');\n    expect(node.kind).toBe('instructionArgumentLinkNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = instructionArgumentLinkNode('amount');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/linkNodes/InstructionLinkNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { instructionLinkNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = instructionLinkNode('transferTokens');\n    expect(node.kind).toBe('instructionLinkNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = instructionLinkNode('transferTokens');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/linkNodes/LinkNode.typetest.ts",
    "content": "import type { RegisteredLinkNode } from '@codama/node-types';\n\nimport { REGISTERED_LINK_NODE_KINDS } from '../../src';\n\n// [DESCRIBE] Registered link node kinds.\n{\n    // It matches exactly with RegisteredLinkNode['kind'].\n    {\n        REGISTERED_LINK_NODE_KINDS satisfies readonly RegisteredLinkNode['kind'][];\n        null as unknown as RegisteredLinkNode['kind'] satisfies (typeof REGISTERED_LINK_NODE_KINDS)[number];\n    }\n}\n"
  },
  {
    "path": "packages/nodes/test/linkNodes/PdaLinkNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { pdaLinkNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = pdaLinkNode('associatedToken');\n    expect(node.kind).toBe('pdaLinkNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = pdaLinkNode('associatedToken');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/linkNodes/ProgramLinkNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { programLinkNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = programLinkNode('system');\n    expect(node.kind).toBe('programLinkNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = programLinkNode('system');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/pdaSeedNodes/ConstantPdaSeedNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { constantPdaSeedNode, numberTypeNode, numberValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = constantPdaSeedNode(numberTypeNode('u64'), numberValueNode(42));\n    expect(node.kind).toBe('constantPdaSeedNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = constantPdaSeedNode(numberTypeNode('u64'), numberValueNode(42));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/pdaSeedNodes/PdaSeedNode.typetest.ts",
    "content": "import type { RegisteredPdaSeedNode } from '@codama/node-types';\n\nimport { REGISTERED_PDA_SEED_NODE_KINDS } from '../../src';\n\n// [DESCRIBE] Registered pda seed node kinds.\n{\n    // It matches exactly with RegisteredPdaSeedNode['kind'].\n    {\n        REGISTERED_PDA_SEED_NODE_KINDS satisfies readonly RegisteredPdaSeedNode['kind'][];\n        null as unknown as RegisteredPdaSeedNode['kind'] satisfies (typeof REGISTERED_PDA_SEED_NODE_KINDS)[number];\n    }\n}\n"
  },
  {
    "path": "packages/nodes/test/pdaSeedNodes/VariablePdaSeedNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { numberTypeNode, variablePdaSeedNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = variablePdaSeedNode('edition', numberTypeNode('u64'));\n    expect(node.kind).toBe('variablePdaSeedNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = variablePdaSeedNode('edition', numberTypeNode('u64'));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/shared/stringCases.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { camelCase, snakeCase, titleCase } from '../../src';\n\ndescribe('snakeCase', () => {\n    test('casing', () => {\n        expect(snakeCase('lowercased')).toBe('lowercased');\n        expect(snakeCase('UPPERCASED')).toBe('u_p_p_e_r_c_a_s_e_d');\n        expect(snakeCase('Capitalized')).toBe('capitalized');\n    });\n    test('numbers', () => {\n        expect(snakeCase('1before after2 bet3ween')).toBe('1before_after2_bet3ween');\n        expect(snakeCase('50m3 1 2 3 numb3rs 8 3v3rywh3r3 9')).toBe('50m3_1_2_3_numb3rs_8_3v3rywh3r3_9');\n        expect(snakeCase(snakeCase('50m3 1 2 3 numb3rs 8 3v3rywh3r3 9'))).toBe('50m3_1_2_3_numb3rs_8_3v3rywh3r3_9');\n    });\n    test('special characters', () => {\n        expect(snakeCase('some::special\\\\\\\\chars+++in=between')).toBe('some_special_chars_in_between');\n        expect(snakeCase('$peçia!::ch*rs')).toBe('pe_ia_ch_rs');\n        expect(snakeCase('multiple.........dots')).toBe('multiple_dots');\n        expect(snakeCase('multiple---------dashes')).toBe('multiple_dashes');\n        expect(snakeCase('multiple_________underscores')).toBe('multiple_underscores');\n    });\n    test('from snake case', () => {\n        expect(snakeCase('from_lowercased_snake_case')).toBe('from_lowercased_snake_case');\n        expect(snakeCase('From_Capitalized_Snake_Case')).toBe('from_capitalized_snake_case');\n        expect(snakeCase('FROM_UPPERCASED_SNAKE_CASE')).toBe('f_r_o_m_u_p_p_e_r_c_a_s_e_d_s_n_a_k_e_c_a_s_e');\n        expect(snakeCase('fr0m_5nak3_c4s3_w1th_42n_numb3r5')).toBe('fr0m_5nak3_c4s3_w1th_42n_numb3r5');\n        expect(snakeCase('frøm_snake_case_w:th_$peçia!_ch*rs')).toBe('fr_m_snake_case_w_th_pe_ia_ch_rs');\n        expect(snakeCase(snakeCase('frøm_d0ubl3_Snake_c*se'))).toBe('fr_m_d0ubl3_snake_c_se');\n    });\n    test('from title case', () => {\n        expect(snakeCase('from lowercased title case')).toBe('from_lowercased_title_case');\n        expect(snakeCase('From Capitalized Title Case')).toBe('from_capitalized_title_case');\n        expect(snakeCase('FROM UPPERCASED TITLE CASE')).toBe('f_r_o_m_u_p_p_e_r_c_a_s_e_d_t_i_t_l_e_c_a_s_e');\n        expect(snakeCase('Fr0m T1tl3 C4s3 W1th 42n Numb3r5')).toBe('fr0m_t1tl3_c4s3_w1th_42n_numb3r5');\n        expect(snakeCase('Frøm Title Case W:th $peçia! Ch*rs')).toBe('fr_m_title_case_w_th_pe_ia_ch_rs');\n        expect(snakeCase(snakeCase('Frøm D0ubl3 Title C*se'))).toBe('fr_m_d0ubl3_title_c_se');\n    });\n    test('from pascal case', () => {\n        expect(snakeCase('FromPascaleCase')).toBe('from_pascale_case');\n        expect(snakeCase('Fr0mP45c4l3C4s3W1th42nNumb3r5')).toBe('fr0m_p45c4l3_c4s3_w1th42n_numb3r5');\n        expect(snakeCase('FrømPascaleCaseW:th$peçia!Ch*rs')).toBe('fr_m_pascale_case_w_th_pe_ia_ch_rs');\n        expect(snakeCase(snakeCase('FrømD0ubl3PascaleC*se'))).toBe('fr_m_d0ubl3_pascale_c_se');\n    });\n    test('from camel case', () => {\n        expect(snakeCase('FromCamelCase')).toBe('from_camel_case');\n        expect(snakeCase('Fr0mC4m3lC4s3W1th42nNumb3r5')).toBe('fr0m_c4m3l_c4s3_w1th42n_numb3r5');\n        expect(snakeCase('FrømCamelCaseW:th$peçia!Ch*rs')).toBe('fr_m_camel_case_w_th_pe_ia_ch_rs');\n        expect(snakeCase(snakeCase('FrømD0ubl3CamelC*se'))).toBe('fr_m_d0ubl3_camel_c_se');\n    });\n    test('from paths', () => {\n        expect(snakeCase('crate::my_module::my_type')).toBe('crate_my_module_my_type');\n        expect(snakeCase('/Users/username/My File.txt')).toBe('users_username_my_file_txt');\n        expect(snakeCase('C:\\\\Users\\\\username\\\\My\\\\ File.txt')).toBe('c_users_username_my_file_txt');\n    });\n});\n\ndescribe('titleCase', () => {\n    test('casing', () => {\n        expect(titleCase('lowercased')).toBe('Lowercased');\n        expect(titleCase('UPPERCASED')).toBe('U P P E R C A S E D');\n        expect(titleCase('Capitalized')).toBe('Capitalized');\n    });\n    test('numbers', () => {\n        expect(titleCase('1before after2 bet3ween')).toBe('1before After2 Bet3ween');\n        expect(titleCase('50m3 1 2 3 numb3rs 8 3v3rywh3r3 9')).toBe('50m3 1 2 3 Numb3rs 8 3v3rywh3r3 9');\n        expect(titleCase(titleCase('50m3 1 2 3 numb3rs 8 3v3rywh3r3 9'))).toBe('50m3 1 2 3 Numb3rs 8 3v3rywh3r3 9');\n    });\n    test('special characters', () => {\n        expect(titleCase('some::special\\\\\\\\chars+++in=between')).toBe('Some Special Chars In Between');\n        expect(titleCase('$peçia!::ch*rs')).toBe('Pe Ia Ch Rs');\n        expect(titleCase('multiple.........dots')).toBe('Multiple Dots');\n        expect(titleCase('multiple---------dashes')).toBe('Multiple Dashes');\n        expect(titleCase('multiple_________underscores')).toBe('Multiple Underscores');\n    });\n    test('from snake case', () => {\n        expect(titleCase('from_lowercased_snake_case')).toBe('From Lowercased Snake Case');\n        expect(titleCase('From_Capitalized_Snake_Case')).toBe('From Capitalized Snake Case');\n        expect(titleCase('FROM_UPPERCASED_SNAKE_CASE')).toBe('F R O M U P P E R C A S E D S N A K E C A S E');\n        expect(titleCase('fr0m_5nak3_c4s3_w1th_42n_numb3r5')).toBe('Fr0m 5nak3 C4s3 W1th 42n Numb3r5');\n        expect(titleCase('frøm_snake_case_w:th_$peçia!_ch*rs')).toBe('Fr M Snake Case W Th Pe Ia Ch Rs');\n        expect(titleCase(titleCase('frøm_d0ubl3_Snake_c*se'))).toBe('Fr M D0ubl3 Snake C Se');\n    });\n    test('from title case', () => {\n        expect(titleCase('from lowercased title case')).toBe('From Lowercased Title Case');\n        expect(titleCase('From Capitalized Title Case')).toBe('From Capitalized Title Case');\n        expect(titleCase('FROM UPPERCASED TITLE CASE')).toBe('F R O M U P P E R C A S E D T I T L E C A S E');\n        expect(titleCase('Fr0m T1tl3 C4s3 W1th 42n Numb3r5')).toBe('Fr0m T1tl3 C4s3 W1th 42n Numb3r5');\n        expect(titleCase('Frøm Title Case W:th $peçia! Ch*rs')).toBe('Fr M Title Case W Th Pe Ia Ch Rs');\n        expect(titleCase(titleCase('Frøm D0ubl3 Title C*se'))).toBe('Fr M D0ubl3 Title C Se');\n    });\n    test('from pascal case', () => {\n        expect(titleCase('FromPascaleCase')).toBe('From Pascale Case');\n        expect(titleCase('Fr0mP45c4l3C4s3W1th42nNumb3r5')).toBe('Fr0m P45c4l3 C4s3 W1th42n Numb3r5');\n        expect(titleCase('FrømPascaleCaseW:th$peçia!Ch*rs')).toBe('Fr M Pascale Case W Th Pe Ia Ch Rs');\n        expect(titleCase(titleCase('FrømD0ubl3PascaleC*se'))).toBe('Fr M D0ubl3 Pascale C Se');\n    });\n    test('from camel case', () => {\n        expect(titleCase('FromCamelCase')).toBe('From Camel Case');\n        expect(titleCase('Fr0mC4m3lC4s3W1th42nNumb3r5')).toBe('Fr0m C4m3l C4s3 W1th42n Numb3r5');\n        expect(titleCase('FrømCamelCaseW:th$peçia!Ch*rs')).toBe('Fr M Camel Case W Th Pe Ia Ch Rs');\n        expect(titleCase(titleCase('FrømD0ubl3CamelC*se'))).toBe('Fr M D0ubl3 Camel C Se');\n    });\n    test('from paths', () => {\n        expect(titleCase('crate::my_module::my_type')).toBe('Crate My Module My Type');\n        expect(titleCase('/Users/username/My File.txt')).toBe('Users Username My File Txt');\n        expect(titleCase('C:\\\\Users\\\\username\\\\My\\\\ File.txt')).toBe('C Users Username My File Txt');\n    });\n});\n\ndescribe('camelCase', () => {\n    test('casing', () => {\n        expect(camelCase('lowercased')).toBe('lowercased');\n        expect(camelCase('UPPERCASED')).toBe('uPPERCASED');\n        expect(camelCase('Capitalized')).toBe('capitalized');\n    });\n    test('numbers', () => {\n        expect(camelCase('1before after2 bet3ween')).toBe('1beforeAfter2Bet3ween');\n        expect(camelCase('50m3 1 2 3 numb3rs 8 3v3rywh3r3 9')).toBe('50m3123Numb3rs83v3rywh3r39');\n        expect(titleCase(camelCase('50m3 1 2 3 numb3rs 8 3v3rywh3r3 9'))).toBe('50m3123 Numb3rs83v3rywh3r39');\n    });\n    test('special characters', () => {\n        expect(camelCase('some::special\\\\\\\\chars+++in=between')).toBe('someSpecialCharsInBetween');\n        expect(camelCase('$peçia!::ch*rs')).toBe('peIaChRs');\n        expect(camelCase('multiple.........dots')).toBe('multipleDots');\n        expect(camelCase('multiple---------dashes')).toBe('multipleDashes');\n        expect(camelCase('multiple_________underscores')).toBe('multipleUnderscores');\n    });\n    test('from snake case', () => {\n        expect(camelCase('from_lowercased_snake_case')).toBe('fromLowercasedSnakeCase');\n        expect(camelCase('From_Capitalized_Snake_Case')).toBe('fromCapitalizedSnakeCase');\n        expect(camelCase('FROM_UPPERCASED_SNAKE_CASE')).toBe('fROMUPPERCASEDSNAKECASE');\n        expect(camelCase('fr0m_5nak3_c4s3_w1th_42n_numb3r5')).toBe('fr0m5nak3C4s3W1th42nNumb3r5');\n        expect(camelCase('frøm_snake_case_w:th_$peçia!_ch*rs')).toBe('frMSnakeCaseWThPeIaChRs');\n        expect(camelCase(camelCase('frøm_d0ubl3_Snake_c*se'))).toBe('frMD0ubl3SnakeCSe');\n    });\n    test('from title case', () => {\n        expect(camelCase('from lowercased title case')).toBe('fromLowercasedTitleCase');\n        expect(camelCase('From Capitalized Title Case')).toBe('fromCapitalizedTitleCase');\n        expect(camelCase('FROM UPPERCASED TITLE CASE')).toBe('fROMUPPERCASEDTITLECASE');\n        expect(camelCase('Fr0m T1tl3 C4s3 W1th 42n Numb3r5')).toBe('fr0mT1tl3C4s3W1th42nNumb3r5');\n        expect(camelCase('Frøm Title Case W:th $peçia! Ch*rs')).toBe('frMTitleCaseWThPeIaChRs');\n        expect(camelCase(camelCase('Frøm D0ubl3 Title C*se'))).toBe('frMD0ubl3TitleCSe');\n    });\n    test('from pascal case', () => {\n        expect(camelCase('FromPascaleCase')).toBe('fromPascaleCase');\n        expect(camelCase('Fr0mP45c4l3C4s3W1th42nNumb3r5')).toBe('fr0mP45c4l3C4s3W1th42nNumb3r5');\n        expect(camelCase('FrømPascaleCaseW:th$peçia!Ch*rs')).toBe('frMPascaleCaseWThPeIaChRs');\n        expect(camelCase(camelCase('FrømD0ubl3PascaleC*se'))).toBe('frMD0ubl3PascaleCSe');\n    });\n    test('from camel case', () => {\n        expect(camelCase('FromCamelCase')).toBe('fromCamelCase');\n        expect(camelCase('Fr0mC4m3lC4s3W1th42nNumb3r5')).toBe('fr0mC4m3lC4s3W1th42nNumb3r5');\n        expect(camelCase('FrømCamelCaseW:th$peçia!Ch*rs')).toBe('frMCamelCaseWThPeIaChRs');\n        expect(camelCase(camelCase('FrømD0ubl3CamelC*se'))).toBe('frMD0ubl3CamelCSe');\n    });\n    test('from paths', () => {\n        expect(camelCase('crate::my_module::my_type')).toBe('crateMyModuleMyType');\n        expect(camelCase('/Users/username/My File.txt')).toBe('usersUsernameMyFileTxt');\n        expect(camelCase('C:\\\\Users\\\\username\\\\My\\\\ File.txt')).toBe('cUsersUsernameMyFileTxt');\n    });\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/AmountTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { amountTypeNode, numberTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = amountTypeNode(numberTypeNode('u64'), 9);\n    expect(node.kind).toBe('amountTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = amountTypeNode(numberTypeNode('u64'), 9);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/ArrayTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { arrayTypeNode, numberTypeNode, remainderCountNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = arrayTypeNode(numberTypeNode('u64'), remainderCountNode());\n    expect(node.kind).toBe('arrayTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = arrayTypeNode(numberTypeNode('u64'), remainderCountNode());\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/BooleanTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { booleanTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = booleanTypeNode();\n    expect(node.kind).toBe('booleanTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = booleanTypeNode();\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/BytesTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { bytesTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = bytesTypeNode();\n    expect(node.kind).toBe('bytesTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = bytesTypeNode();\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/DateTimeTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { dateTimeTypeNode, numberTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = dateTimeTypeNode(numberTypeNode('u64'));\n    expect(node.kind).toBe('dateTimeTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = dateTimeTypeNode(numberTypeNode('u64'));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/EnumEmptyVariantTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { enumEmptyVariantTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = enumEmptyVariantTypeNode('apple');\n    expect(node.kind).toBe('enumEmptyVariantTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = enumEmptyVariantTypeNode('apple');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/EnumStructVariantTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { enumStructVariantTypeNode, structTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = enumStructVariantTypeNode('apple', structTypeNode([]));\n    expect(node.kind).toBe('enumStructVariantTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = enumStructVariantTypeNode('apple', structTypeNode([]));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/EnumTupleVariantTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { enumTupleVariantTypeNode, tupleTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = enumTupleVariantTypeNode('apple', tupleTypeNode([]));\n    expect(node.kind).toBe('enumTupleVariantTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = enumTupleVariantTypeNode('apple', tupleTypeNode([]));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/EnumTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { enumTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = enumTypeNode([]);\n    expect(node.kind).toBe('enumTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = enumTypeNode([]);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/FixedSizeTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { fixedSizeTypeNode, stringTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = fixedSizeTypeNode(stringTypeNode('utf8'), 42);\n    expect(node.kind).toBe('fixedSizeTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = fixedSizeTypeNode(stringTypeNode('utf8'), 42);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/HiddenPrefixTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { hiddenPrefixTypeNode, numberTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = hiddenPrefixTypeNode(numberTypeNode('u8'), []);\n    expect(node.kind).toBe('hiddenPrefixTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = hiddenPrefixTypeNode(numberTypeNode('u8'), []);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/HiddenSuffixTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { hiddenSuffixTypeNode, numberTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = hiddenSuffixTypeNode(numberTypeNode('u8'), []);\n    expect(node.kind).toBe('hiddenSuffixTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = hiddenSuffixTypeNode(numberTypeNode('u8'), []);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/MapTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { mapTypeNode, numberTypeNode, remainderCountNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = mapTypeNode(numberTypeNode('u8'), numberTypeNode('u64'), remainderCountNode());\n    expect(node.kind).toBe('mapTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = mapTypeNode(numberTypeNode('u8'), numberTypeNode('u64'), remainderCountNode());\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/NestedTypeNode.test.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport {\n    assertIsNestedTypeNode,\n    fixedSizeTypeNode,\n    isNestedTypeNode,\n    numberTypeNode,\n    publicKeyTypeNode,\n    resolveNestedTypeNode,\n    sizePrefixTypeNode,\n    stringTypeNode,\n    transformNestedTypeNode,\n} from '../../src';\n\ndescribe('resolveNestedTypeNode', () => {\n    test('it resolved nested type nodes', () => {\n        const node = sizePrefixTypeNode(fixedSizeTypeNode(stringTypeNode('utf8'), 32), numberTypeNode('u8'));\n        expect(resolveNestedTypeNode(node)).toEqual(stringTypeNode('utf8'));\n    });\n\n    test('it returns the same instance when resolving nested types nodes', () => {\n        const node = numberTypeNode('u8');\n        expect(resolveNestedTypeNode(node)).toBe(node);\n    });\n});\n\ndescribe('transformNestedTypeNode', () => {\n    test('it transforms nested type nodes', () => {\n        const node = sizePrefixTypeNode(fixedSizeTypeNode(stringTypeNode('utf8'), 32), numberTypeNode('u8'));\n        const transformedNode = transformNestedTypeNode(node, () => publicKeyTypeNode());\n        expect(transformedNode).toEqual(\n            sizePrefixTypeNode(fixedSizeTypeNode(publicKeyTypeNode(), 32), numberTypeNode('u8')),\n        );\n    });\n});\n\ndescribe('isNestedTypeNode', () => {\n    test('it checks if a node is a nested type', () => {\n        const flatNode = numberTypeNode('u64');\n        expect(isNestedTypeNode(flatNode, 'numberTypeNode')).toBe(true);\n        expect(isNestedTypeNode(flatNode, 'stringTypeNode')).toBe(false);\n\n        const nestedNode = sizePrefixTypeNode(fixedSizeTypeNode(numberTypeNode('u64'), 32), numberTypeNode('u8'));\n        expect(isNestedTypeNode(nestedNode, 'numberTypeNode')).toBe(true);\n        expect(isNestedTypeNode(nestedNode, 'stringTypeNode')).toBe(false);\n    });\n});\n\ndescribe('assertIsNestedTypeNode', () => {\n    test('it asserts that a node is a nested type', () => {\n        const flatNode = numberTypeNode('u64');\n        expect(() => assertIsNestedTypeNode(flatNode, 'numberTypeNode')).not.toThrow();\n        expect(() => assertIsNestedTypeNode(flatNode, 'stringTypeNode')).toThrow();\n\n        const nestedNode = sizePrefixTypeNode(fixedSizeTypeNode(numberTypeNode('u64'), 32), numberTypeNode('u8'));\n        expect(() => assertIsNestedTypeNode(nestedNode, 'numberTypeNode')).not.toThrow();\n        expect(() => assertIsNestedTypeNode(nestedNode, 'stringTypeNode')).toThrow();\n    });\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/NestedTypeNode.typetest.ts",
    "content": "import {\n    assertIsNestedTypeNode,\n    fixedSizeTypeNode,\n    isNestedTypeNode,\n    NestedTypeNode,\n    Node,\n    NumberTypeNode,\n    numberTypeNode,\n    resolveNestedTypeNode,\n    StringTypeNode,\n    stringTypeNode,\n    transformNestedTypeNode,\n} from '../../src';\n\n// [DESCRIBE] NestedTypeNode.\n{\n    // It constraints the nested type of a node.\n    {\n        const stringNestedNode = fixedSizeTypeNode(stringTypeNode('utf8'), 32);\n        const numberNestedNode = fixedSizeTypeNode(numberTypeNode('u32'), 32);\n        stringNestedNode satisfies NestedTypeNode<StringTypeNode>;\n        numberNestedNode satisfies NestedTypeNode<NumberTypeNode>;\n        // @ts-expect-error The nested type is not a number.\n        stringNestedNode satisfies NestedTypeNode<NumberTypeNode>;\n        // @ts-expect-error The nested type is not a string.\n        numberNestedNode satisfies NestedTypeNode<StringTypeNode>;\n    }\n}\n\n// [DESCRIBE] resolveNestedTypeNode.\n{\n    // It unwraps the nested type of a node.\n    {\n        const stringNestedNode = fixedSizeTypeNode(stringTypeNode('utf8'), 32);\n        const numberNestedNode = fixedSizeTypeNode(numberTypeNode('u32'), 32);\n        resolveNestedTypeNode(stringNestedNode) satisfies StringTypeNode;\n        resolveNestedTypeNode(numberNestedNode) satisfies NumberTypeNode;\n        // @ts-expect-error The nested type is not a number.\n        resolveNestedTypeNode(stringNestedNode) satisfies NumberTypeNode;\n        // @ts-expect-error The nested type is not a string.\n        resolveNestedTypeNode(numberNestedNode) satisfies StringTypeNode;\n    }\n}\n\n// [DESCRIBE] transformNestedTypeNode.\n{\n    // It transforms the nested type of a nested node.\n    {\n        const transformedNode = transformNestedTypeNode(fixedSizeTypeNode(stringTypeNode('utf8'), 32), () =>\n            numberTypeNode('u32'),\n        );\n        transformedNode satisfies NestedTypeNode<NumberTypeNode>;\n        // @ts-expect-error The nested type is not a number.\n        transformedNode satisfies NestedTypeNode<StringTypeNode>;\n    }\n}\n\n// [DESCRIBE] isNestedTypeNode.\n{\n    // It narrows the type of a node to a nested type node.\n    {\n        const node = {} as Node;\n        if (isNestedTypeNode(node, 'numberTypeNode')) {\n            node satisfies NestedTypeNode<NumberTypeNode>;\n            // @ts-expect-error The nested type is not a string.\n            node satisfies NestedTypeNode<StringTypeNode>;\n        }\n        if (isNestedTypeNode(node, 'stringTypeNode')) {\n            node satisfies NestedTypeNode<StringTypeNode>;\n            // @ts-expect-error The nested type is not a number.\n            node satisfies NestedTypeNode<NumberTypeNode>;\n        }\n    }\n}\n\n// [DESCRIBE] assertIsNestedTypeNode.\n{\n    // It narrows the type of a node to a nested type node.\n    {\n        {\n            const node = {} as Node;\n            assertIsNestedTypeNode(node, 'numberTypeNode');\n            node satisfies NestedTypeNode<NumberTypeNode>;\n            // @ts-expect-error The nested type is not a string.\n            node satisfies NestedTypeNode<StringTypeNode>;\n        }\n        {\n            const node = {} as Node;\n            assertIsNestedTypeNode(node, 'stringTypeNode');\n            node satisfies NestedTypeNode<StringTypeNode>;\n            // @ts-expect-error The nested type is not a number.\n            node satisfies NestedTypeNode<NumberTypeNode>;\n        }\n    }\n}\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/NumberTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { numberTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = numberTypeNode('u8');\n    expect(node.kind).toBe('numberTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = numberTypeNode('u8');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/OptionTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { numberTypeNode, optionTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = optionTypeNode(numberTypeNode('u8'));\n    expect(node.kind).toBe('optionTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = optionTypeNode(numberTypeNode('u8'));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/PostOffsetTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { numberTypeNode, postOffsetTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = postOffsetTypeNode(numberTypeNode('u8'), 42);\n    expect(node.kind).toBe('postOffsetTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = postOffsetTypeNode(numberTypeNode('u8'), 42);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/PreOffsetTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { numberTypeNode, preOffsetTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = preOffsetTypeNode(numberTypeNode('u8'), 42);\n    expect(node.kind).toBe('preOffsetTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = preOffsetTypeNode(numberTypeNode('u8'), 42);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/PublicKeyTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { publicKeyTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = publicKeyTypeNode();\n    expect(node.kind).toBe('publicKeyTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = publicKeyTypeNode();\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/RemainderOptionTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { numberTypeNode, remainderOptionTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = remainderOptionTypeNode(numberTypeNode('u8'));\n    expect(node.kind).toBe('remainderOptionTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = remainderOptionTypeNode(numberTypeNode('u8'));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/SentinelTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { constantValueNodeFromBytes, sentinelTypeNode, stringTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = sentinelTypeNode(stringTypeNode('utf8'), constantValueNodeFromBytes('base16', 'ff'));\n    expect(node.kind).toBe('sentinelTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = sentinelTypeNode(stringTypeNode('utf8'), constantValueNodeFromBytes('base16', 'ff'));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/SetTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { numberTypeNode, remainderCountNode, setTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = setTypeNode(numberTypeNode('u64'), remainderCountNode());\n    expect(node.kind).toBe('setTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = setTypeNode(numberTypeNode('u64'), remainderCountNode());\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/SizePrefixTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { numberTypeNode, sizePrefixTypeNode, stringTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u32'));\n    expect(node.kind).toBe('sizePrefixTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u32'));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/SolAmountTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { numberTypeNode, solAmountTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = solAmountTypeNode(numberTypeNode('u32'));\n    expect(node.kind).toBe('solAmountTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = solAmountTypeNode(numberTypeNode('u32'));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/StringTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { stringTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = stringTypeNode('utf8');\n    expect(node.kind).toBe('stringTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = stringTypeNode('utf8');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/StructFieldTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { numberTypeNode, structFieldTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = structFieldTypeNode({ name: 'age', type: numberTypeNode('u8') });\n    expect(node.kind).toBe('structFieldTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = structFieldTypeNode({ name: 'age', type: numberTypeNode('u8') });\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/StructTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { structTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = structTypeNode([]);\n    expect(node.kind).toBe('structTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = structTypeNode([]);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/TupleTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { tupleTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = tupleTypeNode([]);\n    expect(node.kind).toBe('tupleTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = tupleTypeNode([]);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/TypeNode.typetest.ts",
    "content": "import type { RegisteredTypeNode } from '@codama/node-types';\n\nimport { REGISTERED_TYPE_NODE_KINDS } from '../../src';\n\n// [DESCRIBE] Registered value node kinds.\n{\n    // It matches exactly with RegisteredTypeNode['kind'].\n    {\n        REGISTERED_TYPE_NODE_KINDS satisfies readonly RegisteredTypeNode['kind'][];\n        null as unknown as RegisteredTypeNode['kind'] satisfies (typeof REGISTERED_TYPE_NODE_KINDS)[number];\n    }\n}\n"
  },
  {
    "path": "packages/nodes/test/typeNodes/ZeroableOptionTypeNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { publicKeyTypeNode, zeroableOptionTypeNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = zeroableOptionTypeNode(publicKeyTypeNode());\n    expect(node.kind).toBe('zeroableOptionTypeNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = zeroableOptionTypeNode(publicKeyTypeNode());\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/types/global.d.ts",
    "content": "declare const __BROWSER__: boolean;\ndeclare const __ESM__: boolean;\ndeclare const __NODEJS__: boolean;\ndeclare const __REACTNATIVE__: boolean;\ndeclare const __TEST__: boolean;\ndeclare const __VERSION__: string;\n"
  },
  {
    "path": "packages/nodes/test/valueNodes/ArrayValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { arrayValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = arrayValueNode([]);\n    expect(node.kind).toBe('arrayValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = arrayValueNode([]);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/valueNodes/BooleanValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { booleanValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = booleanValueNode(true);\n    expect(node.kind).toBe('booleanValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = booleanValueNode(true);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/valueNodes/BytesValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { bytesValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = bytesValueNode('utf8', 'hello world');\n    expect(node.kind).toBe('bytesValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = bytesValueNode('utf8', 'hello world');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/valueNodes/ConstantValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { constantValueNode, numberTypeNode, numberValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = constantValueNode(numberTypeNode('u8'), numberValueNode(42));\n    expect(node.kind).toBe('constantValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = constantValueNode(numberTypeNode('u8'), numberValueNode(42));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/valueNodes/EnumValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { enumValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = enumValueNode('fruit', 'apple');\n    expect(node.kind).toBe('enumValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = enumValueNode('fruit', 'apple');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/valueNodes/MapEntryValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { mapEntryValueNode, numberValueNode, stringValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = mapEntryValueNode(stringValueNode('age'), numberValueNode(42));\n    expect(node.kind).toBe('mapEntryValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = mapEntryValueNode(stringValueNode('age'), numberValueNode(42));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/valueNodes/MapValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { mapValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = mapValueNode([]);\n    expect(node.kind).toBe('mapValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = mapValueNode([]);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/valueNodes/NoneValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { noneValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = noneValueNode();\n    expect(node.kind).toBe('noneValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = noneValueNode();\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/valueNodes/NumberValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { numberValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = numberValueNode(42);\n    expect(node.kind).toBe('numberValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = numberValueNode(42);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/valueNodes/PublicKeyValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { publicKeyValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = publicKeyValueNode('1111');\n    expect(node.kind).toBe('publicKeyValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = publicKeyValueNode('1111');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/valueNodes/SetValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { setValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = setValueNode([]);\n    expect(node.kind).toBe('setValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = setValueNode([]);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/valueNodes/SomeValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { numberValueNode, someValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = someValueNode(numberValueNode(42));\n    expect(node.kind).toBe('someValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = someValueNode(numberValueNode(42));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/valueNodes/StringValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { stringValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = stringValueNode('hello world');\n    expect(node.kind).toBe('stringValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = stringValueNode('hello world');\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/valueNodes/StructFieldValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { stringValueNode, structFieldValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = structFieldValueNode('name', stringValueNode('Alice'));\n    expect(node.kind).toBe('structFieldValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = structFieldValueNode('name', stringValueNode('Alice'));\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/valueNodes/StructValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { structValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = structValueNode([]);\n    expect(node.kind).toBe('structValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = structValueNode([]);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/valueNodes/TupleValueNode.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { tupleValueNode } from '../../src';\n\ntest('it returns the right node kind', () => {\n    const node = tupleValueNode([]);\n    expect(node.kind).toBe('tupleValueNode');\n});\n\ntest('it returns a frozen object', () => {\n    const node = tupleValueNode([]);\n    expect(Object.isFrozen(node)).toBe(true);\n});\n"
  },
  {
    "path": "packages/nodes/test/valueNodes/ValueNode.typetest.ts",
    "content": "import type { RegisteredValueNode } from '@codama/node-types';\n\nimport { REGISTERED_VALUE_NODE_KINDS } from '../../src';\n\n// [DESCRIBE] Registered value node kinds.\n{\n    // It matches exactly with RegisteredValueNode['kind'].\n    {\n        REGISTERED_VALUE_NODE_KINDS satisfies readonly RegisteredValueNode['kind'][];\n        null as unknown as RegisteredValueNode['kind'] satisfies (typeof REGISTERED_VALUE_NODE_KINDS)[number];\n    }\n}\n"
  },
  {
    "path": "packages/nodes/tsconfig.declarations.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"declarationMap\": true,\n        \"emitDeclarationOnly\": true,\n        \"outDir\": \"./dist/types\"\n    },\n    \"extends\": \"./tsconfig.json\",\n    \"include\": [\"src/index.ts\", \"src/types\"]\n}\n"
  },
  {
    "path": "packages/nodes/tsconfig.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": { \"lib\": [] },\n    \"display\": \"@codama/nodes\",\n    \"extends\": \"../../tsconfig.json\",\n    \"include\": [\"src\", \"test\"]\n}\n"
  },
  {
    "path": "packages/nodes/tsup.config.ts",
    "content": "import { defineConfig } from 'tsup';\n\nimport { getPackageBuildConfigs } from '../../tsup.config.base';\n\nexport default defineConfig(getPackageBuildConfigs());\n"
  },
  {
    "path": "packages/nodes/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\nimport { getVitestConfig } from '../../vitest.config.base.mjs';\n\nexport default defineConfig({\n    test: {\n        projects: [getVitestConfig('browser'), getVitestConfig('node'), getVitestConfig('react-native')],\n    },\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/.gitignore",
    "content": "dist/\n"
  },
  {
    "path": "packages/nodes-from-anchor/.prettierignore",
    "content": "dist/\ntest/e2e/\ntest-ledger/\ntarget/\nCHANGELOG.md\n"
  },
  {
    "path": "packages/nodes-from-anchor/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Codama\nCopyright (c) 2024 Metaplex Foundation\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/nodes-from-anchor/README.md",
    "content": "# Codama ➤ Nodes From Anchor\n\n[![npm][npm-image]][npm-url]\n[![npm-downloads][npm-downloads-image]][npm-url]\n\n[npm-downloads-image]: https://img.shields.io/npm/dm/@codama/nodes-from-anchor.svg?style=flat\n[npm-image]: https://img.shields.io/npm/v/@codama/nodes-from-anchor.svg?style=flat&label=%40codama%2Fnodes-from-anchor\n[npm-url]: https://www.npmjs.com/package/@codama/nodes-from-anchor\n\nThis package converts Anchor IDLs from various versions into Codama IDLs.\n\n## Installation\n\n```sh\npnpm install @codama/nodes-from-anchor\n```\n\n> [!NOTE]\n>\n> - This package is **not** included in the main [`codama`](../library) package.\n> - If `metadata.origin` is not set on the IDL, it is assumed to be `\"anchor\"`. If you are trying to parse a Shank IDL, be sure that origin is set to `\"shank\"` so discriminators can be set correctly.\n\n## Functions\n\n### `rootNodeFromAnchor(anchorIdl)`\n\nThis function takes a valid Anchor IDL and returns a `RootNode`.\n\n```js\n// node ./codama.mjs\nimport { rootNodeFromAnchor } from '@codama/nodes-from-anchor';\nimport { createFromRoot } from 'codama';\nimport { readFileSync } from 'node:fs';\nimport path from 'path';\n\n// Read the content of your IDL file.\nconst anchorIdlPath = path.join(__dirname, 'target', 'idl', 'anchor_program.json');\nconst anchorIdl = JSON.parse(readFileSync(anchorIdlPath, 'utf-8'));\n\n// Parse it into a Codama IDL.\nconst codama = createFromRoot(rootNodeFromAnchor(anchorIdl));\n```\n"
  },
  {
    "path": "packages/nodes-from-anchor/package.json",
    "content": "{\n    \"name\": \"@codama/nodes-from-anchor\",\n    \"version\": \"1.4.1\",\n    \"description\": \"Node specifications and helpers for the Codama standard\",\n    \"exports\": {\n        \"types\": \"./dist/types/index.d.ts\",\n        \"react-native\": \"./dist/index.react-native.mjs\",\n        \"browser\": {\n            \"import\": \"./dist/index.browser.mjs\",\n            \"require\": \"./dist/index.browser.cjs\"\n        },\n        \"node\": {\n            \"import\": \"./dist/index.node.mjs\",\n            \"require\": \"./dist/index.node.cjs\"\n        }\n    },\n    \"browser\": {\n        \"./dist/index.node.cjs\": \"./dist/index.browser.cjs\",\n        \"./dist/index.node.mjs\": \"./dist/index.browser.mjs\"\n    },\n    \"main\": \"./dist/index.node.cjs\",\n    \"module\": \"./dist/index.node.mjs\",\n    \"react-native\": \"./dist/index.react-native.mjs\",\n    \"types\": \"./dist/types/index.d.ts\",\n    \"type\": \"commonjs\",\n    \"files\": [\n        \"./dist/types\",\n        \"./dist/index.*\"\n    ],\n    \"sideEffects\": false,\n    \"keywords\": [\n        \"solana\",\n        \"framework\",\n        \"standard\",\n        \"specifications\"\n    ],\n    \"scripts\": {\n        \"build\": \"rimraf dist && tsup && tsc -p ./tsconfig.declarations.json\",\n        \"dev\": \"vitest --project node\",\n        \"lint\": \"eslint . && prettier --check .\",\n        \"lint:fix\": \"eslint --fix . && prettier --write .\",\n        \"test\": \"pnpm test:types && pnpm test:treeshakability && pnpm test:unit\",\n        \"test:treeshakability\": \"for file in dist/index.*.mjs; do agadoo $file; done\",\n        \"test:types\": \"tsc --noEmit\",\n        \"test:unit\": \"vitest run\"\n    },\n    \"dependencies\": {\n        \"@codama/errors\": \"workspace:*\",\n        \"@codama/nodes\": \"workspace:*\",\n        \"@codama/visitors\": \"workspace:*\",\n        \"@solana/codecs\": \"^5.3.0\",\n        \"@noble/hashes\": \"^2.0.1\"\n    },\n    \"license\": \"MIT\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/codama-idl/codama\"\n    },\n    \"bugs\": {\n        \"url\": \"http://github.com/codama-idl/codama/issues\"\n    },\n    \"browserslist\": [\n        \"supports bigint and not dead\",\n        \"maintained node versions\"\n    ]\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/defaultVisitor.ts",
    "content": "import { assertIsNode, Node, RootNode } from '@codama/nodes';\nimport {\n    deduplicateIdenticalDefinedTypesVisitor,\n    flattenInstructionDataArgumentsVisitor,\n    getCommonInstructionAccountDefaultRules,\n    rootNodeVisitor,\n    setFixedAccountSizesVisitor,\n    setInstructionAccountDefaultValuesVisitor,\n    transformU8ArraysToBytesVisitor,\n    unwrapInstructionArgsDefinedTypesVisitor,\n    visit,\n    Visitor,\n} from '@codama/visitors';\n\nimport { extractPdasVisitor } from './extractPdasVisitor';\n\nexport function defaultVisitor() {\n    return rootNodeVisitor(currentRoot => {\n        let root: RootNode = currentRoot;\n        const updateRoot = (visitor: Visitor<Node | null, 'rootNode'>) => {\n            const newRoot = visit(root, visitor);\n            assertIsNode(newRoot, 'rootNode');\n            root = newRoot;\n        };\n\n        // PDAs.\n        updateRoot(extractPdasVisitor());\n\n        // Defined types.\n        updateRoot(deduplicateIdenticalDefinedTypesVisitor());\n\n        // Accounts.\n        updateRoot(setFixedAccountSizesVisitor());\n\n        // Instructions.\n        updateRoot(setInstructionAccountDefaultValuesVisitor(getCommonInstructionAccountDefaultRules()));\n        updateRoot(unwrapInstructionArgsDefinedTypesVisitor());\n        updateRoot(flattenInstructionDataArgumentsVisitor());\n\n        // Extras.\n        updateRoot(transformU8ArraysToBytesVisitor());\n\n        return root;\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/discriminators.ts",
    "content": "import { BytesValueNode, bytesValueNode, pascalCase, snakeCase } from '@codama/nodes';\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { getUtf8Codec } from '@solana/codecs';\n\nimport { hex } from './utils';\n\nexport const getAnchorDiscriminatorV01 = (discriminator: number[]): BytesValueNode => {\n    return bytesValueNode('base16', hex(new Uint8Array(discriminator)));\n};\n\nexport const getAnchorInstructionDiscriminatorV00 = (idlName: string): BytesValueNode => {\n    const bytes = getUtf8Codec().encode(`global:${snakeCase(idlName)}`);\n    const hash = sha256(bytes as Uint8Array).slice(0, 8);\n    return bytesValueNode('base16', hex(hash));\n};\n\nexport const getAnchorAccountDiscriminatorV00 = (idlName: string): BytesValueNode => {\n    const bytes = getUtf8Codec().encode(`account:${pascalCase(idlName)}`);\n    const hash = sha256(bytes as Uint8Array).slice(0, 8);\n    return bytesValueNode('base16', hex(hash));\n};\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/extractPdasVisitor.ts",
    "content": "import { logWarn } from '@codama/errors';\nimport {\n    assertIsNode,\n    camelCase,\n    type CamelCaseString,\n    instructionAccountNode,\n    type InstructionNode,\n    instructionNode,\n    isNode,\n    pdaLinkNode,\n    type PdaNode,\n    pdaNode,\n    type ProgramNode,\n    programNode,\n} from '@codama/nodes';\nimport { bottomUpTransformerVisitor, getUniqueHashStringVisitor, visit, type Visitor } from '@codama/visitors';\n\ntype Fingerprint = string;\n\nfunction pdaFingerprint(pda: PdaNode, hashVisitor: Visitor<string>): Fingerprint {\n    return visit(pdaNode({ ...pda, name: '' }), hashVisitor);\n}\n\nfunction getUniquePdaName(name: CamelCaseString, usedNames: Set<CamelCaseString>): CamelCaseString {\n    if (!usedNames.has(name)) return name;\n    let suffix = 2;\n    let candidate = camelCase(`${name}${suffix}`);\n    while (usedNames.has(candidate)) {\n        suffix++;\n        candidate = camelCase(`${name}${suffix}`);\n    }\n    return candidate;\n}\n\nexport function extractPdasVisitor() {\n    return bottomUpTransformerVisitor([\n        {\n            select: '[programNode]',\n            transform: node => {\n                assertIsNode(node, 'programNode');\n                return extractPdasFromProgram(node);\n            },\n        },\n    ]);\n}\n\nexport function extractPdasFromProgram(program: ProgramNode): ProgramNode {\n    const hashVisitor = getUniqueHashStringVisitor();\n    const pdaMap = new Map<Fingerprint, PdaNode>();\n    const usedNames = new Set<CamelCaseString>(program.pdas.map(p => p.name));\n    const nameToFingerprint = new Map<CamelCaseString, Fingerprint>();\n\n    const rewrittenInstructions = program.instructions.map(instruction => {\n        const rewrittenAccounts = instruction.accounts.map(account => {\n            if (\n                !account.defaultValue ||\n                !isNode(account.defaultValue, 'pdaValueNode') ||\n                !isNode(account.defaultValue.pda, 'pdaNode')\n            ) {\n                return account;\n            }\n\n            const pda = account.defaultValue.pda;\n            if (pda.programId && pda.programId !== program.publicKey) return account;\n\n            const fingerprint = pdaFingerprint(pda, hashVisitor);\n\n            if (!pdaMap.has(fingerprint)) {\n                let resolvedName = pda.name;\n                const existingFingerprint = nameToFingerprint.get(resolvedName);\n\n                if (existingFingerprint !== undefined && existingFingerprint !== fingerprint) {\n                    resolvedName = camelCase(`${instruction.name}_${pda.name}`);\n                    logWarn(\n                        `PDA name collision: \"${pda.name}\" has different seeds across instructions. ` +\n                            `Renaming to \"${resolvedName}\".`,\n                    );\n                }\n\n                resolvedName = getUniquePdaName(resolvedName, usedNames);\n\n                usedNames.add(resolvedName);\n                nameToFingerprint.set(resolvedName, fingerprint);\n                pdaMap.set(fingerprint, pdaNode({ ...pda, name: resolvedName }));\n            }\n\n            const extractedPda = pdaMap.get(fingerprint)!;\n            const defaultValue = { ...account.defaultValue, pda: pdaLinkNode(extractedPda.name) };\n            return instructionAccountNode({ ...account, defaultValue });\n        });\n\n        return instructionNode({\n            ...instruction,\n            accounts: rewrittenAccounts,\n        }) as InstructionNode;\n    });\n\n    return programNode({\n        ...program,\n        instructions: rewrittenInstructions,\n        pdas: [...program.pdas, ...pdaMap.values()],\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/index.ts",
    "content": "import { RootNode } from '@codama/nodes';\nimport { visit } from '@codama/visitors';\n\nimport { defaultVisitor } from './defaultVisitor';\nimport { IdlV00, rootNodeFromAnchorV00 } from './v00';\nimport { IdlV01, rootNodeFromAnchorV01 } from './v01';\n\nexport * from './defaultVisitor';\nexport * from './discriminators';\nexport * from './extractPdasVisitor';\nexport * from './v00';\nexport * from './v01';\n\nexport type AnchorIdl = IdlV00 | IdlV01;\n\nexport function rootNodeFromAnchor(idl: AnchorIdl): RootNode {\n    return visit(rootNodeFromAnchorWithoutDefaultVisitor(idl), defaultVisitor());\n}\n\nexport function rootNodeFromAnchorWithoutDefaultVisitor(idl: AnchorIdl): RootNode {\n    if ((idl.metadata as { spec?: string })?.spec === '0.1.0') {\n        return rootNodeFromAnchorV01(idl as IdlV01);\n    }\n\n    return rootNodeFromAnchorV00(idl as IdlV00);\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/utils.ts",
    "content": "export function hex(bytes: number[] | Uint8Array): string {\n    return (bytes as number[]).reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/AccountNode.ts",
    "content": "import {\n    AccountNode,\n    accountNode,\n    assertIsNode,\n    bytesTypeNode,\n    camelCase,\n    DiscriminatorNode,\n    fieldDiscriminatorNode,\n    fixedSizeTypeNode,\n    pdaLinkNode,\n    structFieldTypeNode,\n    StructTypeNode,\n    structTypeNode,\n} from '@codama/nodes';\n\nimport { getAnchorAccountDiscriminatorV00 } from '../discriminators';\nimport { IdlV00AccountDef } from './idl';\nimport { structTypeNodeFromAnchorV00 } from './typeNodes';\n\nexport function accountNodeFromAnchorV00(\n    idl: IdlV00AccountDef,\n    origin?: 'anchor' | 'shank',\n): AccountNode<StructTypeNode> {\n    const idlName = idl.name ?? '';\n    const name = camelCase(idlName);\n    const idlStruct = idl.type ?? { fields: [], kind: 'struct' };\n    let data = structTypeNodeFromAnchorV00(idlStruct);\n    assertIsNode(data, 'structTypeNode');\n    const hasSeeds = (idl.seeds ?? []).length > 0;\n\n    // Account discriminator.\n    let discriminators: DiscriminatorNode[] | undefined;\n    if (origin === 'anchor') {\n        const discriminator = structFieldTypeNode({\n            defaultValue: getAnchorAccountDiscriminatorV00(idlName),\n            defaultValueStrategy: 'omitted',\n            name: 'discriminator',\n            type: fixedSizeTypeNode(bytesTypeNode(), 8),\n        });\n        data = structTypeNode([discriminator, ...data.fields]);\n        discriminators = [fieldDiscriminatorNode('discriminator')];\n    }\n\n    return accountNode({\n        data,\n        discriminators,\n        docs: idl.docs ?? [],\n        name,\n        pda: hasSeeds ? pdaLinkNode(name) : undefined,\n        size: idl.size,\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/DefinedTypeNode.ts",
    "content": "import { DefinedTypeNode, definedTypeNode } from '@codama/nodes';\n\nimport { IdlV00TypeDef } from './idl';\nimport { typeNodeFromAnchorV00 } from './typeNodes';\n\nexport function definedTypeNodeFromAnchorV00(idl: Partial<IdlV00TypeDef>): DefinedTypeNode {\n    const name = idl.name ?? '';\n    const idlType = idl.type ?? { fields: [], kind: 'struct' };\n    const type = typeNodeFromAnchorV00(idlType);\n    return definedTypeNode({ docs: idl.docs, name, type });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/ErrorNode.ts",
    "content": "import { ErrorNode, errorNode } from '@codama/nodes';\n\nimport { IdlV00ErrorCode } from './idl';\n\nexport function errorNodeFromAnchorV00(idl: Partial<IdlV00ErrorCode>): ErrorNode {\n    const name = idl.name ?? '';\n    const msg = idl.msg ?? '';\n    return errorNode({\n        code: idl.code ?? -1,\n        docs: idl.docs ?? [msg ? `${name}: ${msg}` : `${name}`],\n        message: msg,\n        name,\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/InstructionAccountNode.ts",
    "content": "import { camelCase, InstructionAccountNode, instructionAccountNode } from '@codama/nodes';\n\nimport { IdlV00Account, IdlV00AccountItem } from './idl';\n\nfunction hasDuplicateAccountNames(idl: IdlV00AccountItem[]): boolean {\n    const seenNames = new Set<string>();\n\n    function checkDuplicates(items: IdlV00AccountItem[]): boolean {\n        for (const item of items) {\n            if ('accounts' in item) {\n                if (checkDuplicates(item.accounts)) {\n                    return true;\n                }\n            } else {\n                const name = camelCase(item.name ?? '');\n                if (seenNames.has(name)) {\n                    return true;\n                }\n                seenNames.add(name);\n            }\n        }\n        return false;\n    }\n\n    return checkDuplicates(idl);\n}\n\nexport function instructionAccountNodesFromAnchorV00(\n    idl: IdlV00AccountItem[],\n    prefix?: string,\n): InstructionAccountNode[] {\n    const shouldPrefix = prefix !== undefined || hasDuplicateAccountNames(idl);\n\n    return idl.flatMap(account =>\n        'accounts' in account\n            ? instructionAccountNodesFromAnchorV00(\n                  account.accounts,\n                  shouldPrefix ? (prefix ? `${prefix}_${account.name}` : account.name) : undefined,\n              )\n            : [instructionAccountNodeFromAnchorV00(account, shouldPrefix ? prefix : undefined)],\n    );\n}\n\nexport function instructionAccountNodeFromAnchorV00(idl: IdlV00Account, prefix?: string): InstructionAccountNode {\n    const isOptional = idl.optional ?? idl.isOptional ?? false;\n    const desc = idl.desc ? [idl.desc] : undefined;\n    return instructionAccountNode({\n        docs: idl.docs ?? desc ?? [],\n        isOptional,\n        isSigner: idl.isOptionalSigner ? 'either' : (idl.isSigner ?? false),\n        isWritable: idl.isMut ?? false,\n        name: prefix ? `${prefix}_${idl.name ?? ''}` : (idl.name ?? ''),\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/InstructionArgumentNode.ts",
    "content": "import { InstructionArgumentNode, instructionArgumentNode } from '@codama/nodes';\n\nimport { IdlV00Field } from './idl';\nimport { typeNodeFromAnchorV00 } from './typeNodes';\n\nexport function instructionArgumentNodeFromAnchorV00(idl: IdlV00Field): InstructionArgumentNode {\n    return instructionArgumentNode({\n        docs: idl.docs ?? [],\n        name: idl.name ?? '',\n        type: typeNodeFromAnchorV00(idl.type),\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/InstructionNode.ts",
    "content": "import {\n    bytesTypeNode,\n    bytesValueNode,\n    camelCase,\n    DiscriminatorNode,\n    fieldDiscriminatorNode,\n    fixedSizeTypeNode,\n    instructionArgumentNode,\n    InstructionNode,\n    instructionNode,\n    numberValueNode,\n} from '@codama/nodes';\n\nimport { getAnchorInstructionDiscriminatorV00 } from '../discriminators';\nimport { IdlV00Instruction } from './idl';\nimport { instructionAccountNodesFromAnchorV00 } from './InstructionAccountNode';\nimport { instructionArgumentNodeFromAnchorV00 } from './InstructionArgumentNode';\nimport { typeNodeFromAnchorV00 } from './typeNodes';\n\nexport function instructionNodeFromAnchorV00(\n    idl: IdlV00Instruction,\n    ixIndex: number,\n    origin?: 'anchor' | 'shank',\n): InstructionNode {\n    const idlName = idl.name ?? '';\n    const name = camelCase(idlName);\n    let dataArguments = (idl.args ?? []).map(instructionArgumentNodeFromAnchorV00);\n\n    // Instruction discriminator.\n    let discriminators: DiscriminatorNode[] | undefined;\n    if (idl.discriminant) {\n        const discriminatorField = instructionArgumentNode({\n            defaultValue: numberValueNode(idl.discriminant.value),\n            defaultValueStrategy: 'omitted',\n            name: 'discriminator',\n            type: typeNodeFromAnchorV00(idl.discriminant.type),\n        });\n        dataArguments = [discriminatorField, ...dataArguments];\n        discriminators = [fieldDiscriminatorNode('discriminator')];\n    } else if (origin === 'anchor') {\n        const discriminatorField = instructionArgumentNode({\n            defaultValue: getAnchorInstructionDiscriminatorV00(idlName),\n            defaultValueStrategy: 'omitted',\n            name: 'discriminator',\n            type: fixedSizeTypeNode(bytesTypeNode(), 8),\n        });\n        dataArguments = [discriminatorField, ...dataArguments];\n        discriminators = [fieldDiscriminatorNode('discriminator')];\n    } else if (origin === 'shank') {\n        const discriminatorField = instructionArgumentNode({\n            defaultValue: bytesValueNode('base16', ixIndex.toString(16)),\n            defaultValueStrategy: 'omitted',\n            name: 'discriminator',\n            type: fixedSizeTypeNode(bytesTypeNode(), 1),\n        });\n        dataArguments = [discriminatorField, ...dataArguments];\n        discriminators = [fieldDiscriminatorNode('discriminator')];\n    }\n\n    return instructionNode({\n        accounts: instructionAccountNodesFromAnchorV00(idl.accounts ?? []),\n        arguments: dataArguments,\n        discriminators,\n        docs: idl.docs ?? [],\n        name,\n        optionalAccountStrategy: idl.legacyOptionalAccountsStrategy ? 'omitted' : 'programId',\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/PdaNode.ts",
    "content": "import {\n    booleanValueNode,\n    bytesTypeNode,\n    camelCase,\n    constantPdaSeedNode,\n    constantPdaSeedNodeFromProgramId,\n    numberValueNode,\n    PdaNode,\n    pdaNode,\n    PdaSeedNode,\n    stringTypeNode,\n    stringValueNode,\n    variablePdaSeedNode,\n} from '@codama/nodes';\n\nimport { IdlV00PdaDef } from './idl';\nimport { typeNodeFromAnchorV00 } from './typeNodes';\n\nexport function pdaNodeFromAnchorV00(idl: IdlV00PdaDef): PdaNode {\n    const name = camelCase(idl.name ?? '');\n    const seeds = (idl.seeds ?? []).map((seed): PdaSeedNode => {\n        if (seed.kind === 'constant') {\n            const type = (() => {\n                if (seed.type === 'string') return stringTypeNode('utf8');\n                if (seed.type === 'bytes') return bytesTypeNode();\n                return typeNodeFromAnchorV00(seed.type);\n            })();\n            const value = (() => {\n                if (typeof seed.value === 'string') return stringValueNode(seed.value);\n                if (typeof seed.value === 'number') return numberValueNode(seed.value);\n                return booleanValueNode(seed.value);\n            })();\n            return constantPdaSeedNode(type, value);\n        }\n        if (seed.kind === 'variable') {\n            return variablePdaSeedNode(\n                seed.name,\n                typeNodeFromAnchorV00(seed.type),\n                seed.description ? [seed.description] : [],\n            );\n        }\n        return constantPdaSeedNodeFromProgramId();\n    });\n    return pdaNode({ name, seeds });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/ProgramNode.ts",
    "content": "import { ProgramNode, programNode, ProgramVersion } from '@codama/nodes';\n\nimport { accountNodeFromAnchorV00 } from './AccountNode';\nimport { definedTypeNodeFromAnchorV00 } from './DefinedTypeNode';\nimport { errorNodeFromAnchorV00 } from './ErrorNode';\nimport { IdlV00 } from './idl';\nimport { instructionNodeFromAnchorV00 } from './InstructionNode';\nimport { pdaNodeFromAnchorV00 } from './PdaNode';\n\nexport function programNodeFromAnchorV00(idl: IdlV00): ProgramNode {\n    const origin = (idl?.metadata as { origin?: 'anchor' | 'shank' })?.origin ?? 'anchor';\n    const pdas = (idl.accounts ?? []).filter(account => (account.seeds ?? []).length > 0).map(pdaNodeFromAnchorV00);\n    const accounts = (idl.accounts ?? []).map(a => accountNodeFromAnchorV00(a, origin));\n    const instructions = (idl.instructions ?? []).map((instruction, index) =>\n        instructionNodeFromAnchorV00(instruction, index, origin),\n    );\n    return programNode({\n        accounts,\n        definedTypes: (idl?.types ?? []).map(definedTypeNodeFromAnchorV00),\n        errors: (idl?.errors ?? []).map(errorNodeFromAnchorV00),\n        instructions,\n        name: idl?.name ?? '',\n        origin,\n        pdas,\n        publicKey: (idl?.metadata as { address?: string })?.address ?? '',\n        version: idl.version as ProgramVersion,\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/RootNode.ts",
    "content": "import { RootNode, rootNode } from '@codama/nodes';\n\nimport { IdlV00 } from './idl';\nimport { programNodeFromAnchorV00 } from './ProgramNode';\n\nexport function rootNodeFromAnchorV00(program: IdlV00, additionalPrograms: IdlV00[] = []): RootNode {\n    const programNode = programNodeFromAnchorV00(program);\n    const additionalProgramNodes = additionalPrograms.map(programNodeFromAnchorV00);\n    return rootNode(programNode, additionalProgramNodes);\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/idl.ts",
    "content": "export type IdlV00 = {\n    accounts?: IdlV00AccountDef[];\n    constants?: IdlV00Constant[];\n    docs?: string[];\n    errors?: IdlV00ErrorCode[];\n    events?: IdlV00Event[];\n    instructions: IdlV00Instruction[];\n    metadata?: IdlV00Metadata;\n    name: string;\n    types?: IdlV00TypeDef[];\n    version: string;\n};\n\nexport type IdlV00Metadata = object;\n\nexport type IdlV00Constant = {\n    name: string;\n    type: IdlV00Type;\n    value: string;\n};\n\nexport type IdlV00Event = {\n    fields: IdlV00EventField[];\n    name: string;\n};\n\nexport type IdlV00EventField = {\n    index: boolean;\n    name: string;\n    type: IdlV00Type;\n};\n\nexport type IdlV00Instruction = {\n    accounts: IdlV00AccountItem[];\n    args: IdlV00Field[];\n    discriminant?: IdlV00InstructionDiscriminant;\n    docs?: string[];\n    legacyOptionalAccountsStrategy?: boolean;\n    name: string;\n    returns?: IdlV00Type;\n};\n\nexport type IdlV00InstructionDiscriminant = {\n    type: IdlV00Type;\n    value: number;\n};\n\nexport type IdlV00StateMethod = IdlV00Instruction;\n\nexport type IdlV00AccountItem = IdlV00Account | IdlV00Accounts;\n\nexport type IdlV00Account = {\n    desc?: string;\n    docs?: string[];\n    isMut: boolean;\n    isOptional?: boolean;\n    isOptionalSigner?: boolean;\n    isSigner: boolean;\n    name: string;\n    optional?: boolean;\n    pda?: IdlV00Pda;\n    relations?: string[];\n};\n\nexport type IdlV00Pda = {\n    programId?: IdlV00Seed;\n    seeds: IdlV00Seed[];\n};\n\nexport type IdlV00Seed = IdlV00SeedAccount | IdlV00SeedArg | IdlV00SeedConst;\n\nexport type IdlV00SeedConst = {\n    kind: 'const';\n    type: IdlV00Type;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    value: any;\n};\n\nexport type IdlV00SeedArg = {\n    kind: 'arg';\n    path: string;\n    type: IdlV00Type;\n};\n\nexport type IdlV00SeedAccount = {\n    account?: string;\n    kind: 'account';\n    path: string;\n    type: IdlV00Type;\n};\n\n// A nested/recursive version of IdlV00Account.\nexport type IdlV00Accounts = {\n    accounts: IdlV00AccountItem[];\n    docs?: string[];\n    name: string;\n};\n\nexport type IdlV00Field = {\n    docs?: string[];\n    name: string;\n    type: IdlV00Type;\n};\n\nexport type IdlV00TypeDef = {\n    docs?: string[];\n    name: string;\n    type: IdlV00TypeDefTy;\n};\n\nexport type IdlV00AccountDef = {\n    docs?: string[];\n    name: string;\n    seeds?: IdlV00PdaSeedDef[];\n    size?: number;\n    type: IdlV00TypeDefTyStruct;\n};\n\nexport type IdlV00PdaDef = {\n    docs?: string[];\n    name: string;\n    seeds?: IdlV00PdaSeedDef[];\n};\n\nexport type IdlV00PdaSeedDef =\n    | { description: string; kind: 'variable'; name: string; type: IdlV00Type }\n    | { kind: 'constant'; type: IdlV00Type; value: boolean | number | string }\n    | { kind: 'programId' };\n\nexport type IdlV00TypeDefTyStruct = {\n    fields: Array<IdlV00Field>;\n    kind: 'struct';\n};\n\nexport type IdlV00TypeDefTyEnum = {\n    kind: 'enum';\n    size?: IdlV00TypeUnsignedInteger;\n    variants: IdlV00EnumVariant[];\n};\n\nexport type IdlV00TypeDefTyAlias = {\n    kind: 'alias';\n    value: IdlV00Type;\n};\n\nexport type IdlV00TypeDefTy = IdlV00TypeDefTyAlias | IdlV00TypeDefTyEnum | IdlV00TypeDefTyStruct;\n\nexport type IdlV00Type =\n    | IdlV00TypeArray\n    | IdlV00TypeDefined\n    | IdlV00TypeMap\n    | IdlV00TypeNumber\n    | IdlV00TypeOption\n    | IdlV00TypeSet\n    | IdlV00TypeTuple\n    | IdlV00TypeVec\n    | 'bool'\n    | 'bytes'\n    | 'publicKey'\n    | 'string';\n\nexport type IdlV00TypeUnsignedInteger = 'shortU16' | 'u8' | 'u16' | 'u32' | 'u64' | 'u128';\nexport type IdlV00TypeSignedInteger = 'i8' | 'i16' | 'i32' | 'i64' | 'i128';\nexport type IdlV00TypeInteger = IdlV00TypeSignedInteger | IdlV00TypeUnsignedInteger;\nexport type IdlV00TypeDecimals = 'f32' | 'f64';\nexport type IdlV00TypeNumber = IdlV00TypeDecimals | IdlV00TypeInteger;\n\n// User defined type.\nexport type IdlV00TypeDefined = {\n    defined: string;\n};\n\nexport type IdlV00TypeOption = {\n    fixed?: boolean;\n    prefix?: IdlV00TypeUnsignedInteger;\n} & ({ coption: IdlV00Type } | { option: IdlV00Type });\n\nexport type IdlV00TypeVec = {\n    size?: IdlV00TypeUnsignedInteger | 'remainder';\n    vec: IdlV00Type;\n};\nexport type IdlV00TypeTuple = { tuple: IdlV00Type[] };\n\nexport type IdlV00TypeArray = {\n    array: [idlV00Type: IdlV00Type, size: number];\n};\n\nexport type IdlV00TypeHashMap = { hashMap: [IdlV00Type, IdlV00Type] };\nexport type IdlV00TypeBTreeMap = { bTreeMap: [IdlV00Type, IdlV00Type] };\nexport type IdlV00TypeMap = {\n    size?: IdlV00TypeUnsignedInteger | number | 'remainder';\n} & (IdlV00TypeBTreeMap | IdlV00TypeHashMap);\n\nexport type IdlV00TypeHashSet = { hashSet: IdlV00Type };\nexport type IdlV00TypeBTreeSet = { bTreeSet: IdlV00Type };\nexport type IdlV00TypeSet = {\n    size?: IdlV00TypeUnsignedInteger | number | 'remainder';\n} & (IdlV00TypeBTreeSet | IdlV00TypeHashSet);\n\nexport type IdlV00EnumVariant = {\n    fields?: IdlV00EnumFields;\n    name: string;\n};\n\nexport type IdlV00EnumFields = IdlV00EnumFieldsNamed | IdlV00EnumFieldsTuple;\n\nexport type IdlV00EnumFieldsNamed = IdlV00Field[];\n\nexport type IdlV00EnumFieldsTuple = IdlV00Type[];\n\nexport type IdlV00ErrorCode = {\n    code: number;\n    docs?: string[];\n    msg?: string;\n    name: string;\n};\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/index.ts",
    "content": "export * from './AccountNode';\nexport * from './DefinedTypeNode';\nexport * from './ErrorNode';\nexport * from './InstructionAccountNode';\nexport * from './InstructionArgumentNode';\nexport * from './InstructionNode';\nexport * from './PdaNode';\nexport * from './ProgramNode';\nexport * from './RootNode';\nexport * from './idl';\nexport * from './typeNodes';\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/typeNodes/ArrayTypeNode.ts",
    "content": "import {\n    ArrayTypeNode,\n    arrayTypeNode,\n    fixedCountNode,\n    numberTypeNode,\n    prefixedCountNode,\n    remainderCountNode,\n} from '@codama/nodes';\n\nimport { IdlV00TypeArray, IdlV00TypeVec } from '../idl';\nimport { typeNodeFromAnchorV00 } from './TypeNode';\n\nexport function arrayTypeNodeFromAnchorV00(idl: IdlV00TypeArray | IdlV00TypeVec): ArrayTypeNode {\n    if ('array' in idl) {\n        const item = typeNodeFromAnchorV00(idl.array[0]);\n        return arrayTypeNode(item, fixedCountNode(idl.array[1]));\n    }\n    const item = typeNodeFromAnchorV00(idl.vec);\n    if (idl.size === 'remainder') return arrayTypeNode(item, remainderCountNode());\n    return arrayTypeNode(item, prefixedCountNode(numberTypeNode(idl.size ?? 'u32')));\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/typeNodes/EnumEmptyVariantTypeNode.ts",
    "content": "import { EnumEmptyVariantTypeNode, enumEmptyVariantTypeNode } from '@codama/nodes';\n\nimport { IdlV00EnumVariant } from '../idl';\n\nexport function enumEmptyVariantTypeNodeFromAnchorV00(idl: IdlV00EnumVariant): EnumEmptyVariantTypeNode {\n    return enumEmptyVariantTypeNode(idl.name ?? '');\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/typeNodes/EnumStructVariantTypeNode.ts",
    "content": "import { EnumStructVariantTypeNode, enumStructVariantTypeNode, StructTypeNode } from '@codama/nodes';\n\nimport { IdlV00EnumFieldsNamed, IdlV00EnumVariant } from '../idl';\nimport { structTypeNodeFromAnchorV00 } from './StructTypeNode';\n\nexport function enumStructVariantTypeNodeFromAnchorV00(\n    idl: IdlV00EnumVariant & { fields: IdlV00EnumFieldsNamed },\n): EnumStructVariantTypeNode<StructTypeNode> {\n    return enumStructVariantTypeNode(\n        idl.name ?? '',\n        structTypeNodeFromAnchorV00({ fields: idl.fields, kind: 'struct' }),\n    );\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/typeNodes/EnumTupleVariantTypeNode.ts",
    "content": "import { EnumTupleVariantTypeNode, enumTupleVariantTypeNode, TupleTypeNode } from '@codama/nodes';\n\nimport { IdlV00EnumFieldsTuple, IdlV00EnumVariant } from '../idl';\nimport { tupleTypeNodeFromAnchorV00 } from './TupleTypeNode';\n\nexport function enumTupleVariantTypeNodeFromAnchorV00(\n    idl: IdlV00EnumVariant & { fields: IdlV00EnumFieldsTuple },\n): EnumTupleVariantTypeNode<TupleTypeNode> {\n    return enumTupleVariantTypeNode(idl.name ?? '', tupleTypeNodeFromAnchorV00({ tuple: idl.fields }));\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/typeNodes/EnumTypeNode.ts",
    "content": "import { EnumTypeNode, enumTypeNode, EnumVariantTypeNode, NumberTypeNode, numberTypeNode } from '@codama/nodes';\n\nimport { IdlV00EnumFieldsNamed, IdlV00EnumFieldsTuple, IdlV00EnumVariant, IdlV00TypeDefTyEnum } from '../idl';\nimport { enumEmptyVariantTypeNodeFromAnchorV00 } from './EnumEmptyVariantTypeNode';\nimport { enumStructVariantTypeNodeFromAnchorV00 } from './EnumStructVariantTypeNode';\nimport { enumTupleVariantTypeNodeFromAnchorV00 } from './EnumTupleVariantTypeNode';\n\nexport function enumTypeNodeFromAnchorV00(\n    idl: IdlV00TypeDefTyEnum,\n): EnumTypeNode<EnumVariantTypeNode[], NumberTypeNode> {\n    const variants = idl.variants.map((variant): EnumVariantTypeNode => {\n        if (!variant.fields || variant.fields.length <= 0) {\n            return enumEmptyVariantTypeNodeFromAnchorV00(variant);\n        }\n        if (isStructVariant(variant)) {\n            return enumStructVariantTypeNodeFromAnchorV00(variant);\n        }\n        return enumTupleVariantTypeNodeFromAnchorV00(variant as IdlV00EnumVariant & { fields: IdlV00EnumFieldsTuple });\n    });\n    return enumTypeNode(variants, {\n        size: idl.size ? numberTypeNode(idl.size) : undefined,\n    });\n}\n\nfunction isStructVariant(variant: IdlV00EnumVariant): variant is IdlV00EnumVariant & { fields: IdlV00EnumFieldsNamed } {\n    const field = variant.fields![0];\n    return typeof field === 'object' && 'name' in field && 'type' in field;\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/typeNodes/MapTypeNode.ts",
    "content": "import {\n    CountNode,\n    fixedCountNode,\n    MapTypeNode,\n    mapTypeNode,\n    numberTypeNode,\n    prefixedCountNode,\n    remainderCountNode,\n} from '@codama/nodes';\n\nimport { IdlV00TypeMap } from '../idl';\nimport { typeNodeFromAnchorV00 } from './TypeNode';\n\nexport function mapTypeNodeFromAnchorV00(idl: IdlV00TypeMap): MapTypeNode {\n    const [key, value] = 'hashMap' in idl ? idl.hashMap : idl.bTreeMap;\n    let size: CountNode | undefined;\n    if (idl.size === 'remainder') {\n        size = remainderCountNode();\n    } else if (typeof idl.size === 'number') {\n        size = fixedCountNode(idl.size);\n    } else {\n        size = prefixedCountNode(numberTypeNode(idl.size ?? 'u32'));\n    }\n    return mapTypeNode(typeNodeFromAnchorV00(key), typeNodeFromAnchorV00(value), size);\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/typeNodes/OptionTypeNode.ts",
    "content": "import { numberTypeNode, OptionTypeNode, optionTypeNode } from '@codama/nodes';\n\nimport { IdlV00TypeOption } from '../idl';\nimport { typeNodeFromAnchorV00 } from './TypeNode';\n\nexport function optionTypeNodeFromAnchorV00(idl: IdlV00TypeOption): OptionTypeNode {\n    const item = 'option' in idl ? idl.option : idl.coption;\n    const defaultPrefix = numberTypeNode('option' in idl ? 'u8' : 'u32');\n    const defaultFixed = !('option' in idl);\n    return optionTypeNode(typeNodeFromAnchorV00(item), {\n        fixed: idl.fixed !== undefined ? idl.fixed : defaultFixed,\n        prefix: idl.prefix ? numberTypeNode(idl.prefix) : defaultPrefix,\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/typeNodes/SetTypeNode.ts",
    "content": "import {\n    fixedCountNode,\n    numberTypeNode,\n    prefixedCountNode,\n    remainderCountNode,\n    SetTypeNode,\n    setTypeNode,\n} from '@codama/nodes';\n\nimport { IdlV00TypeSet } from '../idl';\nimport { typeNodeFromAnchorV00 } from './TypeNode';\n\nexport function setTypeNodeFromAnchorV00(idl: IdlV00TypeSet): SetTypeNode {\n    const child = 'hashSet' in idl ? idl.hashSet : idl.bTreeSet;\n    let size: SetTypeNode['count'] | undefined;\n    if (idl.size === 'remainder') {\n        size = remainderCountNode();\n    } else if (typeof idl.size === 'number') {\n        size = fixedCountNode(idl.size);\n    } else {\n        size = prefixedCountNode(numberTypeNode(idl.size ?? 'u32'));\n    }\n    return setTypeNode(typeNodeFromAnchorV00(child), size);\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/typeNodes/StructFieldTypeNode.ts",
    "content": "import { StructFieldTypeNode, structFieldTypeNode } from '@codama/nodes';\n\nimport { IdlV00Field } from '../idl';\nimport { typeNodeFromAnchorV00 } from './TypeNode';\n\nexport function structFieldTypeNodeFromAnchorV00(idl: IdlV00Field): StructFieldTypeNode {\n    return structFieldTypeNode({\n        docs: idl.docs ?? [],\n        name: idl.name ?? '',\n        type: typeNodeFromAnchorV00(idl.type),\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/typeNodes/StructTypeNode.ts",
    "content": "import { StructTypeNode, structTypeNode } from '@codama/nodes';\n\nimport { IdlV00TypeDefTyStruct } from '../idl';\nimport { structFieldTypeNodeFromAnchorV00 } from './StructFieldTypeNode';\n\nexport function structTypeNodeFromAnchorV00(idl: IdlV00TypeDefTyStruct): StructTypeNode {\n    return structTypeNode((idl.fields ?? []).map(structFieldTypeNodeFromAnchorV00));\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/typeNodes/TupleTypeNode.ts",
    "content": "import { TupleTypeNode, tupleTypeNode } from '@codama/nodes';\n\nimport { IdlV00TypeTuple } from '../idl';\nimport { typeNodeFromAnchorV00 } from './TypeNode';\n\nexport function tupleTypeNodeFromAnchorV00(idl: IdlV00TypeTuple): TupleTypeNode {\n    return tupleTypeNode(idl.tuple.map(typeNodeFromAnchorV00));\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/typeNodes/TypeNode.ts",
    "content": "import { CODAMA_ERROR__ANCHOR__UNRECOGNIZED_IDL_TYPE, CodamaError } from '@codama/errors';\nimport {\n    booleanTypeNode,\n    bytesTypeNode,\n    definedTypeLinkNode,\n    numberTypeNode,\n    publicKeyTypeNode,\n    sizePrefixTypeNode,\n    stringTypeNode,\n    TypeNode,\n} from '@codama/nodes';\n\nimport { IdlV00Type, IdlV00TypeDefTy, IdlV00TypeMap, IdlV00TypeSet } from '../idl';\nimport { arrayTypeNodeFromAnchorV00 } from './ArrayTypeNode';\nimport { enumTypeNodeFromAnchorV00 } from './EnumTypeNode';\nimport { mapTypeNodeFromAnchorV00 } from './MapTypeNode';\nimport { optionTypeNodeFromAnchorV00 } from './OptionTypeNode';\nimport { setTypeNodeFromAnchorV00 } from './SetTypeNode';\nimport { structTypeNodeFromAnchorV00 } from './StructTypeNode';\nimport { tupleTypeNodeFromAnchorV00 } from './TupleTypeNode';\n\nconst IDL_V00_TYPE_LEAVES = [\n    'string',\n    'publicKey',\n    'bytes',\n    'bool',\n    'u8',\n    'u16',\n    'u32',\n    'u64',\n    'u128',\n    'i8',\n    'i16',\n    'i32',\n    'i64',\n    'i128',\n    'f32',\n    'f64',\n    'shortU16',\n] as const;\n\nexport const typeNodeFromAnchorV00 = (idlType: IdlV00Type | IdlV00TypeDefTy): TypeNode => {\n    // Leaf.\n    if (typeof idlType === 'string' && IDL_V00_TYPE_LEAVES.includes(idlType)) {\n        if (idlType === 'bool') return booleanTypeNode();\n        if (idlType === 'publicKey') return publicKeyTypeNode();\n        if (idlType === 'string') return sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u32'));\n        if (idlType === 'bytes') return sizePrefixTypeNode(bytesTypeNode(), numberTypeNode('u32'));\n        return numberTypeNode(idlType);\n    }\n\n    // Ensure eveything else is an object.\n    if (typeof idlType !== 'object') {\n        throw new CodamaError(CODAMA_ERROR__ANCHOR__UNRECOGNIZED_IDL_TYPE, {\n            idlType: JSON.stringify(idlType),\n        });\n    }\n\n    // Array.\n    if ('array' in idlType && isArrayOfSize(idlType.array, 2)) {\n        return arrayTypeNodeFromAnchorV00(idlType);\n    }\n\n    // Vec.\n    if ('vec' in idlType) {\n        return arrayTypeNodeFromAnchorV00(idlType);\n    }\n\n    // Defined link.\n    if ('defined' in idlType && typeof idlType.defined === 'string') {\n        return definedTypeLinkNode(idlType.defined);\n    }\n\n    // Enum.\n    if ('kind' in idlType && idlType.kind === 'enum' && 'variants' in idlType) {\n        return enumTypeNodeFromAnchorV00(idlType);\n    }\n\n    // Alias.\n    if ('kind' in idlType && idlType.kind === 'alias' && 'value' in idlType) {\n        return typeNodeFromAnchorV00(idlType.value);\n    }\n\n    // Map.\n    if (\n        ('hashMap' in idlType && isArrayOfSize(idlType.hashMap, 2)) ||\n        ('bTreeMap' in idlType && isArrayOfSize(idlType.bTreeMap, 2))\n    ) {\n        return mapTypeNodeFromAnchorV00(idlType as IdlV00TypeMap);\n    }\n\n    // Option.\n    if ('option' in idlType || 'coption' in idlType) {\n        return optionTypeNodeFromAnchorV00(idlType);\n    }\n\n    // Set.\n    if ('hashSet' in idlType || 'bTreeSet' in idlType) {\n        return setTypeNodeFromAnchorV00(idlType as IdlV00TypeSet);\n    }\n\n    // Struct.\n    if ('kind' in idlType && 'fields' in idlType && idlType.kind === 'struct') {\n        return structTypeNodeFromAnchorV00(idlType);\n    }\n\n    // Tuple.\n    if ('tuple' in idlType && Array.isArray(idlType.tuple)) {\n        return tupleTypeNodeFromAnchorV00(idlType);\n    }\n\n    throw new CodamaError(CODAMA_ERROR__ANCHOR__UNRECOGNIZED_IDL_TYPE, {\n        idlType: JSON.stringify(idlType),\n    });\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction isArrayOfSize(array: any, size: number): boolean {\n    return Array.isArray(array) && array.length === size;\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v00/typeNodes/index.ts",
    "content": "export * from './ArrayTypeNode';\nexport * from './EnumEmptyVariantTypeNode';\nexport * from './EnumStructVariantTypeNode';\nexport * from './EnumTupleVariantTypeNode';\nexport * from './EnumTypeNode';\nexport * from './MapTypeNode';\nexport * from './OptionTypeNode';\nexport * from './SetTypeNode';\nexport * from './StructFieldTypeNode';\nexport * from './StructTypeNode';\nexport * from './TupleTypeNode';\nexport * from './TypeNode';\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/AccountNode.ts",
    "content": "import { CODAMA_ERROR__ANCHOR__ACCOUNT_TYPE_MISSING, CodamaError } from '@codama/errors';\nimport {\n    AccountNode,\n    accountNode,\n    assertIsNode,\n    bytesTypeNode,\n    camelCase,\n    fieldDiscriminatorNode,\n    fixedSizeTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n} from '@codama/nodes';\n\nimport { getAnchorDiscriminatorV01 } from './../discriminators';\nimport type { IdlV01Account, IdlV01TypeDef } from './idl';\nimport { typeNodeFromAnchorV01 } from './typeNodes';\nimport type { GenericsV01 } from './unwrapGenerics';\n\nexport function accountNodeFromAnchorV01(\n    idl: IdlV01Account,\n    types: IdlV01TypeDef[],\n    generics: GenericsV01,\n): AccountNode {\n    const name = camelCase(idl.name);\n    const type = types.find(({ name }) => name === idl.name);\n\n    if (!type) {\n        throw new CodamaError(CODAMA_ERROR__ANCHOR__ACCOUNT_TYPE_MISSING, { name: idl.name });\n    }\n\n    const data = typeNodeFromAnchorV01(type.type, generics);\n    assertIsNode(data, 'structTypeNode');\n\n    const discriminator = structFieldTypeNode({\n        defaultValue: getAnchorDiscriminatorV01(idl.discriminator),\n        defaultValueStrategy: 'omitted',\n        name: 'discriminator',\n        type: fixedSizeTypeNode(bytesTypeNode(), idl.discriminator.length),\n    });\n\n    return accountNode({\n        data: structTypeNode([discriminator, ...data.fields]),\n        discriminators: [fieldDiscriminatorNode('discriminator')],\n        name,\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/DefinedTypeNode.ts",
    "content": "import { DefinedTypeNode, definedTypeNode } from '@codama/nodes';\n\nimport type { IdlV01TypeDef } from './idl';\nimport { typeNodeFromAnchorV01 } from './typeNodes';\nimport type { GenericsV01 } from './unwrapGenerics';\n\nexport function definedTypeNodeFromAnchorV01(idl: Partial<IdlV01TypeDef>, generics: GenericsV01): DefinedTypeNode {\n    const name = idl.name ?? '';\n    const idlType = idl.type ?? { fields: [], kind: 'struct' };\n    const type = typeNodeFromAnchorV01(idlType, generics);\n    return definedTypeNode({ docs: idl.docs, name, type });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/ErrorNode.ts",
    "content": "import { ErrorNode, errorNode } from '@codama/nodes';\n\nimport { IdlV01ErrorCode } from './idl';\n\nexport function errorNodeFromAnchorV01(idl: Partial<IdlV01ErrorCode>): ErrorNode {\n    const name = idl.name ?? '';\n    const msg = idl.msg ?? '';\n    return errorNode({\n        code: idl.code ?? -1,\n        docs: `${name}: ${msg}`,\n        message: msg,\n        name,\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/EventNode.ts",
    "content": "import { CODAMA_ERROR__ANCHOR__EVENT_TYPE_MISSING, CodamaError } from '@codama/errors';\nimport {\n    bytesTypeNode,\n    camelCase,\n    constantDiscriminatorNode,\n    constantValueNode,\n    EventNode,\n    eventNode,\n    fixedSizeTypeNode,\n    hiddenPrefixTypeNode,\n} from '@codama/nodes';\n\nimport { getAnchorDiscriminatorV01 } from './../discriminators';\nimport type { IdlV01Event, IdlV01TypeDef } from './idl';\nimport { typeNodeFromAnchorV01 } from './typeNodes';\nimport type { GenericsV01 } from './unwrapGenerics';\n\nexport function eventNodeFromAnchorV01(idl: IdlV01Event, types: IdlV01TypeDef[], generics: GenericsV01): EventNode {\n    const name = camelCase(idl.name);\n    const type = types.find(candidate => candidate.name === idl.name);\n\n    if (!type) {\n        throw new CodamaError(CODAMA_ERROR__ANCHOR__EVENT_TYPE_MISSING, { name: idl.name });\n    }\n\n    const data = typeNodeFromAnchorV01(type.type, generics);\n    const discriminator = getAnchorDiscriminatorV01(idl.discriminator);\n    const discriminatorConstant = constantValueNode(\n        fixedSizeTypeNode(bytesTypeNode(), idl.discriminator.length),\n        discriminator,\n    );\n\n    return eventNode({\n        data: hiddenPrefixTypeNode(data, [discriminatorConstant]),\n        discriminators: [constantDiscriminatorNode(discriminatorConstant)],\n        name,\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/InstructionAccountNode.ts",
    "content": "import {\n    AccountValueNode,\n    ArgumentValueNode,\n    camelCase,\n    InstructionAccountNode,\n    instructionAccountNode,\n    InstructionArgumentNode,\n    isNode,\n    pdaNode,\n    PdaSeedNode,\n    PdaSeedValueNode,\n    PdaValueNode,\n    pdaValueNode,\n    PublicKeyValueNode,\n    publicKeyValueNode,\n} from '@codama/nodes';\n\nimport { IdlV01InstructionAccount, IdlV01InstructionAccountItem, IdlV01Seed } from './idl';\nimport { pdaSeedNodeFromAnchorV01 } from './PdaSeedNode';\n\nfunction hasDuplicateAccountNames(idl: IdlV01InstructionAccountItem[]): boolean {\n    const seenNames = new Set<string>();\n\n    function checkDuplicates(items: IdlV01InstructionAccountItem[]): boolean {\n        for (const item of items) {\n            if ('accounts' in item) {\n                if (checkDuplicates(item.accounts)) {\n                    return true;\n                }\n            } else {\n                const name = camelCase(item.name ?? '');\n                if (seenNames.has(name)) {\n                    return true;\n                }\n                seenNames.add(name);\n            }\n        }\n        return false;\n    }\n\n    return checkDuplicates(idl);\n}\n\nexport function instructionAccountNodesFromAnchorV01(\n    idl: IdlV01InstructionAccountItem[],\n    instructionArguments: InstructionArgumentNode[],\n    prefix?: string,\n): InstructionAccountNode[] {\n    const shouldPrefix = prefix !== undefined || hasDuplicateAccountNames(idl);\n\n    return idl.flatMap(account =>\n        'accounts' in account\n            ? instructionAccountNodesFromAnchorV01(\n                  account.accounts,\n                  instructionArguments,\n                  shouldPrefix ? (prefix ? `${prefix}_${account.name}` : account.name) : undefined,\n              )\n            : [instructionAccountNodeFromAnchorV01(account, instructionArguments, shouldPrefix ? prefix : undefined)],\n    );\n}\n\nexport function instructionAccountNodeFromAnchorV01(\n    idl: IdlV01InstructionAccount,\n    instructionArguments: InstructionArgumentNode[],\n    prefix?: string,\n): InstructionAccountNode {\n    const isOptional = idl.optional ?? false;\n    const docs = idl.docs ?? [];\n    const isSigner = idl.signer ?? false;\n    const isWritable = idl.writable ?? false;\n    const name = prefix ? `${prefix}_${idl.name ?? ''}` : (idl.name ?? '');\n    let defaultValue: PdaValueNode | PublicKeyValueNode | undefined;\n\n    if (idl.address) {\n        defaultValue = publicKeyValueNode(idl.address, name);\n    } else if (idl.pda) {\n        // TODO: Handle seeds with nested paths.\n        // Currently, we gracefully ignore PDA default values if we encounter seeds with nested paths.\n        const seedsWithNestedPaths = idl.pda.seeds.some(seed => 'path' in seed && seed.path.includes('.'));\n        if (!seedsWithNestedPaths) {\n            const [seedDefinitions, seedValues] = idl.pda.seeds.reduce(\n                ([seeds, lookups], seed: IdlV01Seed) => {\n                    const { definition, value } = pdaSeedNodeFromAnchorV01(seed, instructionArguments, prefix);\n                    return [[...seeds, definition], value ? [...lookups, value] : lookups];\n                },\n                <[PdaSeedNode[], PdaSeedValueNode[]]>[[], []],\n            );\n\n            let programId: string | undefined;\n            let programIdValue: AccountValueNode | ArgumentValueNode | undefined;\n            if (idl.pda.program !== undefined) {\n                const { definition, value } = pdaSeedNodeFromAnchorV01(idl.pda.program, instructionArguments, prefix);\n                if (\n                    isNode(definition, 'constantPdaSeedNode') &&\n                    isNode(definition.value, 'bytesValueNode') &&\n                    definition.value.encoding === 'base58'\n                ) {\n                    programId = definition.value.data;\n                } else if (value && isNode(value.value, ['accountValueNode', 'argumentValueNode'])) {\n                    programIdValue = value.value;\n                }\n            }\n\n            defaultValue = pdaValueNode(\n                pdaNode({ name, programId, seeds: seedDefinitions }),\n                seedValues,\n                programIdValue,\n            );\n        }\n    }\n\n    return instructionAccountNode({\n        defaultValue,\n        docs,\n        isOptional,\n        isSigner,\n        isWritable,\n        name,\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/InstructionArgumentNode.ts",
    "content": "import { InstructionArgumentNode, instructionArgumentNode } from '@codama/nodes';\n\nimport type { IdlV01Field } from './idl';\nimport { typeNodeFromAnchorV01 } from './typeNodes';\nimport type { GenericsV01 } from './unwrapGenerics';\n\nexport function instructionArgumentNodeFromAnchorV01(idl: IdlV01Field, generics: GenericsV01): InstructionArgumentNode {\n    return instructionArgumentNode({\n        docs: idl.docs ?? [],\n        name: idl.name,\n        type: typeNodeFromAnchorV01(idl.type, generics),\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/InstructionNode.ts",
    "content": "import {\n    bytesTypeNode,\n    camelCase,\n    fieldDiscriminatorNode,\n    fixedSizeTypeNode,\n    instructionArgumentNode,\n    InstructionNode,\n    instructionNode,\n} from '@codama/nodes';\n\nimport { getAnchorDiscriminatorV01 } from '../discriminators';\nimport type { IdlV01Instruction } from './idl';\nimport { instructionAccountNodesFromAnchorV01 } from './InstructionAccountNode';\nimport { instructionArgumentNodeFromAnchorV01 } from './InstructionArgumentNode';\nimport type { GenericsV01 } from './unwrapGenerics';\n\nexport function instructionNodeFromAnchorV01(idl: IdlV01Instruction, generics: GenericsV01): InstructionNode {\n    const name = idl.name;\n    let dataArguments = idl.args.map(arg => instructionArgumentNodeFromAnchorV01(arg, generics));\n\n    const discriminatorField = instructionArgumentNode({\n        defaultValue: getAnchorDiscriminatorV01(idl.discriminator),\n        defaultValueStrategy: 'omitted',\n        name: 'discriminator',\n        type: fixedSizeTypeNode(bytesTypeNode(), idl.discriminator.length),\n    });\n    dataArguments = [discriminatorField, ...dataArguments];\n    const discriminators = [fieldDiscriminatorNode('discriminator')];\n\n    return instructionNode({\n        accounts: instructionAccountNodesFromAnchorV01(idl.accounts ?? [], dataArguments),\n        arguments: dataArguments,\n        discriminators,\n        docs: idl.docs ?? [],\n        name: camelCase(name),\n        optionalAccountStrategy: 'programId',\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/PdaSeedNode.ts",
    "content": "import {\n    CODAMA_ERROR__ANCHOR__ARGUMENT_TYPE_MISSING,\n    CODAMA_ERROR__ANCHOR__SEED_KIND_UNIMPLEMENTED,\n    CodamaError,\n} from '@codama/errors';\nimport {\n    accountValueNode,\n    argumentValueNode,\n    camelCase,\n    constantPdaSeedNodeFromBytes,\n    InstructionArgumentNode,\n    isNode,\n    PdaSeedNode,\n    PdaSeedValueNode,\n    pdaSeedValueNode,\n    publicKeyTypeNode,\n    stringTypeNode,\n    variablePdaSeedNode,\n} from '@codama/nodes';\nimport { getBase58Codec } from '@solana/codecs';\n\nimport { IdlV01Seed } from './idl';\n\nexport function pdaSeedNodeFromAnchorV01(\n    seed: IdlV01Seed,\n    instructionArguments: InstructionArgumentNode[],\n    prefix?: string,\n): Readonly<{ definition: PdaSeedNode; value?: PdaSeedValueNode }> {\n    const kind = seed.kind;\n\n    switch (kind) {\n        case 'const':\n            return {\n                definition: constantPdaSeedNodeFromBytes('base58', getBase58Codec().decode(new Uint8Array(seed.value))),\n            };\n        case 'account': {\n            // Ignore nested paths.\n            const [accountName] = seed.path.split('.');\n            const prefixedAccountName = prefix ? `${prefix}_${accountName}` : accountName;\n            return {\n                definition: variablePdaSeedNode(prefixedAccountName, publicKeyTypeNode()),\n                value: pdaSeedValueNode(prefixedAccountName, accountValueNode(prefixedAccountName)),\n            };\n        }\n        case 'arg': {\n            // Ignore nested paths.\n            const [originalArgumentName] = seed.path.split('.');\n            const argumentName = camelCase(originalArgumentName);\n            const argumentNode = instructionArguments.find(({ name }) => name === argumentName);\n            if (!argumentNode) {\n                throw new CodamaError(CODAMA_ERROR__ANCHOR__ARGUMENT_TYPE_MISSING, { name: originalArgumentName });\n            }\n\n            // Anchor uses unprefixed strings for PDA seeds even though the\n            // argument itself uses a Borsh size-prefixed string. Thus, we\n            // must recognize this case and convert the type accordingly.\n            const isBorshString =\n                isNode(argumentNode.type, 'sizePrefixTypeNode') &&\n                isNode(argumentNode.type.type, 'stringTypeNode') &&\n                argumentNode.type.type.encoding === 'utf8' &&\n                isNode(argumentNode.type.prefix, 'numberTypeNode') &&\n                argumentNode.type.prefix.format === 'u32';\n            const argumentType = isBorshString ? stringTypeNode('utf8') : argumentNode.type;\n\n            return {\n                definition: variablePdaSeedNode(argumentNode.name, argumentType),\n                value: pdaSeedValueNode(argumentNode.name, argumentValueNode(argumentNode.name)),\n            };\n        }\n        default:\n            throw new CodamaError(CODAMA_ERROR__ANCHOR__SEED_KIND_UNIMPLEMENTED, { kind });\n    }\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/ProgramNode.ts",
    "content": "import { ProgramNode, programNode, ProgramVersion } from '@codama/nodes';\n\nimport { accountNodeFromAnchorV01 } from './AccountNode';\nimport { definedTypeNodeFromAnchorV01 } from './DefinedTypeNode';\nimport { errorNodeFromAnchorV01 } from './ErrorNode';\nimport { eventNodeFromAnchorV01 } from './EventNode';\nimport { IdlV01 } from './idl';\nimport { instructionNodeFromAnchorV01 } from './InstructionNode';\nimport { extractGenerics } from './unwrapGenerics';\n\nexport function programNodeFromAnchorV01(idl: IdlV01): ProgramNode {\n    const [types, generics] = extractGenerics(idl.types ?? []);\n    const accounts = idl.accounts ?? [];\n    const events = idl.events ?? [];\n    const instructions = idl.instructions ?? [];\n    const errors = idl.errors ?? [];\n\n    const filteredTypes = types.filter(\n        type =>\n            !accounts.some(account => account.name === type.name) && !events.some(event => event.name === type.name),\n    );\n    const definedTypes = filteredTypes.map(type => definedTypeNodeFromAnchorV01(type, generics));\n    const accountNodes = accounts.map(account => accountNodeFromAnchorV01(account, types, generics));\n\n    return programNode({\n        accounts: accountNodes,\n        definedTypes,\n        errors: errors.map(errorNodeFromAnchorV01),\n        events: events.map(event => eventNodeFromAnchorV01(event, types, generics)),\n        instructions: instructions.map(instruction => instructionNodeFromAnchorV01(instruction, generics)),\n        name: idl.metadata.name,\n        origin: 'anchor',\n        publicKey: idl.address,\n        version: idl.metadata.version as ProgramVersion,\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/RootNode.ts",
    "content": "import { RootNode, rootNode } from '@codama/nodes';\n\nimport { IdlV01 } from './idl';\nimport { programNodeFromAnchorV01 } from './ProgramNode';\n\nexport function rootNodeFromAnchorV01(program: IdlV01, additionalPrograms: IdlV01[] = []): RootNode {\n    const programNode = programNodeFromAnchorV01(program);\n    const additionalProgramNodes = additionalPrograms.map(programNodeFromAnchorV01);\n    return rootNode(programNode, additionalProgramNodes);\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/idl.ts",
    "content": "export type IdlV01 = {\n    accounts?: IdlV01Account[];\n    address: string;\n    constants?: IdlV01Const[];\n    docs?: string[];\n    errors?: IdlV01ErrorCode[];\n    events?: IdlV01Event[];\n    instructions: IdlV01Instruction[];\n    metadata: IdlV01Metadata;\n    types?: IdlV01TypeDef[];\n};\n\nexport type IdlV01Metadata = {\n    contact?: string;\n    dependencies?: IdlV01Dependency[];\n    deployments?: IdlV01Deployments;\n    description?: string;\n    name: string;\n    repository?: string;\n    spec: string;\n    version: string;\n};\n\nexport type IdlV01Dependency = {\n    name: string;\n    version: string;\n};\n\nexport type IdlV01Deployments = {\n    devnet?: string;\n    localnet?: string;\n    mainnet?: string;\n    testnet?: string;\n};\n\nexport type IdlV01Instruction = {\n    accounts: IdlV01InstructionAccountItem[];\n    args: IdlV01Field[];\n    discriminator: IdlV01Discriminator;\n    docs?: string[];\n    name: string;\n    returns?: IdlV01Type;\n};\n\nexport type IdlV01InstructionAccountItem = IdlV01InstructionAccount | IdlV01InstructionAccounts;\n\nexport type IdlV01InstructionAccount = {\n    address?: string;\n    docs?: string[];\n    name: string;\n    optional?: boolean;\n    pda?: IdlV01Pda;\n    relations?: string[];\n    signer?: boolean;\n    writable?: boolean;\n};\n\nexport type IdlV01InstructionAccounts = {\n    accounts: IdlV01InstructionAccount[];\n    name: string;\n};\n\nexport type IdlV01Pda = {\n    program?: IdlV01Seed;\n    seeds: IdlV01Seed[];\n};\n\nexport type IdlV01Seed = IdlV01SeedAccount | IdlV01SeedArg | IdlV01SeedConst;\n\nexport type IdlV01SeedConst = {\n    kind: 'const';\n    value: number[];\n};\n\nexport type IdlV01SeedArg = {\n    kind: 'arg';\n    path: string;\n};\n\nexport type IdlV01SeedAccount = {\n    account?: string;\n    kind: 'account';\n    path: string;\n};\n\nexport type IdlV01Account = {\n    discriminator: IdlV01Discriminator;\n    name: string;\n};\n\nexport type IdlV01Event = {\n    discriminator: IdlV01Discriminator;\n    name: string;\n};\n\nexport type IdlV01Const = {\n    name: string;\n    type: IdlV01Type;\n    value: string;\n};\n\nexport type IdlV01ErrorCode = {\n    code: number;\n    msg?: string;\n    name: string;\n};\n\nexport type IdlV01Field = {\n    docs?: string[];\n    name: string;\n    type: IdlV01Type;\n};\n\nexport type IdlV01TypeDef = {\n    docs?: string[];\n    generics?: IdlV01TypeDefGeneric[];\n    name: string;\n    repr?: IdlV01Repr;\n    serialization?: IdlV01Serialization;\n    type: IdlV01TypeDefTy;\n};\n\nexport type IdlV01Serialization = 'borsh' | 'bytemuck' | 'bytemuckunsafe' | { custom: string };\n\nexport type IdlV01Repr = IdlV01ReprC | IdlV01ReprRust | IdlV01ReprTransparent;\n\nexport type IdlV01ReprRust = IdlV01ReprModifier & {\n    kind: 'rust';\n};\n\nexport type IdlV01ReprC = IdlV01ReprModifier & {\n    kind: 'c';\n};\n\nexport type IdlV01ReprTransparent = {\n    kind: 'transparent';\n};\n\nexport type IdlV01ReprModifier = {\n    align?: number;\n    packed?: boolean;\n};\n\nexport type IdlV01TypeDefGeneric = IdlV01TypeDefGenericConst | IdlV01TypeDefGenericType;\n\nexport type IdlV01TypeDefGenericType = {\n    kind: 'type';\n    name: string;\n};\n\nexport type IdlV01TypeDefGenericConst = {\n    kind: 'const';\n    name: string;\n    type: string;\n};\n\nexport type IdlV01TypeDefTy = IdlV01TypeDefTyAlias | IdlV01TypeDefTyEnum | IdlV01TypeDefTyStruct | IdlV01TypeDefTyType;\n\nexport type IdlV01TypeDefTyStruct = {\n    fields?: IdlV01DefinedFields;\n    kind: 'struct';\n};\n\nexport type IdlV01TypeDefTyEnum = {\n    kind: 'enum';\n    variants: IdlV01EnumVariant[];\n};\n\nexport type IdlV01TypeDefTyAlias = {\n    kind: 'alias';\n    value: IdlV01Type;\n};\n\nexport type IdlV01TypeDefTyType = {\n    alias: IdlV01Type;\n    kind: 'type';\n};\n\nexport type IdlV01EnumVariant = {\n    fields?: IdlV01DefinedFields;\n    name: string;\n};\n\nexport type IdlV01DefinedFields = IdlV01DefinedFieldsNamed | IdlV01DefinedFieldsTuple;\n\nexport type IdlV01DefinedFieldsNamed = IdlV01Field[];\n\nexport type IdlV01DefinedFieldsTuple = IdlV01Type[];\n\nexport type IdlV01ArrayLen = IdlV01ArrayLenGeneric | IdlV01ArrayLenValue;\n\nexport type IdlV01ArrayLenGeneric = {\n    generic: string;\n};\n\nexport type IdlV01ArrayLenValue = number;\n\nexport type IdlV01GenericArg = IdlV01GenericArgConst | IdlV01GenericArgType;\n\nexport type IdlV01GenericArgType = { kind: 'type'; type: IdlV01Type };\n\nexport type IdlV01GenericArgConst = { kind: 'const'; value: string };\n\nexport type IdlV01Type =\n    | IdlV01TypeArray\n    | IdlV01TypeCOption\n    | IdlV01TypeDefined\n    | IdlV01TypeGeneric\n    | IdlV01TypeNumber\n    | IdlV01TypeOption\n    | IdlV01TypeVec\n    | 'bool'\n    | 'bytes'\n    | 'pubkey'\n    | 'string';\n\nexport type IdlV01TypeUnsignedInteger = 'shortU16' | 'u8' | 'u16' | 'u32' | 'u64' | 'u128';\nexport type IdlV01TypeSignedInteger = 'i8' | 'i16' | 'i32' | 'i64' | 'i128';\nexport type IdlV01TypeInteger = IdlV01TypeSignedInteger | IdlV01TypeUnsignedInteger;\nexport type IdlV01TypeDecimals = 'f32' | 'f64';\nexport type IdlV01TypeNumber = IdlV01TypeDecimals | IdlV01TypeInteger;\n\nexport type IdlV01TypeOption = {\n    option: IdlV01Type;\n};\n\nexport type IdlV01TypeCOption = {\n    coption: IdlV01Type;\n};\n\nexport type IdlV01TypeVec = {\n    vec: IdlV01Type;\n};\n\nexport type IdlV01TypeArray = {\n    array: [IdlV01Type: IdlV01Type, size: IdlV01ArrayLen];\n};\n\nexport type IdlV01TypeDefined = {\n    defined: {\n        generics?: IdlV01GenericArg[];\n        name: string;\n    };\n};\n\nexport type IdlV01TypeGeneric = {\n    generic: string;\n};\n\nexport type IdlV01Discriminator = number[];\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/index.ts",
    "content": "export * from './AccountNode';\nexport * from './DefinedTypeNode';\nexport * from './EventNode';\nexport * from './ErrorNode';\nexport * from './idl';\nexport * from './InstructionAccountNode';\nexport * from './InstructionArgumentNode';\nexport * from './InstructionNode';\nexport * from './PdaSeedNode';\nexport * from './ProgramNode';\nexport * from './RootNode';\nexport * from './typeNodes';\nexport * from './unwrapGenerics';\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/typeNodes/ArrayTypeNode.ts",
    "content": "import { ArrayTypeNode, arrayTypeNode, fixedCountNode, numberTypeNode, prefixedCountNode } from '@codama/nodes';\n\nimport type { IdlV01TypeArray, IdlV01TypeVec } from '../idl';\nimport type { GenericsV01 } from '../unwrapGenerics';\nimport { typeNodeFromAnchorV01 } from './TypeNode';\n\nexport function arrayTypeNodeFromAnchorV01(idl: IdlV01TypeArray | IdlV01TypeVec, generics: GenericsV01): ArrayTypeNode {\n    if ('array' in idl) {\n        const item = typeNodeFromAnchorV01(idl.array[0], generics);\n        const size =\n            typeof idl.array[1] === 'number' ? idl.array[1] : parseInt(generics.constArgs[idl.array[1].generic].value);\n        return arrayTypeNode(item, fixedCountNode(size));\n    }\n\n    const item = typeNodeFromAnchorV01(idl.vec, generics);\n\n    return arrayTypeNode(item, prefixedCountNode(numberTypeNode('u32')));\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/typeNodes/EnumEmptyVariantTypeNode.ts",
    "content": "import { EnumEmptyVariantTypeNode, enumEmptyVariantTypeNode } from '@codama/nodes';\n\nimport { IdlV01EnumVariant } from '../idl';\n\nexport function enumEmptyVariantTypeNodeFromAnchorV01(idl: IdlV01EnumVariant): EnumEmptyVariantTypeNode {\n    return enumEmptyVariantTypeNode(idl.name ?? '');\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/typeNodes/EnumStructVariantTypeNode.ts",
    "content": "import { EnumStructVariantTypeNode, enumStructVariantTypeNode, StructTypeNode } from '@codama/nodes';\n\nimport type { IdlV01DefinedFieldsNamed, IdlV01EnumVariant } from '../idl';\nimport type { GenericsV01 } from '../unwrapGenerics';\nimport { structTypeNodeFromAnchorV01 } from './StructTypeNode';\n\nexport function enumStructVariantTypeNodeFromAnchorV01(\n    idl: IdlV01EnumVariant & { fields: IdlV01DefinedFieldsNamed },\n    generics: GenericsV01,\n): EnumStructVariantTypeNode<StructTypeNode> {\n    return enumStructVariantTypeNode(\n        idl.name ?? '',\n        structTypeNodeFromAnchorV01({ fields: idl.fields, kind: 'struct' }, generics),\n    );\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/typeNodes/EnumTupleVariantTypeNode.ts",
    "content": "import { EnumTupleVariantTypeNode, enumTupleVariantTypeNode, TupleTypeNode } from '@codama/nodes';\n\nimport type { IdlV01DefinedFieldsTuple, IdlV01EnumVariant } from '../idl';\nimport type { GenericsV01 } from '../unwrapGenerics';\nimport { tupleTypeNodeFromAnchorV01 } from './TupleTypeNode';\n\nexport function enumTupleVariantTypeNodeFromAnchorV01(\n    idl: IdlV01EnumVariant & { fields: IdlV01DefinedFieldsTuple },\n    generics: GenericsV01,\n): EnumTupleVariantTypeNode<TupleTypeNode> {\n    return enumTupleVariantTypeNode(idl.name ?? '', tupleTypeNodeFromAnchorV01(idl.fields, generics));\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/typeNodes/EnumTypeNode.ts",
    "content": "import { EnumTypeNode, enumTypeNode, EnumVariantTypeNode, NumberTypeNode } from '@codama/nodes';\n\nimport type {\n    IdlV01DefinedFieldsNamed,\n    IdlV01DefinedFieldsTuple,\n    IdlV01EnumVariant,\n    IdlV01TypeDefTyEnum,\n} from '../idl';\nimport type { GenericsV01 } from '../unwrapGenerics';\nimport { enumEmptyVariantTypeNodeFromAnchorV01 } from './EnumEmptyVariantTypeNode';\nimport { enumStructVariantTypeNodeFromAnchorV01 } from './EnumStructVariantTypeNode';\nimport { enumTupleVariantTypeNodeFromAnchorV01 } from './EnumTupleVariantTypeNode';\n\nexport function enumTypeNodeFromAnchorV01(\n    idl: IdlV01TypeDefTyEnum,\n    generics: GenericsV01,\n): EnumTypeNode<EnumVariantTypeNode[], NumberTypeNode> {\n    const variants = idl.variants.map((variant): EnumVariantTypeNode => {\n        if (!variant.fields || variant.fields.length <= 0) {\n            return enumEmptyVariantTypeNodeFromAnchorV01(variant);\n        }\n        if (isStructVariant(variant)) {\n            return enumStructVariantTypeNodeFromAnchorV01(variant, generics);\n        }\n        return enumTupleVariantTypeNodeFromAnchorV01(\n            variant as IdlV01EnumVariant & { fields: IdlV01DefinedFieldsTuple },\n            generics,\n        );\n    });\n    return enumTypeNode(variants);\n}\n\nfunction isStructVariant(\n    variant: IdlV01EnumVariant,\n): variant is IdlV01EnumVariant & { fields: IdlV01DefinedFieldsNamed } {\n    const field = variant.fields![0];\n    return typeof field === 'object' && 'name' in field && 'type' in field;\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/typeNodes/OptionTypeNode.ts",
    "content": "import { numberTypeNode, OptionTypeNode, optionTypeNode } from '@codama/nodes';\n\nimport type { IdlV01TypeCOption, IdlV01TypeOption } from '../idl';\nimport type { GenericsV01 } from '../unwrapGenerics';\nimport { typeNodeFromAnchorV01 } from './TypeNode';\n\nexport function optionTypeNodeFromAnchorV01(\n    idl: IdlV01TypeCOption | IdlV01TypeOption,\n    generics: GenericsV01,\n): OptionTypeNode {\n    const item = 'option' in idl ? idl.option : idl.coption;\n    const hasOptionField = 'option' in idl;\n\n    const prefix = numberTypeNode(hasOptionField ? 'u8' : 'u32');\n    const fixed = !hasOptionField;\n\n    return optionTypeNode(typeNodeFromAnchorV01(item, generics), {\n        fixed,\n        prefix,\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/typeNodes/StructFieldTypeNode.ts",
    "content": "import { CODAMA_ERROR__ANCHOR__UNRECOGNIZED_IDL_TYPE, CodamaError } from '@codama/errors';\nimport { StructFieldTypeNode, structFieldTypeNode } from '@codama/nodes';\n\nimport type { IdlV01Field, IdlV01Type } from '../idl';\nimport type { GenericsV01 } from '../unwrapGenerics';\nimport { typeNodeFromAnchorV01 } from './TypeNode';\n\nexport function structFieldTypeNodeFromAnchorV01(\n    idl: IdlV01Field | IdlV01Type,\n    generics: GenericsV01,\n): StructFieldTypeNode {\n    if (!isStructField(idl)) {\n        throw new CodamaError(CODAMA_ERROR__ANCHOR__UNRECOGNIZED_IDL_TYPE, {\n            idlType: JSON.stringify(idl),\n        });\n    }\n\n    return structFieldTypeNode({\n        docs: idl.docs ?? [],\n        name: idl.name,\n        type: typeNodeFromAnchorV01(idl.type, generics),\n    });\n}\n\nfunction isStructField(field: IdlV01Field | IdlV01Type): field is IdlV01Field {\n    return typeof field === 'object' && 'name' in field && 'type' in field;\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/typeNodes/StructTypeNode.ts",
    "content": "import { StructTypeNode, structTypeNode } from '@codama/nodes';\n\nimport type { IdlV01DefinedFields, IdlV01TypeDefTyStruct } from '../idl';\nimport type { GenericsV01 } from '../unwrapGenerics';\nimport { structFieldTypeNodeFromAnchorV01 } from './StructFieldTypeNode';\n\nexport function structTypeNodeFromAnchorV01(idl: IdlV01TypeDefTyStruct, generics: GenericsV01): StructTypeNode {\n    const fields: IdlV01DefinedFields = idl.fields ?? [];\n\n    return structTypeNode(fields.map(field => structFieldTypeNodeFromAnchorV01(field, generics)));\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/typeNodes/TupleTypeNode.ts",
    "content": "import { TupleTypeNode, tupleTypeNode } from '@codama/nodes';\n\nimport type { IdlV01DefinedFieldsTuple } from '../idl';\nimport type { GenericsV01 } from '../unwrapGenerics';\nimport { typeNodeFromAnchorV01 } from './TypeNode';\n\nexport function tupleTypeNodeFromAnchorV01(idl: IdlV01DefinedFieldsTuple, generics: GenericsV01): TupleTypeNode {\n    return tupleTypeNode(idl.map(type => typeNodeFromAnchorV01(type, generics)));\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/typeNodes/TypeNode.ts",
    "content": "import { CODAMA_ERROR__ANCHOR__UNRECOGNIZED_IDL_TYPE, CodamaError } from '@codama/errors';\nimport {\n    booleanTypeNode,\n    bytesTypeNode,\n    definedTypeLinkNode,\n    numberTypeNode,\n    publicKeyTypeNode,\n    sizePrefixTypeNode,\n    stringTypeNode,\n    TypeNode,\n} from '@codama/nodes';\n\nimport type {\n    IdlV01DefinedFields,\n    IdlV01DefinedFieldsNamed,\n    IdlV01DefinedFieldsTuple,\n    IdlV01Field,\n    IdlV01Type,\n    IdlV01TypeDefTy,\n} from '../idl';\nimport { type GenericsV01, unwrapGenericTypeFromAnchorV01 } from '../unwrapGenerics';\nimport { arrayTypeNodeFromAnchorV01 } from './ArrayTypeNode';\nimport { enumTypeNodeFromAnchorV01 } from './EnumTypeNode';\nimport { optionTypeNodeFromAnchorV01 } from './OptionTypeNode';\nimport { structTypeNodeFromAnchorV01 } from './StructTypeNode';\nimport { tupleTypeNodeFromAnchorV01 } from './TupleTypeNode';\n\nconst IDL_V01_TYPE_LEAVES = [\n    'string',\n    'pubkey',\n    'bytes',\n    'bool',\n    'u8',\n    'u16',\n    'u32',\n    'u64',\n    'u128',\n    'i8',\n    'i16',\n    'i32',\n    'i64',\n    'i128',\n    'f32',\n    'f64',\n    'shortU16',\n] as const;\n\nexport const typeNodeFromAnchorV01 = (idlType: IdlV01Type | IdlV01TypeDefTy, generics: GenericsV01): TypeNode => {\n    // Leaf.\n    if (typeof idlType === 'string' && IDL_V01_TYPE_LEAVES.includes(idlType)) {\n        if (idlType === 'bool') return booleanTypeNode();\n        if (idlType === 'pubkey') return publicKeyTypeNode();\n        if (idlType === 'string') return sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u32'));\n        if (idlType === 'bytes') return sizePrefixTypeNode(bytesTypeNode(), numberTypeNode('u32'));\n        return numberTypeNode(idlType);\n    }\n\n    // Ensure eveything else is an object.\n    if (typeof idlType !== 'object') {\n        throw new CodamaError(CODAMA_ERROR__ANCHOR__UNRECOGNIZED_IDL_TYPE, {\n            idlType: JSON.stringify(idlType),\n        });\n    }\n\n    // Array.\n    if ('array' in idlType && isArrayOfSize(idlType.array, 2)) {\n        return arrayTypeNodeFromAnchorV01(idlType, generics);\n    }\n\n    // Vec.\n    if ('vec' in idlType) {\n        return arrayTypeNodeFromAnchorV01(idlType, generics);\n    }\n\n    // Defined link.\n    if ('defined' in idlType && typeof idlType.defined === 'object') {\n        return 'generics' in idlType.defined\n            ? unwrapGenericTypeFromAnchorV01(idlType, generics)\n            : definedTypeLinkNode(idlType.defined.name);\n    }\n\n    // Generic reference.\n    if ('generic' in idlType) {\n        return typeNodeFromAnchorV01(generics.typeArgs[idlType.generic].type, generics);\n    }\n\n    // Enum.\n    if ('kind' in idlType && idlType.kind === 'enum' && 'variants' in idlType) {\n        return enumTypeNodeFromAnchorV01(idlType, generics);\n    }\n\n    // Alias.\n    if ('kind' in idlType && idlType.kind === 'alias' && 'value' in idlType) {\n        return typeNodeFromAnchorV01(idlType.value, generics);\n    }\n\n    // Option.\n    if ('option' in idlType) {\n        return optionTypeNodeFromAnchorV01(idlType, generics);\n    }\n\n    if ('coption' in idlType) {\n        return optionTypeNodeFromAnchorV01(idlType, generics);\n    }\n\n    // Struct and Tuple.\n    if ('kind' in idlType && idlType.kind === 'struct') {\n        const fields = idlType.fields ?? [];\n        if (isStructFieldArray(fields)) {\n            return structTypeNodeFromAnchorV01(idlType, generics);\n        }\n        if (isTupleFieldArray(fields)) {\n            return tupleTypeNodeFromAnchorV01(fields, generics);\n        }\n    }\n\n    throw new CodamaError(CODAMA_ERROR__ANCHOR__UNRECOGNIZED_IDL_TYPE, {\n        idlType: JSON.stringify(idlType),\n    });\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction isArrayOfSize(array: any, size: number): boolean {\n    return Array.isArray(array) && array.length === size;\n}\n\nfunction isStructFieldArray(field: IdlV01DefinedFields): field is IdlV01DefinedFieldsNamed {\n    return field.every(isStructField);\n}\n\nfunction isTupleFieldArray(field: IdlV01DefinedFields): field is IdlV01DefinedFieldsTuple {\n    return field.every(f => !isStructField(f));\n}\n\nfunction isStructField(field: IdlV01Field | IdlV01Type): field is IdlV01Field {\n    return typeof field === 'object' && 'name' in field && 'type' in field;\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/typeNodes/index.ts",
    "content": "export * from './ArrayTypeNode';\nexport * from './EnumEmptyVariantTypeNode';\nexport * from './EnumStructVariantTypeNode';\nexport * from './EnumTupleVariantTypeNode';\nexport * from './EnumTypeNode';\nexport * from './OptionTypeNode';\nexport * from './StructFieldTypeNode';\nexport * from './StructTypeNode';\nexport * from './TupleTypeNode';\nexport * from './TypeNode';\n"
  },
  {
    "path": "packages/nodes-from-anchor/src/v01/unwrapGenerics.ts",
    "content": "import { CODAMA_ERROR__ANCHOR__GENERIC_TYPE_MISSING, CodamaError } from '@codama/errors';\nimport { TypeNode } from '@codama/nodes';\n\nimport {\n    IdlV01GenericArgConst,\n    IdlV01GenericArgType,\n    IdlV01TypeDef,\n    IdlV01TypeDefGenericConst,\n    IdlV01TypeDefGenericType,\n    IdlV01TypeDefined,\n} from './idl';\nimport { typeNodeFromAnchorV01 } from './typeNodes';\n\nexport type GenericsV01 = {\n    constArgs: Record<string, IdlV01GenericArgConst & IdlV01TypeDefGenericConst>;\n    typeArgs: Record<string, IdlV01GenericArgType & IdlV01TypeDefGenericType>;\n    types: Record<string, IdlV01TypeDef & Required<Pick<IdlV01TypeDef, 'generics'>>>;\n};\n\nexport function extractGenerics(types: IdlV01TypeDef[]): [IdlV01TypeDef[], GenericsV01] {\n    const [nonGenericTypes, genericTypes] = types.reduce(\n        (acc, type) => {\n            acc['generics' in type ? 1 : 0].push(type);\n            return acc;\n        },\n        [[], []] as [IdlV01TypeDef[], IdlV01TypeDef[]],\n    );\n\n    const generics = {\n        constArgs: {},\n        typeArgs: {},\n        types: Object.fromEntries(genericTypes.map(type => [type.name, type])),\n    } as GenericsV01;\n\n    return [nonGenericTypes, generics];\n}\n\nexport function unwrapGenericTypeFromAnchorV01(type: IdlV01TypeDefined, generics: GenericsV01): TypeNode {\n    const genericType = generics.types[type.defined.name];\n    if (!genericType) {\n        throw new CodamaError(CODAMA_ERROR__ANCHOR__GENERIC_TYPE_MISSING, { name: type.defined.name });\n    }\n\n    const constArgs: GenericsV01['constArgs'] = {};\n    const typeArgs: GenericsV01['typeArgs'] = {};\n\n    const genericDefinitions = genericType.generics ?? [];\n    const genericArgs = type.defined.generics ?? [];\n    genericDefinitions.forEach((genericDefinition, index) => {\n        const genericArg = genericArgs[index];\n        if (genericDefinition.kind === 'const') {\n            constArgs[genericDefinition.name] = genericArg as IdlV01GenericArgConst & IdlV01TypeDefGenericConst;\n        } else {\n            typeArgs[genericDefinition.name] = genericArg as IdlV01GenericArgType & IdlV01TypeDefGenericType;\n        }\n    });\n\n    return typeNodeFromAnchorV01(genericType.type, {\n        ...generics,\n        constArgs: { ...generics.constArgs, ...constArgs },\n        typeArgs: { ...generics.typeArgs, ...typeArgs },\n    });\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/discriminator.test.ts",
    "content": "import { bytesValueNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getAnchorAccountDiscriminatorV00, getAnchorInstructionDiscriminatorV00 } from '../src/index.js';\n\ntest('it can compute the discriminator of an Anchor account', () => {\n    // Given an account named \"StakeEntry\" on the IDL.\n    const idlName = 'StakeEntry';\n\n    // When we compute its Anchor discriminator.\n    const discriminator = getAnchorAccountDiscriminatorV00(idlName);\n\n    // Then we get the expected value.\n    expect(discriminator).toEqual(bytesValueNode('base16', 'bb7f09239b445628'));\n});\n\ntest('it can compute the discriminator of an Anchor instruction', () => {\n    // Given an instruction named \"addConfigLines\" on the IDL.\n    const idlName = 'addConfigLines';\n\n    // When we compute its Anchor discriminator.\n    const discriminator = getAnchorInstructionDiscriminatorV00(idlName);\n\n    // Then we get the expected value.\n    expect(discriminator).toEqual(bytesValueNode('base16', 'df32e0e39708736a'));\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/rootNodeFromAnchor.test.ts",
    "content": "import { programNode, rootNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { rootNodeFromAnchor } from '../src';\n\ntest('it creates root nodes from IDL version 0.0', () => {\n    const node = rootNodeFromAnchor({\n        instructions: [],\n        metadata: { address: '1111' },\n        name: 'myProgram',\n        version: '1.2.3',\n    });\n\n    expect(node).toEqual(\n        rootNode(\n            programNode({\n                name: 'myProgram',\n                origin: 'anchor',\n                publicKey: '1111',\n                version: '1.2.3',\n            }),\n        ),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/AccountNode.test.ts",
    "content": "import {\n    accountNode,\n    bytesTypeNode,\n    bytesValueNode,\n    fieldDiscriminatorNode,\n    fixedSizeTypeNode,\n    numberTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { accountNodeFromAnchorV00 } from '../../src';\n\ntest('it creates account nodes', () => {\n    const node = accountNodeFromAnchorV00({\n        name: 'myAccount',\n        type: {\n            fields: [{ name: 'myField', type: 'u64' }],\n            kind: 'struct',\n        },\n    });\n\n    expect(node).toEqual(\n        accountNode({\n            data: structTypeNode([\n                structFieldTypeNode({\n                    name: 'myField',\n                    type: numberTypeNode('u64'),\n                }),\n            ]),\n            name: 'myAccount',\n        }),\n    );\n});\n\ntest('it creates account nodes with anchor discriminators', () => {\n    const node = accountNodeFromAnchorV00(\n        {\n            name: 'myAccount',\n            type: { fields: [], kind: 'struct' },\n        },\n        'anchor',\n    );\n\n    expect(node).toEqual(\n        accountNode({\n            data: structTypeNode([\n                structFieldTypeNode({\n                    defaultValue: bytesValueNode('base16', 'f61c0657fb2d322a'),\n                    defaultValueStrategy: 'omitted',\n                    name: 'discriminator',\n                    type: fixedSizeTypeNode(bytesTypeNode(), 8),\n                }),\n            ]),\n            discriminators: [fieldDiscriminatorNode('discriminator')],\n            name: 'myAccount',\n        }),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/DefinedTypeNode.test.ts",
    "content": "import { definedTypeNode, numberTypeNode, structFieldTypeNode, structTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { definedTypeNodeFromAnchorV00 } from '../../src';\n\ntest('it creates defined type nodes', () => {\n    const node = definedTypeNodeFromAnchorV00({\n        name: 'myType',\n        type: {\n            fields: [{ name: 'myField', type: 'u64' }],\n            kind: 'struct',\n        },\n    });\n\n    expect(node).toEqual(\n        definedTypeNode({\n            name: 'myType',\n            type: structTypeNode([\n                structFieldTypeNode({\n                    name: 'myField',\n                    type: numberTypeNode('u64'),\n                }),\n            ]),\n        }),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/ErrorNode.test.ts",
    "content": "import { errorNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { errorNodeFromAnchorV00 } from '../../src';\n\ntest('it creates error nodes', () => {\n    const node = errorNodeFromAnchorV00({\n        code: 42,\n        msg: 'my error message',\n        name: 'myError',\n    });\n\n    expect(node).toEqual(\n        errorNode({\n            code: 42,\n            docs: ['myError: my error message'],\n            message: 'my error message',\n            name: 'myError',\n        }),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/InstructionAccountNode.test.ts",
    "content": "import { instructionAccountNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { instructionAccountNodeFromAnchorV00, instructionAccountNodesFromAnchorV00 } from '../../src';\n\ntest('it creates instruction account nodes', () => {\n    const node = instructionAccountNodeFromAnchorV00({\n        docs: ['my docs'],\n        isMut: true,\n        isOptional: true,\n        isSigner: false,\n        name: 'myInstructionAccount',\n    });\n\n    expect(node).toEqual(\n        instructionAccountNode({\n            docs: ['my docs'],\n            isOptional: true,\n            isSigner: false,\n            isWritable: true,\n            name: 'myInstructionAccount',\n        }),\n    );\n});\n\ntest('it flattens nested instruction accounts without prefixing when no duplicates exist', () => {\n    const nodes = instructionAccountNodesFromAnchorV00([\n        { isMut: false, isSigner: false, name: 'accountA' },\n        {\n            accounts: [\n                { isMut: true, isSigner: false, name: 'accountB' },\n                { isMut: false, isSigner: true, name: 'accountC' },\n            ],\n            name: 'nested',\n        },\n        { isMut: true, isSigner: true, name: 'accountD' },\n    ]);\n\n    expect(nodes).toEqual([\n        instructionAccountNode({ isSigner: false, isWritable: false, name: 'accountA' }),\n        instructionAccountNode({ isSigner: false, isWritable: true, name: 'accountB' }),\n        instructionAccountNode({ isSigner: true, isWritable: false, name: 'accountC' }),\n        instructionAccountNode({ isSigner: true, isWritable: true, name: 'accountD' }),\n    ]);\n});\n\ntest('it prevents duplicate names by prefixing nested accounts with different parent names', () => {\n    const nodes = instructionAccountNodesFromAnchorV00([\n        {\n            accounts: [\n                { isMut: false, isSigner: false, name: 'mint' },\n                { isMut: false, isSigner: true, name: 'authority' },\n            ],\n            name: 'tokenProgram',\n        },\n        {\n            accounts: [\n                { isMut: true, isSigner: false, name: 'mint' },\n                { isMut: true, isSigner: false, name: 'metadata' },\n            ],\n            name: 'nftProgram',\n        },\n    ]);\n\n    expect(nodes).toEqual([\n        instructionAccountNode({ isSigner: false, isWritable: false, name: 'tokenProgramMint' }),\n        instructionAccountNode({ isSigner: true, isWritable: false, name: 'tokenProgramAuthority' }),\n        instructionAccountNode({ isSigner: false, isWritable: true, name: 'nftProgramMint' }),\n        instructionAccountNode({ isSigner: false, isWritable: true, name: 'nftProgramMetadata' }),\n    ]);\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/InstructionArgumentNode.test.ts",
    "content": "import { instructionArgumentNode, numberTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { instructionArgumentNodeFromAnchorV00 } from '../../src';\n\ntest('it creates instruction argument nodes', () => {\n    const node = instructionArgumentNodeFromAnchorV00({\n        name: 'myInstructionArgument',\n        type: 'u8',\n    });\n\n    expect(node).toEqual(\n        instructionArgumentNode({\n            name: 'myInstructionArgument',\n            type: numberTypeNode('u8'),\n        }),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/InstructionNode.test.ts",
    "content": "import {\n    bytesTypeNode,\n    bytesValueNode,\n    fieldDiscriminatorNode,\n    fixedSizeTypeNode,\n    instructionAccountNode,\n    instructionArgumentNode,\n    instructionNode,\n    numberTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { instructionNodeFromAnchorV00 } from '../../src';\n\ntest('it creates instruction nodes', () => {\n    const node = instructionNodeFromAnchorV00(\n        {\n            accounts: [{ isMut: true, isSigner: false, name: 'mint' }],\n            args: [{ name: 'amount', type: 'u8' }],\n            name: 'mintTokens',\n        },\n        0,\n    );\n\n    expect(node).toEqual(\n        instructionNode({\n            accounts: [instructionAccountNode({ isSigner: false, isWritable: true, name: 'mint' })],\n            arguments: [instructionArgumentNode({ name: 'amount', type: numberTypeNode('u8') })],\n            name: 'mintTokens',\n        }),\n    );\n});\n\ntest('it creates instruction nodes with anchor discriminators', () => {\n    const node = instructionNodeFromAnchorV00(\n        {\n            accounts: [],\n            args: [],\n            name: 'myInstruction',\n        },\n        0,\n        'anchor',\n    );\n\n    expect(node).toEqual(\n        instructionNode({\n            arguments: [\n                instructionArgumentNode({\n                    defaultValue: bytesValueNode('base16', 'c3f1b80e7f9b4435'),\n                    defaultValueStrategy: 'omitted',\n                    name: 'discriminator',\n                    type: fixedSizeTypeNode(bytesTypeNode(), 8),\n                }),\n            ],\n            discriminators: [fieldDiscriminatorNode('discriminator')],\n            name: 'myInstruction',\n        }),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/PdaNode.test.ts",
    "content": "import {\n    constantPdaSeedNode,\n    constantPdaSeedNodeFromProgramId,\n    numberTypeNode,\n    numberValueNode,\n    pdaNode,\n    variablePdaSeedNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { pdaNodeFromAnchorV00 } from '../../src';\n\ntest('it creates PDA nodes', () => {\n    const node = pdaNodeFromAnchorV00({\n        name: 'myPda',\n        seeds: [\n            { kind: 'programId' },\n            { kind: 'constant', type: 'u8', value: 42 },\n            { description: 'seed description', kind: 'variable', name: 'myVariableSeed', type: 'u16' },\n        ],\n    });\n\n    expect(node).toEqual(\n        pdaNode({\n            name: 'myPda',\n            seeds: [\n                constantPdaSeedNodeFromProgramId(),\n                constantPdaSeedNode(numberTypeNode('u8'), numberValueNode(42)),\n                variablePdaSeedNode('myVariableSeed', numberTypeNode('u16'), 'seed description'),\n            ],\n        }),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/ProgramNode.test.ts",
    "content": "import {\n    accountNode,\n    bytesTypeNode,\n    bytesValueNode,\n    constantPdaSeedNodeFromProgramId,\n    definedTypeNode,\n    errorNode,\n    fieldDiscriminatorNode,\n    fixedSizeTypeNode,\n    instructionArgumentNode,\n    instructionNode,\n    pdaLinkNode,\n    pdaNode,\n    programNode,\n    structTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { programNodeFromAnchorV00 } from '../../src';\n\ntest('it creates program nodes', () => {\n    const node = programNodeFromAnchorV00({\n        accounts: [{ name: 'myAccount', seeds: [{ kind: 'programId' }], type: { fields: [], kind: 'struct' } }],\n        errors: [{ code: 42, msg: 'my error message', name: 'myError' }],\n        instructions: [{ accounts: [], args: [], name: 'myInstruction' }],\n        metadata: { address: '1111', origin: 'shank' },\n        name: 'myProgram',\n        types: [{ name: 'myType', type: { fields: [], kind: 'struct' } }],\n        version: '1.2.3',\n    });\n\n    expect(node).toEqual(\n        programNode({\n            accounts: [accountNode({ name: 'myAccount', pda: pdaLinkNode('myAccount') })],\n            definedTypes: [definedTypeNode({ name: 'myType', type: structTypeNode([]) })],\n            errors: [\n                errorNode({\n                    code: 42,\n                    docs: ['myError: my error message'],\n                    message: 'my error message',\n                    name: 'myError',\n                }),\n            ],\n            instructions: [\n                instructionNode({\n                    arguments: [\n                        instructionArgumentNode({\n                            defaultValue: bytesValueNode('base16', (0).toString(16)),\n                            defaultValueStrategy: 'omitted',\n                            name: 'discriminator',\n                            type: fixedSizeTypeNode(bytesTypeNode(), 1),\n                        }),\n                    ],\n                    discriminators: [fieldDiscriminatorNode('discriminator')],\n                    name: 'myInstruction',\n                }),\n            ],\n            name: 'myProgram',\n            origin: 'shank',\n            pdas: [pdaNode({ name: 'myAccount', seeds: [constantPdaSeedNodeFromProgramId()] })],\n            publicKey: '1111',\n            version: '1.2.3',\n        }),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/RootNode.test.ts",
    "content": "import { programNode, rootNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { rootNodeFromAnchorV00 } from '../../src';\n\ntest('it creates root nodes', () => {\n    const node = rootNodeFromAnchorV00({\n        instructions: [],\n        metadata: { address: '1111' },\n        name: 'myProgram',\n        version: '1.2.3',\n    });\n\n    expect(node).toEqual(\n        rootNode(\n            programNode({\n                name: 'myProgram',\n                origin: 'anchor',\n                publicKey: '1111',\n                version: '1.2.3',\n            }),\n        ),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/typeNodes/ArrayTypeNode.test.ts",
    "content": "import { arrayTypeNode, fixedCountNode, numberTypeNode, prefixedCountNode, remainderCountNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { typeNodeFromAnchorV00 } from '../../../src';\n\ntest('it creates array type nodes', () => {\n    expect(typeNodeFromAnchorV00({ array: ['u8', 2] })).toEqual(arrayTypeNode(numberTypeNode('u8'), fixedCountNode(2)));\n    expect(typeNodeFromAnchorV00({ vec: 'u8' })).toEqual(\n        arrayTypeNode(numberTypeNode('u8'), prefixedCountNode(numberTypeNode('u32'))),\n    );\n    expect(typeNodeFromAnchorV00({ size: 'u16', vec: 'u8' })).toEqual(\n        arrayTypeNode(numberTypeNode('u8'), prefixedCountNode(numberTypeNode('u16'))),\n    );\n    expect(typeNodeFromAnchorV00({ size: 'remainder', vec: 'u8' })).toEqual(\n        arrayTypeNode(numberTypeNode('u8'), remainderCountNode()),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/typeNodes/BooleanTypeNode.test.ts",
    "content": "import { booleanTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { typeNodeFromAnchorV00 } from '../../../src';\n\ntest('it creates boolean type nodes', () => {\n    expect(typeNodeFromAnchorV00('bool')).toEqual(booleanTypeNode());\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/typeNodes/BytesTypeNode.test.ts",
    "content": "import { bytesTypeNode, numberTypeNode, sizePrefixTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { typeNodeFromAnchorV00 } from '../../../src';\n\ntest('it creates bytes type nodes', () => {\n    expect(typeNodeFromAnchorV00('bytes')).toEqual(sizePrefixTypeNode(bytesTypeNode(), numberTypeNode('u32')));\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/typeNodes/EnumTypeNode.test.ts",
    "content": "import {\n    booleanTypeNode,\n    enumEmptyVariantTypeNode,\n    enumStructVariantTypeNode,\n    enumTupleVariantTypeNode,\n    enumTypeNode,\n    numberTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n    tupleTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { typeNodeFromAnchorV00 } from '../../../src';\n\ntest('it creates enum type nodes', () => {\n    const node = typeNodeFromAnchorV00({\n        kind: 'enum',\n        variants: [\n            { name: 'variantA' }, // Empty variant.\n            { fields: ['u16', 'bool'], name: 'variantB' }, // Tuple variant.\n            { fields: [{ name: 'age', type: 'u8' }], name: 'variantC' }, // Struct variant.\n        ],\n    });\n\n    expect(node).toEqual(\n        enumTypeNode([\n            enumEmptyVariantTypeNode('variantA'),\n            enumTupleVariantTypeNode('variantB', tupleTypeNode([numberTypeNode('u16'), booleanTypeNode()])),\n            enumStructVariantTypeNode(\n                'variantC',\n                structTypeNode([structFieldTypeNode({ name: 'age', type: numberTypeNode('u8') })]),\n            ),\n        ]),\n    );\n});\n\ntest('it creates enum type nodes with custom sizes', () => {\n    const node = typeNodeFromAnchorV00({ kind: 'enum', size: 'u16', variants: [] });\n    expect(node).toEqual(enumTypeNode([], { size: numberTypeNode('u16') }));\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/typeNodes/MapTypeNode.test.ts",
    "content": "import {\n    booleanTypeNode,\n    fixedCountNode,\n    mapTypeNode,\n    numberTypeNode,\n    prefixedCountNode,\n    remainderCountNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { typeNodeFromAnchorV00 } from '../../../src';\n\ntest('it creates map type nodes', () => {\n    expect(typeNodeFromAnchorV00({ hashMap: ['u8', 'bool'] })).toEqual(\n        mapTypeNode(numberTypeNode('u8'), booleanTypeNode(), prefixedCountNode(numberTypeNode('u32'))),\n    );\n    expect(typeNodeFromAnchorV00({ hashMap: ['u8', 'bool'], size: 2 })).toEqual(\n        mapTypeNode(numberTypeNode('u8'), booleanTypeNode(), fixedCountNode(2)),\n    );\n    expect(typeNodeFromAnchorV00({ hashMap: ['u8', 'bool'], size: 'u16' })).toEqual(\n        mapTypeNode(numberTypeNode('u8'), booleanTypeNode(), prefixedCountNode(numberTypeNode('u16'))),\n    );\n    expect(typeNodeFromAnchorV00({ hashMap: ['u8', 'bool'], size: 'remainder' })).toEqual(\n        mapTypeNode(numberTypeNode('u8'), booleanTypeNode(), remainderCountNode()),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/typeNodes/NumberTypeNode.test.ts",
    "content": "import { numberTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { typeNodeFromAnchorV00 } from '../../../src';\n\ntest('it creates number type nodes', () => {\n    expect(typeNodeFromAnchorV00('f32')).toEqual(numberTypeNode('f32'));\n    expect(typeNodeFromAnchorV00('f64')).toEqual(numberTypeNode('f64'));\n    expect(typeNodeFromAnchorV00('i8')).toEqual(numberTypeNode('i8'));\n    expect(typeNodeFromAnchorV00('i16')).toEqual(numberTypeNode('i16'));\n    expect(typeNodeFromAnchorV00('i32')).toEqual(numberTypeNode('i32'));\n    expect(typeNodeFromAnchorV00('i64')).toEqual(numberTypeNode('i64'));\n    expect(typeNodeFromAnchorV00('i128')).toEqual(numberTypeNode('i128'));\n    expect(typeNodeFromAnchorV00('shortU16')).toEqual(numberTypeNode('shortU16'));\n    expect(typeNodeFromAnchorV00('u8')).toEqual(numberTypeNode('u8'));\n    expect(typeNodeFromAnchorV00('u16')).toEqual(numberTypeNode('u16'));\n    expect(typeNodeFromAnchorV00('u32')).toEqual(numberTypeNode('u32'));\n    expect(typeNodeFromAnchorV00('u64')).toEqual(numberTypeNode('u64'));\n    expect(typeNodeFromAnchorV00('u128')).toEqual(numberTypeNode('u128'));\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/typeNodes/OptionTypeNode.test.ts",
    "content": "import { numberTypeNode, optionTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { typeNodeFromAnchorV00 } from '../../../src';\n\ntest('it creates option type nodes', () => {\n    expect(typeNodeFromAnchorV00({ option: 'u8' })).toEqual(optionTypeNode(numberTypeNode('u8')));\n});\n\ntest('it creates option type nodes with custom prefixes', () => {\n    expect(typeNodeFromAnchorV00({ option: 'u8', prefix: 'u64' })).toEqual(\n        optionTypeNode(numberTypeNode('u8'), { prefix: numberTypeNode('u64') }),\n    );\n});\n\ntest('it creates option type nodes with fixed size', () => {\n    expect(typeNodeFromAnchorV00({ coption: 'u8' })).toEqual(\n        optionTypeNode(numberTypeNode('u8'), { fixed: true, prefix: numberTypeNode('u32') }),\n    );\n    expect(typeNodeFromAnchorV00({ coption: 'u8', prefix: 'u16' })).toEqual(\n        optionTypeNode(numberTypeNode('u8'), { fixed: true, prefix: numberTypeNode('u16') }),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/typeNodes/PublicKeyTypeNode.test.ts",
    "content": "import { publicKeyTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { typeNodeFromAnchorV00 } from '../../../src';\n\ntest('it creates public key type nodes', () => {\n    expect(typeNodeFromAnchorV00('publicKey')).toEqual(publicKeyTypeNode());\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/typeNodes/SetTypeNode.test.ts",
    "content": "import { fixedCountNode, numberTypeNode, prefixedCountNode, remainderCountNode, setTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { typeNodeFromAnchorV00 } from '../../../src';\n\ntest('it creates set type nodes', () => {\n    expect(typeNodeFromAnchorV00({ hashSet: 'u8' })).toEqual(\n        setTypeNode(numberTypeNode('u8'), prefixedCountNode(numberTypeNode('u32'))),\n    );\n    expect(typeNodeFromAnchorV00({ hashSet: 'u8', size: 2 })).toEqual(\n        setTypeNode(numberTypeNode('u8'), fixedCountNode(2)),\n    );\n    expect(typeNodeFromAnchorV00({ hashSet: 'u8', size: 'u16' })).toEqual(\n        setTypeNode(numberTypeNode('u8'), prefixedCountNode(numberTypeNode('u16'))),\n    );\n    expect(typeNodeFromAnchorV00({ hashSet: 'u8', size: 'remainder' })).toEqual(\n        setTypeNode(numberTypeNode('u8'), remainderCountNode()),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/typeNodes/StringTypeNode.test.ts",
    "content": "import { numberTypeNode, sizePrefixTypeNode, stringTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { typeNodeFromAnchorV00 } from '../../../src';\n\ntest('it creates string type nodes', () => {\n    expect(typeNodeFromAnchorV00('string')).toEqual(sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u32')));\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/typeNodes/StructTypeNode.test.ts",
    "content": "import { numberTypeNode, sizePrefixTypeNode, stringTypeNode, structFieldTypeNode, structTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { typeNodeFromAnchorV00 } from '../../../src';\n\ntest('it creates struct type nodes', () => {\n    const node = typeNodeFromAnchorV00({\n        fields: [\n            { name: 'name', type: 'string' },\n            { name: 'age', type: 'u8' },\n        ],\n        kind: 'struct',\n    });\n\n    expect(node).toEqual(\n        structTypeNode([\n            structFieldTypeNode({\n                name: 'name',\n                type: sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u32')),\n            }),\n            structFieldTypeNode({ name: 'age', type: numberTypeNode('u8') }),\n        ]),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v00/typeNodes/TupleTypeNode.test.ts",
    "content": "import { numberTypeNode, publicKeyTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { typeNodeFromAnchorV00 } from '../../../src';\n\ntest('it creates tuple type nodes', () => {\n    const node = typeNodeFromAnchorV00({\n        tuple: ['u8', 'publicKey'],\n    });\n\n    expect(node).toEqual(tupleTypeNode([numberTypeNode('u8'), publicKeyTypeNode()]));\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/AccountNode.test.ts",
    "content": "import {\n    accountNode,\n    bytesTypeNode,\n    fieldDiscriminatorNode,\n    fixedSizeTypeNode,\n    numberTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { accountNodeFromAnchorV01, GenericsV01, getAnchorDiscriminatorV01 } from '../../src';\n\nconst generics = {} as GenericsV01;\n\ntest('it creates account nodes with anchor discriminators', () => {\n    const node = accountNodeFromAnchorV01(\n        {\n            discriminator: [246, 28, 6, 87, 251, 45, 50, 42],\n            name: 'MyAccount',\n        },\n        [\n            {\n                docs: [],\n                name: 'MyAccount',\n                type: {\n                    fields: [\n                        {\n                            name: 'name',\n                            type: 'u32',\n                        },\n                    ],\n                    kind: 'struct',\n                },\n            },\n        ],\n        generics,\n    );\n\n    expect(node).toEqual(\n        accountNode({\n            data: structTypeNode([\n                structFieldTypeNode({\n                    defaultValue: getAnchorDiscriminatorV01([246, 28, 6, 87, 251, 45, 50, 42]),\n                    defaultValueStrategy: 'omitted',\n                    name: 'discriminator',\n                    type: fixedSizeTypeNode(bytesTypeNode(), 8),\n                }),\n                structFieldTypeNode({\n                    name: 'name',\n                    type: numberTypeNode('u32'),\n                }),\n            ]),\n            discriminators: [fieldDiscriminatorNode('discriminator')],\n            name: 'myAccount',\n        }),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/DefinedTypeNode.test.ts",
    "content": "/* eslint-disable sort-keys-fix/sort-keys-fix */\nimport { definedTypeNode, numberTypeNode, structFieldTypeNode, structTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { definedTypeNodeFromAnchorV01, GenericsV01 } from '../../src';\n\ntest('it creates defined type nodes', () => {\n    const node = definedTypeNodeFromAnchorV01(\n        {\n            name: 'MyType',\n            type: {\n                fields: [{ name: 'my_field', type: 'u64' }],\n                kind: 'struct',\n            },\n        },\n        {} as GenericsV01,\n    );\n\n    expect(node).toEqual(\n        definedTypeNode({\n            name: 'myType',\n            type: structTypeNode([\n                structFieldTypeNode({\n                    name: 'myField',\n                    type: numberTypeNode('u64'),\n                }),\n            ]),\n        }),\n    );\n});\n\ntest('it unwraps generic arguments', () => {\n    const node = definedTypeNodeFromAnchorV01(\n        {\n            name: 'Buffer',\n            type: {\n                fields: [{ name: 'data', type: { generic: 'T' } }],\n                kind: 'struct',\n            },\n        },\n        {\n            constArgs: {},\n            typeArgs: { T: { name: 'T', kind: 'type', type: 'u64' } },\n            types: {},\n        },\n    );\n\n    expect(node).toEqual(\n        definedTypeNode({\n            name: 'buffer',\n            type: structTypeNode([\n                structFieldTypeNode({\n                    name: 'data',\n                    type: numberTypeNode('u64'),\n                }),\n            ]),\n        }),\n    );\n});\n\ntest('it unwraps nested generic types', () => {\n    const node = definedTypeNodeFromAnchorV01(\n        {\n            name: 'Buffer',\n            type: {\n                fields: [{ name: 'data', type: { generic: 'T' } }],\n                kind: 'struct',\n            },\n        },\n        {\n            constArgs: {},\n            typeArgs: {\n                T: {\n                    name: 'T',\n                    kind: 'type',\n                    type: { defined: { name: 'PrefixedData', generics: [{ kind: 'type', type: 'u8' }] } },\n                },\n            },\n            types: {\n                PrefixedData: {\n                    name: 'PrefixedData',\n                    generics: [{ name: 'T', kind: 'type' }],\n                    type: {\n                        fields: ['u64', { generic: 'T' }],\n                        kind: 'struct',\n                    },\n                },\n            },\n        },\n    );\n\n    expect(node).toEqual(\n        definedTypeNode({\n            name: 'buffer',\n            type: structTypeNode([\n                structFieldTypeNode({\n                    name: 'data',\n                    type: tupleTypeNode([numberTypeNode('u64'), numberTypeNode('u8')]),\n                }),\n            ]),\n        }),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/ErrorNode.test.ts",
    "content": "import { errorNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { errorNodeFromAnchorV01 } from '../../src';\n\ntest('it creates error nodes', () => {\n    const node = errorNodeFromAnchorV01({\n        code: 42,\n        msg: 'my error message',\n        name: 'myError',\n    });\n\n    expect(node).toEqual(\n        errorNode({\n            code: 42,\n            docs: ['myError: my error message'],\n            message: 'my error message',\n            name: 'myError',\n        }),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/EventNode.test.ts",
    "content": "import { CODAMA_ERROR__ANCHOR__EVENT_TYPE_MISSING, CodamaError } from '@codama/errors';\nimport { constantDiscriminatorNode, constantValueNode } from '@codama/nodes';\nimport {\n    bytesTypeNode,\n    eventNode,\n    fixedSizeTypeNode,\n    hiddenPrefixTypeNode,\n    numberTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n    tupleTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { eventNodeFromAnchorV01, GenericsV01, getAnchorDiscriminatorV01 } from '../../src';\n\nconst generics = {} as GenericsV01;\n\ntest('it creates event nodes with anchor discriminators', () => {\n    const node = eventNodeFromAnchorV01(\n        {\n            discriminator: [246, 28, 6, 87, 251, 45, 50, 42],\n            name: 'MyEvent',\n        },\n        [\n            {\n                docs: [],\n                name: 'MyEvent',\n                type: {\n                    fields: [\n                        {\n                            name: 'amount',\n                            type: 'u32',\n                        },\n                    ],\n                    kind: 'struct',\n                },\n            },\n        ],\n        generics,\n    );\n\n    expect(node).toEqual(\n        eventNode({\n            data: hiddenPrefixTypeNode(\n                structTypeNode([structFieldTypeNode({ name: 'amount', type: numberTypeNode('u32') })]),\n                [\n                    constantValueNode(\n                        fixedSizeTypeNode(bytesTypeNode(), 8),\n                        getAnchorDiscriminatorV01([246, 28, 6, 87, 251, 45, 50, 42]),\n                    ),\n                ],\n            ),\n            discriminators: [\n                constantDiscriminatorNode(\n                    constantValueNode(\n                        fixedSizeTypeNode(bytesTypeNode(), 8),\n                        getAnchorDiscriminatorV01([246, 28, 6, 87, 251, 45, 50, 42]),\n                    ),\n                ),\n            ],\n            name: 'myEvent',\n        }),\n    );\n});\n\ntest('it creates tuple event nodes with anchor discriminators', () => {\n    const node = eventNodeFromAnchorV01(\n        {\n            discriminator: [246, 28, 6, 87, 251, 45, 50, 42],\n            name: 'TupleEvent',\n        },\n        [\n            {\n                docs: [],\n                name: 'TupleEvent',\n                type: {\n                    fields: ['u32', 'u64'],\n                    kind: 'struct',\n                },\n            },\n        ],\n        generics,\n    );\n\n    expect(node).toEqual(\n        eventNode({\n            data: hiddenPrefixTypeNode(tupleTypeNode([numberTypeNode('u32'), numberTypeNode('u64')]), [\n                constantValueNode(\n                    fixedSizeTypeNode(bytesTypeNode(), 8),\n                    getAnchorDiscriminatorV01([246, 28, 6, 87, 251, 45, 50, 42]),\n                ),\n            ]),\n            discriminators: [\n                constantDiscriminatorNode(\n                    constantValueNode(\n                        fixedSizeTypeNode(bytesTypeNode(), 8),\n                        getAnchorDiscriminatorV01([246, 28, 6, 87, 251, 45, 50, 42]),\n                    ),\n                ),\n            ],\n            name: 'tupleEvent',\n        }),\n    );\n});\n\ntest('it throws when the backing event type is missing', () => {\n    expect(() =>\n        eventNodeFromAnchorV01(\n            {\n                discriminator: [246, 28, 6, 87, 251, 45, 50, 42],\n                name: 'MissingEvent',\n            },\n            [],\n            generics,\n        ),\n    ).toThrow(new CodamaError(CODAMA_ERROR__ANCHOR__EVENT_TYPE_MISSING, { name: 'MissingEvent' }));\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/InstructionAccountNode.test.ts",
    "content": "import {\n    accountValueNode,\n    argumentValueNode,\n    constantPdaSeedNodeFromBytes,\n    instructionAccountNode,\n    instructionArgumentNode,\n    numberTypeNode,\n    pdaNode,\n    pdaSeedValueNode,\n    pdaValueNode,\n    publicKeyTypeNode,\n    publicKeyValueNode,\n    variablePdaSeedNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport {\n    IdlV01InstructionAccountItem,\n    instructionAccountNodeFromAnchorV01,\n    instructionAccountNodesFromAnchorV01,\n} from '../../src';\n\ntest('it creates instruction account nodes', () => {\n    const node = instructionAccountNodeFromAnchorV01(\n        {\n            docs: ['my docs'],\n            name: 'MyInstructionAccount',\n            optional: true,\n            signer: false,\n            writable: true,\n        },\n        [],\n    );\n\n    expect(node).toEqual(\n        instructionAccountNode({\n            docs: ['my docs'],\n            isOptional: true,\n            isSigner: false,\n            isWritable: true,\n            name: 'myInstructionAccount',\n        }),\n    );\n});\n\ntest('it flattens nested instruction accounts without prefixing when no duplicates exist', () => {\n    const nodes = instructionAccountNodesFromAnchorV01(\n        [\n            { name: 'accountA', signer: false, writable: false },\n            {\n                accounts: [\n                    {\n                        name: 'account_b',\n                        signer: false,\n                        writable: true,\n                    },\n                    {\n                        name: 'account_c',\n                        pda: {\n                            seeds: [\n                                {\n                                    kind: 'const',\n                                    value: [0, 1, 2, 3],\n                                },\n                                {\n                                    kind: 'account',\n                                    path: 'account_b',\n                                },\n                                {\n                                    kind: 'arg',\n                                    path: 'amount',\n                                },\n                            ],\n                        },\n                        signer: true,\n                        writable: false,\n                    },\n                    {\n                        address: '11111111111111111111111111111111',\n                        name: 'system_program',\n                    },\n                ],\n                name: 'nested',\n            },\n            { name: 'account_d', signer: true, writable: true },\n        ],\n        [instructionArgumentNode({ name: 'amount', type: numberTypeNode('u8') })],\n    );\n\n    expect(nodes).toEqual([\n        instructionAccountNode({ isSigner: false, isWritable: false, name: 'accountA' }),\n        instructionAccountNode({ isSigner: false, isWritable: true, name: 'accountB' }),\n        instructionAccountNode({\n            defaultValue: pdaValueNode(\n                pdaNode({\n                    name: 'accountC',\n                    seeds: [\n                        constantPdaSeedNodeFromBytes('base58', '1Ldp'),\n                        variablePdaSeedNode('accountB', publicKeyTypeNode()),\n                        variablePdaSeedNode('amount', numberTypeNode('u8')),\n                    ],\n                }),\n                [\n                    pdaSeedValueNode('accountB', accountValueNode('accountB')),\n                    pdaSeedValueNode('amount', argumentValueNode('amount')),\n                ],\n            ),\n            isSigner: true,\n            isWritable: false,\n            name: 'accountC',\n        }),\n        instructionAccountNode({\n            defaultValue: publicKeyValueNode('11111111111111111111111111111111', 'systemProgram'),\n            isSigner: false,\n            isWritable: false,\n            name: 'systemProgram',\n        }),\n        instructionAccountNode({ isSigner: true, isWritable: true, name: 'accountD' }),\n    ]);\n});\n\ntest('it prevents duplicate names by prefixing nested accounts with different parent names', () => {\n    const nodes = instructionAccountNodesFromAnchorV01(\n        [\n            {\n                accounts: [\n                    { name: 'mint', signer: false, writable: false },\n                    { name: 'authority', signer: true, writable: false },\n                ],\n                name: 'tokenProgram',\n            },\n            {\n                accounts: [\n                    { name: 'mint', signer: false, writable: true },\n                    { name: 'metadata', signer: false, writable: true },\n                ],\n                name: 'nftProgram',\n            },\n        ],\n        [],\n    );\n\n    expect(nodes).toEqual([\n        instructionAccountNode({ isSigner: false, isWritable: false, name: 'tokenProgramMint' }),\n        instructionAccountNode({ isSigner: true, isWritable: false, name: 'tokenProgramAuthority' }),\n        instructionAccountNode({ isSigner: false, isWritable: true, name: 'nftProgramMint' }),\n        instructionAccountNode({ isSigner: false, isWritable: true, name: 'nftProgramMetadata' }),\n    ]);\n});\n\ntest('it handles nested accounts with more complex duplicate scenarios', () => {\n    const nodes = instructionAccountNodesFromAnchorV01(\n        [\n            { name: 'authority', signer: true, writable: false },\n            {\n                accounts: [\n                    { name: 'mint', signer: false, writable: false },\n                    { name: 'vault', signer: false, writable: true },\n                    { name: 'authority', signer: false, writable: false },\n                ],\n                name: 'sourceProgram',\n            },\n            {\n                accounts: [\n                    { name: 'mint', signer: false, writable: false },\n                    { name: 'escrow', signer: false, writable: true },\n                    { name: 'metadata', signer: false, writable: true },\n                ],\n                name: 'destinationProgram',\n            },\n        ],\n        [],\n    );\n\n    expect(nodes).toEqual([\n        instructionAccountNode({ isSigner: true, isWritable: false, name: 'authority' }),\n        instructionAccountNode({ isSigner: false, isWritable: false, name: 'sourceProgramMint' }),\n        instructionAccountNode({ isSigner: false, isWritable: true, name: 'sourceProgramVault' }),\n        instructionAccountNode({ isSigner: false, isWritable: false, name: 'sourceProgramAuthority' }),\n        instructionAccountNode({ isSigner: false, isWritable: false, name: 'destinationProgramMint' }),\n        instructionAccountNode({ isSigner: false, isWritable: true, name: 'destinationProgramEscrow' }),\n        instructionAccountNode({ isSigner: false, isWritable: true, name: 'destinationProgramMetadata' }),\n    ]);\n});\n\ntest('it handles depth-2 nested accounts with naming conflicts', () => {\n    const items = [\n        { name: 'authority', signer: true, writable: false },\n        {\n            accounts: [\n                { name: 'mint', signer: false, writable: false },\n                { name: 'vault', signer: false, writable: true },\n                { name: 'authority', signer: false, writable: false },\n                {\n                    accounts: [\n                        { name: 'authority', signer: false, writable: true },\n                        { name: 'mint', signer: false, writable: false },\n                    ],\n                    name: 'deepProgram',\n                },\n            ],\n            name: 'sourceProgram',\n        },\n        {\n            accounts: [\n                { name: 'mint', signer: false, writable: false },\n                { name: 'escrow', signer: false, writable: true },\n                { name: 'metadata', signer: false, writable: true },\n            ],\n            name: 'destinationProgram',\n        },\n    ] as unknown as IdlV01InstructionAccountItem[];\n\n    const nodes = instructionAccountNodesFromAnchorV01(items, []);\n\n    expect(nodes).toEqual([\n        instructionAccountNode({ isSigner: true, isWritable: false, name: 'authority' }),\n        instructionAccountNode({ isSigner: false, isWritable: false, name: 'sourceProgramMint' }),\n        instructionAccountNode({ isSigner: false, isWritable: true, name: 'sourceProgramVault' }),\n        instructionAccountNode({ isSigner: false, isWritable: false, name: 'sourceProgramAuthority' }),\n        instructionAccountNode({ isSigner: false, isWritable: true, name: 'sourceProgramDeepProgramAuthority' }),\n        instructionAccountNode({ isSigner: false, isWritable: false, name: 'sourceProgramDeepProgramMint' }),\n        instructionAccountNode({ isSigner: false, isWritable: false, name: 'destinationProgramMint' }),\n        instructionAccountNode({ isSigner: false, isWritable: true, name: 'destinationProgramEscrow' }),\n        instructionAccountNode({ isSigner: false, isWritable: true, name: 'destinationProgramMetadata' }),\n    ]);\n});\n\ntest('it correctly prefixes PDA seed account references in nested groups', () => {\n    const nodes = instructionAccountNodesFromAnchorV01(\n        [\n            {\n                accounts: [\n                    { name: 'mint', signer: false, writable: false },\n                    {\n                        name: 'vault',\n                        pda: {\n                            seeds: [{ kind: 'account', path: 'mint' }],\n                        },\n                        signer: false,\n                        writable: true,\n                    },\n                ],\n                name: 'tokenProgram',\n            },\n            {\n                accounts: [\n                    { name: 'mint', signer: false, writable: false },\n                    {\n                        name: 'escrow',\n                        pda: {\n                            seeds: [{ kind: 'account', path: 'mint' }],\n                        },\n                        signer: false,\n                        writable: true,\n                    },\n                ],\n                name: 'nftProgram',\n            },\n        ],\n        [],\n    );\n\n    expect(nodes).toEqual([\n        instructionAccountNode({ isSigner: false, isWritable: false, name: 'tokenProgramMint' }),\n        instructionAccountNode({\n            defaultValue: pdaValueNode(\n                pdaNode({\n                    name: 'tokenProgramVault',\n                    seeds: [variablePdaSeedNode('tokenProgramMint', publicKeyTypeNode())],\n                }),\n                [pdaSeedValueNode('tokenProgramMint', accountValueNode('tokenProgramMint'))],\n            ),\n            isSigner: false,\n            isWritable: true,\n            name: 'tokenProgramVault',\n        }),\n        instructionAccountNode({ isSigner: false, isWritable: false, name: 'nftProgramMint' }),\n        instructionAccountNode({\n            defaultValue: pdaValueNode(\n                pdaNode({\n                    name: 'nftProgramEscrow',\n                    seeds: [variablePdaSeedNode('nftProgramMint', publicKeyTypeNode())],\n                }),\n                [pdaSeedValueNode('nftProgramMint', accountValueNode('nftProgramMint'))],\n            ),\n            isSigner: false,\n            isWritable: true,\n            name: 'nftProgramEscrow',\n        }),\n    ]);\n});\n\ntest('it ignores PDA default values if at least one seed as a path of length greater than 1', () => {\n    const nodes = instructionAccountNodesFromAnchorV01(\n        // [\n        //     accountNode({\n        //         data: sizePrefixTypeNode(\n        //             structTypeNode([structFieldTypeNode({ name: 'authority', type: publicKeyTypeNode() })]),\n        //             numberTypeNode('u32'),\n        //         ),\n        //         name: 'mint',\n        //     }),\n        // ],\n        [\n            {\n                name: 'somePdaAccount',\n                pda: {\n                    seeds: [\n                        {\n                            account: 'mint',\n                            kind: 'account',\n                            path: 'mint.authority',\n                        },\n                    ],\n                },\n                signer: false,\n                writable: false,\n            },\n        ],\n        [],\n    );\n\n    expect(nodes).toEqual([\n        instructionAccountNode({\n            isSigner: false,\n            isWritable: false,\n            name: 'somePdaAccount',\n        }),\n    ]);\n});\n\ntest('it handles PDAs with a constant program id', () => {\n    const nodes = instructionAccountNodesFromAnchorV01(\n        [\n            {\n                name: 'program_data',\n                pda: {\n                    program: {\n                        kind: 'const',\n                        value: [\n                            2, 168, 246, 145, 78, 136, 161, 176, 226, 16, 21, 62, 247, 99, 174, 43, 0, 194, 185, 61, 22,\n                            193, 36, 210, 192, 83, 122, 16, 4, 128, 0, 0,\n                        ],\n                    },\n                    seeds: [\n                        {\n                            kind: 'const',\n                            value: [\n                                166, 175, 151, 238, 166, 67, 87, 148, 114, 209, 13, 88, 186, 228, 206, 197, 182, 71,\n                                129, 195, 206, 236, 229, 223, 184, 60, 97, 249, 63, 92, 203, 27,\n                            ],\n                        },\n                    ],\n                },\n            },\n        ],\n        [],\n    );\n\n    expect(nodes).toEqual([\n        instructionAccountNode({\n            defaultValue: pdaValueNode(\n                pdaNode({\n                    name: 'programData',\n                    programId: 'BPFLoaderUpgradeab1e11111111111111111111111',\n                    seeds: [constantPdaSeedNodeFromBytes('base58', 'CDfyUBS8ZuL1L3kEy6mHVyAx1s9E97KNAwTfMfvhCriN')],\n                }),\n                [],\n            ),\n            isSigner: false,\n            isWritable: false,\n            name: 'programData',\n        }),\n    ]);\n});\n\ntest('it handles PDAs with a program id that points to another account', () => {\n    const nodes = instructionAccountNodesFromAnchorV01(\n        [\n            {\n                name: 'my_pda',\n                pda: {\n                    program: { kind: 'account', path: 'my_program' },\n                    seeds: [],\n                },\n            },\n        ],\n        [],\n    );\n\n    expect(nodes).toEqual([\n        instructionAccountNode({\n            defaultValue: pdaValueNode(\n                pdaNode({\n                    name: 'myPda',\n                    seeds: [],\n                }),\n                [],\n                accountValueNode('myProgram'),\n            ),\n            isSigner: false,\n            isWritable: false,\n            name: 'myPda',\n        }),\n    ]);\n});\n\ntest.skip('it handles account data paths of length 2', () => {\n    const nodes = instructionAccountNodesFromAnchorV01(\n        // [\n        //     accountNode({\n        //         data: sizePrefixTypeNode(\n        //             structTypeNode([structFieldTypeNode({ name: 'authority', type: publicKeyTypeNode() })]),\n        //             numberTypeNode('u32'),\n        //         ),\n        //         name: 'mint',\n        //     }),\n        // ],\n        [\n            {\n                name: 'somePdaAccount',\n                pda: {\n                    seeds: [\n                        {\n                            account: 'mint',\n                            kind: 'account',\n                            path: 'mint.authority',\n                        },\n                    ],\n                },\n                signer: false,\n                writable: false,\n            },\n        ],\n        [],\n    );\n\n    expect(nodes).toEqual([\n        instructionAccountNode({\n            defaultValue: pdaValueNode(\n                pdaNode({\n                    name: 'somePdaAccount',\n                    seeds: [variablePdaSeedNode('mintAuthority', publicKeyTypeNode())],\n                }),\n                [],\n            ),\n            isSigner: false,\n            isWritable: false,\n            name: 'somePdaAccount',\n        }),\n    ]);\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/InstructionArgumentNode.test.ts",
    "content": "import { instructionArgumentNode, numberTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { GenericsV01, instructionArgumentNodeFromAnchorV01 } from '../../src';\n\nconst generics = {} as GenericsV01;\n\ntest('it creates instruction argument nodes', () => {\n    const node = instructionArgumentNodeFromAnchorV01(\n        {\n            name: 'my_instruction_argument',\n            type: 'u8',\n        },\n        generics,\n    );\n\n    expect(node).toEqual(\n        instructionArgumentNode({\n            name: 'myInstructionArgument',\n            type: numberTypeNode('u8'),\n        }),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/InstructionNode.test.ts",
    "content": "import {\n    bytesTypeNode,\n    fieldDiscriminatorNode,\n    fixedSizeTypeNode,\n    instructionAccountNode,\n    instructionArgumentNode,\n    instructionNode,\n    numberTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { GenericsV01, getAnchorDiscriminatorV01, instructionNodeFromAnchorV01 } from '../../src';\n\nconst generics = {} as GenericsV01;\n\ntest('it creates instruction nodes', () => {\n    const node = instructionNodeFromAnchorV01(\n        {\n            accounts: [\n                {\n                    name: 'distribution',\n                    pda: {\n                        seeds: [\n                            { kind: 'const', value: [42, 31, 29] },\n                            { account: 'Distribution', kind: 'account', path: 'distribution.group_mint' },\n                        ],\n                    },\n                    signer: false,\n                    writable: true,\n                },\n            ],\n            args: [{ name: 'amount', type: 'u8' }],\n            discriminator: [246, 28, 6, 87, 251, 45, 50, 42],\n            name: 'mintTokens',\n        },\n        generics,\n    );\n\n    expect(node).toEqual(\n        instructionNode({\n            accounts: [\n                instructionAccountNode({\n                    // TODO: Handle seeds with nested paths. (Needs a path in the IDL but should we?)\n                    // defaultValue: pdaValueNode(\n                    //     pdaNode({\n                    //         name: 'distribution',\n                    //         seeds: [\n                    //             constantPdaSeedNodeFromBytes('base58', 'F9bS'),\n                    //             variablePdaSeedNode('distributionGroupMint', publicKeyTypeNode()),\n                    //         ],\n                    //     }),\n                    //     [pdaSeedValueNode(\"distributionGroupMint\", accountValueNode('distribution', 'group_mint'))],\n                    // ),\n                    isSigner: false,\n                    isWritable: true,\n                    name: 'distribution',\n                }),\n            ],\n            arguments: [\n                instructionArgumentNode({\n                    defaultValue: getAnchorDiscriminatorV01([246, 28, 6, 87, 251, 45, 50, 42]),\n                    defaultValueStrategy: 'omitted',\n                    name: 'discriminator',\n                    type: fixedSizeTypeNode(bytesTypeNode(), 8),\n                }),\n                instructionArgumentNode({ name: 'amount', type: numberTypeNode('u8') }),\n            ],\n            discriminators: [fieldDiscriminatorNode('discriminator')],\n            name: 'mintTokens',\n        }),\n    );\n});\n\ntest('it creates instruction nodes with anchor discriminators', () => {\n    const node = instructionNodeFromAnchorV01(\n        {\n            accounts: [],\n            args: [],\n            discriminator: [246, 28, 6, 87, 251, 45, 50, 42],\n            name: 'myInstruction',\n        },\n        generics,\n    );\n\n    expect(node).toEqual(\n        instructionNode({\n            arguments: [\n                instructionArgumentNode({\n                    defaultValue: getAnchorDiscriminatorV01([246, 28, 6, 87, 251, 45, 50, 42]),\n                    defaultValueStrategy: 'omitted',\n                    name: 'discriminator',\n                    type: fixedSizeTypeNode(bytesTypeNode(), 8),\n                }),\n            ],\n            discriminators: [fieldDiscriminatorNode('discriminator')],\n            name: 'myInstruction',\n        }),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/ProgramNode.test.ts",
    "content": "import {\n    accountNode,\n    accountValueNode,\n    argumentValueNode,\n    arrayTypeNode,\n    bytesTypeNode,\n    constantDiscriminatorNode,\n    constantPdaSeedNodeFromBytes,\n    constantValueNode,\n    definedTypeLinkNode,\n    definedTypeNode,\n    enumEmptyVariantTypeNode,\n    enumTupleVariantTypeNode,\n    enumTypeNode,\n    errorNode,\n    eventNode,\n    fieldDiscriminatorNode,\n    fixedCountNode,\n    fixedSizeTypeNode,\n    hiddenPrefixTypeNode,\n    instructionAccountNode,\n    instructionArgumentNode,\n    instructionNode,\n    numberTypeNode,\n    pdaNode,\n    pdaSeedValueNode,\n    pdaValueNode,\n    programNode,\n    publicKeyTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n    tupleTypeNode,\n    variablePdaSeedNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getAnchorDiscriminatorV01, programNodeFromAnchorV01 } from '../../src';\n\ntest('it creates program nodes', () => {\n    const node = programNodeFromAnchorV01({\n        accounts: [{ discriminator: [246, 28, 6, 87, 251, 45, 50, 42], name: 'MyAccount' }],\n        address: '1111',\n        errors: [{ code: 42, msg: 'my error message', name: 'myError' }],\n        events: [{ discriminator: [1, 2, 3, 4, 5, 6, 7, 8], name: 'MyEvent' }],\n        instructions: [\n            {\n                accounts: [\n                    {\n                        name: 'authority',\n                        pda: {\n                            seeds: [\n                                { kind: 'const', value: [42, 31, 29] },\n                                { kind: 'account', path: 'owner' },\n                                { kind: 'arg', path: 'amount' },\n                            ],\n                        },\n                    },\n                    {\n                        name: 'owner',\n                    },\n                    {\n                        name: 'some_account',\n                    },\n                ],\n                args: [\n                    {\n                        name: 'amount',\n                        type: 'u8',\n                    },\n                ],\n                discriminator: [246, 28, 6, 87, 251, 45, 50, 42],\n                name: 'my_instruction',\n            },\n        ],\n        metadata: { name: 'my_program', spec: '0.1.0', version: '1.2.3' },\n        types: [\n            { name: 'MyAccount', type: { fields: [{ name: 'delegate', type: 'pubkey' }], kind: 'struct' } },\n            { name: 'MyEvent', type: { fields: [{ name: 'amount', type: 'u64' }], kind: 'struct' } },\n        ],\n    });\n\n    expect(node).toEqual(\n        programNode({\n            accounts: [\n                accountNode({\n                    data: structTypeNode([\n                        structFieldTypeNode({\n                            defaultValue: getAnchorDiscriminatorV01([246, 28, 6, 87, 251, 45, 50, 42]),\n                            defaultValueStrategy: 'omitted',\n                            name: 'discriminator',\n                            type: fixedSizeTypeNode(bytesTypeNode(), 8),\n                        }),\n                        structFieldTypeNode({\n                            name: 'delegate',\n                            type: publicKeyTypeNode(),\n                        }),\n                    ]),\n                    discriminators: [fieldDiscriminatorNode('discriminator')],\n                    name: 'myAccount',\n                }),\n            ],\n            definedTypes: [],\n            errors: [\n                errorNode({\n                    code: 42,\n                    docs: ['myError: my error message'],\n                    message: 'my error message',\n                    name: 'myError',\n                }),\n            ],\n            events: [\n                eventNode({\n                    data: hiddenPrefixTypeNode(\n                        structTypeNode([\n                            structFieldTypeNode({\n                                name: 'amount',\n                                type: numberTypeNode('u64'),\n                            }),\n                        ]),\n                        [\n                            constantValueNode(\n                                fixedSizeTypeNode(bytesTypeNode(), 8),\n                                getAnchorDiscriminatorV01([1, 2, 3, 4, 5, 6, 7, 8]),\n                            ),\n                        ],\n                    ),\n                    discriminators: [\n                        constantDiscriminatorNode(\n                            constantValueNode(\n                                fixedSizeTypeNode(bytesTypeNode(), 8),\n                                getAnchorDiscriminatorV01([1, 2, 3, 4, 5, 6, 7, 8]),\n                            ),\n                        ),\n                    ],\n                    name: 'myEvent',\n                }),\n            ],\n            instructions: [\n                instructionNode({\n                    accounts: [\n                        instructionAccountNode({\n                            defaultValue: pdaValueNode(\n                                pdaNode({\n                                    name: 'authority',\n                                    seeds: [\n                                        constantPdaSeedNodeFromBytes('base58', 'F9bS'),\n                                        variablePdaSeedNode('owner', publicKeyTypeNode()),\n                                        variablePdaSeedNode('amount', numberTypeNode('u8')),\n                                    ],\n                                }),\n                                [\n                                    pdaSeedValueNode('owner', accountValueNode('owner')),\n                                    pdaSeedValueNode('amount', argumentValueNode('amount')),\n                                ],\n                            ),\n                            isSigner: false,\n                            isWritable: false,\n                            name: 'authority',\n                        }),\n                        instructionAccountNode({\n                            isSigner: false,\n                            isWritable: false,\n                            name: 'owner',\n                        }),\n                        instructionAccountNode({\n                            isSigner: false,\n                            isWritable: false,\n                            name: 'someAccount',\n                        }),\n                    ],\n                    arguments: [\n                        instructionArgumentNode({\n                            defaultValue: getAnchorDiscriminatorV01([246, 28, 6, 87, 251, 45, 50, 42]),\n                            defaultValueStrategy: 'omitted',\n                            name: 'discriminator',\n                            type: fixedSizeTypeNode(bytesTypeNode(), 8),\n                        }),\n                        instructionArgumentNode({ name: 'amount', type: numberTypeNode('u8') }),\n                    ],\n                    discriminators: [fieldDiscriminatorNode('discriminator')],\n                    name: 'myInstruction',\n                }),\n            ],\n            name: 'myProgram',\n            origin: 'anchor',\n            pdas: [],\n            publicKey: '1111',\n            version: '1.2.3',\n        }),\n    );\n});\n\ntest('it unwraps and removes generic types', () => {\n    const node = programNodeFromAnchorV01({\n        address: '1111',\n        instructions: [],\n        metadata: { name: 'my_program', spec: '0.1.0', version: '1.2.3' },\n        types: [\n            {\n                generics: [\n                    { kind: 'const', name: 'N', type: 'usize' },\n                    { kind: 'type', name: 'T' },\n                ],\n                name: 'SimpleAllocator',\n                type: {\n                    fields: [\n                        {\n                            name: 'state',\n                            type: { array: [{ defined: { name: 'ItemState' } }, { generic: 'N' }] },\n                        },\n                        {\n                            name: 'data',\n                            type: { array: [{ generic: 'T' }, { generic: 'N' }] },\n                        },\n                    ],\n                    kind: 'struct',\n                },\n            },\n            {\n                name: 'AccountData',\n                type: {\n                    kind: 'enum',\n                    variants: [\n                        { name: 'Unknown' },\n                        {\n                            fields: [\n                                {\n                                    defined: {\n                                        generics: [\n                                            { kind: 'const', value: '1000' },\n                                            { kind: 'type', type: { defined: { name: 'VirtualTimelockAccount' } } },\n                                        ],\n                                        name: 'SimpleAllocator',\n                                    },\n                                },\n                            ],\n                            name: 'Timelock',\n                        },\n                        {\n                            fields: [\n                                {\n                                    defined: {\n                                        generics: [\n                                            { kind: 'const', value: '500' },\n                                            { kind: 'type', type: { defined: { name: 'VirtualDurableNonce' } } },\n                                        ],\n                                        name: 'SimpleAllocator',\n                                    },\n                                },\n                            ],\n                            name: 'Nonce',\n                        },\n                        {\n                            fields: [\n                                {\n                                    defined: {\n                                        generics: [\n                                            { kind: 'const', value: '250' },\n                                            { kind: 'type', type: { defined: { name: 'VirtualRelayAccount' } } },\n                                        ],\n                                        name: 'SimpleAllocator',\n                                    },\n                                },\n                            ],\n                            name: 'Relay',\n                        },\n                    ],\n                },\n            },\n        ],\n    });\n\n    expect(node).toEqual(\n        programNode({\n            definedTypes: [\n                definedTypeNode({\n                    name: 'AccountData',\n                    type: enumTypeNode([\n                        enumEmptyVariantTypeNode('unknown'),\n                        enumTupleVariantTypeNode(\n                            'timelock',\n                            tupleTypeNode([\n                                structTypeNode([\n                                    structFieldTypeNode({\n                                        name: 'state',\n                                        type: arrayTypeNode(definedTypeLinkNode('itemState'), fixedCountNode(1000)),\n                                    }),\n                                    structFieldTypeNode({\n                                        name: 'data',\n                                        type: arrayTypeNode(\n                                            definedTypeLinkNode('virtualTimelockAccount'),\n                                            fixedCountNode(1000),\n                                        ),\n                                    }),\n                                ]),\n                            ]),\n                        ),\n                        enumTupleVariantTypeNode(\n                            'nonce',\n                            tupleTypeNode([\n                                structTypeNode([\n                                    structFieldTypeNode({\n                                        name: 'state',\n                                        type: arrayTypeNode(definedTypeLinkNode('itemState'), fixedCountNode(500)),\n                                    }),\n                                    structFieldTypeNode({\n                                        name: 'data',\n                                        type: arrayTypeNode(\n                                            definedTypeLinkNode('virtualDurableNonce'),\n                                            fixedCountNode(500),\n                                        ),\n                                    }),\n                                ]),\n                            ]),\n                        ),\n                        enumTupleVariantTypeNode(\n                            'relay',\n                            tupleTypeNode([\n                                structTypeNode([\n                                    structFieldTypeNode({\n                                        name: 'state',\n                                        type: arrayTypeNode(definedTypeLinkNode('itemState'), fixedCountNode(250)),\n                                    }),\n                                    structFieldTypeNode({\n                                        name: 'data',\n                                        type: arrayTypeNode(\n                                            definedTypeLinkNode('virtualRelayAccount'),\n                                            fixedCountNode(250),\n                                        ),\n                                    }),\n                                ]),\n                            ]),\n                        ),\n                    ]),\n                }),\n            ],\n            name: 'myProgram',\n            origin: 'anchor',\n            pdas: [],\n            publicKey: '1111',\n            version: '1.2.3',\n        }),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/RootNode.test.ts",
    "content": "import { programNode, rootNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { rootNodeFromAnchorV01 } from '../../src';\n\ntest('it creates root nodes', () => {\n    const node = rootNodeFromAnchorV01({\n        address: '1111',\n        instructions: [],\n        metadata: {\n            name: 'myProgram',\n            spec: '0.1.0',\n            version: '1.2.3',\n        },\n    });\n\n    expect(node).toEqual(\n        rootNode(\n            programNode({\n                name: 'myProgram',\n                origin: 'anchor',\n                publicKey: '1111',\n                version: '1.2.3',\n            }),\n        ),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/extractPdasVisitor.test.ts",
    "content": "import {\n    accountValueNode,\n    constantPdaSeedNodeFromBytes,\n    instructionAccountNode,\n    instructionNode,\n    pdaLinkNode,\n    pdaNode,\n    pdaSeedValueNode,\n    pdaValueNode,\n    programNode,\n    publicKeyTypeNode,\n    variablePdaSeedNode,\n} from '@codama/nodes';\nimport { expect, test, vi } from 'vitest';\n\nimport { extractPdasFromProgram } from '../../src/extractPdasVisitor';\n\nfunction makeProgram(instructions: ReturnType<typeof instructionNode>[]) {\n    return programNode({\n        instructions,\n        name: 'testProgram',\n        publicKey: '1111',\n    });\n}\n\ntest('it extracts a single PDA to program level', () => {\n    const program = makeProgram([\n        instructionNode({\n            accounts: [\n                instructionAccountNode({\n                    defaultValue: pdaValueNode(\n                        pdaNode({\n                            name: 'myPda',\n                            seeds: [constantPdaSeedNodeFromBytes('base58', 'F9bS')],\n                        }),\n                        [],\n                    ),\n                    isSigner: false,\n                    isWritable: false,\n                    name: 'myPda',\n                }),\n            ],\n            name: 'myInstruction',\n        }),\n    ]);\n\n    const result = extractPdasFromProgram(program);\n\n    expect(result.pdas).toEqual([\n        pdaNode({\n            name: 'myPda',\n            seeds: [constantPdaSeedNodeFromBytes('base58', 'F9bS')],\n        }),\n    ]);\n    expect(result.instructions[0].accounts[0].defaultValue).toEqual(pdaValueNode(pdaLinkNode('myPda'), []));\n});\n\ntest('it deduplicates the same PDA across two instructions', () => {\n    const seeds = [constantPdaSeedNodeFromBytes('base58', 'F9bS'), variablePdaSeedNode('owner', publicKeyTypeNode())];\n    const program = makeProgram([\n        instructionNode({\n            accounts: [\n                instructionAccountNode({\n                    defaultValue: pdaValueNode(pdaNode({ name: 'myPda', seeds }), [\n                        pdaSeedValueNode('owner', accountValueNode('owner')),\n                    ]),\n                    isSigner: false,\n                    isWritable: false,\n                    name: 'myPda',\n                }),\n                instructionAccountNode({ isSigner: false, isWritable: false, name: 'owner' }),\n            ],\n            name: 'instructionA',\n        }),\n        instructionNode({\n            accounts: [\n                instructionAccountNode({\n                    defaultValue: pdaValueNode(pdaNode({ name: 'myPda', seeds }), [\n                        pdaSeedValueNode('owner', accountValueNode('owner')),\n                    ]),\n                    isSigner: false,\n                    isWritable: false,\n                    name: 'myPda',\n                }),\n                instructionAccountNode({ isSigner: false, isWritable: false, name: 'owner' }),\n            ],\n            name: 'instructionB',\n        }),\n    ]);\n\n    const result = extractPdasFromProgram(program);\n\n    // Only one PDA extracted.\n    expect(result.pdas).toHaveLength(1);\n    expect(result.pdas[0].name).toBe('myPda');\n\n    // Both instructions use pdaLinkNode.\n    for (const ix of result.instructions) {\n        const account = ix.accounts[0];\n        expect(account.defaultValue).toEqual(\n            pdaValueNode(pdaLinkNode('myPda'), [pdaSeedValueNode('owner', accountValueNode('owner'))]),\n        );\n    }\n});\n\ntest('it handles name collisions with different seeds by suffixing', () => {\n    const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});\n\n    const program = makeProgram([\n        instructionNode({\n            accounts: [\n                instructionAccountNode({\n                    defaultValue: pdaValueNode(\n                        pdaNode({\n                            name: 'authority',\n                            seeds: [constantPdaSeedNodeFromBytes('base58', 'F9bS')],\n                        }),\n                        [],\n                    ),\n                    isSigner: false,\n                    isWritable: false,\n                    name: 'authority',\n                }),\n            ],\n            name: 'instructionA',\n        }),\n        instructionNode({\n            accounts: [\n                instructionAccountNode({\n                    defaultValue: pdaValueNode(\n                        pdaNode({\n                            name: 'authority',\n                            seeds: [constantPdaSeedNodeFromBytes('base58', 'AAAA')],\n                        }),\n                        [],\n                    ),\n                    isSigner: false,\n                    isWritable: false,\n                    name: 'authority',\n                }),\n            ],\n            name: 'instructionB',\n        }),\n    ]);\n\n    const result = extractPdasFromProgram(program);\n\n    expect(result.pdas).toHaveLength(2);\n    expect(result.pdas[0].name).toBe('authority');\n    expect(result.pdas[1].name).toBe('instructionBAuthority');\n    expect(warnSpy).toHaveBeenCalledOnce();\n\n    warnSpy.mockRestore();\n});\n\ntest('it excludes foreign-program PDAs', () => {\n    const program = makeProgram([\n        instructionNode({\n            accounts: [\n                instructionAccountNode({\n                    defaultValue: pdaValueNode(\n                        pdaNode({\n                            name: 'ata',\n                            programId: 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',\n                            seeds: [constantPdaSeedNodeFromBytes('base58', 'F9bS')],\n                        }),\n                        [],\n                    ),\n                    isSigner: false,\n                    isWritable: false,\n                    name: 'ata',\n                }),\n            ],\n            name: 'myInstruction',\n        }),\n    ]);\n\n    const result = extractPdasFromProgram(program);\n\n    expect(result.pdas).toEqual([]);\n    // Account is unchanged (still inline pdaNode).\n    expect(result.instructions[0].accounts[0].defaultValue).toEqual(\n        pdaValueNode(\n            pdaNode({\n                name: 'ata',\n                programId: 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',\n                seeds: [constantPdaSeedNodeFromBytes('base58', 'F9bS')],\n            }),\n            [],\n        ),\n    );\n    // Nothing changed on the node at all.\n    expect(result).toEqual(program);\n});\n\ntest('it keeps dynamic programId on pdaValueNode, not on PdaNode', () => {\n    const program = makeProgram([\n        instructionNode({\n            accounts: [\n                instructionAccountNode({\n                    defaultValue: pdaValueNode(\n                        pdaNode({\n                            name: 'dynamicPda',\n                            seeds: [variablePdaSeedNode('owner', publicKeyTypeNode())],\n                        }),\n                        [pdaSeedValueNode('owner', accountValueNode('owner'))],\n                        accountValueNode('tokenProgram'),\n                    ),\n                    isSigner: false,\n                    isWritable: false,\n                    name: 'dynamicPda',\n                }),\n                instructionAccountNode({ isSigner: false, isWritable: false, name: 'owner' }),\n                instructionAccountNode({ isSigner: false, isWritable: false, name: 'tokenProgram' }),\n            ],\n            name: 'myInstruction',\n        }),\n    ]);\n\n    const result = extractPdasFromProgram(program);\n\n    // PdaNode has no programId.\n    expect(result.pdas[0].programId).toBeUndefined();\n\n    // pdaValueNode still has the dynamic programId.\n    const defaultValue = result.instructions[0].accounts[0].defaultValue;\n    expect(defaultValue).toEqual(\n        pdaValueNode(\n            pdaLinkNode('dynamicPda'),\n            [pdaSeedValueNode('owner', accountValueNode('owner'))],\n            accountValueNode('tokenProgram'),\n        ),\n    );\n});\n\ntest('it deduplicates same seeds with different account names using first name', () => {\n    const seeds = [constantPdaSeedNodeFromBytes('base58', 'F9bS'), variablePdaSeedNode('owner', publicKeyTypeNode())];\n    const program = makeProgram([\n        instructionNode({\n            accounts: [\n                instructionAccountNode({\n                    defaultValue: pdaValueNode(pdaNode({ name: 'authority', seeds }), [\n                        pdaSeedValueNode('owner', accountValueNode('owner')),\n                    ]),\n                    isSigner: false,\n                    isWritable: false,\n                    name: 'authority',\n                }),\n                instructionAccountNode({ isSigner: false, isWritable: false, name: 'owner' }),\n            ],\n            name: 'instructionA',\n        }),\n        instructionNode({\n            accounts: [\n                instructionAccountNode({\n                    defaultValue: pdaValueNode(pdaNode({ name: 'admin', seeds }), [\n                        pdaSeedValueNode('owner', accountValueNode('owner')),\n                    ]),\n                    isSigner: false,\n                    isWritable: false,\n                    name: 'admin',\n                }),\n                instructionAccountNode({ isSigner: false, isWritable: false, name: 'owner' }),\n            ],\n            name: 'instructionB',\n        }),\n    ]);\n\n    const result = extractPdasFromProgram(program);\n\n    expect(result.pdas).toHaveLength(1);\n    expect(result.pdas[0].name).toBe('authority');\n\n    // Both instructions link to the first-encountered name.\n    expect(result.instructions[0].accounts[0].defaultValue).toEqual(\n        pdaValueNode(pdaLinkNode('authority'), [pdaSeedValueNode('owner', accountValueNode('owner'))]),\n    );\n    expect(result.instructions[1].accounts[0].defaultValue).toEqual(\n        pdaValueNode(pdaLinkNode('authority'), [pdaSeedValueNode('owner', accountValueNode('owner'))]),\n    );\n});\n\ntest('it preserves existing program-level PDAs', () => {\n    const existingPda = pdaNode({\n        name: 'existingPda',\n        seeds: [constantPdaSeedNodeFromBytes('base58', 'ZZZZ')],\n    });\n    const program = programNode({\n        instructions: [\n            instructionNode({\n                accounts: [\n                    instructionAccountNode({\n                        defaultValue: pdaValueNode(\n                            pdaNode({ name: 'newPda', seeds: [constantPdaSeedNodeFromBytes('base58', 'F9bS')] }),\n                            [],\n                        ),\n                        isSigner: false,\n                        isWritable: false,\n                        name: 'newPda',\n                    }),\n                ],\n                name: 'myInstruction',\n            }),\n        ],\n        name: 'testProgram',\n        pdas: [existingPda],\n        publicKey: '1111',\n    });\n\n    const result = extractPdasFromProgram(program);\n\n    expect(result.pdas).toHaveLength(2);\n    expect(result.pdas[0]).toEqual(existingPda);\n    expect(result.pdas[1].name).toBe('newPda');\n});\n\ntest('it returns empty pdas when no PDA accounts exist', () => {\n    const program = makeProgram([\n        instructionNode({\n            accounts: [\n                instructionAccountNode({ isSigner: false, isWritable: false, name: 'owner' }),\n                instructionAccountNode({ isSigner: false, isWritable: false, name: 'payer' }),\n            ],\n            name: 'myInstruction',\n        }),\n    ]);\n\n    const result = extractPdasFromProgram(program);\n    expect(result.pdas).toEqual([]);\n    // Nothing changed on the node at all.\n    expect(result).toEqual(program);\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/pdaSeedNode.test.ts",
    "content": "import {\n    accountValueNode,\n    argumentValueNode,\n    constantPdaSeedNodeFromBytes,\n    instructionArgumentNode,\n    numberTypeNode,\n    pdaSeedValueNode,\n    publicKeyTypeNode,\n    sizePrefixTypeNode,\n    stringTypeNode,\n    variablePdaSeedNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { pdaSeedNodeFromAnchorV01 } from '../../src';\n\ntest('it creates a PdaSeedNode from a const Anchor seed', () => {\n    const nodes = pdaSeedNodeFromAnchorV01({ kind: 'const', value: [11, 57, 246, 240] }, []);\n\n    expect(nodes.definition).toEqual(constantPdaSeedNodeFromBytes('base58', 'HeLLo'));\n    expect(nodes.value).toBeUndefined();\n});\n\ntest('it creates a PdaSeedNode from an account Anchor seed', () => {\n    const nodes = pdaSeedNodeFromAnchorV01({ kind: 'account', path: 'authority' }, []);\n\n    expect(nodes.definition).toEqual(variablePdaSeedNode('authority', publicKeyTypeNode()));\n    expect(nodes.value).toEqual(pdaSeedValueNode('authority', accountValueNode('authority')));\n});\n\ntest('it creates a PdaSeedNode from an arg Anchor seed', () => {\n    const nodes = pdaSeedNodeFromAnchorV01({ kind: 'arg', path: 'capacity' }, [\n        instructionArgumentNode({ name: 'capacity', type: numberTypeNode('u64') }),\n    ]);\n\n    expect(nodes.definition).toEqual(variablePdaSeedNode('capacity', numberTypeNode('u64')));\n    expect(nodes.value).toEqual(pdaSeedValueNode('capacity', argumentValueNode('capacity')));\n});\n\ntest('it removes the string prefix from arg Anchor seeds', () => {\n    const nodes = pdaSeedNodeFromAnchorV01({ kind: 'arg', path: 'identifier' }, [\n        instructionArgumentNode({\n            name: 'identifier',\n            type: sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u32')),\n        }),\n    ]);\n\n    expect(nodes.definition).toEqual(variablePdaSeedNode('identifier', stringTypeNode('utf8')));\n    expect(nodes.value).toEqual(pdaSeedValueNode('identifier', argumentValueNode('identifier')));\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/typeNodes/ArrayTypeNode.test.ts",
    "content": "import { arrayTypeNode, fixedCountNode, numberTypeNode, prefixedCountNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { GenericsV01, typeNodeFromAnchorV01 } from '../../../src';\n\nconst generics = {} as GenericsV01;\n\ntest('it creates array type nodes', () => {\n    expect(typeNodeFromAnchorV01({ array: ['u8', 2] }, generics)).toEqual(\n        arrayTypeNode(numberTypeNode('u8'), fixedCountNode(2)),\n    );\n    expect(typeNodeFromAnchorV01({ vec: 'u8' }, generics)).toEqual(\n        arrayTypeNode(numberTypeNode('u8'), prefixedCountNode(numberTypeNode('u32'))),\n    );\n});\n\ntest('it unwraps array nodes with generic sizes', () => {\n    expect(\n        typeNodeFromAnchorV01(\n            { array: ['u8', { generic: 'N' }] },\n            {\n                constArgs: { N: { kind: 'const', name: 'N', type: 'usize', value: '100' } },\n                typeArgs: {},\n                types: {},\n            },\n        ),\n    ).toEqual(arrayTypeNode(numberTypeNode('u8'), fixedCountNode(100)));\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/typeNodes/BooleanTypeNode.test.ts",
    "content": "import { booleanTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { GenericsV01, typeNodeFromAnchorV01 } from '../../../src';\n\nconst generics = {} as GenericsV01;\n\ntest('it creates boolean type nodes', () => {\n    expect(typeNodeFromAnchorV01('bool', generics)).toEqual(booleanTypeNode());\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/typeNodes/BytesTypeNode.test.ts",
    "content": "import { bytesTypeNode, numberTypeNode, sizePrefixTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { GenericsV01, typeNodeFromAnchorV01 } from '../../../src';\n\nconst generics = {} as GenericsV01;\n\ntest('it creates bytes type nodes', () => {\n    expect(typeNodeFromAnchorV01('bytes', generics)).toEqual(\n        sizePrefixTypeNode(bytesTypeNode(), numberTypeNode('u32')),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/typeNodes/EnumTypeNode.test.ts",
    "content": "import {\n    booleanTypeNode,\n    enumEmptyVariantTypeNode,\n    enumStructVariantTypeNode,\n    enumTupleVariantTypeNode,\n    enumTypeNode,\n    numberTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n    tupleTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { GenericsV01, typeNodeFromAnchorV01 } from '../../../src';\n\nconst generics = {} as GenericsV01;\n\ntest('it creates enum type nodes', () => {\n    const node = typeNodeFromAnchorV01(\n        {\n            kind: 'enum',\n            variants: [\n                { name: 'variantA' }, // Empty variant.\n                { fields: ['u16', 'bool'], name: 'variantB' }, // Tuple variant.\n                { fields: [{ name: 'age', type: 'u8' }], name: 'variantC' }, // Struct variant.\n            ],\n        },\n        generics,\n    );\n\n    expect(node).toEqual(\n        enumTypeNode([\n            enumEmptyVariantTypeNode('variantA'),\n            enumTupleVariantTypeNode('variantB', tupleTypeNode([numberTypeNode('u16'), booleanTypeNode()])),\n            enumStructVariantTypeNode(\n                'variantC',\n                structTypeNode([structFieldTypeNode({ name: 'age', type: numberTypeNode('u8') })]),\n            ),\n        ]),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/typeNodes/NumberTypeNode.test.ts",
    "content": "import { numberTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { GenericsV01, typeNodeFromAnchorV01 } from '../../../src';\n\nconst generics = {} as GenericsV01;\n\ntest('it creates number type nodes', () => {\n    expect(typeNodeFromAnchorV01('f32', generics)).toEqual(numberTypeNode('f32'));\n    expect(typeNodeFromAnchorV01('f64', generics)).toEqual(numberTypeNode('f64'));\n    expect(typeNodeFromAnchorV01('i8', generics)).toEqual(numberTypeNode('i8'));\n    expect(typeNodeFromAnchorV01('i16', generics)).toEqual(numberTypeNode('i16'));\n    expect(typeNodeFromAnchorV01('i32', generics)).toEqual(numberTypeNode('i32'));\n    expect(typeNodeFromAnchorV01('i64', generics)).toEqual(numberTypeNode('i64'));\n    expect(typeNodeFromAnchorV01('i128', generics)).toEqual(numberTypeNode('i128'));\n    expect(typeNodeFromAnchorV01('shortU16', generics)).toEqual(numberTypeNode('shortU16'));\n    expect(typeNodeFromAnchorV01('u8', generics)).toEqual(numberTypeNode('u8'));\n    expect(typeNodeFromAnchorV01('u16', generics)).toEqual(numberTypeNode('u16'));\n    expect(typeNodeFromAnchorV01('u32', generics)).toEqual(numberTypeNode('u32'));\n    expect(typeNodeFromAnchorV01('u64', generics)).toEqual(numberTypeNode('u64'));\n    expect(typeNodeFromAnchorV01('u128', generics)).toEqual(numberTypeNode('u128'));\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/typeNodes/OptionTypeNode.test.ts",
    "content": "import { numberTypeNode, optionTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { GenericsV01, typeNodeFromAnchorV01 } from '../../../src';\n\nconst generics = {} as GenericsV01;\n\ntest('it creates option type nodes', () => {\n    expect(typeNodeFromAnchorV01({ option: 'u8' }, generics)).toEqual(optionTypeNode(numberTypeNode('u8')));\n});\n\ntest('it creates option type nodes with fixed size', () => {\n    expect(typeNodeFromAnchorV01({ coption: 'u8' }, generics)).toEqual(\n        optionTypeNode(numberTypeNode('u8'), { fixed: true, prefix: numberTypeNode('u32') }),\n    );\n    expect(typeNodeFromAnchorV01({ coption: 'u8' }, generics)).toEqual(\n        optionTypeNode(numberTypeNode('u8'), { fixed: true, prefix: numberTypeNode('u32') }),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/typeNodes/PublicKeyTypeNode.test.ts",
    "content": "import { publicKeyTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { GenericsV01, typeNodeFromAnchorV01 } from '../../../src';\n\nconst generics = {} as GenericsV01;\n\ntest('it creates public key type nodes', () => {\n    expect(typeNodeFromAnchorV01('pubkey', generics)).toEqual(publicKeyTypeNode());\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/typeNodes/StringTypeNode.test.ts",
    "content": "import { numberTypeNode, sizePrefixTypeNode, stringTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { GenericsV01, typeNodeFromAnchorV01 } from '../../../src';\n\nconst generics = {} as GenericsV01;\n\ntest('it creates string type nodes', () => {\n    expect(typeNodeFromAnchorV01('string', generics)).toEqual(\n        sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u32')),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/typeNodes/StructTypeNode.test.ts",
    "content": "import { CODAMA_ERROR__ANCHOR__UNRECOGNIZED_IDL_TYPE, CodamaError } from '@codama/errors';\nimport {\n    arrayTypeNode,\n    numberTypeNode,\n    prefixedCountNode,\n    publicKeyTypeNode,\n    sizePrefixTypeNode,\n    stringTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n    tupleTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { GenericsV01, typeNodeFromAnchorV01 } from '../../../src';\n\nconst generics = {} as GenericsV01;\n\ntest('it creates struct type nodes', () => {\n    const node = typeNodeFromAnchorV01(\n        {\n            fields: [\n                { name: 'name', type: 'string' },\n                { name: 'age', type: 'u8' },\n                { name: 'created_at', type: 'u8' },\n            ],\n            kind: 'struct',\n        },\n        generics,\n    );\n\n    expect(node).toEqual(\n        structTypeNode([\n            structFieldTypeNode({\n                name: 'name',\n                type: sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u32')),\n            }),\n            structFieldTypeNode({ name: 'age', type: numberTypeNode('u8') }),\n            structFieldTypeNode({ name: 'createdAt', type: numberTypeNode('u8') }),\n        ]),\n    );\n});\n\ntest('it creates tuple type nodes when unnamed fields are provided', () => {\n    const node = typeNodeFromAnchorV01(\n        {\n            fields: ['u8', { vec: 'pubkey' }],\n            kind: 'struct',\n        },\n        generics,\n    );\n\n    expect(node).toEqual(\n        tupleTypeNode([\n            numberTypeNode('u8'),\n            arrayTypeNode(publicKeyTypeNode(), prefixedCountNode(numberTypeNode('u32'))),\n        ]),\n    );\n});\n\ntest('it fails when a mixture of named and unnamed fields are provided', () => {\n    const anchorIdl = {\n        fields: [{ name: 'name', type: 'string' }, 'u8'],\n        kind: 'struct',\n    } as const;\n\n    // @ts-expect-error Invalid IDL type because of mixed named and unnamed fields.\n    expect(() => typeNodeFromAnchorV01(anchorIdl)).toThrow(\n        new CodamaError(CODAMA_ERROR__ANCHOR__UNRECOGNIZED_IDL_TYPE, {\n            idlType: JSON.stringify(anchorIdl),\n        }),\n    );\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/test/v01/typeNodes/TupleTypeNode.test.ts",
    "content": "import { numberTypeNode, publicKeyTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { GenericsV01, typeNodeFromAnchorV01 } from '../../../src';\n\nconst generics = {} as GenericsV01;\n\ntest('it creates tuple type nodes', () => {\n    const node = typeNodeFromAnchorV01(\n        {\n            fields: ['u8', 'pubkey'],\n            kind: 'struct',\n        },\n        generics,\n    );\n\n    expect(node).toEqual(tupleTypeNode([numberTypeNode('u8'), publicKeyTypeNode()]));\n});\n"
  },
  {
    "path": "packages/nodes-from-anchor/tsconfig.declarations.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"declarationMap\": true,\n        \"emitDeclarationOnly\": true,\n        \"outDir\": \"./dist/types\"\n    },\n    \"extends\": \"./tsconfig.json\",\n    \"include\": [\"src/index.ts\", \"src/types\"]\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/tsconfig.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": { \"lib\": [] },\n    \"display\": \"@codama/nodes-from-anchor\",\n    \"extends\": \"../../tsconfig.json\",\n    \"include\": [\"src\", \"test\"]\n}\n"
  },
  {
    "path": "packages/nodes-from-anchor/tsup.config.ts",
    "content": "import { defineConfig } from 'tsup';\n\nimport { getPackageBuildConfigs } from '../../tsup.config.base';\n\nexport default defineConfig(getPackageBuildConfigs());\n"
  },
  {
    "path": "packages/nodes-from-anchor/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\nimport { getVitestConfig } from '../../vitest.config.base.mjs';\n\nexport default defineConfig({\n    test: {\n        projects: [getVitestConfig('browser'), getVitestConfig('node'), getVitestConfig('react-native')],\n    },\n});\n"
  },
  {
    "path": "packages/renderers-core/.gitignore",
    "content": "dist/\n"
  },
  {
    "path": "packages/renderers-core/.prettierignore",
    "content": "dist/\ntest/e2e/\ntest-ledger/\ntarget/\nCHANGELOG.md\n"
  },
  {
    "path": "packages/renderers-core/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Codama\nCopyright (c) 2024 Metaplex Foundation\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/renderers-core/README.md",
    "content": "# Codama ➤ Renderers ➤ Core\n\n[![npm][npm-image]][npm-url]\n[![npm-downloads][npm-downloads-image]][npm-url]\n\n[npm-downloads-image]: https://img.shields.io/npm/dm/@codama/renderers-core.svg?style=flat\n[npm-image]: https://img.shields.io/npm/v/@codama/renderers-core.svg?style=flat&label=%40codama%2Frenderers-core\n[npm-url]: https://www.npmjs.com/package/@codama/renderers-core\n\nThis package provides the core utility for generating clients from Codama IDLs. Its aim is mainly to provide helpers for other renderer packages such as [`@codama/renderers-js`](https://github.com/codama-idl/renderers-js) and [`@codama/renderers-rust`](https://github.com/codama-idl/renderers-rust).\n\n## Installation\n\n```sh\npnpm install @codama/renderers-core\n```\n\n> [!NOTE]\n> This package is **not** included in the main [`codama`](../library) package.\n\n## Filesystem wrappers\n\nThis package offers several helper functions that delegate to the native Filesystem API — i.e. `node:fs` — when using the Node.js runtime. However, in any other environment — such as the browser — these functions will throw a `CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE` error as a Filesystem API is not available. This enables us to import renderers regardless of the runtime environment.\n\n### `createDirectory`\n\nCreates a directory at the given path, recursively.\n\n```ts\ncreateDirectory(newDirectoryPath);\n```\n\n### `deleteDirectory`\n\nDeletes a directory, recursively, if it exists.\n\n```ts\ndeleteDirectory(directoryPath);\n```\n\n### `writeFile`\n\nCreates a new file at the given path with the given content. Creates its parent directory, recursively, if it does not exist.\n\n```ts\nwriteFile(filePath, content);\n```\n\n### `readFile`\n\nReads the UTF-8 content of a file as a string.\n\n```ts\nconst content = readFile(filePath);\n```\n\n### `readJson`\n\nReads the UTF-8 content of a file as a JSON object.\n\n```ts\nconst json = readJson<MyJsonDefinition>(filePath);\n```\n\n## Path wrappers\n\nThis package also offers several `path` helpers that delegate to the native `node:path` module when using the Node.js runtime but provide a fallback implementation when using any other runtime.\n\n### `joinPath`\n\nJoins multiple path segments into a single path.\n\n```ts\nconst path = joinPath('path', 'to', 'my', 'file.ts');\n```\n\n### `pathDirectory`\n\nReturns the parent directory of a given path.\n\n```ts\nconst parentPath = pathDirectory(path);\n```\n\n## Fragments\n\nThe concept of fragments is commonly used in Codama renderers as a way to combine a piece of code with any context that is relevant to that piece of code. For instance, a fragment may include a dependency map that lists all the module imports required by that piece of code.\n\nSince fragments vary from one renderer to another, this package cannot provide a one-size-fits-all `Fragment` type. Instead, it provides some base types and utility functions that can be used to build more specific fragment types.\n\n### `BaseFragment`\n\nThe `BaseFragment` type is an object that includes a `content` string. Renderers may extend this type to include any additional context they need.\n\n```ts\ntype Fragment = BaseFragment & Readonly<{ importMap: ImportMap }>;\n```\n\n### `mapFragmentContent`\n\nThe `mapFragmentContent` helper can be used to transform the `content` of a fragment while preserving the rest of its context.\n\n```ts\nconst updatedFragment = mapFragmentContent(fragment, c => `/** This is a fragment. */\\n${c}`);\n```\n\n### `mapFragmentContentAsync`\n\nThe `mapFragmentContentAsync` helper can be used to transform the `content` of a fragment asynchronously while preserving the rest of its context.\n\n```ts\nconst updatedFragment = mapFragmentContentAsync(fragment, async c => `${await getDocs(c)}\\n${c}`);\n```\n\n### `setFragmentContent`\n\nThe `setFragmentContent` helper can be used to replace the `content` of a fragment while preserving the rest of its context.\n\n```ts\nconst updatedFragment = setFragmentContent(fragment, '[redacted]');\n```\n\n### `createFragmentTemplate`\n\nThe `createFragmentTemplate` helper can be used to create [tagged template literal](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates) functions. For this, you need to provide a function that can merge multiple fragments together and a function that can identify fragments from other values.\n\n```ts\nfunction fragment(template: TemplateStringsArray, ...items: unknown[]): Fragment {\n    return createFragmentTemplate(template, items, isFragment, mergeFragments);\n}\nconst apple = fragment`apple`;\nconst banana = fragment`banana`;\nconst fruits = fragment`${apple}, ${banana}`;\n```\n\n## Render maps\n\nThis package also provides a `RenderMap` type and a handful of helpers to work with it.\n\nA `RenderMap` is a utility type that helps manage a collection of `Fragment` files to be rendered. It acts as a middleman between the logic that generates the content and the logic that writes the content to the filesystem. As such, it provides a way to access the generated content outside an environment that supports the Filesystem API — such as the browser. It also helps us write tests about the generated code without having to write it to the filesystem.\n\n### Creating new `RenderMaps`\n\nYou can use the `createRenderMap` function with no arguments to create a new empty `RenderMap`.\n\n```ts\nconst renderMap = createRenderMap();\n```\n\nSince `RenderMaps` store fragments, you may specify a custom fragment type parameter that extends `BaseFragment` when creating a new `RenderMap`.\n\n```ts\ntype Fragment = BaseFragment & { imports: ImportMap };\nconst renderMap = createRenderMap<Fragment>();\n```\n\nYou may provide the path and fragment of a file to create a `RenderMap` with a single file.\n\n```ts\nconst renderMap = createRenderMap('path/to/file.ts', { content: 'file content' });\n```\n\nYou may also provide an object mapping file paths to their fragments to create a `RenderMap` with multiple files.\n\n```ts\nconst renderMap = createRenderMap({\n    'path/to/file.ts': { content: 'file content' },\n    'path/to/another/file.ts': { content: 'another file content' },\n});\n```\n\nNote that when setting paths inside a `RenderMap`, they should be relative to the base directory that will be provided when writing the `RenderMap` to the filesystem. For instance, if we decide to use `src/generated` as the base directory when writing the `RenderMap`, then using a path such as `accounts/mint.ts` will result in the file being written to `src/generated/accounts/mint.ts`.\n\n### Adding content to a `RenderMap`\n\nTo add content to a `RenderMap`, you may use the `addToRenderMap` function by providing the path and the fragment of the file to be added. Note that, here as well, the path should be relative to the base directory that will be provided when writing the `RenderMap` to the filesystem.\n\n```ts\nconst updatedRenderMap = addToRenderMap(renderMap, 'path/to/file.ts', { content: 'file content' });\n```\n\nSince `RenderMaps` are immutable, you may want to use the `pipe` function from `@codama/visitors-core` — also available in `codama` — to chain multiple updates together.\n\n```ts\nconst renderMap = pipe(\n    createRenderMap(),\n    m => addToRenderMap(m, 'programs/token.ts', { content: 'export type TokenProgram = {...}' }),\n    m => addToRenderMap(m, 'accounts/mint.ts', { content: 'export type MintAccount = {...}' }),\n    m => addToRenderMap(m, 'instructions/transfer.ts', { content: 'export function getTransferInstruction() {...}' }),\n);\n```\n\n### Merging multiple `RenderMaps`\n\nYou may use the `mergeRenderMaps` helper to combine multiple `RenderMap` instances into a single one. If two `RenderMap` instances contain the same file path, the content from the latter will overwrite the content from the former.\n\n```ts\nconst renderMapA = createRenderMap('programs/programA.ts', { content: 'export type ProgramA = {...}' });\nconst renderMapB = createRenderMap('programs/programB.ts', { content: 'export type ProgramB = {...}' });\nconst mergedRenderMap = mergeRenderMaps(renderMapA, renderMapB);\n```\n\n### Removing content from a `RenderMap`\n\nTo remove files from a `RenderMap`, simply use the `removeFromRenderMap` function by providing the relative path of the file to be removed.\n\n```ts\nconst updatedRenderMap = removeFromRenderMap(renderMap, 'programs/token.ts');\n```\n\n### Accessing content from a `RenderMap`\n\nThe `RenderMap` type is essentially a JavaScript `Map` so you can use all the methods available on the `Map` prototype. Therefore, you may use the `get` method to access the content of a file from its relative path.\n\n```ts\nconst content: string | undefined = renderMap.get('programs/token.ts');\n```\n\nHowever, this may return `undefined` if the file does not exist on the `RenderMap`. If you want to access the content of a file and throw an error if it does not exist, you can use the `getFromRenderMap` helper instead.\n\n```ts\nconst content: string = getFromRenderMap(renderMap, 'programs/token.ts');\n```\n\nYou may also use the `renderMapContains` helper to check if the provided file content exists in the `RenderMap` at the given path. The expected file content can be a string or a regular expression.\n\n```ts\nconst hasTokenProgram = renderMapContains(renderMap, 'programs/token.ts', 'export type TokenProgram = {...}');\nconst hasMintAccount = renderMapContains(renderMap, 'programs/token.ts', /MintAccount/);\n```\n\n### Transforming content from a `RenderMap`\n\nTo map the content of all files inside a `RenderMap`, you can use the `mapRenderMapContent` function. This method accepts a function that takes the content of a file and returns a new content.\n\n```ts\nconst updatedRenderMap = mapRenderMapContent(renderMap, c => `/** Prefix for all files */\\n\\n${c}`);\n```\n\nAn asynchronous version of this function called `mapRenderMapContentAsync` is also available in case the transformation function needs to be asynchronous.\n\n```ts\nconst updatedRenderMap = await mapRenderMapContentAsync(renderMap, async content => {\n    const transformedContent = await someAsyncFunction(content);\n    return `/** Prefix for all files */\\n\\n${transformedContent}`;\n});\n```\n\nNote that in both cases, a second argument is available in the mapping function that provides the relative path of the file being transformed.\n\n```ts\nconst updatedRenderMap = mapRenderMapContent(renderMap, (content, path) => `/** File: ${path} */\\n\\n${content}`);\n```\n\n### Writing a `RenderMap` to the filesystem\n\nWhen the `RenderMap` is ready to be written to the filesystem, you can use the `writeRenderMap` helper by providing the base directory where all files should be written. All paths inside the `RenderMap` will be appended to this base directory.\n\n```ts\nconst renderMap = createRenderMap({\n    'programs/token.ts': { content: 'export type TokenProgram = {...}' },\n    'accounts/mint.ts': { content: 'export type MintAccount = {...}' },\n});\n\nwriteRenderMap(renderMap, 'src/generated');\n// In this example, files will be written to:\n// - src/generated/programs/token.ts\n// - src/generated/accounts/mint.ts.\n```\n\n### Using visitors\n\nWhen building renderers, you will most likely create a visitor that traverses the Codama IDL and returns a `RenderMap`. That way, you can test the generated content without having to write it to the filesystem. For instance, the [`@codama/renderers-js`](https://github.com/codama-idl/renderers-js) package exports a `getRenderMapVisitor` function that does just that.\n\n```ts\nimport { getRenderMapVisitor } from '@codama/renderers-js';\n\nconst renderMap = codama.accept(getRenderMapVisitor());\n```\n\nIf you have access to a visitor that returns a `RenderMap` — also described as `Visitor<RenderMap>` — then, you can wrap it inside the `writeRenderMapVisitor` to directly write the content to the filesystem at the given base directory.\n\n```ts\nimport { getRenderMapVisitor } from '@codama/renderers-js';\n\ncodama.accept(writeRenderMapVisitor(getRenderMapVisitor(), 'src/generated'));\n```\n\nNote however that, if you are writing your own renderer, you should probably offer a higher-level visitor that includes this logic and also does some additional work such as deleting the base directory before writing the new content if it already exists.\n\nFor instance, the recommended way of using the `@codama/renderers-js` package is to use its default exported visitor which does exactly that.\n\n```ts\nimport renderVisitor from '@codama/renderers-js';\n\ncodama.accept(renderVisitor('src/generated'));\n```\n\nHere's a simple example of how to set up the basis of a renderer from an existing `getRenderMapVisitor`.\n\n```ts\nimport { deleteDirectory } from '@codama/renderers-core';\nimport { rootNodeVisitor, visit } from '@codama/visitors-core';\n\ntype RenderOptions = {\n    deleteFolderBeforeRendering?: boolean;\n    // Any other options...\n};\n\nexport function renderVisitor(path: string, options: RenderOptions = {}) {\n    return rootNodeVisitor(async root => {\n        // Delete existing generated folder.\n        if (options.deleteFolderBeforeRendering ?? true) {\n            deleteDirectory(path);\n        }\n\n        // Render the new files.\n        visit(root, writeRenderMapVisitor(getRenderMapVisitor(options), path));\n    });\n}\n```\n"
  },
  {
    "path": "packages/renderers-core/package.json",
    "content": "{\n    \"name\": \"@codama/renderers-core\",\n    \"version\": \"1.3.7\",\n    \"description\": \"Core types and helpers for Codama renderers to use\",\n    \"exports\": {\n        \"types\": \"./dist/types/index.d.ts\",\n        \"react-native\": \"./dist/index.react-native.mjs\",\n        \"browser\": {\n            \"import\": \"./dist/index.browser.mjs\",\n            \"require\": \"./dist/index.browser.cjs\"\n        },\n        \"node\": {\n            \"import\": \"./dist/index.node.mjs\",\n            \"require\": \"./dist/index.node.cjs\"\n        }\n    },\n    \"browser\": {\n        \"./dist/index.node.cjs\": \"./dist/index.browser.cjs\",\n        \"./dist/index.node.mjs\": \"./dist/index.browser.mjs\"\n    },\n    \"main\": \"./dist/index.node.cjs\",\n    \"module\": \"./dist/index.node.mjs\",\n    \"react-native\": \"./dist/index.react-native.mjs\",\n    \"types\": \"./dist/types/index.d.ts\",\n    \"type\": \"commonjs\",\n    \"files\": [\n        \"./dist/types\",\n        \"./dist/index.*\"\n    ],\n    \"sideEffects\": false,\n    \"keywords\": [\n        \"solana\",\n        \"framework\",\n        \"standard\",\n        \"visitors\"\n    ],\n    \"scripts\": {\n        \"build\": \"rimraf dist && tsup && tsc -p ./tsconfig.declarations.json\",\n        \"dev\": \"vitest --project node\",\n        \"lint\": \"eslint . && prettier --check .\",\n        \"lint:fix\": \"eslint --fix . && prettier --write .\",\n        \"test\": \"pnpm test:types && pnpm test:treeshakability && pnpm test:unit\",\n        \"test:treeshakability\": \"for file in dist/index.*.mjs; do agadoo $file; done\",\n        \"test:types\": \"tsc --noEmit\",\n        \"test:unit\": \"vitest run\"\n    },\n    \"dependencies\": {\n        \"@codama/errors\": \"workspace:*\",\n        \"@codama/nodes\": \"workspace:*\",\n        \"@codama/visitors-core\": \"workspace:*\"\n    },\n    \"license\": \"MIT\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/codama-idl/codama\"\n    },\n    \"bugs\": {\n        \"url\": \"http://github.com/codama-idl/codama/issues\"\n    },\n    \"browserslist\": [\n        \"supports bigint and not dead\",\n        \"maintained node versions\"\n    ]\n}\n"
  },
  {
    "path": "packages/renderers-core/src/fragment.ts",
    "content": "export type BaseFragment = Readonly<{ content: string }>;\n\nexport function mapFragmentContent<TFragment extends BaseFragment>(\n    fragment: TFragment,\n    mapContent: (content: string) => string,\n): TFragment {\n    return setFragmentContent(fragment, mapContent(fragment.content));\n}\n\nexport async function mapFragmentContentAsync<TFragment extends BaseFragment>(\n    fragment: TFragment,\n    mapContent: (content: string) => Promise<string>,\n): Promise<TFragment> {\n    return setFragmentContent(fragment, await mapContent(fragment.content));\n}\n\nexport function setFragmentContent<TFragment extends BaseFragment>(fragment: TFragment, content: string): TFragment {\n    return Object.freeze({ ...fragment, content });\n}\n\nexport function createFragmentTemplate<TFragment extends BaseFragment>(\n    template: TemplateStringsArray,\n    items: unknown[],\n    isFragment: (value: unknown) => value is TFragment,\n    mergeFragments: (fragments: TFragment[], mergeContent: (contents: string[]) => string) => TFragment,\n): TFragment {\n    const fragments = items.filter(isFragment);\n    const zippedItems = items.map((item, i) => {\n        const itemPrefix = template[i];\n        if (typeof item === 'undefined') return itemPrefix;\n        if (isFragment(item)) return itemPrefix + item.content;\n        return itemPrefix + String(item as string);\n    });\n    return mergeFragments(fragments, () => zippedItems.join('') + template[template.length - 1]);\n}\n"
  },
  {
    "path": "packages/renderers-core/src/fs.ts",
    "content": "import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\n\nimport { CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE, CodamaError } from '@codama/errors';\n\nimport { Path, pathDirectory } from './path';\n\nexport function createDirectory(path: Path): void {\n    if (!__NODEJS__) {\n        throw new CodamaError(CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE, { fsFunction: 'mkdirSync' });\n    }\n\n    mkdirSync(path, { recursive: true });\n}\n\nexport function deleteDirectory(path: Path): void {\n    if (!__NODEJS__) {\n        throw new CodamaError(CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE, { fsFunction: 'rmSync' });\n    }\n\n    if (existsSync(path)) {\n        rmSync(path, { recursive: true });\n    }\n}\n\nexport function writeFile(path: Path, content: string): void {\n    if (!__NODEJS__) {\n        throw new CodamaError(CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE, { fsFunction: 'writeFileSync' });\n    }\n\n    const directory = pathDirectory(path);\n    if (!existsSync(directory)) {\n        createDirectory(directory);\n    }\n    writeFileSync(path, content);\n}\n\nexport function fileExists(path: Path): boolean {\n    if (!__NODEJS__) {\n        throw new CodamaError(CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE, { fsFunction: 'existsSync' });\n    }\n\n    return existsSync(path);\n}\n\nexport function readFile(path: Path): string {\n    if (!__NODEJS__) {\n        throw new CodamaError(CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE, { fsFunction: 'readFileSync' });\n    }\n\n    return readFileSync(path, 'utf-8');\n}\n\nexport function readJson<T>(path: Path): T {\n    return JSON.parse(readFile(path)) as T;\n}\n"
  },
  {
    "path": "packages/renderers-core/src/index.ts",
    "content": "export * from './fragment';\nexport * from './fs';\nexport * from './path';\nexport * from './renderMap';\n"
  },
  {
    "path": "packages/renderers-core/src/path.ts",
    "content": "import { dirname, join } from 'node:path';\n\nexport type Path = string;\n\nexport function joinPath(...paths: Path[]): string {\n    if (!__NODEJS__) {\n        return paths.join('/').replace(/\\/+/g, '/');\n    }\n\n    return join(...paths);\n}\n\nexport function pathDirectory(path: Path): Path {\n    if (!__NODEJS__) {\n        return path.substring(0, path.lastIndexOf('/'));\n    }\n\n    return dirname(path);\n}\n"
  },
  {
    "path": "packages/renderers-core/src/renderMap.ts",
    "content": "import { CODAMA_ERROR__VISITORS__RENDER_MAP_KEY_NOT_FOUND, CodamaError } from '@codama/errors';\nimport { NodeKind } from '@codama/nodes';\nimport { mapVisitor, Visitor } from '@codama/visitors-core';\n\nimport { BaseFragment, mapFragmentContent, mapFragmentContentAsync } from './fragment';\nimport { writeFile } from './fs';\nimport { joinPath, Path } from './path';\n\nexport type RenderMap<TFragment extends BaseFragment> = ReadonlyMap<Path, TFragment>;\n\nexport function createRenderMap<TFragment extends BaseFragment = BaseFragment>(): RenderMap<TFragment>;\nexport function createRenderMap<TFragment extends BaseFragment>(path: Path, content: TFragment): RenderMap<TFragment>;\nexport function createRenderMap<TFragment extends BaseFragment>(\n    entries: Record<Path, TFragment | undefined>,\n): RenderMap<TFragment>;\nexport function createRenderMap<TFragment extends BaseFragment>(\n    pathOrEntries?: Path | Record<Path, TFragment | undefined>,\n    content?: TFragment,\n): RenderMap<TFragment> {\n    let entries: [Path, TFragment][] = [];\n    if (typeof pathOrEntries === 'string' && pathOrEntries !== undefined && content !== undefined) {\n        entries = [[pathOrEntries, content]];\n    } else if (typeof pathOrEntries === 'object' && pathOrEntries !== null) {\n        entries = Object.entries(pathOrEntries).flatMap(([key, value]) =>\n            value === undefined ? [] : ([[key, value]] as const),\n        );\n    }\n    return Object.freeze(new Map(entries));\n}\n\nexport function addToRenderMap<TFragment extends BaseFragment>(\n    renderMap: RenderMap<TFragment>,\n    path: Path,\n    content: TFragment,\n): RenderMap<TFragment> {\n    return mergeRenderMaps([renderMap, createRenderMap(path, content)]);\n}\n\nexport function removeFromRenderMap<TFragment extends BaseFragment>(\n    renderMap: RenderMap<TFragment>,\n    path: Path,\n): RenderMap<TFragment> {\n    const newMap = new Map(renderMap);\n    newMap.delete(path);\n    return Object.freeze(newMap);\n}\n\nexport function mergeRenderMaps<TFragment extends BaseFragment>(\n    renderMaps: RenderMap<TFragment>[],\n): RenderMap<TFragment> {\n    if (renderMaps.length === 0) return createRenderMap();\n    if (renderMaps.length === 1) return renderMaps[0];\n    const merged = new Map(renderMaps[0]);\n    for (const map of renderMaps.slice(1)) {\n        for (const [key, value] of map) {\n            merged.set(key, value);\n        }\n    }\n    return Object.freeze(merged);\n}\n\nexport function mapRenderMapFragment<TFragment extends BaseFragment>(\n    renderMap: RenderMap<TFragment>,\n    fn: (fragment: TFragment, path: Path) => TFragment,\n): RenderMap<TFragment> {\n    return Object.freeze(new Map([...[...renderMap.entries()].map(([key, value]) => [key, fn(value, key)] as const)]));\n}\n\nexport async function mapRenderMapFragmentAsync<TFragment extends BaseFragment>(\n    renderMap: RenderMap<TFragment>,\n    fn: (fragment: TFragment, path: Path) => Promise<TFragment>,\n): Promise<RenderMap<TFragment>> {\n    return Object.freeze(\n        new Map(\n            await Promise.all([\n                ...[...renderMap.entries()].map(async ([key, value]) => [key, await fn(value, key)] as const),\n            ]),\n        ),\n    );\n}\n\nexport function mapRenderMapContent<TFragment extends BaseFragment>(\n    renderMap: RenderMap<TFragment>,\n    fn: (content: string, path: Path) => string,\n): RenderMap<TFragment> {\n    return mapRenderMapFragment(renderMap, (fragment, path) =>\n        mapFragmentContent(fragment, content => fn(content, path)),\n    );\n}\n\nexport async function mapRenderMapContentAsync<TFragment extends BaseFragment>(\n    renderMap: RenderMap<TFragment>,\n    fn: (content: string, path: Path) => Promise<string>,\n): Promise<RenderMap<TFragment>> {\n    return await mapRenderMapFragmentAsync(renderMap, (fragment, path) =>\n        mapFragmentContentAsync(fragment, content => fn(content, path)),\n    );\n}\n\nexport function getFromRenderMap<TFragment extends BaseFragment>(\n    renderMap: RenderMap<TFragment>,\n    path: Path,\n): TFragment {\n    const value = renderMap.get(path);\n    if (value === undefined) {\n        throw new CodamaError(CODAMA_ERROR__VISITORS__RENDER_MAP_KEY_NOT_FOUND, { key: path });\n    }\n    return value;\n}\n\nexport function renderMapContains<TFragment extends BaseFragment>(\n    renderMap: RenderMap<TFragment>,\n    path: Path,\n    value: RegExp | string,\n): boolean {\n    const { content } = getFromRenderMap(renderMap, path);\n    return typeof value === 'string' ? content.includes(value) : value.test(content);\n}\n\nexport function writeRenderMap<TFragment extends BaseFragment>(renderMap: RenderMap<TFragment>, basePath: Path): void {\n    renderMap.forEach(({ content }, relativePath) => {\n        writeFile(joinPath(basePath, relativePath), content);\n    });\n}\n\nexport function writeRenderMapVisitor<\n    TFragment extends BaseFragment = BaseFragment,\n    TNodeKind extends NodeKind = NodeKind,\n>(visitor: Visitor<RenderMap<TFragment>, TNodeKind>, basePath: Path): Visitor<void, TNodeKind> {\n    return mapVisitor(visitor, renderMap => writeRenderMap(renderMap, basePath));\n}\n"
  },
  {
    "path": "packages/renderers-core/src/types/global.d.ts",
    "content": "declare const __BROWSER__: boolean;\ndeclare const __ESM__: boolean;\ndeclare const __NODEJS__: boolean;\ndeclare const __REACTNATIVE__: boolean;\ndeclare const __TEST__: boolean;\ndeclare const __VERSION__: string;\n"
  },
  {
    "path": "packages/renderers-core/test/fs.test.json",
    "content": "{ \"key\": \"value\" }\n"
  },
  {
    "path": "packages/renderers-core/test/fs.test.ts",
    "content": "import { CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE, CodamaError } from '@codama/errors';\nimport { expect, test } from 'vitest';\n\nimport { createDirectory, deleteDirectory, fileExists, readJson, writeFile } from '../src';\n\nif (__NODEJS__) {\n    test('it reads JSON objects from files', () => {\n        const result = readJson('./test/fs.test.json');\n        expect(result).toEqual({ key: 'value' });\n    });\n    test('it checks if a file exists', () => {\n        const result = fileExists('./test/fs.test.json');\n        expect(result).toBe(true);\n    });\n} else {\n    test('it fails to call readJson', () => {\n        expect(() => readJson('./path')).toThrow(\n            new CodamaError(CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE, { fsFunction: 'readFileSync' }),\n        );\n    });\n    test('it fails to call fileExists', () => {\n        expect(() => fileExists('./path')).toThrow(\n            new CodamaError(CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE, { fsFunction: 'existsSync' }),\n        );\n    });\n    test('it fails to call createDirectory', () => {\n        expect(() => createDirectory('./path')).toThrow(\n            new CodamaError(CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE, { fsFunction: 'mkdirSync' }),\n        );\n    });\n    test('it fails to call deleteDirectory', () => {\n        expect(() => deleteDirectory('./path')).toThrow(\n            new CodamaError(CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE, { fsFunction: 'rmSync' }),\n        );\n    });\n    test('it fails to call writeFile', () => {\n        expect(() => writeFile('./path', 'content')).toThrow(\n            new CodamaError(CODAMA_ERROR__NODE_FILESYSTEM_FUNCTION_UNAVAILABLE, { fsFunction: 'writeFileSync' }),\n        );\n    });\n}\n"
  },
  {
    "path": "packages/renderers-core/test/path.test.ts",
    "content": "import { expect, test } from 'vitest';\n\nimport { joinPath, pathDirectory } from '../src';\n\ntest('it joins path together', () => {\n    const result = joinPath('foo', 'bar', 'baz');\n    expect(result).toEqual('foo/bar/baz');\n});\n\ntest('it gets the directory of a path', () => {\n    const result = pathDirectory('foo/bar/baz');\n    expect(result).toEqual('foo/bar');\n});\n"
  },
  {
    "path": "packages/renderers-core/test/renderMap.test.ts",
    "content": "import { assert, describe, expect, expectTypeOf, test } from 'vitest';\n\nimport {\n    addToRenderMap,\n    BaseFragment,\n    createRenderMap,\n    mapRenderMapContent,\n    mapRenderMapContentAsync,\n    mergeRenderMaps,\n    removeFromRenderMap,\n    RenderMap,\n} from '../src';\n\ndescribe('createRenderMap', () => {\n    test('it creates an empty render map', () => {\n        expect(createRenderMap()).toStrictEqual(new Map());\n        expectTypeOf(createRenderMap()).toEqualTypeOf<RenderMap<BaseFragment>>();\n    });\n\n    test('it creates an empty render map using a custom fragment type', () => {\n        type CustomFragment = BaseFragment & { customProperty: number };\n        expect(createRenderMap()).toStrictEqual(new Map());\n        expectTypeOf(createRenderMap<CustomFragment>()).toEqualTypeOf<RenderMap<CustomFragment>>();\n    });\n\n    test('it creates a render map from a path and a fragment', () => {\n        expect(createRenderMap('some/path', { content: 'Some content' })).toStrictEqual(\n            new Map([['some/path', { content: 'Some content' }]]),\n        );\n    });\n\n    test('it creates a render map from a record of entries', () => {\n        expect(\n            createRenderMap({\n                'some/path/a': { content: 'Some content A' },\n                'some/path/b': { content: 'Some content B' },\n            }),\n        ).toStrictEqual(\n            new Map([\n                ['some/path/a', { content: 'Some content A' }],\n                ['some/path/b', { content: 'Some content B' }],\n            ]),\n        );\n    });\n\n    test('it removes undefined entries from the provided record', () => {\n        expect(\n            createRenderMap({\n                'some/path': { content: 'Some content' },\n                'some/path/undefined': undefined,\n            }),\n        ).toStrictEqual(new Map([['some/path', { content: 'Some content' }]]));\n    });\n\n    test('it freezes the returned render map', () => {\n        assert.isFrozen(createRenderMap());\n        assert.isFrozen(createRenderMap('some/path', { content: 'Some content' }));\n        assert.isFrozen(createRenderMap({ 'some/path': { content: 'Some content' } }));\n    });\n});\n\ndescribe('addToRenderMap', () => {\n    test('it adds new entries to render map', () => {\n        const renderMap = createRenderMap('some/path', { content: 'Some content' });\n        expect(addToRenderMap(renderMap, 'some/new/path', { content: 'Some new content' })).toStrictEqual(\n            new Map([\n                ['some/path', { content: 'Some content' }],\n                ['some/new/path', { content: 'Some new content' }],\n            ]),\n        );\n    });\n\n    test('it overwrites existing entries in the render map', () => {\n        const renderMap = createRenderMap('some/path', { content: 'Some content' });\n        expect(addToRenderMap(renderMap, 'some/path', { content: 'Some new content' })).toStrictEqual(\n            new Map([['some/path', { content: 'Some new content' }]]),\n        );\n    });\n\n    test('it freezes the returned render map', () => {\n        assert.isFrozen(addToRenderMap(createRenderMap(), 'some/new/path', { content: 'Some new content' }));\n    });\n});\n\ndescribe('removeFromRenderMap', () => {\n    test('it removes existing entries from a render map', () => {\n        const renderMap = createRenderMap({ pathA: { content: 'Content A' }, pathB: { content: 'Content B' } });\n        expect(removeFromRenderMap(renderMap, 'pathA')).toStrictEqual(new Map([['pathB', { content: 'Content B' }]]));\n    });\n\n    test('it can remove the last entry of a render map', () => {\n        const renderMap = createRenderMap('pathA', { content: 'Content A' });\n        expect(removeFromRenderMap(renderMap, 'pathA')).toStrictEqual(new Map());\n    });\n\n    test('it ignores missing paths', () => {\n        const renderMap = createRenderMap();\n        expect(removeFromRenderMap(renderMap, 'missingPaths')).toStrictEqual(new Map());\n    });\n\n    test('it freezes the returned render map', () => {\n        assert.isFrozen(removeFromRenderMap(createRenderMap(), 'some/path'));\n    });\n});\n\ndescribe('mergeRenderMaps', () => {\n    test('it returns an empty render map when no maps are provided', () => {\n        expect(mergeRenderMaps([])).toStrictEqual(new Map());\n    });\n\n    test('it returns the first render map as-is when only one map is provided', () => {\n        const renderMap = createRenderMap('pathA', { content: 'ContentA' });\n        expect(mergeRenderMaps([renderMap])).toBe(renderMap);\n    });\n\n    test('it merges the entries of two render maps', () => {\n        expect(\n            mergeRenderMaps([\n                createRenderMap('pathA', { content: 'ContentA' }),\n                createRenderMap('pathB', { content: 'ContentB' }),\n            ]),\n        ).toStrictEqual(\n            new Map([\n                ['pathA', { content: 'ContentA' }],\n                ['pathB', { content: 'ContentB' }],\n            ]),\n        );\n    });\n\n    test('later entries overwrite earlier entries', () => {\n        expect(\n            mergeRenderMaps([\n                createRenderMap('samePath', { content: 'Old content' }),\n                createRenderMap('samePath', { content: 'New content' }),\n            ]),\n        ).toStrictEqual(new Map([['samePath', { content: 'New content' }]]));\n    });\n\n    test('it freezes the returned render map', () => {\n        assert.isFrozen(mergeRenderMaps([]));\n        assert.isFrozen(mergeRenderMaps([createRenderMap('pathA', { content: 'ContentA' })]));\n        assert.isFrozen(\n            mergeRenderMaps([\n                createRenderMap('pathA', { content: 'ContentA' }),\n                createRenderMap('pathB', { content: 'ContentB' }),\n            ]),\n        );\n    });\n});\n\ndescribe('mapRenderMapContent', () => {\n    test('it maps the content of all entries inside a render map', () => {\n        expect(\n            mapRenderMapContent(\n                createRenderMap({\n                    pathA: { content: 'ContentA' },\n                    pathB: { content: 'ContentB' },\n                }),\n                content => `Mapped: ${content}`,\n            ),\n        ).toStrictEqual(\n            new Map([\n                ['pathA', { content: 'Mapped: ContentA' }],\n                ['pathB', { content: 'Mapped: ContentB' }],\n            ]),\n        );\n    });\n\n    test('it provides the path of the content being mapped', () => {\n        expect(\n            mapRenderMapContent(\n                createRenderMap({\n                    pathA: { content: 'Content' },\n                    pathB: { content: 'Content' },\n                }),\n                (content, path) => `${content} from ${path}`,\n            ),\n        ).toStrictEqual(\n            new Map([\n                ['pathA', { content: 'Content from pathA' }],\n                ['pathB', { content: 'Content from pathB' }],\n            ]),\n        );\n    });\n\n    test('it freezes the returned render map', () => {\n        assert.isFrozen(mapRenderMapContent(createRenderMap(), c => c));\n    });\n});\n\ndescribe('mapRenderMapContentAsync', () => {\n    test('it maps the content of all entries inside a render map', async () => {\n        expect(\n            await mapRenderMapContentAsync(\n                createRenderMap({\n                    pathA: { content: 'ContentA' },\n                    pathB: { content: 'ContentB' },\n                }),\n                content => Promise.resolve(`Mapped: ${content}`),\n            ),\n        ).toStrictEqual(\n            new Map([\n                ['pathA', { content: 'Mapped: ContentA' }],\n                ['pathB', { content: 'Mapped: ContentB' }],\n            ]),\n        );\n    });\n\n    test('it provides the path of the content being mapped', async () => {\n        expect(\n            await mapRenderMapContentAsync(\n                createRenderMap({\n                    pathA: { content: 'Content' },\n                    pathB: { content: 'Content' },\n                }),\n                (content, path) => Promise.resolve(`${content} from ${path}`),\n            ),\n        ).toStrictEqual(\n            new Map([\n                ['pathA', { content: 'Content from pathA' }],\n                ['pathB', { content: 'Content from pathB' }],\n            ]),\n        );\n    });\n\n    test('it freezes the returned render map', async () => {\n        assert.isFrozen(await mapRenderMapContentAsync(createRenderMap(), c => Promise.resolve(c)));\n    });\n});\n"
  },
  {
    "path": "packages/renderers-core/test/types/global.d.ts",
    "content": "declare const __BROWSER__: boolean;\ndeclare const __ESM__: boolean;\ndeclare const __NODEJS__: boolean;\ndeclare const __REACTNATIVE__: boolean;\ndeclare const __TEST__: boolean;\ndeclare const __VERSION__: string;\n"
  },
  {
    "path": "packages/renderers-core/tsconfig.declarations.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"declarationMap\": true,\n        \"emitDeclarationOnly\": true,\n        \"outDir\": \"./dist/types\"\n    },\n    \"extends\": \"./tsconfig.json\",\n    \"include\": [\"src/index.ts\", \"src/types\"]\n}\n"
  },
  {
    "path": "packages/renderers-core/tsconfig.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": { \"lib\": [] },\n    \"display\": \"@codama/renderers-core\",\n    \"extends\": \"../../tsconfig.json\",\n    \"include\": [\"src\", \"test\"]\n}\n"
  },
  {
    "path": "packages/renderers-core/tsup.config.ts",
    "content": "import { defineConfig } from 'tsup';\n\nimport { getPackageBuildConfigs } from '../../tsup.config.base';\n\nexport default defineConfig(getPackageBuildConfigs());\n"
  },
  {
    "path": "packages/renderers-core/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\nimport { getVitestConfig } from '../../vitest.config.base.mjs';\n\nexport default defineConfig({\n    test: {\n        projects: [getVitestConfig('browser'), getVitestConfig('node'), getVitestConfig('react-native')],\n    },\n});\n"
  },
  {
    "path": "packages/validators/.gitignore",
    "content": "dist/\n"
  },
  {
    "path": "packages/validators/.prettierignore",
    "content": "dist/\ntest/e2e/\ntest-ledger/\ntarget/\nCHANGELOG.md\n"
  },
  {
    "path": "packages/validators/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Codama\nCopyright (c) 2024 Metaplex Foundation\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/validators/README.md",
    "content": "# Codama ➤ Validators\n\n[![npm][npm-image]][npm-url]\n[![npm-downloads][npm-downloads-image]][npm-url]\n\n[npm-downloads-image]: https://img.shields.io/npm/dm/@codama/validators.svg?style=flat\n[npm-image]: https://img.shields.io/npm/v/@codama/validators.svg?style=flat&label=%40codama%2Fvalidators\n[npm-url]: https://www.npmjs.com/package/@codama/validators\n\nThis package offers a set of validation rules for Codama IDLs to ensure that they are correctly formatted.\n\n## Installation\n\n```sh\npnpm install @codama/validators\n```\n\n> [!NOTE]\n> This package is included in the main [`codama`](../library) package. Meaning, you already have access to its content if you are installing Codama this way.\n>\n> ```sh\n> pnpm install codama\n> ```\n\n## Types\n\n### `ValidationItem`\n\nA validation item describes a single piece of information — typically a warning or an error — about a node in the Codama IDL.\n\n```ts\ntype ValidationItem = {\n    // The level of importance of a validation item.\n    level: 'debug' | 'trace' | 'info' | 'warn' | 'error';\n    // A human-readable message describing the issue or information.\n    message: string;\n    // The node that the validation item is related to.\n    node: Node;\n    // The path of nodes that led to the node above (including the node itself).\n    path: NodePath;\n};\n```\n\n## Functions\n\n### `getValidationItemsVisitor(visitor)`\n\nThe `getValidationItemsVisitor` function returns a visitor that collects all validation items from a Codama IDL. Note that this visitor is still a work in progress and does not cover all validation rules.\n\n```ts\nimport { getValidationItemsVisitor } from '@codama/validators';\n\nconst validationItems = codama.accept(getValidationItemsVisitor());\n```\n\n### `throwValidatorItemsVisitor(visitor)`\n\nThe `throwValidatorItemsVisitor` function accepts a `Visitor<ValidationItemp[]>` and throws an error if any validation items above a certain level are found. By default, the level is set to `'error'` but a second argument can be passed to change it.\n\n```ts\nimport { throwValidatorItemsVisitor, getValidationItemsVisitor } from '@codama/validators';\n\n// Throw if any \"error\" items are found.\ncodama.accept(throwValidatorItemsVisitor(getValidationItemsVisitor()));\n\n// Throw if any \"warn\" or \"error\" items are found.\ncodama.accept(throwValidatorItemsVisitor(getValidationItemsVisitor(), 'warn'));\n```\n"
  },
  {
    "path": "packages/validators/package.json",
    "content": "{\n    \"name\": \"@codama/validators\",\n    \"version\": \"1.6.0\",\n    \"description\": \"Validator visitors for the Codama framework\",\n    \"exports\": {\n        \"types\": \"./dist/types/index.d.ts\",\n        \"react-native\": \"./dist/index.react-native.mjs\",\n        \"browser\": {\n            \"import\": \"./dist/index.browser.mjs\",\n            \"require\": \"./dist/index.browser.cjs\"\n        },\n        \"node\": {\n            \"import\": \"./dist/index.node.mjs\",\n            \"require\": \"./dist/index.node.cjs\"\n        }\n    },\n    \"browser\": {\n        \"./dist/index.node.cjs\": \"./dist/index.browser.cjs\",\n        \"./dist/index.node.mjs\": \"./dist/index.browser.mjs\"\n    },\n    \"main\": \"./dist/index.node.cjs\",\n    \"module\": \"./dist/index.node.mjs\",\n    \"react-native\": \"./dist/index.react-native.mjs\",\n    \"types\": \"./dist/types/index.d.ts\",\n    \"type\": \"commonjs\",\n    \"files\": [\n        \"./dist/types\",\n        \"./dist/index.*\"\n    ],\n    \"sideEffects\": false,\n    \"keywords\": [\n        \"solana\",\n        \"framework\",\n        \"standard\",\n        \"visitors\"\n    ],\n    \"scripts\": {\n        \"build\": \"rimraf dist && tsup && tsc -p ./tsconfig.declarations.json\",\n        \"dev\": \"vitest --project node\",\n        \"lint\": \"eslint . && prettier --check .\",\n        \"lint:fix\": \"eslint --fix . && prettier --write .\",\n        \"test\": \"pnpm test:types && pnpm test:treeshakability && pnpm test:unit\",\n        \"test:treeshakability\": \"for file in dist/index.*.mjs; do agadoo $file; done\",\n        \"test:types\": \"tsc --noEmit\",\n        \"test:unit\": \"vitest run\"\n    },\n    \"dependencies\": {\n        \"@codama/errors\": \"workspace:*\",\n        \"@codama/nodes\": \"workspace:*\",\n        \"@codama/visitors-core\": \"workspace:*\"\n    },\n    \"license\": \"MIT\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/codama-idl/codama\"\n    },\n    \"bugs\": {\n        \"url\": \"http://github.com/codama-idl/codama/issues\"\n    },\n    \"browserslist\": [\n        \"supports bigint and not dead\",\n        \"maintained node versions\"\n    ]\n}\n"
  },
  {
    "path": "packages/validators/src/ValidationItem.ts",
    "content": "import { Node } from '@codama/nodes';\nimport { NodePath, NodeStack } from '@codama/visitors-core';\n\nexport const LOG_LEVELS = ['debug', 'trace', 'info', 'warn', 'error'] as const;\nexport type LogLevel = (typeof LOG_LEVELS)[number];\n\nexport type ValidationItem = {\n    level: LogLevel;\n    message: string;\n    node: Node;\n    path: NodePath;\n};\n\nexport function validationItem(\n    level: LogLevel,\n    message: string,\n    node: Node,\n    path: NodePath | NodeStack,\n): ValidationItem {\n    return {\n        level,\n        message,\n        node,\n        path: Array.isArray(path) ? path : (path as NodeStack).getPath(),\n    };\n}\n\nexport const getLevelIndex = (level: LogLevel): number => LOG_LEVELS.indexOf(level);\n"
  },
  {
    "path": "packages/validators/src/getValidationItemsVisitor.ts",
    "content": "import { camelCase, getAllInstructionArguments, isNode } from '@codama/nodes';\nimport {\n    extendVisitor,\n    getResolvedInstructionInputsVisitor,\n    LinkableDictionary,\n    mergeVisitor,\n    NodeStack,\n    pipe,\n    recordLinkablesOnFirstVisitVisitor,\n    recordNodeStackVisitor,\n    visit,\n    Visitor,\n} from '@codama/visitors-core';\n\nimport { ValidationItem, validationItem } from './ValidationItem';\n\nexport function getValidationItemsVisitor(): Visitor<readonly ValidationItem[]> {\n    const linkables = new LinkableDictionary();\n    const stack = new NodeStack();\n\n    return pipe(\n        mergeVisitor(\n            () => [] as readonly ValidationItem[],\n            (_, items) => items.flat(),\n        ),\n        v => recordLinkablesOnFirstVisitVisitor(v, linkables),\n        v => recordNodeStackVisitor(v, stack),\n        v =>\n            extendVisitor(v, {\n                visitAccount(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Account has no name.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitDefinedType(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Defined type has no name.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitDefinedTypeLink(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Pointing to a defined type with no name.', node, stack));\n                    } else if (!linkables.has(stack.getPath(node.kind))) {\n                        items.push(\n                            validationItem(\n                                'error',\n                                `Pointing to a missing defined type named \"${node.name}\"`,\n                                node,\n                                stack,\n                            ),\n                        );\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitEnumEmptyVariantType(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Enum variant has no name.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitEnumStructVariantType(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Enum variant has no name.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitEnumTupleVariantType(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Enum variant has no name.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitEnumType(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (node.variants.length === 0) {\n                        items.push(validationItem('warn', 'Enum has no variants.', node, stack));\n                    }\n                    node.variants.forEach(variant => {\n                        if (!variant.name) {\n                            items.push(validationItem('error', 'Enum variant has no name.', node, stack));\n                        }\n                    });\n                    return [...items, ...next(node)];\n                },\n\n                visitError(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Error has no name.', node, stack));\n                    }\n                    if (typeof node.code !== 'number') {\n                        items.push(validationItem('error', 'Error has no code.', node, stack));\n                    }\n                    if (!node.message) {\n                        items.push(validationItem('warn', 'Error has no message.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitInstruction(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Instruction has no name.', node, stack));\n                    }\n\n                    // Check for duplicate account names.\n                    const accountNameHistogram = new Map<string, number>();\n                    node.accounts.forEach(account => {\n                        if (!account.name) {\n                            items.push(validationItem('error', 'Instruction account has no name.', node, stack));\n                            return;\n                        }\n                        const count = (accountNameHistogram.get(account.name) ?? 0) + 1;\n                        accountNameHistogram.set(account.name, count);\n                        // Only throw an error once per duplicated names.\n                        if (count === 2) {\n                            items.push(\n                                validationItem(\n                                    'error',\n                                    `Account name \"${account.name}\" is not unique in instruction \"${node.name}\".`,\n                                    node,\n                                    stack,\n                                ),\n                            );\n                        }\n                    });\n\n                    // Check for cyclic dependencies in account defaults.\n                    const cyclicCheckVisitor = getResolvedInstructionInputsVisitor();\n                    try {\n                        visit(node, cyclicCheckVisitor);\n                    } catch (error) {\n                        items.push(validationItem('error', (error as Error).message, node, stack));\n                    }\n\n                    // Check args.\n                    const names = getAllInstructionArguments(node).map(({ name }) => camelCase(name));\n                    const duplicates = names.filter((e, i, a) => a.indexOf(e) !== i);\n                    const uniqueDuplicates = [...new Set(duplicates)];\n                    const hasConflictingNames = uniqueDuplicates.length > 0;\n                    if (hasConflictingNames) {\n                        items.push(\n                            validationItem(\n                                'error',\n                                `The names of the following instruction arguments are conflicting: ` +\n                                    `[${uniqueDuplicates.join(', ')}].`,\n                                node,\n                                stack,\n                            ),\n                        );\n                    }\n\n                    // Check arg defaults.\n                    getAllInstructionArguments(node).forEach(argument => {\n                        const { defaultValue } = argument;\n                        if (isNode(defaultValue, 'accountBumpValueNode')) {\n                            const defaultAccount = node.accounts.find(account => account.name === defaultValue.name);\n                            if (defaultAccount && defaultAccount.isSigner !== false) {\n                                items.push(\n                                    validationItem(\n                                        'error',\n                                        `Argument ${argument.name} cannot default to the bump attribute of ` +\n                                            `the [${defaultValue.name}] account as it may be a Signer.`,\n                                        node,\n                                        stack,\n                                    ),\n                                );\n                            }\n                        }\n                    });\n\n                    return [...items, ...next(node)];\n                },\n\n                visitProgram(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Program has no name.', node, stack));\n                    }\n                    if (!node.publicKey) {\n                        items.push(validationItem('error', 'Program has no public key.', node, stack));\n                    }\n                    if (!node.version) {\n                        items.push(validationItem('warn', 'Program has no version.', node, stack));\n                    }\n                    if (!node.origin) {\n                        items.push(validationItem('info', 'Program has no origin.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitStructFieldType(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (!node.name) {\n                        items.push(validationItem('error', 'Struct field has no name.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n\n                visitStructType(node, { next }) {\n                    const items = [] as ValidationItem[];\n\n                    // Check for duplicate field names.\n                    const fieldNameHistogram = new Map<string, number>();\n                    node.fields.forEach(field => {\n                        if (!field.name) return; // Handled by TypeStructField\n                        const count = (fieldNameHistogram.get(field.name) ?? 0) + 1;\n                        fieldNameHistogram.set(field.name, count);\n                        // Only throw an error once per duplicated names.\n                        if (count === 2) {\n                            items.push(\n                                validationItem(\n                                    'error',\n                                    `Struct field name \"${field.name}\" is not unique.`,\n                                    field,\n                                    stack,\n                                ),\n                            );\n                        }\n                    });\n                    return [...items, ...next(node)];\n                },\n\n                visitTupleType(node, { next }) {\n                    const items = [] as ValidationItem[];\n                    if (node.items.length === 0) {\n                        items.push(validationItem('warn', 'Tuple has no items.', node, stack));\n                    }\n                    return [...items, ...next(node)];\n                },\n            }),\n    );\n}\n"
  },
  {
    "path": "packages/validators/src/index.ts",
    "content": "export * from './getValidationItemsVisitor';\nexport * from './throwValidatorItemsVisitor';\nexport * from './ValidationItem';\n"
  },
  {
    "path": "packages/validators/src/throwValidatorItemsVisitor.ts",
    "content": "import { CODAMA_ERROR__VISITORS__FAILED_TO_VALIDATE_NODE, CodamaError } from '@codama/errors';\nimport { NodeKind } from '@codama/nodes';\nimport { mapVisitor, Visitor } from '@codama/visitors-core';\n\nimport { getLevelIndex, LogLevel, ValidationItem } from './ValidationItem';\n\nexport function throwValidatorItemsVisitor<TNodeKind extends NodeKind = NodeKind>(\n    visitor: Visitor<readonly ValidationItem[], TNodeKind>,\n    throwLevel: LogLevel = 'error',\n): Visitor<void, TNodeKind> {\n    return mapVisitor(visitor, validationItems => {\n        const levelHistogram = [...validationItems]\n            .sort((a, b) => getLevelIndex(b.level) - getLevelIndex(a.level))\n            .reduce(\n                (acc, item) => {\n                    acc[item.level] = (acc[item.level] ?? 0) + 1;\n                    return acc;\n                },\n                {} as Record<LogLevel, number>,\n            );\n        const maxLevel = Object.keys(levelHistogram)\n            .map(level => getLevelIndex(level as LogLevel))\n            .sort((a, b) => b - a)[0];\n\n        if (maxLevel >= getLevelIndex(throwLevel)) {\n            const formattedHistogram = Object.keys(levelHistogram)\n                .map(level => `${level}s: ${levelHistogram[level as LogLevel]}`)\n                .join(', ');\n            throw new CodamaError(CODAMA_ERROR__VISITORS__FAILED_TO_VALIDATE_NODE, {\n                formattedHistogram,\n                validationItems,\n            });\n        }\n    });\n}\n"
  },
  {
    "path": "packages/validators/test/getValidationItemsVisitor.test.ts",
    "content": "import { programNode, publicKeyTypeNode, structFieldTypeNode, structTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { getValidationItemsVisitor, validationItem } from '../src';\n\ntest('it validates program nodes', () => {\n    // Given the following program node with empty strings.\n    const node = programNode({\n        accounts: [],\n        definedTypes: [],\n        errors: [],\n        instructions: [],\n        name: '',\n        origin: undefined,\n        publicKey: '',\n        // @ts-expect-error Empty string does not match ProgramVersion.\n        version: '',\n    });\n\n    // When we get the validation items using a visitor.\n    const items = visit(node, getValidationItemsVisitor());\n\n    // Then we expect the following validation errors.\n    expect(items).toEqual([\n        validationItem('error', 'Program has no name.', node, []),\n        validationItem('error', 'Program has no public key.', node, []),\n        validationItem('warn', 'Program has no version.', node, []),\n        validationItem('info', 'Program has no origin.', node, []),\n    ]);\n});\n\ntest('it validates nested nodes', () => {\n    // Given the following tuple with nested issues.\n    const node = tupleTypeNode([\n        tupleTypeNode([]),\n        structTypeNode([\n            structFieldTypeNode({ name: 'owner', type: publicKeyTypeNode() }),\n            structFieldTypeNode({ name: 'owner', type: publicKeyTypeNode() }),\n        ]),\n    ]);\n\n    // When we get the validation items using a visitor.\n    const items = visit(node, getValidationItemsVisitor());\n\n    // Then we expect the following validation errors.\n    const tupleNode = node.items[0];\n    const structNode = node.items[1];\n    expect(items).toEqual([\n        validationItem('warn', 'Tuple has no items.', tupleNode, [node]),\n        validationItem('error', 'Struct field name \"owner\" is not unique.', structNode.fields[0], [node]),\n    ]);\n});\n"
  },
  {
    "path": "packages/validators/tsconfig.declarations.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"declarationMap\": true,\n        \"emitDeclarationOnly\": true,\n        \"outDir\": \"./dist/types\"\n    },\n    \"extends\": \"./tsconfig.json\",\n    \"include\": [\"src/index.ts\", \"src/types\"]\n}\n"
  },
  {
    "path": "packages/validators/tsconfig.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": { \"lib\": [] },\n    \"display\": \"@codama/validators\",\n    \"extends\": \"../../tsconfig.json\",\n    \"include\": [\"src\", \"test\"]\n}\n"
  },
  {
    "path": "packages/validators/tsup.config.ts",
    "content": "import { defineConfig } from 'tsup';\n\nimport { getPackageBuildConfigs } from '../../tsup.config.base';\n\nexport default defineConfig(getPackageBuildConfigs());\n"
  },
  {
    "path": "packages/validators/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\nimport { getVitestConfig } from '../../vitest.config.base.mjs';\n\nexport default defineConfig({\n    test: {\n        projects: [getVitestConfig('browser'), getVitestConfig('node'), getVitestConfig('react-native')],\n    },\n});\n"
  },
  {
    "path": "packages/visitors/.gitignore",
    "content": "dist/\n"
  },
  {
    "path": "packages/visitors/.prettierignore",
    "content": "dist/\ntest/e2e/\ntest-ledger/\ntarget/\nCHANGELOG.md\n"
  },
  {
    "path": "packages/visitors/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Codama\nCopyright (c) 2024 Metaplex Foundation\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/visitors/README.md",
    "content": "# Codama ➤ Visitors\n\n[![npm][npm-image]][npm-url]\n[![npm-downloads][npm-downloads-image]][npm-url]\n\n[npm-downloads-image]: https://img.shields.io/npm/dm/@codama/visitors.svg?style=flat\n[npm-image]: https://img.shields.io/npm/v/@codama/visitors.svg?style=flat&label=%40codama%2Fvisitors\n[npm-url]: https://www.npmjs.com/package/@codama/visitors\n\nThis package offers various visitors for Codama IDLs to traverse and manipulate their nodes.\n\n## Installation\n\n```sh\npnpm install @codama/visitors\n```\n\n> [!NOTE]\n> This package is included in the main [`codama`](../library) package. Meaning, you already have access to its content if you are installing Codama this way.\n>\n> ```sh\n> pnpm install codama\n> ```\n\n## Understanding visitors\n\nThis package includes and re-exports the [`@codama/visitors-core`](../visitors-core/README.md) package which provides the core interfaces and functions to create and compose visitors.\n\nTo get a better understanding of visitors and how they work, please refer to the [`@codama/visitors-core` documentation](../visitors-core/README.md).\n\nIn the rest of this documentation, we focus on the high-level visitors that are only available in this package. The main goal of these visitors is to provide a set of specific operations that can be applied to Codama IDLs — as opposed to the generic primitives provided by the core package.\n\nFor instance, this package offers visitors that unwrap link nodes, update instructions, add PDAs, set default values, and more.\n\nLet's go through all of them alphabetically.\n\n## Available visitors\n\n### `addPdasVisitor`\n\nThis visitor adds `PdaNodes` to the desired `ProgramNodes`. It accepts an object where the keys are the program names and the values are the `PdaNodes` to add within these programs.\n\n```ts\ncodama.update(\n    addPdasVisitor({\n        // Add a PDA to the 'token' program.\n        token: [\n            {\n                name: 'associatedToken',\n                seeds: [\n                    variablePdaSeedNode('mint', publicKeyTypeNode()),\n                    constantPdaSeedNode(\n                        publicKeyTypeNode(),\n                        publicKeyValueNode('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'),\n                    ),\n                    variablePdaSeedNode('owner', publicKeyTypeNode()),\n                ],\n            },\n        ],\n        // Add two PDAs to the 'counter' program.\n        counter: [\n            {\n                name: 'counter',\n                seeds: [variablePdaSeedNode('authority', publicKeyTypeNode())],\n            },\n            {\n                name: 'counterConfig',\n                seeds: [variablePdaSeedNode('counter', publicKeyTypeNode())],\n            },\n        ],\n    }),\n);\n```\n\n### `createSubInstructionsFromEnumArgsVisitor`\n\nThis visitor splits an instruction into multiple sub-instructions by using an enum argument such that each of its variants creates a different sub-instruction. It accepts an object where the keys are the instruction names and the values are the enum argument names that will be used to split the instruction.\n\n```ts\ncodama.update(\n    createSubInstructionsFromEnumArgsVisitor({\n        mint: 'mintArgs',\n        transfer: 'transferArgs',\n        burn: 'burnArgs',\n    }),\n);\n```\n\n### `deduplicateIdenticalDefinedTypesVisitor`\n\nThis visitor goes through the `DefinedTypeNodes` of all `ProgramNodes` inside the Codama IDL and removes any duplicates. A `DefinedTypeNode` is considered a duplicate if it has the same name and data structure as another `DefinedTypeNode`. This is useful when you have multiple programs that share the same types.\n\n```ts\ncodama.update(deduplicateIdenticalDefinedTypesVisitor());\n```\n\n### `fillDefaultPdaSeedValuesVisitor`\n\nThis visitor fills any missing `PdaSeedValueNodes` from `PdaValueNodes` using the provided `NodePath<InstructionNode>` such that:\n\n- If a `VariablePdaSeedNode` is of type `PublicKeyTypeNode` and the name of the seed matches the name of an account in the `InstructionNode`, then a new `PdaSeedValueNode` will be added with the matching account.\n- Otherwise, if a `VariablePdaSeedNode` is of any other type and the name of the seed matches the name of an argument in the `InstructionNode`, then a new `PdaSeedValueNode` will be added with the matching argument.\n- Otherwise, no `PdaSeedValueNode` will be added.\n\nIt also requires a [`LinkableDictionary`](../visitors-core/README.md#linkable-dictionary) to resolve any link nodes and an optional `strictMode` boolean to throw an error if seeds are still missing after the visitor has run.\n\nNote that this visitor is mainly used for internal purposes.\n\n```ts\ncodama.update(fillDefaultPdaSeedValuesVisitor(instructionPath, linkables, strictMode));\n```\n\n### `flattenInstructionDataArgumentsVisitor`\n\nThis visitor flattens any instruction arguments of type `StructTypeNode` such that their fields are no longer nested. This can be useful to simplify the data structure of an instruction.\n\n```ts\ncodama.update(flattenInstructionDataArgumentsVisitor());\n```\n\n### `flattenStructVisitor`\n\nThis visitor flattens any struct fields that are also structs such that their fields are no longer nested. It accepts an object such that the keys are the struct names and the values are the field names to flatten or `\"*\"` to flatten all struct fields.\n\n```ts\ncodama.update(\n    flattenStructVisitor({\n        counter: ['data', 'config'],\n        escrow: '*',\n    }),\n);\n```\n\n### `getDefinedTypeHistogramVisitor`\n\nThis visitor goes through all `DefinedTypeNodes` and outputs a histogram of how many times each type is used in the Codama IDL.\n\n```ts\nconst histogram = codama.accept(getDefinedTypeHistogramVisitor());\n```\n\nThe returned histogram is an object such that the keys are the names of visited `DefinedTypeNodes` and the values are objects with properties described below.\n\n```ts\nexport type DefinedTypeHistogram = {\n    [key: CamelCaseString | `${CamelCaseString}.${CamelCaseString}`]: {\n        // The number of times the type is used as a direct instruction argument.\n        directlyAsInstructionArgs: number;\n        // The number of times the type is used in account data.\n        inAccounts: number;\n        // The number of times the type is used in other defined types.\n        inDefinedTypes: number;\n        // The number of times the type is used in event payloads.\n        inEvents: number;\n        // The number of times the type is used in instruction arguments.\n        inInstructionArgs: number;\n        // The number of times the type is used in total.\n        total: number;\n    };\n};\n```\n\nThis histogram is used internally in other visitors to understand how types are used before applying transformations.\n\n### `setAccountDiscriminatorFromFieldVisitor`\n\nThis visitor helps set account discriminators based on a field in the account data and the value it should take. This is typically used on the very first field of the account data which usually refers to a discriminator value that helps distinguish between multiple accounts in a program.\n\n```ts\ncodama.update(\n    setAccountDiscriminatorFromFieldVisitor({\n        counter: { field: 'discriminator', value: k.enumValueNode('accountState', 'counter') },\n        escrow: { field: 'discriminator', value: k.enumValueNode('accountState', 'escrow') },\n        vault: { field: 'discriminator', value: k.enumValueNode('accountState', 'vault') },\n    }),\n);\n```\n\n### `setFixedAccountSizesVisitor`\n\nThis visitor uses the [`getByteSizeVisitor`](../visitors-core/README.md#getbytesizevisitor) to check the size of all `AccountNodes` and, if a fixed-size is identified, it sets the `size` property of the account to that value.\n\n```ts\ncodama.update(setFixedAccountSizesVisitor());\n```\n\n### `setInstructionAccountDefaultValuesVisitor`\n\nThis visitor helps set the default values of instruction accounts in bulk. It accepts an array of \"rule\" objects that must contain the default value to set and the name of the instruction account to set it on. The account name may also be a regular expression to match more complex patterns.\n\n```ts\ncodama.update(\n    setInstructionAccountDefaultValuesVisitor([\n        {\n            // Set this public key as default value to any account named 'counterProgram'.\n            account: 'counterProgram',\n            defaultValue: publicKeyValueNode('MyCounterProgram11111111111111111111111111'),\n        },\n        {\n            // Set this PDA as default value to any account named 'associatedToken' or 'ata'.\n            account: /^(associatedToken|ata)$/,\n            defaultValue: pdaValueNode('associatedToken'),\n        },\n    ]),\n);\n```\n\n### `setInstructionDiscriminatorsVisitor`\n\nThis visitor adds a new instruction argument to each of the provided instruction names. The new argument is added before any existing argument and marked as a discriminator of the instruction. This is useful if your Codama IDL is missing discriminators in the instruction data.\n\n```ts\ncodama.update(\n    setInstructionDiscriminatorsVisitor({\n        mint: { name: 'discriminator', type: numberTypeNode('u8'), value: numberValueNode(0) },\n        transfer: { name: 'discriminator', type: numberTypeNode('u8'), value: numberValueNode(1) },\n        burn: { name: 'discriminator', type: numberTypeNode('u8'), value: numberValueNode(2) },\n    }),\n);\n```\n\n### `setNumberWrappersVisitor`\n\nThis visitor helps wrap `NumberTypeNodes` matching a given name with a specific number wrapper.\n\n```ts\ncodama.update(\n    setNumberWrappersVisitor({\n        lamports: { kind: 'SolAmount' },\n        timestamp: { kind: 'DateTime' },\n        percent: { decimals: 2, kind: 'Amount', unit: '%' },\n    }),\n);\n```\n\n### `setStructDefaultValuesVisitor`\n\nThis visitor sets default values for all provided fields of a struct. It accepts an object where the keys are the struct names and the values are objects that map field names to their new default values.\n\n```ts\ncodama.update(\n    setStructDefaultValuesVisitor({\n        person: {\n            age: numberValueNode(42),\n            dateOfBirth: noneValueNode(),\n        },\n        counter: {\n            count: numberValueNode(0),\n        },\n    }),\n);\n```\n\n### `transformDefinedTypesIntoAccountsVisitor`\n\nThis visitor transforms `DefinedTypeNodes` matching the provided names into `AccountNodes` within the same `ProgramNode`.\n\n```ts\ncodama.update(transformDefinedTypesIntoAccountsVisitor(['counter', 'escrow']));\n```\n\n### `transformU8ArraysToBytesVisitor`\n\nThis visitor transforms any fixed-size array of `u8` numbers into a fixed-size `BytesTypeNode`.\n\n```ts\ncodama.update(transformU8ArraysToBytesVisitor());\n```\n\n### `unwrapDefinedTypesVisitor`\n\nThis visitor replaces any `DefinedTypeLinkNode` with the actual `DefinedTypeNode` it points to. By default, it unwraps all defined types, but you can provide an array of names to only unwrap specific types.\n\nNote that if multiple link nodes point to the same defined type, each link node will be replaced by a copy of the defined type.\n\n```ts\ncodama.update(unwrapDefinedTypesVisitor(['counter', 'escrow']));\n```\n\n### `unwrapInstructionArgsDefinedTypesVisitor`\n\nThis visitor replaces `DefinedTypeLinkNodes` used only once inside an instruction argument with the actual `DefinedTypeNodes` they refer to.\n\n```ts\ncodama.update(unwrapInstructionArgsDefinedTypesVisitor());\n```\n\n### `unwrapTupleEnumWithSingleStructVisitor`\n\nThis visitor transforms `EnumTupleVariantTypeNodes` with a single `StructTypeNode` item into `EnumStructVariantTypeNodes`. By default, it will unwrap all tuple variants matching that criteria, but you can provide an array of names to only unwrap specific variants.\n\n```ts\ncodama.update(unwrapTupleEnumWithSingleStructVisitor());\n```\n\n### `unwrapTypeDefinedLinksVisitor`\n\nThis visitor replaces any `DefinedTypeLinkNode` matching the provided `NodeSelectors` with the actual `DefinedTypeNode` it points to.\n\nContrary to the `unwrapDefinedTypesVisitor` though, it only replaces the requested `DefinedTypeLinkNodes` and does not remove the associated `DefinedTypeNode` from its `ProgramNode`.\n\n```ts\ncodama.update(unwrapTypeDefinedLinksVisitor(['[accountNode]counter.data', '[instructionNode]transfer.config']));\n```\n\n### `updateAccountsVisitor`\n\nThis visitor allows us to update various aspects of `AccountNodes` and/or delete them. It accepts an object where the keys are the account names and the values are the operations to apply to these accounts.\n\n```ts\ncodama.update(\n    updateAccountsVisitor({\n        vault: {\n            // Rename the 'vault' account to 'safe'.\n            name: 'safe',\n            // Rename the 'owner' field to 'authority'.\n            data: { owner: 'authority' },\n            // Create a new PDA node and link it to this account.\n            seeds: [variablePdaSeedNode('authority', publicKeyTypeNode())],\n        },\n        counter: {\n            // Delete the 'counter' account.\n            delete: true,\n        },\n    }),\n);\n```\n\n### `updateDefinedTypesVisitor`\n\nThis visitor allows us to update various aspects of `DefinedTypeNode` and/or delete them. It accepts an object where the keys are the defined type names and the values are the operations to apply to these types.\n\n```ts\ncodama.update(\n    updateDefinedTypesVisitor({\n        options: {\n            // Rename the 'options' type to 'configs'.\n            name: 'configs',\n            // Rename the 'sol' field to 'lamports'.\n            data: { sol: 'lamports' },\n        },\n        player: {\n            // Delete the 'player' type.\n            delete: true,\n        },\n    }),\n);\n```\n\n### `updateErrorsVisitor`\n\nThis visitor allows us to update various aspects of `ErrorNodes` and/or delete them. It accepts an object where the keys are the error names and the values are the operations to apply to these errors.\n\n```ts\ncodama.update(\n    updateErrorsVisitor({\n        invalidPda: {\n            // Rename the 'invalidPda' error to 'invalidProgramDerivedAddress'.\n            name: 'invalidProgramDerivedAddress',\n            // Change the error message.\n            message: 'The program-derived address is invalid.',\n            // Change the error code.\n            code: 123,\n        },\n        accountMismatch: {\n            // Delete the 'accountMismatch' error.\n            delete: true,\n        },\n    }),\n);\n```\n\n### `updateInstructionsVisitor`\n\nThis visitor allows us to update various aspects of `InstructionNodes` and/or delete them. It accepts an object where the keys are the instruction names and the values are the operations to apply to these instructions.\n\n```ts\ncodama.update(\n    updateInstructionsVisitor({\n        send: {\n            // Rename the 'send' instruction to 'transfer'.\n            name: 'transfer',\n            accounts: {\n                // Rename the 'owner' instruction account to 'authority'.\n                owner: { name: 'authority' },\n                // Set a default value for the 'associatedToken' instruction account.\n                associatedToken: { defaultValue: pdaValueNode('associatedToken') },\n                // Update the signer status of the 'payer' instruction account to `true`.\n                payer: { isSigner: true },\n                // Mark the 'mint' instruction account as optional.\n                mint: { isOptional: true },\n            },\n            arguments: {\n                // Set a default value for the 'amount' instruction argument to 1.\n                amount: { defaultValue: numberValueNode(1) },\n                // Rename the 'decimals' instruction argument to 'mintDecimals'.\n                decimals: { name: 'mintDecimals' },\n            },\n        },\n        burn: {\n            // Delete the 'burn' instruction.\n            delete: true,\n        },\n    }),\n);\n```\n\n### `updateProgramsVisitor`\n\nThis visitor allows us to update various aspects of `ProgramNodes` and/or delete them. It accepts an object where the keys are the program names and the values are the operations to apply to these programs.\n\n```ts\ncodama.update(\n    updateProgramsVisitor({\n        splToken: {\n            // Rename the 'splToken' program to 'token'.\n            name: 'token',\n            // Change the program version.\n            version: '3.0.0',\n            // Change the program's public key.\n            publicKey: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',\n        },\n        splAssociatedToken: {\n            // Delete the 'splAssociatedToken' program.\n            delete: true,\n        },\n    }),\n);\n```\n"
  },
  {
    "path": "packages/visitors/package.json",
    "content": "{\n    \"name\": \"@codama/visitors\",\n    \"version\": \"1.6.0\",\n    \"description\": \"All visitors for the Codama framework\",\n    \"exports\": {\n        \"types\": \"./dist/types/index.d.ts\",\n        \"react-native\": \"./dist/index.react-native.mjs\",\n        \"browser\": {\n            \"import\": \"./dist/index.browser.mjs\",\n            \"require\": \"./dist/index.browser.cjs\"\n        },\n        \"node\": {\n            \"import\": \"./dist/index.node.mjs\",\n            \"require\": \"./dist/index.node.cjs\"\n        }\n    },\n    \"browser\": {\n        \"./dist/index.node.cjs\": \"./dist/index.browser.cjs\",\n        \"./dist/index.node.mjs\": \"./dist/index.browser.mjs\"\n    },\n    \"main\": \"./dist/index.node.cjs\",\n    \"module\": \"./dist/index.node.mjs\",\n    \"react-native\": \"./dist/index.react-native.mjs\",\n    \"types\": \"./dist/types/index.d.ts\",\n    \"type\": \"commonjs\",\n    \"files\": [\n        \"./dist/types\",\n        \"./dist/index.*\"\n    ],\n    \"sideEffects\": false,\n    \"keywords\": [\n        \"solana\",\n        \"framework\",\n        \"standard\",\n        \"visitors\"\n    ],\n    \"scripts\": {\n        \"build\": \"rimraf dist && tsup && tsc -p ./tsconfig.declarations.json\",\n        \"dev\": \"vitest --project node\",\n        \"lint\": \"eslint . && prettier --check .\",\n        \"lint:fix\": \"eslint --fix . && prettier --write .\",\n        \"test\": \"pnpm test:types && pnpm test:treeshakability && pnpm test:unit\",\n        \"test:treeshakability\": \"for file in dist/index.*.mjs; do agadoo $file; done\",\n        \"test:types\": \"tsc --noEmit\",\n        \"test:unit\": \"vitest run\"\n    },\n    \"dependencies\": {\n        \"@codama/errors\": \"workspace:*\",\n        \"@codama/nodes\": \"workspace:*\",\n        \"@codama/visitors-core\": \"workspace:*\"\n    },\n    \"license\": \"MIT\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/codama-idl/codama\"\n    },\n    \"bugs\": {\n        \"url\": \"http://github.com/codama-idl/codama/issues\"\n    },\n    \"browserslist\": [\n        \"supports bigint and not dead\",\n        \"maintained node versions\"\n    ]\n}\n"
  },
  {
    "path": "packages/visitors/src/addPdasVisitor.ts",
    "content": "import { CODAMA_ERROR__VISITORS__CANNOT_ADD_DUPLICATED_PDA_NAMES, CodamaError } from '@codama/errors';\nimport { assertIsNode, camelCase, pdaNode, PdaNodeInput, programNode } from '@codama/nodes';\nimport { bottomUpTransformerVisitor } from '@codama/visitors-core';\n\nexport function addPdasVisitor(pdas: Record<string, Omit<PdaNodeInput, 'programId'>[]>) {\n    return bottomUpTransformerVisitor(\n        Object.entries(pdas).map(([uncasedProgramName, newPdas]) => {\n            const programName = camelCase(uncasedProgramName);\n            return {\n                select: `[programNode]${programName}`,\n                transform: node => {\n                    assertIsNode(node, 'programNode');\n                    const existingPdaNames = new Set(node.pdas.map(pda => pda.name));\n                    const newPdaNames = new Set(newPdas.map(pda => pda.name));\n                    const overlappingPdaNames = new Set([...existingPdaNames].filter(name => newPdaNames.has(name)));\n                    if (overlappingPdaNames.size > 0) {\n                        throw new CodamaError(CODAMA_ERROR__VISITORS__CANNOT_ADD_DUPLICATED_PDA_NAMES, {\n                            duplicatedPdaNames: [...overlappingPdaNames],\n                            program: node,\n                            programName: node.name,\n                        });\n                    }\n                    return programNode({\n                        ...node,\n                        pdas: [...node.pdas, ...newPdas.map(({ name, seeds, docs }) => pdaNode({ docs, name, seeds }))],\n                    });\n                },\n            };\n        }),\n    );\n}\n"
  },
  {
    "path": "packages/visitors/src/createSubInstructionsFromEnumArgsVisitor.ts",
    "content": "import { CODAMA_ERROR__VISITORS__INSTRUCTION_ENUM_ARGUMENT_NOT_FOUND, CodamaError } from '@codama/errors';\nimport {\n    assertIsNode,\n    camelCase,\n    EnumTypeNode,\n    instructionArgumentNode,\n    InstructionNode,\n    instructionNode,\n    isNode,\n    numberTypeNode,\n    numberValueNode,\n} from '@codama/nodes';\nimport {\n    BottomUpNodeTransformerWithSelector,\n    bottomUpTransformerVisitor,\n    LinkableDictionary,\n    pipe,\n    recordLinkablesOnFirstVisitVisitor,\n} from '@codama/visitors-core';\n\nimport { flattenInstructionArguments } from './flattenInstructionDataArgumentsVisitor';\n\nexport function createSubInstructionsFromEnumArgsVisitor(map: Record<string, string>) {\n    const linkables = new LinkableDictionary();\n\n    const visitor = bottomUpTransformerVisitor(\n        Object.entries(map).map(\n            ([selector, argNameInput]): BottomUpNodeTransformerWithSelector => ({\n                select: ['[instructionNode]', selector],\n                transform: (node, stack) => {\n                    assertIsNode(node, 'instructionNode');\n\n                    const argFields = node.arguments;\n                    const argName = camelCase(argNameInput);\n                    const argFieldIndex = argFields.findIndex(field => field.name === argName);\n                    const argField = argFieldIndex >= 0 ? argFields[argFieldIndex] : null;\n                    if (!argField) {\n                        throw new CodamaError(CODAMA_ERROR__VISITORS__INSTRUCTION_ENUM_ARGUMENT_NOT_FOUND, {\n                            argumentName: argName,\n                            instruction: node,\n                            instructionName: node.name,\n                        });\n                    }\n\n                    let argType: EnumTypeNode;\n                    if (isNode(argField.type, 'enumTypeNode')) {\n                        argType = argField.type;\n                    } else if (\n                        isNode(argField.type, 'definedTypeLinkNode') &&\n                        linkables.has([...stack.getPath(), argField.type])\n                    ) {\n                        const linkedType = linkables.get([...stack.getPath(), argField.type])?.type;\n                        assertIsNode(linkedType, 'enumTypeNode');\n                        argType = linkedType;\n                    } else {\n                        throw new CodamaError(CODAMA_ERROR__VISITORS__INSTRUCTION_ENUM_ARGUMENT_NOT_FOUND, {\n                            argumentName: argName,\n                            instruction: node,\n                            instructionName: node.name,\n                        });\n                    }\n\n                    const subInstructions = argType.variants.map((variant, index): InstructionNode => {\n                        const subName = camelCase(`${node.name} ${variant.name}`);\n                        const subFields = argFields.slice(0, argFieldIndex);\n                        subFields.push(\n                            instructionArgumentNode({\n                                defaultValue: numberValueNode(index),\n                                defaultValueStrategy: 'omitted',\n                                name: `${subName}Discriminator`,\n                                type: numberTypeNode('u8'),\n                            }),\n                        );\n                        if (isNode(variant, 'enumStructVariantTypeNode')) {\n                            subFields.push(\n                                instructionArgumentNode({\n                                    ...argField,\n                                    type: variant.struct,\n                                }),\n                            );\n                        } else if (isNode(variant, 'enumTupleVariantTypeNode')) {\n                            subFields.push(\n                                instructionArgumentNode({\n                                    ...argField,\n                                    type: variant.tuple,\n                                }),\n                            );\n                        }\n                        subFields.push(...argFields.slice(argFieldIndex + 1));\n\n                        return instructionNode({\n                            ...node,\n                            arguments: flattenInstructionArguments(subFields),\n                            name: subName,\n                        });\n                    });\n\n                    return instructionNode({\n                        ...node,\n                        subInstructions: [...(node.subInstructions ?? []), ...subInstructions],\n                    });\n                },\n            }),\n        ),\n    );\n\n    return pipe(visitor, v => recordLinkablesOnFirstVisitVisitor(v, linkables));\n}\n"
  },
  {
    "path": "packages/visitors/src/deduplicateIdenticalDefinedTypesVisitor.ts",
    "content": "import { assertIsNode, DefinedTypeNode, getAllPrograms, ProgramNode } from '@codama/nodes';\nimport {\n    deleteNodesVisitor,\n    getUniqueHashStringVisitor,\n    NodeSelector,\n    rootNodeVisitor,\n    visit,\n} from '@codama/visitors-core';\n\ntype DefinedTypeWithProgram = {\n    program: ProgramNode;\n    type: DefinedTypeNode;\n};\n\nexport function deduplicateIdenticalDefinedTypesVisitor() {\n    return rootNodeVisitor(root => {\n        const typeMap = new Map<string, DefinedTypeWithProgram[]>();\n\n        // Fill the type map with all defined types.\n        const allPrograms = getAllPrograms(root);\n        allPrograms.forEach(program => {\n            program.definedTypes.forEach(type => {\n                const typeWithProgram = { program, type };\n                const list = typeMap.get(type.name) ?? [];\n                typeMap.set(type.name, [...list, typeWithProgram]);\n            });\n        });\n\n        // Remove all types that are not duplicated.\n        typeMap.forEach((list, name) => {\n            if (list.length <= 1) {\n                typeMap.delete(name);\n            }\n        });\n\n        // Remove duplicates whose types are not equal.\n        const hashVisitor = getUniqueHashStringVisitor({ removeDocs: true });\n        typeMap.forEach((list, name) => {\n            const types = list.map(item => visit(item.type, hashVisitor));\n            const typesAreEqual = types.every((type, _, arr) => type === arr[0]);\n            if (!typesAreEqual) {\n                typeMap.delete(name);\n            }\n        });\n\n        // Get the selectors for all defined types that needs deleting.\n        // Thus, we must select all but the first duplicate of each list.\n        const deleteSelectors = Array.from(typeMap.values())\n            // Order lists by program index, get their tails and flatten.\n            .flatMap(list => {\n                const sortedList = list.sort((a, b) => allPrograms.indexOf(a.program) - allPrograms.indexOf(b.program));\n                const [, ...sortedListTail] = sortedList;\n                return sortedListTail;\n            })\n            // Get selectors from the defined types and their programs.\n            .map(({ program, type }): NodeSelector => `[programNode]${program.name}.[definedTypeNode]${type.name}`);\n\n        // Delete the identified nodes if any.\n        if (deleteSelectors.length > 0) {\n            const newRoot = visit(root, deleteNodesVisitor(deleteSelectors));\n            assertIsNode(newRoot, 'rootNode');\n            return newRoot;\n        }\n\n        return root;\n    });\n}\n"
  },
  {
    "path": "packages/visitors/src/fillDefaultPdaSeedValuesVisitor.ts",
    "content": "import { CODAMA_ERROR__VISITORS__INVALID_PDA_SEED_VALUES, CodamaError } from '@codama/errors';\nimport {\n    accountValueNode,\n    argumentValueNode,\n    assertIsNode,\n    getAllInstructionArguments,\n    INSTRUCTION_INPUT_VALUE_NODES,\n    InstructionInputValueNode,\n    InstructionNode,\n    isNode,\n    isNodeFilter,\n    PdaNode,\n    PdaSeedValueNode,\n    pdaSeedValueNode,\n    pdaValueNode,\n} from '@codama/nodes';\nimport {\n    extendVisitor,\n    getLastNodeFromPath,\n    identityVisitor,\n    LinkableDictionary,\n    NodePath,\n    pipe,\n    Visitor,\n} from '@codama/visitors-core';\n\n/**\n * Fills in default values for variable PDA seeds that are not explicitly provided.\n * Namely, public key seeds are filled with an accountValueNode using the seed name\n * and other types of seeds are filled with an argumentValueNode using the seed name.\n *\n * An instruction and linkable dictionary are required to determine which seeds are\n * valids and to find the pdaLinkNode for the seed respectively. Any invalid default\n * seed won't be filled in.\n *\n * Strict mode goes one step further and will throw an error if the final array of\n * pdaSeedValueNodes contains invalid seeds or if there aren't enough variable seeds.\n */\nexport function fillDefaultPdaSeedValuesVisitor(\n    instructionPath: NodePath<InstructionNode>,\n    linkables: LinkableDictionary,\n    strictMode: boolean = false,\n) {\n    const instruction = getLastNodeFromPath(instructionPath);\n    return pipe(identityVisitor({ keys: INSTRUCTION_INPUT_VALUE_NODES }), v =>\n        extendVisitor(v, {\n            visitPdaValue(node, { next }) {\n                const visitedNode = next(node);\n                assertIsNode(visitedNode, 'pdaValueNode');\n                const foundPda = isNode(visitedNode.pda, 'pdaNode')\n                    ? visitedNode.pda\n                    : linkables.get([...instructionPath, visitedNode.pda]);\n                if (!foundPda) return visitedNode;\n                const seeds = addDefaultSeedValuesFromPdaWhenMissing(instruction, foundPda, visitedNode.seeds);\n                if (strictMode && !allSeedsAreValid(instruction, foundPda, seeds)) {\n                    throw new CodamaError(CODAMA_ERROR__VISITORS__INVALID_PDA_SEED_VALUES, {\n                        instruction,\n                        instructionName: instruction.name,\n                        pda: foundPda,\n                        pdaName: foundPda.name,\n                    });\n                }\n                return pdaValueNode(visitedNode.pda, seeds);\n            },\n        }),\n    ) as Visitor<InstructionInputValueNode, InstructionInputValueNode['kind']>;\n}\n\nfunction addDefaultSeedValuesFromPdaWhenMissing(\n    instruction: InstructionNode,\n    pda: PdaNode,\n    existingSeeds: PdaSeedValueNode[],\n): PdaSeedValueNode[] {\n    const existingSeedNames = new Set(existingSeeds.map(seed => seed.name));\n    const defaultSeeds = getDefaultSeedValuesFromPda(instruction, pda).filter(\n        seed => !existingSeedNames.has(seed.name),\n    );\n    return [...existingSeeds, ...defaultSeeds];\n}\n\nfunction getDefaultSeedValuesFromPda(instruction: InstructionNode, pda: PdaNode): PdaSeedValueNode[] {\n    return pda.seeds.flatMap((seed): PdaSeedValueNode[] => {\n        if (!isNode(seed, 'variablePdaSeedNode')) return [];\n\n        const hasMatchingAccount = instruction.accounts.some(a => a.name === seed.name);\n        if (isNode(seed.type, 'publicKeyTypeNode') && hasMatchingAccount) {\n            return [pdaSeedValueNode(seed.name, accountValueNode(seed.name))];\n        }\n\n        const hasMatchingArgument = getAllInstructionArguments(instruction).some(a => a.name === seed.name);\n        if (hasMatchingArgument) {\n            return [pdaSeedValueNode(seed.name, argumentValueNode(seed.name))];\n        }\n\n        return [];\n    });\n}\n\nfunction allSeedsAreValid(instruction: InstructionNode, foundPda: PdaNode, seeds: PdaSeedValueNode[]) {\n    const hasAllVariableSeeds = foundPda.seeds.filter(isNodeFilter('variablePdaSeedNode')).length === seeds.length;\n    const allAccountsName = instruction.accounts.map(a => a.name);\n    const allArgumentsName = getAllInstructionArguments(instruction).map(a => a.name);\n    const validSeeds = seeds.every(seed => {\n        if (isNode(seed.value, 'accountValueNode')) {\n            return allAccountsName.includes(seed.value.name);\n        }\n        if (isNode(seed.value, 'argumentValueNode')) {\n            return allArgumentsName.includes(seed.value.name);\n        }\n        return true;\n    });\n\n    return hasAllVariableSeeds && validSeeds;\n}\n"
  },
  {
    "path": "packages/visitors/src/flattenInstructionDataArgumentsVisitor.ts",
    "content": "import { CODAMA_ERROR__VISITORS__CANNOT_FLATTEN_STRUCT_WITH_CONFLICTING_ATTRIBUTES, CodamaError } from '@codama/errors';\nimport {\n    assertIsNode,\n    camelCase,\n    InstructionArgumentNode,\n    instructionArgumentNode,\n    instructionNode,\n    isNode,\n} from '@codama/nodes';\nimport { bottomUpTransformerVisitor } from '@codama/visitors-core';\n\nexport function flattenInstructionDataArgumentsVisitor() {\n    return bottomUpTransformerVisitor([\n        {\n            select: '[instructionNode]',\n            transform: instruction => {\n                assertIsNode(instruction, 'instructionNode');\n                return instructionNode({\n                    ...instruction,\n                    arguments: flattenInstructionArguments(instruction.arguments),\n                });\n            },\n        },\n    ]);\n}\n\nexport type FlattenInstructionArgumentsConfig = string[] | '*';\n\nexport const flattenInstructionArguments = (\n    nodes: InstructionArgumentNode[],\n    options: FlattenInstructionArgumentsConfig = '*',\n): InstructionArgumentNode[] => {\n    const camelCaseOptions = options === '*' ? options : options.map(camelCase);\n    const shouldInline = (node: InstructionArgumentNode): boolean =>\n        options === '*' || camelCaseOptions.includes(camelCase(node.name));\n    const inlinedArguments = nodes.flatMap(node => {\n        if (isNode(node.type, 'structTypeNode') && shouldInline(node)) {\n            return node.type.fields.map(field => instructionArgumentNode({ ...field }));\n        }\n        return node;\n    });\n\n    const inlinedFieldsNames = inlinedArguments.map(arg => arg.name);\n    const duplicates = inlinedFieldsNames.filter((e, i, a) => a.indexOf(e) !== i);\n    const uniqueDuplicates = [...new Set(duplicates)];\n    const hasConflictingNames = uniqueDuplicates.length > 0;\n\n    if (hasConflictingNames) {\n        throw new CodamaError(CODAMA_ERROR__VISITORS__CANNOT_FLATTEN_STRUCT_WITH_CONFLICTING_ATTRIBUTES, {\n            conflictingAttributes: uniqueDuplicates,\n        });\n    }\n\n    return hasConflictingNames ? nodes : inlinedArguments;\n};\n"
  },
  {
    "path": "packages/visitors/src/flattenStructVisitor.ts",
    "content": "import { CODAMA_ERROR__VISITORS__CANNOT_FLATTEN_STRUCT_WITH_CONFLICTING_ATTRIBUTES, CodamaError } from '@codama/errors';\nimport {\n    assertIsNode,\n    camelCase,\n    isNode,\n    Node,\n    StructFieldTypeNode,\n    StructTypeNode,\n    structTypeNode,\n} from '@codama/nodes';\nimport { BottomUpNodeTransformerWithSelector, bottomUpTransformerVisitor } from '@codama/visitors-core';\n\nexport type FlattenStructOptions = string[] | '*';\n\nexport function flattenStructVisitor(map: Record<string, FlattenStructOptions>) {\n    return bottomUpTransformerVisitor(\n        Object.entries(map).map(\n            ([stack, options]): BottomUpNodeTransformerWithSelector => ({\n                select: `${stack}.[structTypeNode]`,\n                transform: node => flattenStruct(node, options),\n            }),\n        ),\n    );\n}\n\nexport const flattenStruct = (node: Node, options: FlattenStructOptions = '*'): StructTypeNode => {\n    assertIsNode(node, 'structTypeNode');\n    const camelCaseOptions = options === '*' ? options : options.map(camelCase);\n    const shouldInline = (field: StructFieldTypeNode): boolean =>\n        options === '*' || camelCaseOptions.includes(camelCase(field.name));\n    const inlinedFields = node.fields.flatMap(field => {\n        if (isNode(field.type, 'structTypeNode') && shouldInline(field)) {\n            return field.type.fields;\n        }\n        return [field];\n    });\n\n    const inlinedFieldsNames = inlinedFields.map(arg => arg.name);\n    const duplicates = inlinedFieldsNames.filter((e, i, a) => a.indexOf(e) !== i);\n    const uniqueDuplicates = [...new Set(duplicates)];\n    const hasConflictingNames = uniqueDuplicates.length > 0;\n\n    if (hasConflictingNames) {\n        throw new CodamaError(CODAMA_ERROR__VISITORS__CANNOT_FLATTEN_STRUCT_WITH_CONFLICTING_ATTRIBUTES, {\n            conflictingAttributes: uniqueDuplicates,\n        });\n    }\n\n    return hasConflictingNames ? node : structTypeNode(inlinedFields);\n};\n"
  },
  {
    "path": "packages/visitors/src/getDefinedTypeHistogramVisitor.ts",
    "content": "import { CamelCaseString } from '@codama/nodes';\nimport {\n    extendVisitor,\n    findProgramNodeFromPath,\n    interceptVisitor,\n    mergeVisitor,\n    NodeStack,\n    pipe,\n    recordNodeStackVisitor,\n    visit,\n    Visitor,\n} from '@codama/visitors-core';\n\ntype DefinedTypeHistogramKey = CamelCaseString | `${CamelCaseString}.${CamelCaseString}`;\n\nexport type DefinedTypeHistogram = {\n    [key: DefinedTypeHistogramKey]: {\n        directlyAsInstructionArgs: number;\n        inAccounts: number;\n        inDefinedTypes: number;\n        inEvents: number;\n        inInstructionArgs: number;\n        total: number;\n    };\n};\n\nfunction mergeHistograms(histograms: DefinedTypeHistogram[]): DefinedTypeHistogram {\n    const result: DefinedTypeHistogram = {};\n\n    histograms.forEach(histogram => {\n        Object.keys(histogram).forEach(key => {\n            const mainCaseKey = key as CamelCaseString;\n            if (result[mainCaseKey] === undefined) {\n                result[mainCaseKey] = histogram[mainCaseKey];\n            } else {\n                result[mainCaseKey].total += histogram[mainCaseKey].total;\n                result[mainCaseKey].inAccounts += histogram[mainCaseKey].inAccounts;\n                result[mainCaseKey].inDefinedTypes += histogram[mainCaseKey].inDefinedTypes;\n                result[mainCaseKey].inEvents += histogram[mainCaseKey].inEvents;\n                result[mainCaseKey].inInstructionArgs += histogram[mainCaseKey].inInstructionArgs;\n                result[mainCaseKey].directlyAsInstructionArgs += histogram[mainCaseKey].directlyAsInstructionArgs;\n            }\n        });\n    });\n\n    return result;\n}\n\nexport function getDefinedTypeHistogramVisitor(): Visitor<DefinedTypeHistogram> {\n    const stack = new NodeStack();\n    let mode: 'account' | 'definedType' | 'event' | 'instruction' | null = null;\n    let stackLevel = 0;\n\n    return pipe(\n        mergeVisitor(\n            () => ({}) as DefinedTypeHistogram,\n            (_, histograms) => mergeHistograms(histograms),\n        ),\n        v =>\n            interceptVisitor(v, (node, next) => {\n                stackLevel += 1;\n                const newNode = next(node);\n                stackLevel -= 1;\n                return newNode;\n            }),\n        v =>\n            extendVisitor(v, {\n                visitAccount(node, { self }) {\n                    mode = 'account';\n                    stackLevel = 0;\n                    const histogram = visit(node.data, self);\n                    mode = null;\n                    return histogram;\n                },\n\n                visitDefinedType(node, { self }) {\n                    mode = 'definedType';\n                    stackLevel = 0;\n                    const histogram = visit(node.type, self);\n                    mode = null;\n                    return histogram;\n                },\n\n                visitDefinedTypeLink(node) {\n                    const program = findProgramNodeFromPath(stack.getPath());\n                    const key = program ? `${program.name}.${node.name}` : node.name;\n                    return {\n                        [key]: {\n                            directlyAsInstructionArgs: Number(mode === 'instruction' && stackLevel <= 1),\n                            inAccounts: Number(mode === 'account'),\n                            inDefinedTypes: Number(mode === 'definedType'),\n                            inEvents: Number(mode === 'event'),\n                            inInstructionArgs: Number(mode === 'instruction'),\n                            total: 1,\n                        },\n                    };\n                },\n\n                visitEvent(node, { self }) {\n                    mode = 'event';\n                    stackLevel = 0;\n                    const histogram = visit(node.data, self);\n                    mode = null;\n                    return histogram;\n                },\n\n                visitInstruction(node, { self }) {\n                    mode = 'instruction';\n                    stackLevel = 0;\n                    const dataHistograms = node.arguments.map(arg => visit(arg, self));\n                    const extraHistograms = (node.extraArguments ?? []).map(arg => visit(arg, self));\n                    mode = null;\n                    const subHistograms = (node.subInstructions ?? []).map(ix => visit(ix, self));\n                    return mergeHistograms([...dataHistograms, ...extraHistograms, ...subHistograms]);\n                },\n            }),\n        v => recordNodeStackVisitor(v, stack),\n    );\n}\n"
  },
  {
    "path": "packages/visitors/src/index.ts",
    "content": "export * from '@codama/visitors-core';\n\nexport * from './addPdasVisitor';\nexport * from './createSubInstructionsFromEnumArgsVisitor';\nexport * from './deduplicateIdenticalDefinedTypesVisitor';\nexport * from './fillDefaultPdaSeedValuesVisitor';\nexport * from './flattenInstructionDataArgumentsVisitor';\nexport * from './flattenStructVisitor';\nexport * from './getDefinedTypeHistogramVisitor';\nexport * from './setAccountDiscriminatorFromFieldVisitor';\nexport * from './setFixedAccountSizesVisitor';\nexport * from './setInstructionAccountDefaultValuesVisitor';\nexport * from './setInstructionDiscriminatorsVisitor';\nexport * from './setNumberWrappersVisitor';\nexport * from './setStructDefaultValuesVisitor';\nexport * from './transformDefinedTypesIntoAccountsVisitor';\nexport * from './transformU8ArraysToBytesVisitor';\nexport * from './unwrapDefinedTypesVisitor';\nexport * from './unwrapInstructionArgsDefinedTypesVisitor';\nexport * from './unwrapTupleEnumWithSingleStructVisitor';\nexport * from './unwrapTypeDefinedLinksVisitor';\nexport * from './updateAccountsVisitor';\nexport * from './updateDefinedTypesVisitor';\nexport * from './updateErrorsVisitor';\nexport * from './updateInstructionsVisitor';\nexport * from './updateProgramsVisitor';\n"
  },
  {
    "path": "packages/visitors/src/renameHelpers.ts",
    "content": "import {\n    enumEmptyVariantTypeNode,\n    enumStructVariantTypeNode,\n    enumTupleVariantTypeNode,\n    EnumTypeNode,\n    enumTypeNode,\n    EnumVariantTypeNode,\n    isNode,\n    structFieldTypeNode,\n    StructTypeNode,\n    structTypeNode,\n} from '@codama/nodes';\n\nexport function renameStructNode(node: StructTypeNode, map: Record<string, string>): StructTypeNode {\n    return structTypeNode(\n        node.fields.map(field => (map[field.name] ? structFieldTypeNode({ ...field, name: map[field.name] }) : field)),\n    );\n}\n\nexport function renameEnumNode(node: EnumTypeNode, map: Record<string, string>): EnumTypeNode {\n    return enumTypeNode(\n        node.variants.map(variant => (map[variant.name] ? renameEnumVariant(variant, map[variant.name]) : variant)),\n        { ...node },\n    );\n}\n\nfunction renameEnumVariant(variant: EnumVariantTypeNode, newName: string) {\n    if (isNode(variant, 'enumStructVariantTypeNode')) {\n        return enumStructVariantTypeNode(newName, variant.struct);\n    }\n    if (isNode(variant, 'enumTupleVariantTypeNode')) {\n        return enumTupleVariantTypeNode(newName, variant.tuple);\n    }\n    return enumEmptyVariantTypeNode(newName);\n}\n"
  },
  {
    "path": "packages/visitors/src/setAccountDiscriminatorFromFieldVisitor.ts",
    "content": "import { CODAMA_ERROR__VISITORS__ACCOUNT_FIELD_NOT_FOUND, CodamaError } from '@codama/errors';\nimport {\n    accountNode,\n    assertIsNode,\n    fieldDiscriminatorNode,\n    resolveNestedTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n    transformNestedTypeNode,\n    ValueNode,\n} from '@codama/nodes';\nimport { BottomUpNodeTransformerWithSelector, bottomUpTransformerVisitor } from '@codama/visitors-core';\n\nexport function setAccountDiscriminatorFromFieldVisitor(\n    map: Record<string, { field: string; offset?: number; value: ValueNode }>,\n) {\n    return bottomUpTransformerVisitor(\n        Object.entries(map).map(\n            ([selector, { field, value, offset }]): BottomUpNodeTransformerWithSelector => ({\n                select: ['[accountNode]', selector],\n                transform: node => {\n                    assertIsNode(node, 'accountNode');\n\n                    const accountData = resolveNestedTypeNode(node.data);\n                    const fieldIndex = accountData.fields.findIndex(f => f.name === field);\n                    if (fieldIndex < 0) {\n                        throw new CodamaError(CODAMA_ERROR__VISITORS__ACCOUNT_FIELD_NOT_FOUND, {\n                            account: node,\n                            missingField: field,\n                            name: node.name,\n                        });\n                    }\n\n                    const fieldNode = accountData.fields[fieldIndex];\n                    return accountNode({\n                        ...node,\n                        data: transformNestedTypeNode(node.data, () =>\n                            structTypeNode([\n                                ...accountData.fields.slice(0, fieldIndex),\n                                structFieldTypeNode({\n                                    ...fieldNode,\n                                    defaultValue: value,\n                                    defaultValueStrategy: 'omitted',\n                                }),\n                                ...accountData.fields.slice(fieldIndex + 1),\n                            ]),\n                        ),\n                        discriminators: [fieldDiscriminatorNode(field, offset), ...(node.discriminators ?? [])],\n                    });\n                },\n            }),\n        ),\n    );\n}\n"
  },
  {
    "path": "packages/visitors/src/setFixedAccountSizesVisitor.ts",
    "content": "import { accountNode, assertIsNode } from '@codama/nodes';\nimport {\n    getByteSizeVisitor,\n    getLastNodeFromPath,\n    isNodePath,\n    LinkableDictionary,\n    pipe,\n    recordLinkablesOnFirstVisitVisitor,\n    topDownTransformerVisitor,\n    visit,\n} from '@codama/visitors-core';\n\nexport function setFixedAccountSizesVisitor() {\n    const linkables = new LinkableDictionary();\n\n    const visitor = topDownTransformerVisitor(\n        [\n            {\n                select: path => isNodePath(path, 'accountNode') && getLastNodeFromPath(path).size === undefined,\n                transform: (node, stack) => {\n                    assertIsNode(node, 'accountNode');\n                    const size = visit(node.data, getByteSizeVisitor(linkables, { stack }));\n                    if (size === null) return node;\n                    return accountNode({ ...node, size }) as typeof node;\n                },\n            },\n        ],\n        { keys: ['rootNode', 'programNode', 'accountNode'] },\n    );\n\n    return pipe(visitor, v => recordLinkablesOnFirstVisitVisitor(v, linkables));\n}\n"
  },
  {
    "path": "packages/visitors/src/setInstructionAccountDefaultValuesVisitor.ts",
    "content": "import {\n    camelCase,\n    identityValueNode,\n    InstructionAccountNode,\n    InstructionInputValueNode,\n    InstructionNode,\n    instructionNode,\n    payerValueNode,\n    programIdValueNode,\n    publicKeyValueNode,\n} from '@codama/nodes';\nimport {\n    extendVisitor,\n    LinkableDictionary,\n    NodeStack,\n    nonNullableIdentityVisitor,\n    pipe,\n    recordLinkablesOnFirstVisitVisitor,\n    recordNodeStackVisitor,\n    visit,\n} from '@codama/visitors-core';\n\nimport { fillDefaultPdaSeedValuesVisitor } from './fillDefaultPdaSeedValuesVisitor';\n\nexport type InstructionAccountDefaultRule = {\n    /** The name of the instruction account or a pattern to match on it. */\n    account: RegExp | string;\n    /** The default value to assign to it. */\n    defaultValue: InstructionInputValueNode;\n    /** @defaultValue `false`. */\n    ignoreIfOptional?: boolean;\n    /** @defaultValue Defaults to searching accounts on all instructions. */\n    instruction?: string;\n};\n\nexport const getCommonInstructionAccountDefaultRules = (): InstructionAccountDefaultRule[] => [\n    {\n        account: /^(payer|feePayer)$/,\n        defaultValue: payerValueNode(),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(authority)$/,\n        defaultValue: identityValueNode(),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(programId)$/,\n        defaultValue: programIdValueNode(),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(systemProgram|splSystemProgram)$/,\n        defaultValue: publicKeyValueNode('11111111111111111111111111111111', 'splSystem'),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(tokenProgram|splTokenProgram)$/,\n        defaultValue: publicKeyValueNode('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA', 'splToken'),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(ataProgram|splAtaProgram)$/,\n        defaultValue: publicKeyValueNode('ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL', 'splAssociatedToken'),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(tokenMetadataProgram|mplTokenMetadataProgram)$/,\n        defaultValue: publicKeyValueNode('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s', 'mplTokenMetadata'),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(tokenAuth|mplTokenAuth|authorization|mplAuthorization|auth|mplAuth)RulesProgram$/,\n        defaultValue: publicKeyValueNode('auth9SigNpDKz4sJJ1DfCTuZrZNSAgh9sFD3rboVmgg', 'mplTokenAuthRules'),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(candyMachineProgram|mplCandyMachineProgram)$/,\n        defaultValue: publicKeyValueNode('CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR', 'mplCandyMachine'),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(candyGuardProgram|mplCandyGuardProgram)$/,\n        defaultValue: publicKeyValueNode('Guard1JwRhJkVH6XZhzoYxeBVQe872VH6QggF4BWmS9g', 'mplCandyGuard'),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(clockSysvar|sysvarClock)$/,\n        defaultValue: publicKeyValueNode('SysvarC1ock11111111111111111111111111111111'),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(epochScheduleSysvar|sysvarEpochSchedule)$/,\n        defaultValue: publicKeyValueNode('SysvarEpochSchedu1e111111111111111111111111'),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(instructions?Sysvar|sysvarInstructions?)(Account)?$/,\n        defaultValue: publicKeyValueNode('Sysvar1nstructions1111111111111111111111111'),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(recentBlockhashesSysvar|sysvarRecentBlockhashes)$/,\n        defaultValue: publicKeyValueNode('SysvarRecentB1ockHashes11111111111111111111'),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(rent|rentSysvar|sysvarRent)$/,\n        defaultValue: publicKeyValueNode('SysvarRent111111111111111111111111111111111'),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(rewardsSysvar|sysvarRewards)$/,\n        defaultValue: publicKeyValueNode('SysvarRewards111111111111111111111111111111'),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(slotHashesSysvar|sysvarSlotHashes)$/,\n        defaultValue: publicKeyValueNode('SysvarS1otHashes111111111111111111111111111'),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(slotHistorySysvar|sysvarSlotHistory)$/,\n        defaultValue: publicKeyValueNode('SysvarS1otHistory11111111111111111111111111'),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(stakeHistorySysvar|sysvarStakeHistory)$/,\n        defaultValue: publicKeyValueNode('SysvarStakeHistory1111111111111111111111111'),\n        ignoreIfOptional: true,\n    },\n    {\n        account: /^(mplCoreProgram)$/,\n        defaultValue: publicKeyValueNode('CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d', 'mplCore'),\n        ignoreIfOptional: true,\n    },\n];\n\nexport function setInstructionAccountDefaultValuesVisitor(rules: InstructionAccountDefaultRule[]) {\n    const linkables = new LinkableDictionary();\n    const stack = new NodeStack();\n\n    // Place the rules with instructions first.\n    const sortedRules = rules.sort((a, b) => {\n        const ia = 'instruction' in a;\n        const ib = 'instruction' in b;\n        if ((ia && ib) || (!a && !ib)) return 0;\n        return ia ? -1 : 1;\n    });\n\n    function matchRule(\n        instruction: InstructionNode,\n        account: InstructionAccountNode,\n    ): InstructionAccountDefaultRule | undefined {\n        return sortedRules.find(rule => {\n            if ('instruction' in rule && rule.instruction && camelCase(rule.instruction) !== instruction.name) {\n                return false;\n            }\n            return typeof rule.account === 'string'\n                ? camelCase(rule.account) === account.name\n                : rule.account.test(account.name);\n        });\n    }\n\n    return pipe(\n        nonNullableIdentityVisitor({ keys: ['rootNode', 'programNode', 'instructionNode'] }),\n        v =>\n            extendVisitor(v, {\n                visitInstruction(node) {\n                    const instructionPath = stack.getPath('instructionNode');\n                    const instructionAccounts = node.accounts.map((account): InstructionAccountNode => {\n                        const rule = matchRule(node, account);\n                        if (!rule) return account;\n\n                        if ((rule.ignoreIfOptional ?? false) && (account.isOptional || !!account.defaultValue)) {\n                            return account;\n                        }\n\n                        try {\n                            return {\n                                ...account,\n                                defaultValue: visit(\n                                    rule.defaultValue,\n                                    fillDefaultPdaSeedValuesVisitor(instructionPath, linkables, true),\n                                ),\n                            };\n                        } catch {\n                            return account;\n                        }\n                    });\n\n                    return instructionNode({\n                        ...node,\n                        accounts: instructionAccounts,\n                    });\n                },\n            }),\n        v => recordNodeStackVisitor(v, stack),\n        v => recordLinkablesOnFirstVisitVisitor(v, linkables),\n    );\n}\n"
  },
  {
    "path": "packages/visitors/src/setInstructionDiscriminatorsVisitor.ts",
    "content": "import {\n    assertIsNode,\n    fieldDiscriminatorNode,\n    instructionArgumentNode,\n    instructionNode,\n    numberTypeNode,\n    TypeNode,\n    ValueNode,\n} from '@codama/nodes';\nimport { BottomUpNodeTransformerWithSelector, bottomUpTransformerVisitor } from '@codama/visitors-core';\n\ntype Discriminator = {\n    /** @defaultValue `[]` */\n    docs?: string[];\n    /** @defaultValue `\"discriminator\"` */\n    name?: string;\n    /** @defaultValue `\"omitted\"` */\n    strategy?: 'omitted' | 'optional';\n    /** @defaultValue `numberTypeNode('u8')` */\n    type?: TypeNode;\n    value: ValueNode;\n};\n\nexport function setInstructionDiscriminatorsVisitor(map: Record<string, Discriminator>) {\n    return bottomUpTransformerVisitor(\n        Object.entries(map).map(\n            ([selector, discriminator]): BottomUpNodeTransformerWithSelector => ({\n                select: ['[instructionNode]', selector],\n                transform: node => {\n                    assertIsNode(node, 'instructionNode');\n                    const discriminatorArgument = instructionArgumentNode({\n                        defaultValue: discriminator.value,\n                        defaultValueStrategy: discriminator.strategy ?? 'omitted',\n                        docs: discriminator.docs ?? [],\n                        name: discriminator.name ?? 'discriminator',\n                        type: discriminator.type ?? numberTypeNode('u8'),\n                    });\n\n                    return instructionNode({\n                        ...node,\n                        arguments: [discriminatorArgument, ...node.arguments],\n                        discriminators: [\n                            fieldDiscriminatorNode(discriminator.name ?? 'discriminator'),\n                            ...(node.discriminators ?? []),\n                        ],\n                    });\n                },\n            }),\n        ),\n    );\n}\n"
  },
  {
    "path": "packages/visitors/src/setNumberWrappersVisitor.ts",
    "content": "import { CODAMA_ERROR__VISITORS__INVALID_NUMBER_WRAPPER, CodamaError } from '@codama/errors';\nimport { amountTypeNode, assertIsNestedTypeNode, dateTimeTypeNode, solAmountTypeNode } from '@codama/nodes';\nimport { BottomUpNodeTransformerWithSelector, bottomUpTransformerVisitor } from '@codama/visitors-core';\n\nexport type NumberWrapper =\n    | { decimals: number; kind: 'Amount'; unit?: string }\n    | { kind: 'DateTime' }\n    | { kind: 'SolAmount' };\n\ntype NumberWrapperMap = Record<string, NumberWrapper>;\n\nexport function setNumberWrappersVisitor(map: NumberWrapperMap) {\n    return bottomUpTransformerVisitor(\n        Object.entries(map).map(\n            ([selectorStack, wrapper]): BottomUpNodeTransformerWithSelector => ({\n                select: `${selectorStack}.[numberTypeNode]`,\n                transform: node => {\n                    assertIsNestedTypeNode(node, 'numberTypeNode');\n                    switch (wrapper.kind) {\n                        case 'DateTime':\n                            return dateTimeTypeNode(node);\n                        case 'SolAmount':\n                            return solAmountTypeNode(node);\n                        case 'Amount':\n                            return amountTypeNode(node, wrapper.decimals, wrapper.unit);\n                        default:\n                            throw new CodamaError(CODAMA_ERROR__VISITORS__INVALID_NUMBER_WRAPPER, { wrapper });\n                    }\n                },\n            }),\n        ),\n    );\n}\n"
  },
  {
    "path": "packages/visitors/src/setStructDefaultValuesVisitor.ts",
    "content": "import {\n    assertIsNode,\n    camelCase,\n    InstructionArgumentNode,\n    instructionArgumentNode,\n    instructionNode,\n    StructFieldTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n    ValueNode,\n} from '@codama/nodes';\nimport { BottomUpNodeTransformerWithSelector, bottomUpTransformerVisitor } from '@codama/visitors-core';\n\ntype StructDefaultValueMap = Record<string, Record<string, StructDefaultValue>>;\ntype StructDefaultValue = ValueNode | { strategy?: 'omitted' | 'optional'; value: ValueNode } | null;\n\nexport function setStructDefaultValuesVisitor(map: StructDefaultValueMap) {\n    return bottomUpTransformerVisitor(\n        Object.entries(map).flatMap(([stack, defaultValues]): BottomUpNodeTransformerWithSelector[] => {\n            const camelCasedDefaultValues = Object.fromEntries(\n                Object.entries(defaultValues).map(([key, value]) => [camelCase(key), value]),\n            );\n\n            return [\n                {\n                    select: `${stack}.[structTypeNode]`,\n                    transform: node => {\n                        assertIsNode(node, 'structTypeNode');\n                        const fields = node.fields.map((field): StructFieldTypeNode => {\n                            const defaultValue = camelCasedDefaultValues[field.name];\n                            if (defaultValue === undefined) return field;\n                            if (defaultValue === null) {\n                                return structFieldTypeNode({\n                                    ...field,\n                                    defaultValue: undefined,\n                                    defaultValueStrategy: undefined,\n                                });\n                            }\n                            return structFieldTypeNode({\n                                ...field,\n                                defaultValue: 'kind' in defaultValue ? defaultValue : defaultValue.value,\n                                defaultValueStrategy: 'kind' in defaultValue ? undefined : defaultValue.strategy,\n                            });\n                        });\n                        return structTypeNode(fields);\n                    },\n                },\n                {\n                    select: ['[instructionNode]', stack],\n                    transform: node => {\n                        assertIsNode(node, 'instructionNode');\n                        const transformArguments = (arg: InstructionArgumentNode): InstructionArgumentNode => {\n                            const defaultValue = camelCasedDefaultValues[arg.name];\n                            if (defaultValue === undefined) return arg;\n                            if (defaultValue === null) {\n                                return instructionArgumentNode({\n                                    ...arg,\n                                    defaultValue: undefined,\n                                    defaultValueStrategy: undefined,\n                                });\n                            }\n                            return instructionArgumentNode({\n                                ...arg,\n                                defaultValue: 'kind' in defaultValue ? defaultValue : defaultValue.value,\n                                defaultValueStrategy: 'kind' in defaultValue ? undefined : defaultValue.strategy,\n                            });\n                        };\n                        return instructionNode({\n                            ...node,\n                            arguments: node.arguments.map(transformArguments),\n                            extraArguments: node.extraArguments\n                                ? node.extraArguments.map(transformArguments)\n                                : undefined,\n                        });\n                    },\n                },\n            ];\n        }),\n    );\n}\n"
  },
  {
    "path": "packages/visitors/src/transformDefinedTypesIntoAccountsVisitor.ts",
    "content": "import { accountNode, assertIsNode, programNode } from '@codama/nodes';\nimport { extendVisitor, nonNullableIdentityVisitor, pipe } from '@codama/visitors-core';\n\nexport function transformDefinedTypesIntoAccountsVisitor(definedTypes: string[]) {\n    return pipe(nonNullableIdentityVisitor({ keys: ['rootNode', 'programNode'] }), v =>\n        extendVisitor(v, {\n            visitProgram(program) {\n                const typesToExtract = program.definedTypes.filter(node => definedTypes.includes(node.name));\n\n                const newDefinedTypes = program.definedTypes.filter(node => !definedTypes.includes(node.name));\n\n                const newAccounts = typesToExtract.map(node => {\n                    assertIsNode(node.type, 'structTypeNode');\n                    return accountNode({\n                        ...node,\n                        data: node.type,\n                        discriminators: [],\n                        size: undefined,\n                    });\n                });\n\n                return programNode({\n                    ...program,\n                    accounts: [...program.accounts, ...newAccounts],\n                    definedTypes: newDefinedTypes,\n                });\n            },\n        }),\n    );\n}\n"
  },
  {
    "path": "packages/visitors/src/transformU8ArraysToBytesVisitor.ts",
    "content": "import {\n    ArrayTypeNode,\n    arrayTypeNode,\n    assertIsNode,\n    bytesTypeNode,\n    fixedSizeTypeNode,\n    isNode,\n    TYPE_NODES,\n} from '@codama/nodes';\nimport { extendVisitor, nonNullableIdentityVisitor, pipe, visit } from '@codama/visitors-core';\n\nexport function transformU8ArraysToBytesVisitor(sizes: number[] | '*' = '*') {\n    const hasRequiredSize = (count: ArrayTypeNode['count']): boolean => {\n        if (!isNode(count, 'fixedCountNode')) return false;\n        return sizes === '*' || sizes.includes(count.value);\n    };\n\n    return pipe(nonNullableIdentityVisitor(), v =>\n        extendVisitor(v, {\n            visitArrayType(node, { self }) {\n                const child = visit(node.item, self);\n                assertIsNode(child, TYPE_NODES);\n\n                if (\n                    isNode(child, 'numberTypeNode') &&\n                    child.format === 'u8' &&\n                    isNode(node.count, 'fixedCountNode') &&\n                    hasRequiredSize(node.count)\n                ) {\n                    return fixedSizeTypeNode(bytesTypeNode(), node.count.value);\n                }\n\n                return arrayTypeNode(child, node.count);\n            },\n        }),\n    );\n}\n"
  },
  {
    "path": "packages/visitors/src/unwrapDefinedTypesVisitor.ts",
    "content": "import { assertIsNodeFilter, camelCase, CamelCaseString, programNode } from '@codama/nodes';\nimport {\n    extendVisitor,\n    findProgramNodeFromPath,\n    getLastNodeFromPath,\n    LinkableDictionary,\n    NodeStack,\n    nonNullableIdentityVisitor,\n    pipe,\n    recordLinkablesOnFirstVisitVisitor,\n    recordNodeStackVisitor,\n    visit,\n} from '@codama/visitors-core';\n\nexport function unwrapDefinedTypesVisitor(typesToInline: string[] | '*' = '*') {\n    const linkables = new LinkableDictionary();\n    const stack = new NodeStack();\n    const typesToInlineCamelCased = (typesToInline === '*' ? [] : typesToInline).map(fullPath => {\n        if (!fullPath.includes('.')) return camelCase(fullPath);\n        const [programName, typeName] = fullPath.split('.');\n        return `${camelCase(programName)}.${camelCase(typeName)}`;\n    });\n    const shouldInline = (typeName: CamelCaseString, programName: CamelCaseString | undefined): boolean => {\n        if (typesToInline === '*') return true;\n        const fullPath = `${programName}.${typeName}`;\n        if (!!programName && typesToInlineCamelCased.includes(fullPath)) return true;\n        return typesToInlineCamelCased.includes(typeName);\n    };\n\n    return pipe(\n        nonNullableIdentityVisitor(),\n        v =>\n            extendVisitor(v, {\n                visitDefinedTypeLink(linkType, { self }) {\n                    const programName = linkType.program?.name ?? findProgramNodeFromPath(stack.getPath())?.name;\n                    if (!shouldInline(linkType.name, programName)) {\n                        return linkType;\n                    }\n                    const definedTypePath = linkables.getPathOrThrow(stack.getPath('definedTypeLinkNode'));\n                    const definedType = getLastNodeFromPath(definedTypePath);\n\n                    stack.pushPath(definedTypePath);\n                    const result = visit(definedType.type, self);\n                    stack.popPath();\n                    return result;\n                },\n\n                visitProgram(program, { self }) {\n                    return programNode({\n                        ...program,\n                        accounts: program.accounts\n                            .map(account => visit(account, self))\n                            .filter(assertIsNodeFilter('accountNode')),\n                        definedTypes: program.definedTypes\n                            .filter(definedType => !shouldInline(definedType.name, program.name))\n                            .map(type => visit(type, self))\n                            .filter(assertIsNodeFilter('definedTypeNode')),\n                        instructions: program.instructions\n                            .map(instruction => visit(instruction, self))\n                            .filter(assertIsNodeFilter('instructionNode')),\n                    });\n                },\n            }),\n        v => recordNodeStackVisitor(v, stack),\n        v => recordLinkablesOnFirstVisitVisitor(v, linkables),\n    );\n}\n"
  },
  {
    "path": "packages/visitors/src/unwrapInstructionArgsDefinedTypesVisitor.ts",
    "content": "import { assertIsNode, CamelCaseString, definedTypeLinkNode, isNode } from '@codama/nodes';\nimport { getRecordLinkablesVisitor, LinkableDictionary, rootNodeVisitor, visit } from '@codama/visitors-core';\n\nimport { getDefinedTypeHistogramVisitor } from './getDefinedTypeHistogramVisitor';\nimport { unwrapDefinedTypesVisitor } from './unwrapDefinedTypesVisitor';\n\nexport function unwrapInstructionArgsDefinedTypesVisitor() {\n    return rootNodeVisitor(root => {\n        const histogram = visit(root, getDefinedTypeHistogramVisitor());\n        const linkables = new LinkableDictionary();\n        visit(root, getRecordLinkablesVisitor(linkables));\n\n        const definedTypesToInline = (Object.keys(histogram) as CamelCaseString[])\n            // Get all defined types used exactly once as an instruction argument.\n            .filter(key => (histogram[key].total ?? 0) === 1 && (histogram[key].directlyAsInstructionArgs ?? 0) === 1)\n            // Filter out enums which are better defined as external types.\n            .filter(key => {\n                const names = key.split('.');\n                const link = names.length == 2 ? definedTypeLinkNode(names[1], names[0]) : definedTypeLinkNode(key);\n                const found = linkables.get([link]);\n                return found && !isNode(found.type, 'enumTypeNode');\n            });\n\n        // Inline the identified defined types if any.\n        if (definedTypesToInline.length > 0) {\n            const inlineVisitor = unwrapDefinedTypesVisitor(definedTypesToInline);\n            const newRoot = visit(root, inlineVisitor);\n            assertIsNode(newRoot, 'rootNode');\n            return newRoot;\n        }\n\n        return root;\n    });\n}\n"
  },
  {
    "path": "packages/visitors/src/unwrapTupleEnumWithSingleStructVisitor.ts",
    "content": "import {\n    assertIsNode,\n    CamelCaseString,\n    DefinedTypeNode,\n    enumStructVariantTypeNode,\n    getAllDefinedTypes,\n    isNode,\n    REGISTERED_NODE_KINDS,\n    resolveNestedTypeNode,\n    StructTypeNode,\n    transformNestedTypeNode,\n} from '@codama/nodes';\nimport {\n    bottomUpTransformerVisitor,\n    getNodeSelectorFunction,\n    NodeSelectorFunction,\n    NodeStack,\n    rootNodeVisitor,\n    visit,\n} from '@codama/visitors-core';\n\nimport { getDefinedTypeHistogramVisitor } from './getDefinedTypeHistogramVisitor';\nimport { unwrapDefinedTypesVisitor } from './unwrapDefinedTypesVisitor';\n\nexport function unwrapTupleEnumWithSingleStructVisitor(enumsOrVariantsToUnwrap: string[] | '*' = '*') {\n    const selectorFunctions: NodeSelectorFunction[] =\n        enumsOrVariantsToUnwrap === '*'\n            ? [() => true]\n            : enumsOrVariantsToUnwrap.map(selector => getNodeSelectorFunction(selector));\n\n    const shouldUnwrap = (stack: NodeStack): boolean =>\n        selectorFunctions.some(selector => selector(stack.getPath(REGISTERED_NODE_KINDS)));\n\n    return rootNodeVisitor(root => {\n        const typesToPotentiallyUnwrap: string[] = [];\n        const definedTypes: Map<string, DefinedTypeNode> = new Map(\n            getAllDefinedTypes(root).map(definedType => [definedType.name, definedType]),\n        );\n\n        let newRoot = visit(\n            root,\n            bottomUpTransformerVisitor([\n                {\n                    select: '[enumTupleVariantTypeNode]',\n                    transform: (node, stack) => {\n                        assertIsNode(node, 'enumTupleVariantTypeNode');\n                        if (!shouldUnwrap(stack)) return node;\n                        const tupleNode = resolveNestedTypeNode(node.tuple);\n                        if (tupleNode.items.length !== 1) return node;\n                        let item = tupleNode.items[0];\n                        if (isNode(item, 'definedTypeLinkNode')) {\n                            const definedType = definedTypes.get(item.name);\n                            if (!definedType) return node;\n                            if (!isNode(definedType.type, 'structTypeNode')) return node;\n                            typesToPotentiallyUnwrap.push(item.name);\n                            item = definedType.type;\n                        }\n                        if (!isNode(item, 'structTypeNode')) return node;\n                        const nestedStruct = transformNestedTypeNode(node.tuple, () => item as StructTypeNode);\n                        return enumStructVariantTypeNode(node.name, nestedStruct);\n                    },\n                },\n            ]),\n        );\n        assertIsNode(newRoot, 'rootNode');\n\n        const histogram = visit(newRoot, getDefinedTypeHistogramVisitor());\n        const typesToUnwrap = typesToPotentiallyUnwrap.filter(\n            type => !histogram[type as CamelCaseString] || histogram[type as CamelCaseString].total === 0,\n        );\n\n        newRoot = visit(newRoot, unwrapDefinedTypesVisitor(typesToUnwrap));\n        assertIsNode(newRoot, 'rootNode');\n\n        return newRoot;\n    });\n}\n"
  },
  {
    "path": "packages/visitors/src/unwrapTypeDefinedLinksVisitor.ts",
    "content": "import {\n    BottomUpNodeTransformerWithSelector,\n    bottomUpTransformerVisitor,\n    LinkableDictionary,\n    pipe,\n    recordLinkablesOnFirstVisitVisitor,\n} from '@codama/visitors-core';\n\nexport function unwrapTypeDefinedLinksVisitor(definedLinksType: string[]) {\n    const linkables = new LinkableDictionary();\n\n    const transformers: BottomUpNodeTransformerWithSelector[] = definedLinksType.map(selector => ({\n        select: ['[definedTypeLinkNode]', selector],\n        transform: (_, stack) => {\n            const definedType = linkables.getOrThrow(stack.getPath('definedTypeLinkNode'));\n            return definedType.type;\n        },\n    }));\n\n    return pipe(bottomUpTransformerVisitor(transformers), v => recordLinkablesOnFirstVisitVisitor(v, linkables));\n}\n"
  },
  {
    "path": "packages/visitors/src/updateAccountsVisitor.ts",
    "content": "import {\n    accountLinkNode,\n    accountNode,\n    AccountNodeInput,\n    assertIsNode,\n    camelCase,\n    CamelCaseString,\n    pdaLinkNode,\n    PdaNode,\n    pdaNode,\n    PdaSeedNode,\n    programNode,\n    transformNestedTypeNode,\n} from '@codama/nodes';\nimport {\n    BottomUpNodeTransformerWithSelector,\n    bottomUpTransformerVisitor,\n    findProgramNodeFromPath,\n} from '@codama/visitors-core';\n\nimport { renameStructNode } from './renameHelpers';\n\nexport type AccountUpdates =\n    | { delete: true }\n    | (Partial<Omit<AccountNodeInput, 'data'>> & {\n          data?: Record<string, string>;\n          seeds?: PdaSeedNode[];\n      });\n\nexport function updateAccountsVisitor(map: Record<string, AccountUpdates>) {\n    return bottomUpTransformerVisitor(\n        Object.entries(map).flatMap(([selector, updates]) => {\n            const newName =\n                typeof updates === 'object' && 'name' in updates && updates.name ? camelCase(updates.name) : undefined;\n            const pdasToUpsert = [] as { pda: PdaNode; program: CamelCaseString }[];\n\n            const transformers: BottomUpNodeTransformerWithSelector[] = [\n                {\n                    select: ['[accountNode]', selector],\n                    transform: (node, stack) => {\n                        assertIsNode(node, 'accountNode');\n                        if ('delete' in updates) return null;\n\n                        const programNode = findProgramNodeFromPath(stack.getPath())!;\n                        const { seeds, pda, ...assignableUpdates } = updates;\n                        let newPda = node.pda;\n                        if (pda && seeds !== undefined) {\n                            newPda = pda;\n                            pdasToUpsert.push({\n                                pda: pdaNode({ name: pda.name, seeds }),\n                                program: programNode.name,\n                            });\n                        } else if (pda) {\n                            newPda = pda;\n                        } else if (seeds !== undefined && node.pda) {\n                            pdasToUpsert.push({\n                                pda: pdaNode({ name: node.pda.name, seeds }),\n                                program: programNode.name,\n                            });\n                        } else if (seeds !== undefined) {\n                            newPda = pdaLinkNode(newName ?? node.name);\n                            pdasToUpsert.push({\n                                pda: pdaNode({ name: newName ?? node.name, seeds }),\n                                program: programNode.name,\n                            });\n                        }\n\n                        return accountNode({\n                            ...node,\n                            ...assignableUpdates,\n                            data: transformNestedTypeNode(node.data, struct =>\n                                renameStructNode(struct, updates.data ?? {}),\n                            ),\n                            pda: newPda,\n                        });\n                    },\n                },\n                {\n                    select: `[programNode]`,\n                    transform: node => {\n                        assertIsNode(node, 'programNode');\n                        const pdasToUpsertForProgram = pdasToUpsert\n                            .filter(p => p.program === node.name)\n                            .map(p => p.pda);\n                        if (pdasToUpsertForProgram.length === 0) return node;\n                        const existingPdaNames = new Set(node.pdas.map(pda => pda.name));\n                        const pdasToCreate = pdasToUpsertForProgram.filter(p => !existingPdaNames.has(p.name));\n                        const pdasToUpdate = new Map(\n                            pdasToUpsertForProgram.filter(p => existingPdaNames.has(p.name)).map(p => [p.name, p]),\n                        );\n                        const newPdas = [...node.pdas.map(p => pdasToUpdate.get(p.name) ?? p), ...pdasToCreate];\n                        return programNode({ ...node, pdas: newPdas });\n                    },\n                },\n            ];\n\n            if (newName) {\n                transformers.push(\n                    {\n                        select: ['[accountLinkNode]', selector],\n                        transform: node => {\n                            assertIsNode(node, 'accountLinkNode');\n                            return accountLinkNode(newName);\n                        },\n                    },\n                    {\n                        select: ['[pdaNode]', selector],\n                        transform: node => {\n                            assertIsNode(node, 'pdaNode');\n                            return pdaNode({ name: newName, seeds: node.seeds });\n                        },\n                    },\n                    {\n                        select: ['[pdaLinkNode]', selector],\n                        transform: node => {\n                            assertIsNode(node, 'pdaLinkNode');\n                            return pdaLinkNode(newName);\n                        },\n                    },\n                );\n            }\n\n            return transformers;\n        }),\n    );\n}\n"
  },
  {
    "path": "packages/visitors/src/updateDefinedTypesVisitor.ts",
    "content": "import {\n    assertIsNode,\n    camelCase,\n    definedTypeLinkNode,\n    definedTypeNode,\n    DefinedTypeNodeInput,\n    isNode,\n} from '@codama/nodes';\nimport { BottomUpNodeTransformerWithSelector, bottomUpTransformerVisitor } from '@codama/visitors-core';\n\nimport { renameEnumNode, renameStructNode } from './renameHelpers';\n\nexport type DefinedTypeUpdates =\n    | { delete: true }\n    | (Partial<Omit<DefinedTypeNodeInput, 'data'>> & {\n          data?: Record<string, string>;\n      });\n\nexport function updateDefinedTypesVisitor(map: Record<string, DefinedTypeUpdates>) {\n    return bottomUpTransformerVisitor(\n        Object.entries(map).flatMap(([selector, updates]): BottomUpNodeTransformerWithSelector[] => {\n            const newName =\n                typeof updates === 'object' && 'name' in updates && updates.name ? camelCase(updates.name) : undefined;\n\n            const transformers: BottomUpNodeTransformerWithSelector[] = [\n                {\n                    select: ['[definedTypeNode]', selector],\n                    transform: node => {\n                        assertIsNode(node, 'definedTypeNode');\n                        if ('delete' in updates) {\n                            return null;\n                        }\n                        const { data: dataUpdates, ...otherUpdates } = updates;\n                        let newType = node.type;\n                        if (isNode(node.type, 'structTypeNode')) {\n                            newType = renameStructNode(node.type, dataUpdates ?? {});\n                        } else if (isNode(node.type, 'enumTypeNode')) {\n                            newType = renameEnumNode(node.type, dataUpdates ?? {});\n                        }\n                        return definedTypeNode({\n                            ...node,\n                            ...otherUpdates,\n                            name: newName ?? node.name,\n                            type: newType,\n                        });\n                    },\n                },\n            ];\n\n            if (newName) {\n                transformers.push({\n                    select: ['[definedTypeLinkNode]', selector],\n                    transform: node => {\n                        assertIsNode(node, 'definedTypeLinkNode');\n                        return definedTypeLinkNode(newName);\n                    },\n                });\n            }\n\n            return transformers;\n        }),\n    );\n}\n"
  },
  {
    "path": "packages/visitors/src/updateErrorsVisitor.ts",
    "content": "import { assertIsNode, errorNode, ErrorNodeInput } from '@codama/nodes';\nimport { BottomUpNodeTransformerWithSelector, bottomUpTransformerVisitor } from '@codama/visitors-core';\n\nexport type ErrorUpdates = Partial<ErrorNodeInput> | { delete: true };\n\nexport function updateErrorsVisitor(map: Record<string, ErrorUpdates>) {\n    return bottomUpTransformerVisitor(\n        Object.entries(map).map(\n            ([name, updates]): BottomUpNodeTransformerWithSelector => ({\n                select: `[errorNode]${name}`,\n                transform: node => {\n                    assertIsNode(node, 'errorNode');\n                    if ('delete' in updates) return null;\n                    return errorNode({ ...node, ...updates });\n                },\n            }),\n        ),\n    );\n}\n"
  },
  {
    "path": "packages/visitors/src/updateInstructionsVisitor.ts",
    "content": "import {\n    assertIsNode,\n    InstructionAccountNode,\n    instructionAccountNode,\n    InstructionAccountNodeInput,\n    InstructionArgumentNode,\n    instructionArgumentNode,\n    InstructionArgumentNodeInput,\n    InstructionInputValueNode,\n    InstructionNode,\n    instructionNode,\n    InstructionNodeInput,\n    TYPE_NODES,\n} from '@codama/nodes';\nimport {\n    BottomUpNodeTransformerWithSelector,\n    bottomUpTransformerVisitor,\n    LinkableDictionary,\n    NodePath,\n    NodeStack,\n    pipe,\n    recordLinkablesOnFirstVisitVisitor,\n    recordNodeStackVisitor,\n    visit,\n} from '@codama/visitors-core';\n\nimport { fillDefaultPdaSeedValuesVisitor } from './fillDefaultPdaSeedValuesVisitor';\n\nexport type InstructionUpdates =\n    | Partial<\n          Omit<InstructionNodeInput, 'accounts' | 'arguments' | 'extraArguments'> & {\n              accounts?: InstructionAccountUpdates;\n              arguments?: InstructionArgumentUpdates;\n          }\n      >\n    | { delete: true };\n\nexport type InstructionAccountUpdates = Record<\n    string,\n    Partial<Omit<InstructionAccountNodeInput, 'defaultValue'>> & {\n        defaultValue?: InstructionInputValueNode | null;\n    }\n>;\n\nexport type InstructionArgumentUpdates = Record<\n    string,\n    Partial<Omit<InstructionArgumentNodeInput, 'defaultValue'>> & {\n        defaultValue?: InstructionInputValueNode | null;\n    }\n>;\n\nexport function updateInstructionsVisitor(map: Record<string, InstructionUpdates>) {\n    const linkables = new LinkableDictionary();\n    const stack = new NodeStack();\n\n    const transformers = Object.entries(map).map(\n        ([selector, updates]): BottomUpNodeTransformerWithSelector => ({\n            select: ['[instructionNode]', selector],\n            transform: node => {\n                assertIsNode(node, 'instructionNode');\n                if ('delete' in updates) {\n                    return null;\n                }\n\n                const instructionPath = stack.getPath('instructionNode');\n                const { accounts: accountUpdates, arguments: argumentUpdates, ...metadataUpdates } = updates;\n                const { newArguments, newExtraArguments } = handleInstructionArguments(node, argumentUpdates ?? {});\n                const newAccounts = node.accounts.map(account =>\n                    handleInstructionAccount(instructionPath, account, accountUpdates ?? {}, linkables),\n                );\n                return instructionNode({\n                    ...node,\n                    ...metadataUpdates,\n                    accounts: newAccounts,\n                    arguments: newArguments,\n                    extraArguments: newExtraArguments.length > 0 ? newExtraArguments : undefined,\n                });\n            },\n        }),\n    );\n\n    return pipe(\n        bottomUpTransformerVisitor(transformers),\n        v => recordNodeStackVisitor(v, stack),\n        v => recordLinkablesOnFirstVisitVisitor(v, linkables),\n    );\n}\n\nfunction handleInstructionAccount(\n    instructionPath: NodePath<InstructionNode>,\n    account: InstructionAccountNode,\n    accountUpdates: InstructionAccountUpdates,\n    linkables: LinkableDictionary,\n): InstructionAccountNode {\n    const accountUpdate = accountUpdates?.[account.name];\n    if (!accountUpdate) return account;\n    const { defaultValue, ...acountWithoutDefault } = {\n        ...account,\n        ...accountUpdate,\n    };\n\n    if (!defaultValue) {\n        return instructionAccountNode(acountWithoutDefault);\n    }\n\n    return instructionAccountNode({\n        ...acountWithoutDefault,\n        defaultValue: visit(defaultValue, fillDefaultPdaSeedValuesVisitor(instructionPath, linkables)),\n    });\n}\n\nfunction handleInstructionArguments(\n    instruction: InstructionNode,\n    argUpdates: InstructionArgumentUpdates,\n): {\n    newArguments: InstructionArgumentNode[];\n    newExtraArguments: InstructionArgumentNode[];\n} {\n    const usedArguments = new Set<string>();\n\n    const newArguments = instruction.arguments.map(node => {\n        const argUpdate = argUpdates[node.name];\n        if (!argUpdate) return node;\n        usedArguments.add(node.name);\n        return instructionArgumentNode({\n            ...node,\n            defaultValue: argUpdate.defaultValue ?? node.defaultValue,\n            defaultValueStrategy: argUpdate.defaultValueStrategy ?? node.defaultValueStrategy,\n            docs: argUpdate.docs ?? node.docs,\n            name: argUpdate.name ?? node.name,\n            type: argUpdate.type ?? node.type,\n        });\n    });\n\n    const updatedExtraArguments = (instruction.extraArguments ?? []).map(node => {\n        if (usedArguments.has(node.name)) return node;\n        const argUpdate = argUpdates[node.name];\n        if (!argUpdate) return node;\n        usedArguments.add(node.name);\n        return instructionArgumentNode({\n            ...node,\n            defaultValue: argUpdate.defaultValue ?? node.defaultValue,\n            defaultValueStrategy: argUpdate.defaultValueStrategy ?? node.defaultValueStrategy,\n            docs: argUpdate.docs ?? node.docs,\n            name: argUpdate.name ?? node.name,\n            type: argUpdate.type ?? node.type,\n        });\n    });\n\n    const newExtraArguments = [\n        ...updatedExtraArguments,\n        ...Object.entries(argUpdates)\n            .filter(([argName]) => !usedArguments.has(argName))\n            .map(([argName, argUpdate]) => {\n                const { type } = argUpdate;\n                assertIsNode(type, TYPE_NODES);\n                return instructionArgumentNode({\n                    defaultValue: argUpdate.defaultValue ?? undefined,\n                    defaultValueStrategy: argUpdate.defaultValueStrategy ?? undefined,\n                    docs: argUpdate.docs ?? [],\n                    name: argUpdate.name ?? argName,\n                    type,\n                });\n            }),\n    ];\n\n    return { newArguments, newExtraArguments };\n}\n"
  },
  {
    "path": "packages/visitors/src/updateProgramsVisitor.ts",
    "content": "import { assertIsNode, camelCase, programLinkNode, programNode, ProgramNodeInput } from '@codama/nodes';\nimport { BottomUpNodeTransformerWithSelector, bottomUpTransformerVisitor } from '@codama/visitors-core';\n\nexport type ProgramUpdates =\n    | Partial<Omit<ProgramNodeInput, 'accounts' | 'definedTypes' | 'errors' | 'instructions'>>\n    | { delete: true };\n\nexport function updateProgramsVisitor(map: Record<string, ProgramUpdates>) {\n    return bottomUpTransformerVisitor(\n        Object.entries(map).flatMap(([name, updates]): BottomUpNodeTransformerWithSelector[] => {\n            const newName =\n                typeof updates === 'object' && 'name' in updates && updates.name ? camelCase(updates.name) : undefined;\n\n            const transformers: BottomUpNodeTransformerWithSelector[] = [\n                {\n                    select: `[programNode]${name}`,\n                    transform: node => {\n                        assertIsNode(node, 'programNode');\n                        if ('delete' in updates) return null;\n                        return programNode({ ...node, ...updates });\n                    },\n                },\n            ];\n\n            if (newName) {\n                transformers.push({\n                    select: `[programLinkNode]${name}`,\n                    transform: node => {\n                        assertIsNode(node, 'programLinkNode');\n                        return programLinkNode(newName);\n                    },\n                });\n            }\n\n            return transformers;\n        }),\n    );\n}\n"
  },
  {
    "path": "packages/visitors/test/addPdasVisitor.test.ts",
    "content": "import { CODAMA_ERROR__VISITORS__CANNOT_ADD_DUPLICATED_PDA_NAMES, CodamaError } from '@codama/errors';\nimport {\n    constantPdaSeedNodeFromProgramId,\n    constantPdaSeedNodeFromString,\n    pdaNode,\n    programNode,\n    publicKeyTypeNode,\n    variablePdaSeedNode,\n} from '@codama/nodes';\nimport { visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { addPdasVisitor } from '../src';\n\ntest('it adds PDA nodes to a program', () => {\n    // Given a program with a single PDA.\n    const node = programNode({\n        name: 'myProgram',\n        pdas: [\n            pdaNode({\n                name: 'associatedToken',\n                seeds: [\n                    variablePdaSeedNode('owner', publicKeyTypeNode()),\n                    constantPdaSeedNodeFromProgramId(),\n                    variablePdaSeedNode('mint', publicKeyTypeNode()),\n                ],\n            }),\n        ],\n        publicKey: 'Epo9rxh99jpeeWabRZi4tpgUVxZQeVn9vbbDjUztJtu4',\n    });\n\n    // When we add two more PDAs.\n    const newPdas = [\n        pdaNode({\n            name: 'metadata',\n            seeds: [\n                constantPdaSeedNodeFromString('utf8', 'metadata'),\n                constantPdaSeedNodeFromProgramId(),\n                variablePdaSeedNode('mint', publicKeyTypeNode()),\n            ],\n        }),\n        pdaNode({\n            name: 'masterEdition',\n            seeds: [\n                constantPdaSeedNodeFromString('utf8', 'metadata'),\n                constantPdaSeedNodeFromProgramId(),\n                variablePdaSeedNode('mint', publicKeyTypeNode()),\n                constantPdaSeedNodeFromString('utf8', 'edition'),\n            ],\n        }),\n    ];\n    const result = visit(node, addPdasVisitor({ myProgram: newPdas }));\n\n    // Then we expect the following program to be returned.\n    expect(result).toEqual({ ...node, pdas: [...node.pdas, ...newPdas] });\n});\n\ntest('it fails to add a PDA if its name conflicts with an existing PDA on the program', () => {\n    // Given a program with a PDA named \"myPda\".\n    const node = programNode({\n        name: 'myProgram',\n        pdas: [\n            pdaNode({\n                name: 'myPda',\n                seeds: [\n                    variablePdaSeedNode('owner', publicKeyTypeNode()),\n                    constantPdaSeedNodeFromProgramId(),\n                    variablePdaSeedNode('mint', publicKeyTypeNode()),\n                ],\n            }),\n        ],\n        publicKey: 'Epo9rxh99jpeeWabRZi4tpgUVxZQeVn9vbbDjUztJtu4',\n    });\n\n    // When we try to add another PDA with the same name.\n    const fn = () =>\n        visit(\n            node,\n            addPdasVisitor({\n                myProgram: [\n                    pdaNode({\n                        name: 'myPda',\n                        seeds: [\n                            constantPdaSeedNodeFromString('utf8', 'metadata'),\n                            constantPdaSeedNodeFromProgramId(),\n                            variablePdaSeedNode('mint', publicKeyTypeNode()),\n                        ],\n                    }),\n                ],\n            }),\n        );\n\n    // Then we expect the following error to be thrown.\n    expect(fn).toThrow(\n        new CodamaError(CODAMA_ERROR__VISITORS__CANNOT_ADD_DUPLICATED_PDA_NAMES, {\n            duplicatedPdaNames: ['myPda'],\n            program: node,\n            programName: 'myProgram',\n        }),\n    );\n});\n\ntest('it adds PDA nodes to a program with docs', () => {\n    // Given a program with a single PDA.\n    const node = programNode({\n        name: 'myProgram',\n        pdas: [\n            pdaNode({\n                name: 'associatedToken',\n                seeds: [\n                    variablePdaSeedNode('owner', publicKeyTypeNode()),\n                    constantPdaSeedNodeFromProgramId(),\n                    variablePdaSeedNode('mint', publicKeyTypeNode()),\n                ],\n            }),\n        ],\n        publicKey: 'Epo9rxh99jpeeWabRZi4tpgUVxZQeVn9vbbDjUztJtu4',\n    });\n\n    // When we add two more PDAs.\n    const newPdas = [\n        pdaNode({\n            docs: 'Metadata for a token.',\n            name: 'metadata',\n            seeds: [\n                constantPdaSeedNodeFromString('utf8', 'metadata'),\n                constantPdaSeedNodeFromProgramId(),\n                variablePdaSeedNode('mint', publicKeyTypeNode()),\n            ],\n        }),\n        pdaNode({\n            docs: 'The master edition.',\n            name: 'masterEdition',\n            seeds: [\n                constantPdaSeedNodeFromString('utf8', 'metadata'),\n                constantPdaSeedNodeFromProgramId(),\n                variablePdaSeedNode('mint', publicKeyTypeNode()),\n                constantPdaSeedNodeFromString('utf8', 'edition'),\n            ],\n        }),\n    ];\n    const result = visit(node, addPdasVisitor({ myProgram: newPdas }));\n\n    // Then we expect the following program to be returned.\n    expect(result).toEqual({ ...node, pdas: [...node.pdas, ...newPdas] });\n});\n"
  },
  {
    "path": "packages/visitors/test/fillDefaultPdaSeedValuesVisitor.test.ts",
    "content": "import {\n    accountValueNode,\n    argumentValueNode,\n    conditionalValueNode,\n    instructionAccountNode,\n    instructionArgumentNode,\n    instructionNode,\n    numberTypeNode,\n    numberValueNode,\n    pdaNode,\n    pdaSeedValueNode,\n    pdaValueNode,\n    programNode,\n    publicKeyTypeNode,\n    variablePdaSeedNode,\n} from '@codama/nodes';\nimport { LinkableDictionary, visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { fillDefaultPdaSeedValuesVisitor } from '../src';\n\ntest('it fills missing pda seed values with default values', () => {\n    // Given a pdaNode with three variable seeds.\n    const program = programNode({\n        name: 'myProgram',\n        pdas: [\n            pdaNode({\n                name: 'myPda',\n                seeds: [\n                    variablePdaSeedNode('seed1', numberTypeNode('u64')),\n                    variablePdaSeedNode('seed2', numberTypeNode('u64')),\n                    variablePdaSeedNode('seed3', publicKeyTypeNode()),\n                ],\n            }),\n        ],\n        publicKey: '1111',\n    });\n    const pda = program.pdas[0];\n\n    // And a linkable dictionary that recorded this PDA.\n    const linkables = new LinkableDictionary();\n    linkables.recordPath([program, pda]);\n\n    // And a pdaValueNode with a single seed filled.\n    const node = pdaValueNode('myPda', [pdaSeedValueNode('seed1', numberValueNode(42))]);\n\n    // And an instruction node that defines both of the missing seeds.\n    const instruction = instructionNode({\n        accounts: [\n            instructionAccountNode({\n                isSigner: false,\n                isWritable: false,\n                name: 'seed3',\n            }),\n        ],\n        arguments: [instructionArgumentNode({ name: 'seed2', type: numberTypeNode('u64') })],\n        name: 'myInstruction',\n    });\n\n    // When we fill the PDA seeds with default values.\n    const result = visit(node, fillDefaultPdaSeedValuesVisitor([program, instruction], linkables));\n\n    // Then we expect the following pdaValueNode to be returned.\n    expect(result).toEqual(\n        pdaValueNode('myPda', [\n            pdaSeedValueNode('seed1', numberValueNode(42)),\n            pdaSeedValueNode('seed2', argumentValueNode('seed2')),\n            pdaSeedValueNode('seed3', accountValueNode('seed3')),\n        ]),\n    );\n});\n\ntest('it fills nested pda value nodes', () => {\n    // Given a pdaNode with three variable seeds.\n    const program = programNode({\n        name: 'myProgram',\n        pdas: [\n            pdaNode({\n                name: 'myPda',\n                seeds: [\n                    variablePdaSeedNode('seed1', numberTypeNode('u64')),\n                    variablePdaSeedNode('seed2', numberTypeNode('u64')),\n                    variablePdaSeedNode('seed3', publicKeyTypeNode()),\n                ],\n            }),\n        ],\n        publicKey: '1111',\n    });\n    const pda = program.pdas[0];\n\n    // And a linkable dictionary that recorded this PDA.\n    const linkables = new LinkableDictionary();\n    linkables.recordPath([program, pda]);\n\n    // And a pdaValueNode nested inside a conditionalValueNode.\n    const node = conditionalValueNode({\n        condition: accountValueNode('myAccount'),\n        ifTrue: pdaValueNode('myPda', [pdaSeedValueNode('seed1', numberValueNode(42))]),\n    });\n\n    // And an instruction node that defines both of the missing seeds.\n    const instruction = instructionNode({\n        accounts: [\n            instructionAccountNode({\n                isSigner: false,\n                isWritable: false,\n                name: 'seed3',\n            }),\n        ],\n        arguments: [instructionArgumentNode({ name: 'seed2', type: numberTypeNode('u64') })],\n        name: 'myInstruction',\n    });\n\n    // When we fill the PDA seeds with default values.\n    const result = visit(node, fillDefaultPdaSeedValuesVisitor([program, instruction], linkables));\n\n    // Then we expect the following conditionalValueNode to be returned.\n    expect(result).toEqual(\n        conditionalValueNode({\n            condition: accountValueNode('myAccount'),\n            ifTrue: pdaValueNode('myPda', [\n                pdaSeedValueNode('seed1', numberValueNode(42)),\n                pdaSeedValueNode('seed2', argumentValueNode('seed2')),\n                pdaSeedValueNode('seed3', accountValueNode('seed3')),\n            ]),\n        }),\n    );\n});\n\ntest('it ignores default seeds missing from the instruction', () => {\n    // Given a pdaNode with three variable seeds.\n    const program = programNode({\n        name: 'myProgram',\n        pdas: [\n            pdaNode({\n                name: 'myPda',\n                seeds: [\n                    variablePdaSeedNode('seed1', numberTypeNode('u64')),\n                    variablePdaSeedNode('seed2', numberTypeNode('u64')),\n                    variablePdaSeedNode('seed3', publicKeyTypeNode()),\n                ],\n            }),\n        ],\n        publicKey: '1111',\n    });\n    const pda = program.pdas[0];\n\n    // And a linkable dictionary that recorded this PDA.\n    const linkables = new LinkableDictionary();\n    linkables.recordPath([program, pda]);\n\n    // And a pdaValueNode with a single seed filled.\n    const node = pdaValueNode('myPda', [pdaSeedValueNode('seed1', numberValueNode(42))]);\n\n    // And an instruction node that defines only seed2 as an argument.\n    const instruction = instructionNode({\n        arguments: [instructionArgumentNode({ name: 'seed2', type: numberTypeNode('u64') })],\n        name: 'myInstruction',\n    });\n\n    // When we fill the PDA seeds with default values.\n    const result = visit(node, fillDefaultPdaSeedValuesVisitor([program, instruction], linkables));\n\n    // Then we expect the following pdaValueNode to be returned.\n    expect(result).toEqual(\n        pdaValueNode('myPda', [\n            pdaSeedValueNode('seed1', numberValueNode(42)),\n            pdaSeedValueNode('seed2', argumentValueNode('seed2')),\n        ]),\n    );\n});\n"
  },
  {
    "path": "packages/visitors/test/getDefinedTypeHistogramVisitor.test.ts",
    "content": "import {\n    accountNode,\n    definedTypeLinkNode,\n    definedTypeNode,\n    enumTypeNode,\n    eventNode,\n    instructionArgumentNode,\n    instructionNode,\n    numberTypeNode,\n    programNode,\n    rootNode,\n    structFieldTypeNode,\n    structTypeNode,\n} from '@codama/nodes';\nimport { visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { getDefinedTypeHistogramVisitor } from '../src';\n\ntest('it counts the amount of times defined types are used within the tree', () => {\n    // Given the following tree.\n    const node = programNode({\n        accounts: [\n            accountNode({\n                data: structTypeNode([\n                    structFieldTypeNode({\n                        name: 'field1',\n                        type: definedTypeLinkNode('myStruct'),\n                    }),\n                    structFieldTypeNode({\n                        name: 'field2',\n                        type: definedTypeLinkNode('myEnum'),\n                    }),\n                ]),\n                name: 'myAccount',\n            }),\n        ],\n        definedTypes: [\n            definedTypeNode({\n                name: 'myStruct',\n                type: structTypeNode([]),\n            }),\n            definedTypeNode({\n                name: 'myEnum',\n                type: enumTypeNode([]),\n            }),\n        ],\n        errors: [],\n        instructions: [\n            instructionNode({\n                accounts: [],\n                arguments: [\n                    instructionArgumentNode({\n                        name: 'arg1',\n                        type: definedTypeLinkNode('myStruct'),\n                    }),\n                ],\n                name: 'myInstruction',\n            }),\n        ],\n        name: 'customProgram',\n        publicKey: '1111',\n        version: '1.0.0',\n    });\n\n    // When we get its defined type histogram.\n    const histogram = visit(node, getDefinedTypeHistogramVisitor());\n\n    // Then we expect the following histogram.\n    expect(histogram).toEqual({\n        'customProgram.myEnum': {\n            directlyAsInstructionArgs: 0,\n            inAccounts: 1,\n            inDefinedTypes: 0,\n            inEvents: 0,\n            inInstructionArgs: 0,\n            total: 1,\n        },\n        'customProgram.myStruct': {\n            directlyAsInstructionArgs: 1,\n            inAccounts: 1,\n            inDefinedTypes: 0,\n            inEvents: 0,\n            inInstructionArgs: 1,\n            total: 2,\n        },\n    });\n});\n\ntest('it counts defined types used inside event payloads', () => {\n    const node = programNode({\n        definedTypes: [definedTypeNode({ name: 'eventPayload', type: structTypeNode([]) })],\n        events: [\n            eventNode({\n                data: structTypeNode([\n                    structFieldTypeNode({\n                        name: 'payload',\n                        type: definedTypeLinkNode('eventPayload'),\n                    }),\n                ]),\n                name: 'payloadCreated',\n            }),\n        ],\n        name: 'customProgram',\n        publicKey: '1111',\n    });\n\n    const histogram = visit(node, getDefinedTypeHistogramVisitor());\n\n    expect(histogram).toEqual({\n        'customProgram.eventPayload': {\n            directlyAsInstructionArgs: 0,\n            inAccounts: 0,\n            inDefinedTypes: 0,\n            inEvents: 1,\n            inInstructionArgs: 0,\n            total: 1,\n        },\n    });\n});\n\ntest('it counts links from different programs separately', () => {\n    // Given a program node with a defined type used in another type.\n    const programA = programNode({\n        definedTypes: [\n            definedTypeNode({ name: 'myType', type: numberTypeNode('u8') }),\n            definedTypeNode({ name: 'myCopyType', type: definedTypeLinkNode('myType') }),\n        ],\n        name: 'programA',\n        publicKey: '1111',\n    });\n\n    // And another program with a defined type sharing the same name.\n    const programB = programNode({\n        definedTypes: [\n            definedTypeNode({ name: 'myType', type: numberTypeNode('u16') }),\n            definedTypeNode({ name: 'myCopyType', type: definedTypeLinkNode('myType') }),\n        ],\n        name: 'programB',\n        publicKey: '2222',\n    });\n\n    // When we unwrap the defined type from programA.\n    const node = rootNode(programA, [programB]);\n    const histogram = visit(node, getDefinedTypeHistogramVisitor());\n\n    // Then we expect programA to have been modified but not programB.\n    expect(histogram).toStrictEqual({\n        'programA.myType': {\n            directlyAsInstructionArgs: 0,\n            inAccounts: 0,\n            inDefinedTypes: 1,\n            inEvents: 0,\n            inInstructionArgs: 0,\n            total: 1,\n        },\n        'programB.myType': {\n            directlyAsInstructionArgs: 0,\n            inAccounts: 0,\n            inDefinedTypes: 1,\n            inEvents: 0,\n            inInstructionArgs: 0,\n            total: 1,\n        },\n    });\n});\n"
  },
  {
    "path": "packages/visitors/test/setStructDefaultValuesVisitor.test.ts",
    "content": "import {\n    accountNode,\n    assertIsNode,\n    definedTypeNode,\n    instructionArgumentNode,\n    instructionNode,\n    noneValueNode,\n    numberTypeNode,\n    numberValueNode,\n    optionTypeNode,\n    publicKeyTypeNode,\n    resolveNestedTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n} from '@codama/nodes';\nimport { visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { setStructDefaultValuesVisitor } from '../src';\n\ntest('it adds new default values to struct fields', () => {\n    // Given the following person type with no default values.\n    const node = definedTypeNode({\n        name: 'person',\n        type: structTypeNode([\n            structFieldTypeNode({\n                name: 'age',\n                type: numberTypeNode('u32'),\n            }),\n            structFieldTypeNode({\n                name: 'dateOfBirth',\n                type: optionTypeNode(numberTypeNode('i64')),\n            }),\n        ]),\n    });\n\n    // When we set default values for the age and dateOfBirth fields of the person type.\n    const result = visit(\n        node,\n        setStructDefaultValuesVisitor({\n            person: {\n                age: numberValueNode(42),\n                dateOfBirth: noneValueNode(),\n            },\n        }),\n    );\n\n    // Then we expect the following tree changes.\n    assertIsNode(result, 'definedTypeNode');\n    assertIsNode(result.type, 'structTypeNode');\n    expect(result.type.fields[0].defaultValue).toEqual(numberValueNode(42));\n    expect(result.type.fields[0].defaultValueStrategy).toBeUndefined();\n    expect(result.type.fields[1].defaultValue).toEqual(noneValueNode());\n    expect(result.type.fields[1].defaultValueStrategy).toBeUndefined();\n});\n\ntest('it adds new default values with custom strategies to struct fields', () => {\n    // Given the following token account with no default values.\n    const node = accountNode({\n        data: structTypeNode([\n            structFieldTypeNode({\n                name: 'discriminator',\n                type: numberTypeNode('u8'),\n            }),\n            structFieldTypeNode({\n                name: 'delegateAuthority',\n                type: optionTypeNode(publicKeyTypeNode()),\n            }),\n        ]),\n        name: 'token',\n    });\n\n    // When we set default values of that account with custom strategies.\n    const result = visit(\n        node,\n        setStructDefaultValuesVisitor({\n            token: {\n                delegateAuthority: { strategy: 'optional', value: noneValueNode() },\n                discriminator: { strategy: 'omitted', value: numberValueNode(42) },\n            },\n        }),\n    );\n\n    // Then we expect the following tree changes.\n    assertIsNode(result, 'accountNode');\n    const data = resolveNestedTypeNode(result.data);\n    expect(data.fields[0].defaultValue).toEqual(numberValueNode(42));\n    expect(data.fields[0].defaultValueStrategy).toBe('omitted');\n    expect(data.fields[1].defaultValue).toEqual(noneValueNode());\n    expect(data.fields[1].defaultValueStrategy).toBe('optional');\n});\n\ntest('it adds new default values to instruction arguments', () => {\n    // Given the following instruction node with no default values for its arguments\n    const node = instructionNode({\n        arguments: [\n            instructionArgumentNode({\n                name: 'discriminator',\n                type: numberTypeNode('u8'),\n            }),\n            instructionArgumentNode({\n                name: 'amount',\n                type: numberTypeNode('u64'),\n            }),\n        ],\n        name: 'transferTokens',\n    });\n\n    // When we set default values for its arguments.\n    const result = visit(\n        node,\n        setStructDefaultValuesVisitor({\n            transferTokens: {\n                amount: numberValueNode(1),\n                discriminator: { strategy: 'omitted', value: numberValueNode(42) },\n            },\n        }),\n    );\n\n    // Then we expect the following tree changes.\n    assertIsNode(result, 'instructionNode');\n    expect(result.arguments[0].defaultValue).toEqual(numberValueNode(42));\n    expect(result.arguments[0].defaultValueStrategy).toBe('omitted');\n    expect(result.arguments[1].defaultValue).toEqual(numberValueNode(1));\n    expect(result.arguments[1].defaultValueStrategy).toBeUndefined();\n});\n"
  },
  {
    "path": "packages/visitors/test/unwrapDefinedTypesVisitor.test.ts",
    "content": "import {\n    accountNode,\n    assertIsNode,\n    definedTypeLinkNode,\n    definedTypeNode,\n    numberTypeNode,\n    programLinkNode,\n    programNode,\n    rootNode,\n    structFieldTypeNode,\n    structTypeNode,\n} from '@codama/nodes';\nimport { visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { unwrapDefinedTypesVisitor } from '../src';\n\ntest('it unwraps defined types by following links', () => {\n    // Given a program node with an account that uses a defined type link.\n    const node = programNode({\n        accounts: [\n            accountNode({\n                data: structTypeNode([structFieldTypeNode({ name: 'value', type: definedTypeLinkNode('myType') })]),\n                name: 'myAccount',\n            }),\n        ],\n        definedTypes: [definedTypeNode({ name: 'myType', type: numberTypeNode('u64') })],\n        name: 'myProgram',\n        publicKey: '1111',\n    });\n\n    // When we unwrap the defined types.\n    const result = visit(node, unwrapDefinedTypesVisitor(['myType']));\n\n    // Then we expect the following tree.\n    assertIsNode(result, 'programNode');\n    expect(result.accounts[0].data).toStrictEqual(\n        structTypeNode([structFieldTypeNode({ name: 'value', type: numberTypeNode('u64') })]),\n    );\n});\n\ntest('it follows linked nodes using the correct paths', () => {\n    // Given two link nodes designed so that the path would\n    // fail if we did not save and restored linked paths.\n    const programA = programNode({\n        definedTypes: [\n            definedTypeNode({\n                name: 'typeA',\n                type: definedTypeLinkNode('typeB1', programLinkNode('programB')),\n            }),\n        ],\n        name: 'programA',\n        publicKey: '1111',\n    });\n    const programB = programNode({\n        definedTypes: [\n            definedTypeNode({ name: 'typeB1', type: definedTypeLinkNode('typeB2') }),\n            definedTypeNode({ name: 'typeB2', type: numberTypeNode('u64') }),\n        ],\n        name: 'programB',\n        publicKey: '2222',\n    });\n    const root = rootNode(programA, [programB]);\n\n    // When we unwrap the defined types in programB.\n    const visitor = unwrapDefinedTypesVisitor(['typeB1', 'typeB2']);\n    const result = visit(root, visitor);\n\n    // Then we expect the final linkable to be resolved in programA.\n    assertIsNode(result, 'rootNode');\n    expect(result.program.definedTypes[0]).toStrictEqual(\n        definedTypeNode({ name: 'typeA', type: numberTypeNode('u64') }),\n    );\n});\n\ntest('it does not unwrap types from the wrong programs', () => {\n    // Given a program node with a defined type used in another type.\n    const programA = programNode({\n        definedTypes: [\n            definedTypeNode({ name: 'myType', type: numberTypeNode('u8') }),\n            definedTypeNode({ name: 'myCopyType', type: definedTypeLinkNode('myType') }),\n        ],\n        name: 'programA',\n        publicKey: '1111',\n    });\n\n    // And another program with a defined type sharing the same name.\n    const programB = programNode({\n        definedTypes: [\n            definedTypeNode({ name: 'myType', type: numberTypeNode('u16') }),\n            definedTypeNode({ name: 'myCopyType', type: definedTypeLinkNode('myType') }),\n        ],\n        name: 'programB',\n        publicKey: '2222',\n    });\n\n    // When we unwrap the defined type from programA.\n    const node = rootNode(programA, [programB]);\n    const result = visit(node, unwrapDefinedTypesVisitor(['programA.myType']));\n\n    // Then we expect programA to have been modified but not programB.\n    assertIsNode(result, 'rootNode');\n    expect(result).toStrictEqual(\n        rootNode(\n            programNode({\n                definedTypes: [definedTypeNode({ name: 'myCopyType', type: numberTypeNode('u8') })],\n                name: 'programA',\n                publicKey: '1111',\n            }),\n            [programB],\n        ),\n    );\n});\n"
  },
  {
    "path": "packages/visitors/test/unwrapInstructionArgsDefinedTypesVisitor.test.ts",
    "content": "import {\n    arrayTypeNode,\n    definedTypeLinkNode,\n    definedTypeNode,\n    fixedCountNode,\n    instructionArgumentNode,\n    instructionNode,\n    numberTypeNode,\n    programNode,\n    rootNode,\n    structFieldTypeNode,\n    structTypeNode,\n} from '@codama/nodes';\nimport { visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { unwrapInstructionArgsDefinedTypesVisitor } from '../src';\n\ntest('it unwraps defined type link nodes used as instruction arguments', () => {\n    // Given a program with a type used only once as a direct instruction argument.\n    const node = rootNode(\n        programNode({\n            definedTypes: [\n                definedTypeNode({\n                    name: 'typeA',\n                    type: structTypeNode([structFieldTypeNode({ name: 'foo', type: numberTypeNode('u8') })]),\n                }),\n                definedTypeNode({\n                    name: 'typeB',\n                    type: structTypeNode([structFieldTypeNode({ name: 'bar', type: numberTypeNode('u8') })]),\n                }),\n            ],\n            instructions: [\n                instructionNode({\n                    arguments: [instructionArgumentNode({ name: 'argA', type: definedTypeLinkNode('typeA') })],\n                    name: 'myInstruction',\n                }),\n            ],\n            name: 'MyProgram',\n            publicKey: '1111',\n        }),\n    );\n\n    // When the defined type link nodes are unwrapped.\n    const result = visit(node, unwrapInstructionArgsDefinedTypesVisitor());\n\n    // Then we expect the following node.\n    expect(result).toStrictEqual(\n        rootNode(\n            programNode({\n                definedTypes: [\n                    definedTypeNode({\n                        name: 'typeB',\n                        type: structTypeNode([structFieldTypeNode({ name: 'bar', type: numberTypeNode('u8') })]),\n                    }),\n                ],\n                instructions: [\n                    instructionNode({\n                        arguments: [\n                            instructionArgumentNode({\n                                name: 'argA',\n                                type: structTypeNode([\n                                    structFieldTypeNode({ name: 'foo', type: numberTypeNode('u8') }),\n                                ]),\n                            }),\n                        ],\n                        name: 'myInstruction',\n                    }),\n                ],\n                name: 'MyProgram',\n                publicKey: '1111',\n            }),\n        ),\n    );\n});\n\ntest('it does not unwrap defined type link nodes that are used in more than one place.', () => {\n    // Given a link node used in an instruction argument and in another place.\n    const node = rootNode(\n        programNode({\n            definedTypes: [\n                definedTypeNode({\n                    name: 'myType',\n                    type: structTypeNode([structFieldTypeNode({ name: 'foo', type: numberTypeNode('u8') })]),\n                }),\n                definedTypeNode({ name: 'myCopyType', type: definedTypeLinkNode('myType') }),\n            ],\n            instructions: [\n                instructionNode({\n                    arguments: [instructionArgumentNode({ name: 'myArg', type: definedTypeLinkNode('myType') })],\n                    name: 'myInstruction',\n                }),\n            ],\n            name: 'MyProgram',\n            publicKey: '1111',\n        }),\n    );\n\n    // When we try to unwrap defined type link nodes for instruction arguments.\n    const result = visit(node, unwrapInstructionArgsDefinedTypesVisitor());\n\n    // Then we expect the same node.\n    expect(result).toStrictEqual(node);\n});\n\ntest('it only unwraps defined type link nodes if they are direct instruction arguments', () => {\n    // Given a link node used in an instruction argument but not as a direct argument.\n    const node = rootNode(\n        programNode({\n            definedTypes: [\n                definedTypeNode({\n                    name: 'myType',\n                    type: structTypeNode([structFieldTypeNode({ name: 'foo', type: numberTypeNode('u8') })]),\n                }),\n            ],\n            instructions: [\n                instructionNode({\n                    arguments: [\n                        instructionArgumentNode({\n                            name: 'myArg',\n                            type: arrayTypeNode(definedTypeLinkNode('myType'), fixedCountNode(3)),\n                        }),\n                    ],\n                    name: 'myInstruction',\n                }),\n            ],\n            name: 'MyProgram',\n            publicKey: '1111',\n        }),\n    );\n\n    // When we try to unwrap defined type link nodes for instruction arguments.\n    const result = visit(node, unwrapInstructionArgsDefinedTypesVisitor());\n\n    // Then we expect the same node.\n    expect(result).toStrictEqual(node);\n});\n\ntest('it does not unwrap defined type link nodes from other programs', () => {\n    // Given a program that defines the\n    const programA = programNode({\n        definedTypes: [definedTypeNode({ name: 'myType', type: numberTypeNode('u8') })],\n        instructions: [\n            instructionNode({\n                arguments: [instructionArgumentNode({ name: 'myArg', type: definedTypeLinkNode('myType') })],\n                name: 'myInstruction',\n            }),\n        ],\n        name: 'programA',\n        publicKey: '1111',\n    });\n\n    // And another program with a defined type sharing the same name.\n    const programB = programNode({\n        definedTypes: [\n            definedTypeNode({ name: 'myType', type: numberTypeNode('u16') }),\n            definedTypeNode({ name: 'myCopyType', type: definedTypeLinkNode('myType') }),\n        ],\n        name: 'programB',\n        publicKey: '2222',\n    });\n\n    // When we unwrap defined type link nodes for instruction arguments for both of them.\n    const node = rootNode(programA, [programB]);\n    const result = visit(node, unwrapInstructionArgsDefinedTypesVisitor());\n\n    // Then we expect program A to have been modified but not program B.\n    expect(result).toStrictEqual(\n        rootNode(\n            programNode({\n                instructions: [\n                    instructionNode({\n                        arguments: [instructionArgumentNode({ name: 'myArg', type: numberTypeNode('u8') })],\n                        name: 'myInstruction',\n                    }),\n                ],\n                name: 'programA',\n                publicKey: '1111',\n            }),\n            [programB],\n        ),\n    );\n});\n"
  },
  {
    "path": "packages/visitors/test/updateAccountsVisitor.test.ts",
    "content": "import {\n    accountNode,\n    assertIsNode,\n    CamelCaseString,\n    constantPdaSeedNodeFromString,\n    numberTypeNode,\n    pdaLinkNode,\n    pdaNode,\n    programNode,\n    resolveNestedTypeNode,\n    rootNode,\n    structFieldTypeNode,\n    structTypeNode,\n} from '@codama/nodes';\nimport { visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { updateAccountsVisitor } from '../src';\n\ntest('it updates the name of an account', () => {\n    // Given the following program node with one account.\n    const node = programNode({\n        accounts: [accountNode({ name: 'myAccount' })],\n        name: 'myProgram',\n        publicKey: '1111',\n    });\n\n    // When we update the name of that account.\n    const result = visit(\n        node,\n        updateAccountsVisitor({\n            myAccount: { name: 'myNewAccount' },\n        }),\n    );\n\n    // Then we expect the following tree changes.\n    assertIsNode(result, 'programNode');\n    expect(result.accounts[0].name).toBe('myNewAccount' as CamelCaseString);\n});\n\ntest('it updates the name of an account within a specific program', () => {\n    // Given two programs each with an account of the same name.\n    const node = rootNode(\n        programNode({\n            accounts: [accountNode({ name: 'candyMachine' })],\n            name: 'myProgramA',\n            publicKey: '1111',\n        }),\n        [\n            programNode({\n                accounts: [accountNode({ name: 'candyMachine' })],\n                name: 'myProgramB',\n                publicKey: '2222',\n            }),\n        ],\n    );\n\n    // When we update the name of that account in the first program.\n    const result = visit(\n        node,\n        updateAccountsVisitor({\n            'myProgramA.candyMachine': { name: 'newCandyMachine' },\n        }),\n    );\n\n    // Then we expect the first account to have been renamed.\n    assertIsNode(result, 'rootNode');\n    expect(result.program.accounts[0].name).toBe('newCandyMachine' as CamelCaseString);\n\n    // But not the second account.\n    expect(result.additionalPrograms[0].accounts[0].name).toBe('candyMachine' as CamelCaseString);\n});\n\ntest(\"it renames the fields of an account's data\", () => {\n    // Given the following account.\n    const node = accountNode({\n        data: structTypeNode([structFieldTypeNode({ name: 'myData', type: numberTypeNode('u32') })]),\n        name: 'myAccount',\n    });\n\n    // When we rename its data fields.\n    const result = visit(\n        node,\n        updateAccountsVisitor({\n            myAccount: {\n                data: { myData: 'myNewData' },\n            },\n        }),\n    );\n\n    // Then we expect the following tree changes.\n    assertIsNode(result, 'accountNode');\n    const data = resolveNestedTypeNode(result.data);\n    expect(data.fields[0].name).toBe('myNewData' as CamelCaseString);\n});\n\ntest('it updates the name of associated PDA nodes', () => {\n    // Given the following program node with one account\n    // and PDA accounts such that one of them is named the same.\n    const node = programNode({\n        accounts: [accountNode({ name: 'myAccount' })],\n        name: 'myProgram',\n        pdas: [pdaNode({ name: 'myAccount', seeds: [] }), pdaNode({ name: 'myOtherAccount', seeds: [] })],\n        publicKey: '1111',\n    });\n\n    // When we update the name of that account.\n    const result = visit(\n        node,\n        updateAccountsVisitor({\n            myAccount: { name: 'myNewAccount' },\n        }),\n    );\n\n    // Then we expect the associated PDA node to have been renamed.\n    assertIsNode(result, 'programNode');\n    expect(result.pdas[0].name).toBe('myNewAccount' as CamelCaseString);\n\n    // But not the other PDA node.\n    expect(result.pdas[1].name).toBe('myOtherAccount' as CamelCaseString);\n});\n\ntest('it creates a new PDA node when providing seeds to an account with no linked PDA', () => {\n    // Given the following program node with one account.\n    const node = rootNode(\n        programNode({\n            accounts: [accountNode({ name: 'myAccount' })],\n            name: 'myProgramA',\n            pdas: [],\n            publicKey: '1111',\n        }),\n        [programNode({ name: 'myProgramB', publicKey: '2222' })],\n    );\n\n    // When we update the account with PDA seeds.\n    const seeds = [constantPdaSeedNodeFromString('utf8', 'myAccount')];\n    const result = visit(\n        node,\n        updateAccountsVisitor({\n            myAccount: { seeds },\n        }),\n    );\n    assertIsNode(result, 'rootNode');\n\n    // Then we expect a new PDA node to have been created on the program.\n    expect(result.program.pdas.length).toBe(1);\n    expect(result.additionalPrograms[0].pdas.length).toBe(0);\n    expect(result.program.pdas[0]).toEqual(pdaNode({ name: 'myAccount', seeds }));\n\n    // And the account now links to the new PDA node.\n    expect(result.program.accounts[0].pda).toEqual(pdaLinkNode('myAccount'));\n});\n\ntest('it updates the PDA node when the updated account name matches an existing PDA node', () => {\n    // Given an account node and a PDA node with the same name\n    // such that the account is not linked to the PDA.\n    const node = programNode({\n        accounts: [accountNode({ name: 'myAccount' })],\n        name: 'myProgram',\n        pdas: [pdaNode({ name: 'myAccount', seeds: [] })],\n        publicKey: '1111',\n    });\n\n    // When we update the account with PDA seeds.\n    const seeds = [constantPdaSeedNodeFromString('utf8', 'myAccount')];\n    const result = visit(\n        node,\n        updateAccountsVisitor({\n            myAccount: { seeds },\n        }),\n    );\n    assertIsNode(result, 'programNode');\n\n    // Then we expect the PDA node with the same name to have been updated.\n    expect(result.pdas.length).toBe(1);\n    expect(result.pdas[0]).toEqual(pdaNode({ name: 'myAccount', seeds }));\n\n    // And the account now links to this PDA node.\n    expect(result.accounts[0].pda).toEqual(pdaLinkNode('myAccount'));\n});\n\ntest('it updates the PDA node with the provided seeds when an account is linked to a PDA', () => {\n    // Given an account node and a PDA node with a different name\n    // such that the account is linked to the PDA.\n    const node = programNode({\n        accounts: [accountNode({ name: 'myAccount', pda: pdaLinkNode('myPda') })],\n        name: 'myProgram',\n        pdas: [pdaNode({ name: 'myPda', seeds: [] })],\n        publicKey: '1111',\n    });\n\n    // When we update the account with PDA seeds.\n    const seeds = [constantPdaSeedNodeFromString('utf8', 'myAccount')];\n    const result = visit(\n        node,\n        updateAccountsVisitor({\n            myAccount: { seeds },\n        }),\n    );\n    assertIsNode(result, 'programNode');\n\n    // Then we expect the linked PDA node to have been updated.\n    expect(result.pdas.length).toBe(1);\n    expect(result.pdas[0]).toEqual(pdaNode({ name: 'myPda', seeds }));\n\n    // And the account still links to the PDA node.\n    expect(result.accounts[0].pda).toEqual(pdaLinkNode('myPda'));\n});\n\ntest('it creates a new PDA node when updating an account with seeds and a new linked PDA that does not exist', () => {\n    // Given an account node with no linked PDA.\n    const node = programNode({\n        accounts: [accountNode({ name: 'myAccount' })],\n        name: 'myProgram',\n        publicKey: '1111',\n    });\n\n    // When we update the account with PDA seeds and a new linked PDA node.\n    const seeds = [constantPdaSeedNodeFromString('utf8', 'myAccount')];\n    const result = visit(\n        node,\n        updateAccountsVisitor({\n            myAccount: {\n                pda: pdaLinkNode('myPda'),\n                seeds,\n            },\n        }),\n    );\n    assertIsNode(result, 'programNode');\n\n    // Then we expect the linked PDA node to have been created.\n    expect(result.pdas.length).toBe(1);\n    expect(result.pdas[0]).toEqual(pdaNode({ name: 'myPda', seeds }));\n\n    // And the account now links to the PDA node.\n    expect(result.accounts[0].pda).toEqual(pdaLinkNode('myPda'));\n});\n\ntest('it updates a PDA node when updating an account with seeds and a new linked PDA that exists', () => {\n    // Given an account node with no linked PDA and an existing PDA node.\n    const node = programNode({\n        accounts: [accountNode({ name: 'myAccount' })],\n        name: 'myProgram',\n        pdas: [pdaNode({ name: 'myPda', seeds: [] })],\n        publicKey: '1111',\n    });\n\n    // When we update the account with PDA seeds and a linked PDA node that points to the existing PDA.\n    const seeds = [constantPdaSeedNodeFromString('utf8', 'myAccount')];\n    const result = visit(\n        node,\n        updateAccountsVisitor({\n            myAccount: {\n                pda: pdaLinkNode('myPda'),\n                seeds,\n            },\n        }),\n    );\n    assertIsNode(result, 'programNode');\n\n    // Then we expect the existing PDA node to have been updated.\n    expect(result.pdas.length).toBe(1);\n    expect(result.pdas[0]).toEqual(pdaNode({ name: 'myPda', seeds }));\n\n    // And the account now links to this PDA node.\n    expect(result.accounts[0].pda).toEqual(pdaLinkNode('myPda'));\n});\n\ntest('it can update the seeds and name of an account at the same time', () => {\n    // Given an account node with no linked PDA.\n    const node = programNode({\n        accounts: [accountNode({ name: 'myAccount' })],\n        name: 'myProgram',\n        publicKey: '1111',\n    });\n\n    // When we update the name and seeds of the account.\n    const seeds = [constantPdaSeedNodeFromString('utf8', 'myAccount')];\n    const result = visit(\n        node,\n        updateAccountsVisitor({\n            myAccount: {\n                name: 'myNewAccount',\n                seeds,\n            },\n        }),\n    );\n    assertIsNode(result, 'programNode');\n\n    // Then we expect the account name to have been updated.\n    expect(result.accounts[0].name).toBe('myNewAccount' as CamelCaseString);\n\n    // And a new PDA node to have been created with that new name and the provided seeds.\n    expect(result.pdas.length).toBe(1);\n    expect(result.pdas[0]).toEqual(pdaNode({ name: 'myNewAccount', seeds }));\n\n    // And the account to now link to the PDA node.\n    expect(result.accounts[0].pda).toEqual(pdaLinkNode('myNewAccount'));\n});\n"
  },
  {
    "path": "packages/visitors/test/updateInstructionsVisitor.test.ts",
    "content": "import {\n    ArgumentValueNode,\n    argumentValueNode,\n    assertIsNode,\n    CamelCaseString,\n    ConstantDiscriminatorNode,\n    constantDiscriminatorNode,\n    constantValueNode,\n    instructionAccountNode,\n    instructionArgumentNode,\n    instructionByteDeltaNode,\n    instructionNode,\n    instructionRemainingAccountsNode,\n    numberTypeNode,\n    NumberValueNode,\n    numberValueNode,\n    programNode,\n    rootNode,\n} from '@codama/nodes';\nimport { visit } from '@codama/visitors-core';\nimport { expect, test } from 'vitest';\n\nimport { updateInstructionsVisitor } from '../src';\n\ntest('it updates the name of an instruction', () => {\n    // Given the following program node with one instruction.\n    const node = programNode({\n        instructions: [instructionNode({ name: 'myInstruction' })],\n        name: 'myProgram',\n        publicKey: '1111',\n    });\n\n    // When we update the name of that instruction.\n    const result = visit(\n        node,\n        updateInstructionsVisitor({\n            myInstruction: { name: 'myNewInstruction' },\n        }),\n    );\n\n    // Then we expect the following tree changes.\n    assertIsNode(result, 'programNode');\n    expect(result.instructions[0].name).toBe('myNewInstruction' as CamelCaseString);\n});\n\ntest('it updates the name of an instruction within a specific program', () => {\n    // Given two programs each with an instruction of the same name.\n    const node = rootNode(\n        programNode({\n            instructions: [instructionNode({ name: 'transfer' })],\n            name: 'myProgramA',\n            publicKey: '1111',\n        }),\n        [\n            programNode({\n                instructions: [instructionNode({ name: 'transfer' })],\n                name: 'myProgramB',\n                publicKey: '2222',\n            }),\n        ],\n    );\n\n    // When we update the name of that instruction in the first program.\n    const result = visit(\n        node,\n        updateInstructionsVisitor({\n            'myProgramA.transfer': { name: 'newTransfer' },\n        }),\n    );\n\n    // Then we expect the first instruction to have been renamed.\n    assertIsNode(result, 'rootNode');\n    expect(result.program.instructions[0].name).toBe('newTransfer' as CamelCaseString);\n\n    // But not the second instruction.\n    expect(result.additionalPrograms[0].instructions[0].name).toBe('transfer' as CamelCaseString);\n});\n\ntest('it updates the name of an instruction account', () => {\n    // Given the following instruction node with one account.\n    const node = instructionNode({\n        accounts: [\n            instructionAccountNode({\n                isSigner: false,\n                isWritable: true,\n                name: 'myAccount',\n            }),\n        ],\n        name: 'myInstruction',\n    });\n\n    // When we update the name of that instruction account.\n    const result = visit(\n        node,\n        updateInstructionsVisitor({\n            myInstruction: {\n                accounts: {\n                    myAccount: { name: 'myNewAccount' },\n                },\n            },\n        }),\n    );\n\n    // Then we expect the following tree changes.\n    assertIsNode(result, 'instructionNode');\n    expect(result.accounts[0].name).toBe('myNewAccount' as CamelCaseString);\n});\n\ntest('it updates the name of an instruction argument', () => {\n    // Given the following instruction node with one argument.\n    const node = instructionNode({\n        arguments: [\n            instructionArgumentNode({\n                name: 'myArgument',\n                type: numberTypeNode('u8'),\n            }),\n        ],\n        name: 'myInstruction',\n    });\n\n    // When we update the name of that instruction argument.\n    const result = visit(\n        node,\n        updateInstructionsVisitor({\n            myInstruction: {\n                arguments: {\n                    myArgument: { name: 'myNewArgument' },\n                },\n            },\n        }),\n    );\n\n    // Then we expect the following tree changes.\n    assertIsNode(result, 'instructionNode');\n    expect(result.arguments[0].name).toBe('myNewArgument' as CamelCaseString);\n});\n\ntest('it updates the default value of an instruction argument', () => {\n    // Given the following instruction node with a argument that has no default value.\n    const node = instructionNode({\n        arguments: [\n            instructionArgumentNode({\n                name: 'amount',\n                type: numberTypeNode('u64'),\n            }),\n        ],\n        name: 'transferTokens',\n    });\n\n    // When we update the default value of that instruction argument.\n    const result = visit(\n        node,\n        updateInstructionsVisitor({\n            transferTokens: {\n                arguments: {\n                    amount: { defaultValue: numberValueNode(1) },\n                },\n            },\n        }),\n    );\n\n    // Then we expect the following tree changes.\n    assertIsNode(result, 'instructionNode');\n    expect(result.arguments[0].defaultValue).toEqual(numberValueNode(1));\n    expect(result.arguments[0].defaultValueStrategy).toBeUndefined();\n});\n\ntest('it updates the default value strategy of an instruction argument', () => {\n    // Given the following instruction node with two arguments that have no default values.\n    const node = instructionNode({\n        arguments: [\n            instructionArgumentNode({\n                name: 'discriminator',\n                type: numberTypeNode('u8'),\n            }),\n            instructionArgumentNode({\n                name: 'amount',\n                type: numberTypeNode('u64'),\n            }),\n        ],\n        name: 'transferTokens',\n    });\n\n    // When we update the default value of these arguments using specific strategies.\n    const result = visit(\n        node,\n        updateInstructionsVisitor({\n            transferTokens: {\n                arguments: {\n                    amount: {\n                        defaultValue: numberValueNode(1),\n                        defaultValueStrategy: 'optional',\n                    },\n                    discriminator: {\n                        defaultValue: numberValueNode(42),\n                        defaultValueStrategy: 'omitted',\n                    },\n                },\n            },\n        }),\n    );\n\n    // Then we expect the following tree changes.\n    assertIsNode(result, 'instructionNode');\n    expect(result.arguments[0].defaultValue).toEqual(numberValueNode(42));\n    expect(result.arguments[0].defaultValueStrategy).toBe('omitted');\n    expect(result.arguments[1].defaultValue).toEqual(numberValueNode(1));\n    expect(result.arguments[1].defaultValueStrategy).toBe('optional');\n});\n\ntest('it updates the byteDeltas of an instruction', () => {\n    // Given the following instruction node with no byteDeltas.\n    const node = instructionNode({\n        name: 'myInstruction',\n    });\n\n    // When we update the byteDeltas of that instruction.\n    const result = visit(\n        node,\n        updateInstructionsVisitor({\n            myInstruction: {\n                byteDeltas: [instructionByteDeltaNode(numberValueNode(100))],\n            },\n        }),\n    );\n\n    // Then we expect the following tree changes.\n    assertIsNode(result, 'instructionNode');\n    expect(result.byteDeltas).toEqual([instructionByteDeltaNode(numberValueNode(100))]);\n});\n\ntest('it updates the discriminators of an instruction', () => {\n    // Given the following instruction node with no discriminators.\n    const node = instructionNode({\n        name: 'myInstruction',\n    });\n\n    // When we update the discriminators of that instruction.\n    const result = visit(\n        node,\n        updateInstructionsVisitor({\n            myInstruction: {\n                discriminators: [\n                    constantDiscriminatorNode(constantValueNode(numberTypeNode('u64'), numberValueNode(42))),\n                ],\n            },\n        }),\n    );\n\n    // Then we expect the following tree changes.\n    assertIsNode(result, 'instructionNode');\n    expect(result.discriminators![0].kind).toBe('constantDiscriminatorNode');\n    expect(((result.discriminators![0] as ConstantDiscriminatorNode).constant.value as NumberValueNode).number).toEqual(\n        42,\n    );\n});\n\ntest('it updates the remainingAccounts of an instruction', () => {\n    // Given the following instruction node with no remaining accounts.\n    const node = instructionNode({\n        name: 'myInstruction',\n    });\n\n    // When we update the remaining accounts of that instruction.\n    const result = visit(\n        node,\n        updateInstructionsVisitor({\n            myInstruction: {\n                remainingAccounts: [instructionRemainingAccountsNode(argumentValueNode('abc'))],\n            },\n        }),\n    );\n\n    // Then we expect the following tree changes.\n    assertIsNode(result, 'instructionNode');\n    expect(result.remainingAccounts![0].kind).toBe('instructionRemainingAccountsNode');\n    expect((result.remainingAccounts![0].value as ArgumentValueNode).name).toBe('abc');\n});\n"
  },
  {
    "path": "packages/visitors/tsconfig.declarations.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"declarationMap\": true,\n        \"emitDeclarationOnly\": true,\n        \"outDir\": \"./dist/types\"\n    },\n    \"extends\": \"./tsconfig.json\",\n    \"include\": [\"src/index.ts\", \"src/types\"]\n}\n"
  },
  {
    "path": "packages/visitors/tsconfig.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": { \"lib\": [] },\n    \"display\": \"@codama/visitors\",\n    \"extends\": \"../../tsconfig.json\",\n    \"include\": [\"src\", \"test\"]\n}\n"
  },
  {
    "path": "packages/visitors/tsup.config.ts",
    "content": "import { defineConfig } from 'tsup';\n\nimport { getPackageBuildConfigs } from '../../tsup.config.base';\n\nexport default defineConfig(getPackageBuildConfigs());\n"
  },
  {
    "path": "packages/visitors/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\nimport { getVitestConfig } from '../../vitest.config.base.mjs';\n\nexport default defineConfig({\n    test: {\n        projects: [getVitestConfig('browser'), getVitestConfig('node'), getVitestConfig('react-native')],\n    },\n});\n"
  },
  {
    "path": "packages/visitors-core/.gitignore",
    "content": "dist/\n"
  },
  {
    "path": "packages/visitors-core/.prettierignore",
    "content": "dist/\ntest/e2e/\ntest-ledger/\ntarget/\nCHANGELOG.md\n"
  },
  {
    "path": "packages/visitors-core/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Codama\nCopyright (c) 2024 Metaplex Foundation\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/visitors-core/README.md",
    "content": "# Codama ➤ Visitors ➤ Core\n\n[![npm][npm-image]][npm-url]\n[![npm-downloads][npm-downloads-image]][npm-url]\n\n[npm-downloads-image]: https://img.shields.io/npm/dm/@codama/visitors-core.svg?style=flat\n[npm-image]: https://img.shields.io/npm/v/@codama/visitors-core.svg?style=flat&label=%40codama%2Fvisitors-core\n[npm-url]: https://www.npmjs.com/package/@codama/visitors-core\n\nThis package provides core interfaces and utilities for creating visitors for Codama IDLs.\n\n## Installation\n\n```sh\npnpm install @codama/visitors-core\n```\n\n> [!NOTE]\n> This package is included in the [`@codama/visitors`](../visitors) package and in the main [`codama`](../library) library. Meaning, you already have access to its content if you are installing Codama in one of these ways.\n>\n> ```sh\n> pnpm install @codama/visitors\n> pnpm install codama\n> ```\n\n## Getting started with visitors\n\n### The `Visitor` type\n\nThe type `Visitor<T>` is the core interface for defining Codama visitors. The type parameter `T` is used to determine the return type of the visitor. For instance, here's the definition of a visitor that goes through the nodes and returns a number.\n\n```ts\nlet myNumberVisitor: Visitor<number>;\n```\n\nThe `Visitor` type accepts a second type parameter which defines the scope of nodes accepted by the visitor. By default, the visitor accepts all nodes. However, you can restrict the visitor to a specific set of nodes by providing a union of node kinds.\n\n```ts\nlet myVisitorForProgramNodesOnly: Visitor<number, 'programNode'>;\nlet myVisitorForTypeNodesOnly: Visitor<number, TypeNode['kind']>;\n```\n\nThe definition of the `Visitor` type is an object such that, for each supported node kind, a function that accepts a node of that kind and returns a value of type `T` is defined. The name of the function must be camel-cased, start with `visit` and finish with the name of the node kind without the `Node` suffix. For instance, the function for the `programNode` kind is named `visitProgram`.\n\n### Writing your own visitor\n\nTo write a custom visitor, you may simply define an object with the appropriate functions. For instance, here's a visitor that only visits `ProgramNodes` and returns the number of accounts in the program.\n\n```ts\nconst accountCounterVisitor: Visitor<number, 'programNode'> = {\n    visitProgram: (node: ProgramNode) => node.accounts.length,\n};\n```\n\nNote that it is recommended to return visitors from functions so we can easily reuse them and parameterize them. Additionally, this allows our code to be tree-shaken by the bundler. As we will see in this documentation, all provided visitors are returned from functions even if they don't take any parameter.\n\nHere's our previous example updated to accept a `multiplier` parameter.\n\n```ts\nconst accountCounterVisitor = (multiplier = 1): Visitor<number, 'programNode'> => ({\n    visitProgram: (node: ProgramNode) => node.accounts.length * multiplier,\n});\n```\n\nIn practice, writing a visitor manually can be cumbersome as a function must be provided for each supported node kind. Therefore, it is recommended to compose visitors from a set of core visitors provided by this package and extend them to suit your needs. We will see how to do this in the next sections.\n\n### Visiting nodes\n\nOnce we have a visitor, we can visit any node it supports by calling the `visit` function. This function accepts a node and a visitor of type `Visitor<T>` and returns a type `T`.\n\n```ts\nconst counter: number = visit(programNode, accountCounterVisitor());\n```\n\nThe `visitOrElse` function can also be used to gracefully handle the case where the node is not supported by the visitor. In this case, a fallback logic — provided as a third argument — is used to compute the result.\n\n```ts\nconst counter: number = visit(stringTypeNode, accountCounterVisitor(), () => 0);\n```\n\nAlso note that, if you are using [the `Codama` interface](../library/README#codama) — which is a simple wrapper around a `RootNode` — you may visit that root node using the provided helpers:\n\n```ts\n// Runs the visitor and returns the result.\nconst result: number = codama.accept(myNumberVisitor());\n\n// Runs the visitor and updates the wrapped `RootNode` with the result.\ncodama.update(myTransformerVisitor());\n```\n\n## Core visitors\n\nAs mentioned in the previous section, creating visitors is much easier when we start from a set of core visitors and extend them to suit our needs.\n\nTherefore, let's start by exploring the core visitors provided by this package.\n\n### Filtering node kinds\n\nBefore we list each available core visitor, it is important to know that each of these functions optionally accepts a node kind or an array of node kinds **as a `keys` attribute in their `options`**. This allows us to restrict the visitor to a specific set of nodes and will return a `Visitor<T, U>` instance where `U` is the union of the provided node kinds.\n\nHere are some examples:\n\n```ts\n// This visitor only accepts `ProgramNodes`.\nconst visitor: Visitor<number, 'programNode'> = voidVisitor({ keys: 'programNode' });\n\n// This visitor accepts both `NumberTypeNodes` and `StringTypeNodes`.\nconst visitor: Visitor<number, 'numberTypeNode' | 'stringTypeNode'> = voidVisitor({\n    keys: ['numberTypeNode', 'stringTypeNode'],\n});\n\n// This visitor accepts all type nodes.\nconst visitor: Visitor<number, TypeNode['kind']> = voidVisitor({ keys: TYPE_NODES });\n\n// This visitor accepts all nodes.\nconst visitor: Visitor<number> = voidVisitor();\n```\n\nIn the following sections describing the core visitors, this exact pattern can be used to restrict the visitors to specific node kinds. We won't cover this for each visitor but know that you can achieve this via the `keys` option of each function.\n\n### `voidVisitor`\n\nThe `voidVisitor` traverses all the nodes and ends up returning `undefined`, regardless of the node kind.\n\n```ts\nvisit(node, voidVisitor());\n// ^ undefined\n```\n\nVisiting a node with this visitor does nothing and causes no side effects. However, it can be a great starting point for creating new visitors by extending certain visiting functions of the `voidVisitor`.\n\n### `staticVisitor`\n\nThe `staticVisitor` accepts a function that is used for every node. The provided function is called with the node being visited.\n\n```ts\nconst visitor: Visitor<string> = staticVisitor(node => `Visiting ${node.kind}`);\nconst kind = visit(numberTypeNode('u32'), visitor);\n// ^ \"Visiting numberTypeNode\"\n```\n\nThis visitor can be used to create simple visitors where each node shares a similar logic or to provide a starting point for more complex visitors.\n\n### `identityVisitor`\n\nThe `identityVisitor` traverses the nodes and returns a deep copy of the visited node.\n\n```ts\nconst node = visit(numberTypeNode('u32'), identityVisitor());\n// ^ A different instance of numberTypeNode('u32')\n```\n\nNote that the returned visitor is of type `Visitor<Node | null>` meaning this visitor allows for nodes to be deleted — i.e. marked as `null`. The `identityVisitor` can resolve nested `null` references depending on the node kind. For instance, if a `tupleTypeNode` contains two items and the first one is `null` — after having visited its children — then, the `tupleTypeNode` will only contain the second item. It is also possible for a nested `null` reference to bubble up if it cannot be resolved.\n\nHere are some examples of this behaviour by overriding the `visitPublicKeyType` function to return `null`.\n\n```ts\nconst visitor = identityVisitor();\nvisitor.visitPublicKeyType = () => null;\n\nconst node = visit(tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]), visitor);\n// ^ tupleTypeNode([numberTypeNode('u32')])\n\nconst node = visit(definedTypeNode({ name: 'address', type: publicKeyTypeNode() }), visitor);\n// ^ null\n```\n\nAlso note that, because the visitor is of type `Node | null`, it is technically possible to extend it such that a node of a different kind is returned.\n\n```ts\nconst visitor = identityVisitor();\nvisitor.visitPublicKeyType = () => fixedSizeTypeNode(stringTypeNode('base58'), 32);\n```\n\n### `nonNullableIdentityVisitor`\n\nThe `nonNullableIdentityVisitor` works the same way as the `identityVisitor` but it does not allow nodes to be deleted. That is, its return type must be a `Node` and not `Node | null`.\n\n```ts\nconst node = visit(numberTypeNode('u32'), nonNullableIdentityVisitor());\n// ^ A different instance of numberTypeNode('u32')\n```\n\n### `mergeVisitor`\n\nThe `mergeVisitor` returns a `Visitor<T>` by accepting two functions such that:\n\n- The first function is used on the leaves of the Codama IDL and returns a type `T`.\n- The second function is used to merge the values `T[]` of the children of a node and aggregate them into a type `T`.\n\nFor instance, here is how we can use the `mergeVisitor` to create a nested string representation of node kinds.\n\n```ts\nconst visitor = mergeVisitor(\n    (node): string => node.kind,\n    (node, values: string[]): string => `${node.kind}(${values.join(',')})`,\n);\n\nconst result = visit(tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]), visitor);\n// ^ \"tupleTypeNode(numberTypeNode,publicKeyTypeNode)\"\n```\n\nHere's another example, counting the number of traversed nodes.\n\n```ts\nconst visitor = mergeVisitor(\n    () => 1,\n    (, values) => values.reduce((a, b) => a + b, 1),\n);\n\nconst result = visit(tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]), visitor);\n// ^ 3\n```\n\nThe `mergeVisitor` is a powerful starting point to create aggregating visitors.\n\n## Composing visitors\n\nThe following visitor functions accept an existing visitor and return a new visitor that extends or modifies the behaviour of the provided visitor. These primitives can be used to create complex visitors by composing simpler ones.\n\n### `extendVisitor`\n\nThe `extendVisitor` function accepts a base visitor and a set of function wrappers that are used to extend the behaviour of the base visitor.\n\nEach function wrapper is given the `node` being visited and an object composed of two elements:\n\n- `next`: A function that can be called to delegate to the base visitor — e.g. `next(node)`.\n- `self`: The visitor itself, allowing for recursive calls.\n\nTo illustrate this, consider the following base visitor that counts the number of nodes.\n\n```ts\nconst baseVisitor = mergeVisitor(\n    () => 1,\n    (_, values) => values.reduce((a, b) => a + b, 1),\n);\n```\n\nWe can extend this visitor to increment the count by 10 when visiting a `PublicKeyTypeNode` like so:\n\n```ts\nconst visitor = extendVisitor(baseVisitor, {\n    visitPublicKeyType: (node, { next }) => next(node) + 10,\n});\n\nconst result = visit(tupleTypeNode([publicKeyTypeNode(), numberTypeNode('u32')]), visitor);\n// ^ 13\n```\n\nNotice how `next(node)` can be used to access the underlying visitor meaning we can extend both the input and the output of the base visitor.\n\nAnother example is to make use of the `self` property to recursively call the extended visitor. For instance, the following code only visits the first item of tuple types.\n\n```ts\nconst visitor = extendVisitor(baseVisitor, {\n    visitTupleType: (node, { self }) => visit(node.items[0], self) + 1,\n});\n\nconst result = visit(tupleTypeNode([tupleTypeNode([publicKeyTypeNode()]), numberTypeNode('u32')]), visitor);\n// ^ 3\n```\n\n### `interceptVisitor`\n\nThe `interceptVisitor` allows us to wrap every visiting function of a provided visitor into a given function. This function has access to the node being visited and a `next` function that can be called to delegate to the base visitor.\n\nFor instance, the following visitor intercepts a `voidVisitor` and captures events when visiting nodes.\n\n```ts\nconst events: string[] = [];\nconst visitor = interceptVisitor(voidVisitor(), (node, next) => {\n    events.push(`down:${node.kind}`);\n    next(node);\n    events.push(`up:${node.kind}`);\n});\n\nvisit(tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]), visitor);\n// events === [\n//     'down:tupleTypeNode',\n//     'down:numberTypeNode',\n//     'up:numberTypeNode',\n//     'down:publicKeyTypeNode',\n//     'up:publicKeyTypeNode',\n//     'up:tupleTypeNode',\n// ]\n```\n\n### `interceptFirstVisitVisitor`\n\nThe `interceptFirstVisitVisitor` works the same way as the `interceptVisitor` but only intercepts the first visit of a node. This means that the provided function is called when visiting the specific node provided but not when visiting its children. The parameters are the same as for the `interceptVisitor`.\n\nFor instance, the following visitor intercepts a `voidVisitor` and captures events only during the first visit.\n\n```ts\nconst events: string[] = [];\nconst visitor = interceptFirstVisitVisitor(voidVisitor(), (node, next) => {\n    events.push(`down:${node.kind}`);\n    next(node);\n    events.push(`up:${node.kind}`);\n});\n\nvisit(tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]), visitor);\n// events === [\n//     'down:tupleTypeNode',\n//     'up:tupleTypeNode',\n// ]\n```\n\n### `tapVisitor`\n\nThe `tapVisitor` function allows us to tap into the visiting functions of a provided visitor without modifying its behaviour. This means the returned visitor will behave exactly like the base visitor except that the provided function will be called for the specified node kind.\n\nNote that the provided function must not return a value as it is only used for side effects.\n\n```ts\nlet numberOfNumberNodes = 0;\nconst visitor = tapVisitor(voidVisitor(), 'numberTypeNode', node => {\n    numberOfNumberNodes++;\n});\n\nvisit(tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]), visitor);\n// numberOfNumberNodes === 1\n```\n\n### `mapVisitor`\n\nThe `mapVisitor` function accepts a base visitor of type `Visitor<T>` and a function of type `(value: T) => U`; and returns a new visitor of type `Visitor<U>`.\n\n```ts\n// Gets a nested string representation of node kinds.\nconst baseVisitor = mergeVisitor(\n    node => node.kind as string,\n    (node, values) => `${node.kind}(${values.join(',')})`,\n);\n\n// Counts the number of characters in the string representation.\nconst visitor = mapVisitor(baseVisitor, (value: string): number => value.length);\n\nconst result = visit(tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]), visitor);\n// ^ 47\n```\n\n### `pipe`\n\nThe `pipe` helper function allows us to compose visitors in a more readable way. It accepts a base visitor and a set of visitor functions that are used to extend the behaviour of the previous visitor at each step.\n\n```ts\nconst visitor = pipe(\n    baseVisitor,\n    v => extendVisitor(v /** ... */),\n    v => interceptVisitor(v /** ... */),\n    v => mapVisitor(v /** ... */),\n    v => tapVisitor(v /** ... */),\n);\n```\n\nFor instance, here's an example using the `pipe` function to transform an `identityVisitor` into a visitor that:\n\n- Transforms all number types into `u64` numbers.\n- Logs the amount of items in tuple types.\n- Wraps the visited node in a `DefinedTypeNode` labelled \"gift\".\n\n```ts\nconst visitor = pipe(\n    // Starts with the identity visitor.\n    identityVisitor(),\n    v =>\n        // Extends the visitor to make all number types u64.\n        extendVisitor(v, {\n            visitNumberType: node => numberTypeNode('u64'),\n        }),\n    v =>\n        // Log the amount of items in tuple types.\n        tapVisitor(v, 'tupleTypeNode', node => {\n            console.log(node.items.length);\n        }),\n    v =>\n        // Wrap the visited node in a `DefinedTypeNode` labelled \"gift\".\n        interceptVisitor(v, node => (node, next) => {\n            return definedTypeNode({ name: 'gift', type: next(node) });\n        }),\n);\n```\n\n### `singleNodeVisitor`\n\nThe `singleNodeVisitor` function is a simple primitive that creates a `Visitor` that only visits a single node kind. It accepts a node kind and a function that is used to visit that node kind. Any other node kind will not be supported by the visitor.\n\n```ts\nconst visitor = singleNodeVisitor('tupleTypeNode', node => node.items.length);\n\nconst result = visit(tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]), visitor);\n// ^ 2\n```\n\nAdditionally, a `rootNodeVisitor` shortcut is provided to create a visitor that only visits `RootNodes`. This can be useful to design top-level visitors using custom logic.\n\nFor instance, we can create a visitor that takes a `RootNode` and updates it through a series of other visitors before returning the updated `RootNode`.\n\n```ts\nconst visitor = rootNodeVisitor((root: RootNode) => {\n    let newRoot = root;\n    newRoot = visit(newRoot, visitorA);\n    newRoot = visit(newRoot, visitorB);\n    newRoot = visit(newRoot, visitorC);\n    return newRoot;\n});\n```\n\n## Recording node paths\n\n### `NodePath`\n\nThe `NodePath` type defines an immutable array of `Nodes` that represents any path of nodes in the Codama IDL. It accepts an optional type parameter that tells us the type of the last node in the path. For instance `NodePath<NumberTypeNode>` represents a path of node ending with a `NumberTypeNode`.\n\nAdditionally, there are several utility functions to use with `NodePath` instances:\n\n```ts\n// An example of a node path.\nconst path: NodePath<AccountNode> = [rootNode, programNode, accountNode];\n\n// Access the last node in the path. I.e. given NodePath<T>, returns T.\nconst lastNode: AccountNode = getLastNodeFromPath(path);\n\n// Access the first/last node of a specific kind in the path.\nconst firstProgramNode: ProgramNode | undefined = findFirstNodeFromPath(path, 'programNode');\nconst lastProgramNode: ProgramNode | undefined = findLastNodeFromPath(path, 'programNode');\n\n// Access the last program/instruction node in the path (sugar for `findLastNodeFromPath`).\nconst programNode: ProgramNode | undefined = findProgramNodeFromPath(path);\nconst instructionNode: InstructionNode | undefined = findInstructionNodeFromPath(path);\n\n// Get the subpath of a path from the beginning to the last node matching a specific kind.\nconst subpath: NodePath = getNodePathUntilLastNode(path, 'programNode');\n// ^ [rootNode, programNode]\n\n// Check that a path is not empty.\nif (isFilledNodePath(path as NodePath)) {\n    path satisfies NodePath<Node>;\n}\n\n// Check that a path finishes with a node matching the provided kind or kinds.\nif (isNodePath(path as NodePath, ['AccountNode', 'InstructionNode'])) {\n    path satisfies NodePath<AccountNode | InstructionNode>;\n}\n\n// Assert that a path finishes with a node matching the provided kind or kinds.\nassertIsNodePath(path as NodePath, ['AccountNode', 'InstructionNode']);\npath satisfies NodePath<AccountNode | InstructionNode>;\n\n// Display paths as strings or arrays of strings.\nnodePathToStringArray(path); // -> ['[rootNode]', '[programNode]token', '[accountNode]mint']\nnodePathToString(path); // -> \"[rootNode] > [programNode]token > [accountNode]mint\"\n```\n\n### `NodeStack`\n\nThe `NodeStack` class is a utility that allows us to record the path of nodes that led to the node being currently visited. It is essentially a mutable version of `NodePath` that pushes and pops `Nodes` as we go down and up the tree of nodes.\n\nFor instance, consider the following node:\n\n```ts\nconst node = definedTypeNode({\n    name: 'myType',\n    type: tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]),\n});\n```\n\nIn this example, the `numberTypeNode` can be reached using the following stack:\n\n```ts\nconst stack = new NodeStack()\n    .push(node) // -> definedTypeNode.\n    .push(node.type) // -> tupleTypeNode.\n    .push(node.type.items[0]); // -> numberTypeNode.\n```\n\nOnce you have access to a `NodeStack` instance, you may use the following methods:\n\n```ts\n// Push a node to the stack.\nnodeStack.push(node);\n\n// Pop the last node out of the stack.\nconst lastNode = nodeStack.pop();\n\n// Peek at the last node in the stack.\nconst lastNode = nodeStack.peek();\n\n// Get all the nodes in the stack as an immutable `NodePath` array.\nconst path: NodePath = nodeStack.getPath();\n\n// Get a `NodePath` whilst asserting on the last node kind.\nconst path: NodePath<AccountNode> = nodeStack.getPath('accountNode');\n\n// Check if the stack is empty.\nconst isEmpty = nodeStack.isEmpty();\n\n// Clone the stack.\nconst clonedStack = nodeStack.clone();\n```\n\nAdditionally, it is possible to save and restore multiple node paths within a `NodeStack` by using the `pushPath` and `popPath` methods. This is for more advanced uses cases where you need to jump from one part of the tree, to a different part of the tree, and back — without loosing the context of the original path. An application of this is when we need to follow a node from a `LinkNode` (see [\"Resolving link nodes\"](#resolving-link-nodes) below for more details).\n\n```ts\n// Save the current path and push a new path.\nstack.pushPath([rootNode, programNode, linkableNode]);\n\n// Pop the current path and restore the previous path.\nconst previousPath = stack.popPath();\n```\n\n### `recordNodeStackVisitor`\n\nThe `recordNodeStackVisitor` function gives us a convenient way to record the stack of each node currently being visited. It accepts a base visitor and an empty `NodeStack` instance that will automatically be pushed and popped as the visitor traverses the nodes. This means that we can inject the `NodeStack` instance into another extension of the visitor to access the stack whilst visiting the nodes.\n\nNote that the `recordNodeStackVisitor` **should be the last visitor** in the pipe to ensure that the stack is correctly recorded and that the current node visited is part of the stack.\n\nFor instance, here's how we can log the `NodeStack` of any base visitor as we visit the nodes.\n\n```ts\nconst stack = new NodeStack();\nconst visitor = pipe(\n    baseVisitor,\n    v =>\n        interceptVisitor(v, (node, next) => {\n            console.log(nodePathToString(stack.getPath()));\n            return next(node);\n        }),\n    v => recordNodeStackVisitor(v, stack),\n);\n```\n\nAlso note that some core visitors such as the `bottomUpTransformerVisitor` or the `getByteSizeVisitor` use a `NodeStack` internally to keep track of the current path. If you use these visitor within another visitor, you may wish to provide your own `NodeStack` instance as an option so that the same `NodeStack` is used across all visitors throughout the traversal.\n\n```ts\nconst stack = new NodeStack();\nconst byteSizeVisitor = getByteSizeVisitor(..., { stack });\n\nconst visitor = pipe(\n    voidVisitor(),\n    v => tapVisitor(v, 'definedTypeNode', node => {\n        const byteSize = visit(node, byteSizeVisitor);\n        console.log(`The byte size of ${node.name} is ${byteSize}`);\n    }),\n    v => recordNodeStackVisitor(v, stack),\n);\n```\n\n## Selecting nodes\n\nWhen visiting a tree of nodes, it is often useful to be explicit about the paths we want to select. For instance, I may want to delete all accounts from a program node named \"token\".\n\nTo that end, the `NodeSelector` type represents a node selection that can take two forms:\n\n- A `NodeSelectorFunction` of type `(path: NodePath) => boolean`. In this case, the provided function is used to determine if the last node in the provided `NodePath` should be selected.\n- A `NodeSelectorPath` of type `string`. In this case, the provided string uses a simple syntax to select nodes.\n\nThe `NodeSelectorPath` syntax is as follows:\n\n- Plain text is used to match the name of a node, if any. For instance, `token` will match any node named \"token\".\n- Square brackets `[]` are used to match the kind of a node. For instance, `[programNode]` will match any `ProgramNode`.\n- Plain text and square brackets can be combined to match both the name and the kind of a node. For instance, `[programNode]token` will match any `ProgramNode` named \"token\".\n- Plain texts and/or square brackets can be chained using dots `.` to match several nodes in the current `NodeStack`.\n- Dot-separated paths must follow the provided order but do not need to be contiguous or exhaustive. This means that `a.b.c` will match a `NodeStack` that looks like `x.a.y.b.z.c` but not `b.a.c`.\n- The last item of a dot-separated path must match the last node of the `NodeStack`. For instance, `a.b` will not match `a.b.x`.\n- The wildcard `*` can be used at the end of the path to match any node within the matching path. For instance, `a.b.*` will match `a.b.x`.\n\nHere are some examples:\n\n```ts\n'[accountNode]';\n// Matches any `AccountNode`.\n\n'mint';\n// Matches any node named \"mint\".\n\n'[accountNode]mint';\n// Matches any `AccountNode` named \"mint\".\n\n'[programNode]token.[accountNode]mint';\n// Matches any `AccountNode` named \"mint\" within a `ProgramNode` named \"token\".\n\n'[programNode]token.*';\n// Matches any node within a `ProgramNode` named \"token\" (excluding the program node itself).\n\n'token.[structTypeNode].amount';\n// Matches any node named \"amount\" within a `StructTypeNode` within any node named \"token\".\n```\n\nThe `NodeSelector` type is used by various visitors such as the `bottomUpTransformerVisitor` or the `deleteNodesVisitor` to help us select the nodes we want to transform or delete.\n\n## Transforming nodes\n\nThis package offers several visitors to facilitate the transformation and/or deletion of nodes. These visitors are designed to be used in conjunction with the `NodeSelector` type to select the nodes we want to transform/delete.\n\n### `bottomUpTransformerVisitor`\n\nThe `bottomUpTransformerVisitor` traverses the nodes and intercepts them on the way back up. This means that when we reach a node, we have already visited all its children.\n\nThis visitor accepts an array of `transformers` where each transformer is an object with the following properties:\n\n- `select`: A `NodeSelector` or an array of `NodeSelectors` used to select the nodes we want to transform. When multiple selectors are provided, they must all match for the node to be selected.\n- `transform`: A function that accepts the selected node and its `NodeStack`; and returns a new node or `null` to delete the node.\n\nHere are a few examples:\n\n```ts\nconst visitor = bottomUpTransformerVisitor([\n    {\n        // Transform all numbers into u64 numbers.\n        select: '[numberTypeNode]',\n        transform: () => numberTypeNode('u64'),\n    },\n    {\n        // Delete all account nodes that start with \"m\".\n        select: [\n            '[accountNode]',\n            path => {\n                const node = getLastNodeFromPath(path);\n                return 'name' in node && node.name.startsWith('m');\n            },\n        ],\n        transform: () => null,\n    },\n    {\n        // Prefix all fields inside a defined type with \"super\".\n        select: '[definedTypeNode]metadata.[structFieldTypeNode]',\n        transform: node => structFieldTypeNode({ ...node, name: `super${pascalCase(node.name)}` }),\n    },\n]);\n```\n\nAdditionally, `transformers` can be provided directly as functions. In this case, the function is used to transform all the nodes and further filtering may be needed inside the function.\n\n```ts\nconst visitor = bottomUpTransformerVisitor([\n    (node, stack) => {\n        if (!isNode(node, numberTypeNode)) {\n            return node;\n        }\n        const swappedEndian = node.endian === 'be' ? 'le' : 'be';\n        return numberTypeNode(node.format, swappedEndian);\n    },\n]);\n```\n\nBy default, this visitor will keep track of its own `NodeStack` but you may provide your own via the `stack` option in order to share the same `NodeStack` across multiple visitors.\n\n### `topDownTransformerVisitor`\n\nThe `topDownTransformerVisitor` works the same way as the `bottomUpTransformerVisitor` but intercepts the nodes on the way down. This means that when we reach a node, we have not yet visited its children.\n\n```ts\nconst visitor = topDownTransformerVisitor([\n    {\n        // Half the amount of all accounts and instructions in programs.\n        // The other half won't be visited on the way down.\n        select: '[programNode]',\n        transform: node =>\n            programNode({\n                ...node,\n                accounts: node.accounts.slice(0, Math.floor(node.accounts.length / 2)),\n                instructions: node.instructions.slice(0, Math.floor(node.instructions.length / 2)),\n            }),\n    },\n]);\n```\n\nHere as well, you may use the `stack` option to provide your own `NodeStack` instance.\n\n### `deleteNodesVisitor`\n\nThe `deleteNodesVisitor` accepts an array of `NodeSelectors` and deletes all the nodes that match any of the provided selectors. Therefore, it is equivalent to using a transformer visitor such that the `transform` function returns `null` for the selected nodes.\n\n```ts\n// Deletes all account nodes named \"mint\" and all number type nodes.\nconst visitor = deleteNodesVisitor(['[accountNode]mint', '[numberTypeNode]']);\n```\n\nHere as well, you may use the `stack` option to provide your own `NodeStack` instance.\n\n## String representations\n\nThis package also offers visitors that help render nodes as strings. These visitors can be useful for debugging purposes as well as getting a unique hash string representation of a node.\n\n### `getDebugStringVisitor`\n\nThe `getDebugStringVisitor` provides a string representation of the nodes that can be used for debugging purposes. By default, it inlines the content of the nodes and does not include any indentation.\n\n```ts\nconst visitor = getDebugStringVisitor();\nconst result = visit(tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]), visitor);\n// ^ \"tupleTypeNode(numberTypeNode[u32], publicKeyTypeNode)\"\n```\n\nHowever, you can provide the `indent` option to get a more readable string representation.\n\n```ts\nconst visitor = getDebugStringVisitor({ indent: true });\nconst result = visit(tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]), visitor);\n// tupleTypeNode\n// |   numberTypeNode [u32]\n// |   publicKeyTypeNode\n```\n\nNote that this string does not always include every piece of information a node has to offer. Therefore, it cannot be used as a unique identifier for the content of a node. For that purpose, see the `getUniqueHashStringVisitor` below.\n\n### `getUniqueHashStringVisitor`\n\nThe `getUniqueHashStringVisitor` provides a unique string representation of the node that can be used to get a unique hash for that node. In other words, if two different nodes have the exact same content, they will output the same string.\n\n```ts\nconst visitor = getUniqueHashStringVisitor();\nconst result = visit(tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]), visitor);\n// ^ '{\"items\":[{\"endian\":\"le\",\"format\":\"u32\",\"kind\":\"numberTypeNode\"},{\"kind\":\"publicKeyTypeNode\"}],\"kind\":\"tupleTypeNode\"}'\n```\n\n### `consoleLogVisitor`\n\nThe `consoleLogVisitor` accepts any `Visitor<string>` and transforms it into a `Visitor<void>` such that the provided `string` is logged to the console.\n\n```ts\n// Outputs the indented debug string to the console.\nconst visitor = consoleLogVisitor(getDebugStringVisitor({ indent: true }));\n```\n\n## Resolving link nodes\n\n### `LinkableDictionary`\n\nThe `LinkableDictionary` type is a utility that allows us to store and access linkable nodes — such as `ProgramNodes`, `AccountNodes` or `PdaNodes` — from their respective [link nodes](../nodes/linkNodes/README.md).\n\nIt offers the following API:\n\n```ts\nconst linkables = new LinkableDictionary();\n\n// Record linkable nodes via their full path.\nlinkables.recordPath([rootNode, programNode, accountNode]);\n\n// Get a linkable node using the full path of a link node, or return undefined if it is not found.\nconst programNode: ProgramNode | undefined = linkables.get([...somePath, programLinkNode]);\n\n// Get a linkable node using the full path of a link node, or throw an error if it is not found.\nconst programNode: ProgramNode = linkables.getOrThrow([...somePath, programLinkNode]);\n\n// Get the path of a linkable node using the full path of a link node, or return undefined if it is not found.\nconst accountPath: NodePath<AccountNode> | undefined = linkables.getPath([...somePath, accountLinkNode]);\n\n// Get the path of a linkable node using the full path of a link node, or throw an error if it is not found.\nconst accountPath: NodePath<AccountNode> = linkables.getPathOrThrow([...somePath, accountLinkNode]);\n```\n\nNote that:\n\n- The path of the recorded node must be provided when recording a linkable node.\n- The path of the link node must be provided when getting a linkable node (or its path) from it.\n\nThis API may be used with the `recordLinkablesOnFirstVisitVisitor` to record the linkable nodes before the first node visit; as well as the `recordNodeStackVisitor` to keep track of the current node path when accessing the linkable nodes.\n\n### `getRecordLinkablesVisitor`\n\nThis visitor accepts a `LinkableDictionary` instance and records all linkable nodes it encounters when visiting the nodes.\n\n```ts\nconst linkables = new LinkableDictionary();\nvisit(rootNode, getRecordLinkablesVisitor(linkables));\n// Now, all linkable nodes are recorded in the `linkables` dictionary.\n```\n\n### `recordLinkablesOnFirstVisitVisitor`\n\nThis visitor is a utility that combines `interceptFirstVisitVisitor` and `getRecordLinkablesVisitor` to record all linkable nodes before the first visit of any node.\n\nIt accepts a base visitor and a `LinkableDictionary` instance; and returns a new visitor that records all linkable nodes it encounters before the very first visit of the provided base visitor. This means that we can inject the `LinkableDictionary` instance into other extensions of the base visitor to resolve any link node we encounter.\n\nNote that the `recordLinkablesOnFirstVisitVisitor` **should be the last visitor** in the pipe to ensure that all linkable nodes are recorded before being used.\n\nHere's an example that records a `LinkableDictionary` and uses it to log the amount of seeds in each linked PDA node.\n\n```ts\nconst linkables = new LinkableDictionary();\nconst stack = new NodeStack();\nconst visitor = pipe(\n    baseVisitor,\n    v =>\n        tapVisitor(v, 'pdaLinkNode', node => {\n            const pdaNode = linkables.getOrThrow(stack.getPath(node.kind));\n            console.log(`${pdaNode.seeds.length} seeds`);\n        }),\n    v => recordNodeStackVisitor(v, stack),\n    v => recordLinkablesOnFirstVisitVisitor(v, linkables),\n);\n```\n\n## Other useful visitors\n\nThis package provides a few other visitors that may help build more complex visitors.\n\n### `getByteSizeVisitor`\n\nThe `getByteSizeVisitor` calculates the byte size of a given `TypeNode`. It returns a `number` if the byte size is fixed or `null` if it is variable. It requires a `LinkableDictionary` instance to resolve any link nodes it encounters.\n\n```ts\nconst visitor = getByteSizeVisitor(linkables);\nconst size = visit(tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]), visitor);\n// ^ 36 (4 bytes for the u32 number and 32 bytes for the public key)\n```\n\nBy default, this visitor will keep track of its own `NodeStack` but you may provide your own via the `stack` option in order to share the same `NodeStack` across multiple visitors.\n\n### `getResolvedInstructionInputsVisitor`\n\nThe `getResolvedInstructionInputsVisitor` visits `InstructionNodes` only and returns an array of instruction accounts and arguments in the order they should be rendered for their default values to be resolved.\n\nFor instance, say we have an instruction with two accounts and one argument such that `argumentA` defaults to `accountB` and `accountA` is a PDA that uses `argumentA` as a seed. Therefore, the visitor will return an array in the order `[accountB, argumentA, accountA]`.\n\nThis is mostly useful when rendering client code for instructions.\n\n### `removeDocsVisitor`\n\nThe `removeDocsVisitor` goes through all nodes that have a `docs` property and clears its content.\n\n```ts\nconst node = definedTypeNode({\n    name: 'authority',\n    type: publicKeyTypeNode(),\n    docs: ['The authority of the account'],\n});\nconst updatedNode = visit(node, removeDocsVisitor());\n// ^ definedTypeNode({ name: 'authority', type: publicKeyTypeNode() })\n```\n\nThis is used internally by the `getUniqueHashStringVisitor` to get a unique identifier for a node regardless of its documentation.\n"
  },
  {
    "path": "packages/visitors-core/package.json",
    "content": "{\n    \"name\": \"@codama/visitors-core\",\n    \"version\": \"1.6.0\",\n    \"description\": \"Core visitors for the Codama framework\",\n    \"exports\": {\n        \"types\": \"./dist/types/index.d.ts\",\n        \"react-native\": \"./dist/index.react-native.mjs\",\n        \"browser\": {\n            \"import\": \"./dist/index.browser.mjs\",\n            \"require\": \"./dist/index.browser.cjs\"\n        },\n        \"node\": {\n            \"import\": \"./dist/index.node.mjs\",\n            \"require\": \"./dist/index.node.cjs\"\n        }\n    },\n    \"browser\": {\n        \"./dist/index.node.cjs\": \"./dist/index.browser.cjs\",\n        \"./dist/index.node.mjs\": \"./dist/index.browser.mjs\"\n    },\n    \"main\": \"./dist/index.node.cjs\",\n    \"module\": \"./dist/index.node.mjs\",\n    \"react-native\": \"./dist/index.react-native.mjs\",\n    \"types\": \"./dist/types/index.d.ts\",\n    \"type\": \"commonjs\",\n    \"files\": [\n        \"./dist/types\",\n        \"./dist/index.*\"\n    ],\n    \"sideEffects\": false,\n    \"keywords\": [\n        \"solana\",\n        \"framework\",\n        \"standard\",\n        \"visitors\"\n    ],\n    \"scripts\": {\n        \"build\": \"rimraf dist && tsup && tsc -p ./tsconfig.declarations.json\",\n        \"dev\": \"vitest --project node\",\n        \"lint\": \"eslint . && prettier --check .\",\n        \"lint:fix\": \"eslint --fix . && prettier --write .\",\n        \"test\": \"pnpm test:types && pnpm test:treeshakability && pnpm test:unit\",\n        \"test:treeshakability\": \"for file in dist/index.*.mjs; do agadoo $file; done\",\n        \"test:types\": \"tsc --noEmit\",\n        \"test:unit\": \"vitest run\"\n    },\n    \"dependencies\": {\n        \"@codama/errors\": \"workspace:*\",\n        \"@codama/nodes\": \"workspace:*\",\n        \"json-stable-stringify\": \"^1.3.0\"\n    },\n    \"devDependencies\": {\n        \"@types/json-stable-stringify\": \"^1.2.0\"\n    },\n    \"license\": \"MIT\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/codama-idl/codama\"\n    },\n    \"bugs\": {\n        \"url\": \"http://github.com/codama-idl/codama/issues\"\n    },\n    \"browserslist\": [\n        \"supports bigint and not dead\",\n        \"maintained node versions\"\n    ]\n}\n"
  },
  {
    "path": "packages/visitors-core/src/LinkableDictionary.ts",
    "content": "import { CODAMA_ERROR__LINKED_NODE_NOT_FOUND, CodamaError } from '@codama/errors';\nimport {\n    AccountNode,\n    CamelCaseString,\n    DefinedTypeNode,\n    InstructionAccountNode,\n    InstructionArgumentNode,\n    InstructionNode,\n    isNode,\n    LinkNode,\n    PdaNode,\n    ProgramNode,\n} from '@codama/nodes';\n\nimport {\n    findInstructionNodeFromPath,\n    findProgramNodeFromPath,\n    getLastNodeFromPath,\n    getNodePathUntilLastNode,\n    isNodePath,\n    NodePath,\n} from './NodePath';\n\nexport type LinkableNode =\n    | AccountNode\n    | DefinedTypeNode\n    | InstructionAccountNode\n    | InstructionArgumentNode\n    | InstructionNode\n    | PdaNode\n    | ProgramNode;\n\nexport const LINKABLE_NODES: LinkableNode['kind'][] = [\n    'accountNode',\n    'definedTypeNode',\n    'instructionAccountNode',\n    'instructionArgumentNode',\n    'instructionNode',\n    'pdaNode',\n    'programNode',\n];\n\nexport type GetLinkableFromLinkNode<TLinkNode extends LinkNode> = {\n    accountLinkNode: AccountNode;\n    definedTypeLinkNode: DefinedTypeNode;\n    instructionAccountLinkNode: InstructionAccountNode;\n    instructionArgumentLinkNode: InstructionArgumentNode;\n    instructionLinkNode: InstructionNode;\n    pdaLinkNode: PdaNode;\n    programLinkNode: ProgramNode;\n}[TLinkNode['kind']];\n\ntype ProgramDictionary = {\n    accounts: Map<string, NodePath<AccountNode>>;\n    definedTypes: Map<string, NodePath<DefinedTypeNode>>;\n    instructions: Map<string, InstructionDictionary>;\n    pdas: Map<string, NodePath<PdaNode>>;\n    program: NodePath<ProgramNode>;\n};\n\ntype InstructionDictionary = {\n    accounts: Map<string, NodePath<InstructionAccountNode>>;\n    arguments: Map<string, NodePath<InstructionArgumentNode>>;\n    instruction: NodePath<InstructionNode>;\n};\n\nexport class LinkableDictionary {\n    readonly programs: Map<string, ProgramDictionary> = new Map();\n\n    recordPath(linkablePath: NodePath<LinkableNode>): this {\n        const linkableNode = getLastNodeFromPath(linkablePath);\n        const programDictionary = this.getOrCreateProgramDictionary(linkablePath);\n        if (!programDictionary) return this; // Do not record nodes that are outside of a program.\n        const instructionDictionary = this.getOrCreateInstructionDictionary(programDictionary, linkablePath);\n\n        if (isNodePath(linkablePath, 'accountNode')) {\n            programDictionary.accounts.set(linkableNode.name, linkablePath);\n        } else if (isNodePath(linkablePath, 'definedTypeNode')) {\n            programDictionary.definedTypes.set(linkableNode.name, linkablePath);\n        } else if (isNodePath(linkablePath, 'pdaNode')) {\n            programDictionary.pdas.set(linkableNode.name, linkablePath);\n        } else if (instructionDictionary && isNodePath(linkablePath, 'instructionAccountNode')) {\n            instructionDictionary.accounts.set(linkableNode.name, linkablePath);\n        } else if (instructionDictionary && isNodePath(linkablePath, 'instructionArgumentNode')) {\n            instructionDictionary.arguments.set(linkableNode.name, linkablePath);\n        }\n\n        return this;\n    }\n\n    getPathOrThrow<TLinkNode extends LinkNode>(\n        linkPath: NodePath<TLinkNode>,\n    ): NodePath<GetLinkableFromLinkNode<TLinkNode>> {\n        const linkablePath = this.getPath(linkPath);\n\n        if (!linkablePath) {\n            const linkNode = getLastNodeFromPath(linkPath);\n            throw new CodamaError(CODAMA_ERROR__LINKED_NODE_NOT_FOUND, {\n                kind: linkNode.kind,\n                linkNode,\n                name: linkNode.name,\n                path: linkPath,\n            });\n        }\n\n        return linkablePath;\n    }\n\n    getPath<TLinkNode extends LinkNode>(\n        linkPath: NodePath<TLinkNode>,\n    ): NodePath<GetLinkableFromLinkNode<TLinkNode>> | undefined {\n        const linkNode = getLastNodeFromPath(linkPath);\n        const programDictionary = this.getProgramDictionary(linkPath);\n        if (!programDictionary) return undefined;\n        const instructionDictionary = this.getInstructionDictionary(programDictionary, linkPath);\n        type LinkablePath = NodePath<GetLinkableFromLinkNode<TLinkNode>> | undefined;\n\n        if (isNode(linkNode, 'accountLinkNode')) {\n            return programDictionary.accounts.get(linkNode.name) as LinkablePath;\n        } else if (isNode(linkNode, 'definedTypeLinkNode')) {\n            return programDictionary.definedTypes.get(linkNode.name) as LinkablePath;\n        } else if (isNode(linkNode, 'instructionAccountLinkNode')) {\n            return instructionDictionary?.accounts.get(linkNode.name) as LinkablePath;\n        } else if (isNode(linkNode, 'instructionArgumentLinkNode')) {\n            return instructionDictionary?.arguments.get(linkNode.name) as LinkablePath;\n        } else if (isNode(linkNode, 'instructionLinkNode')) {\n            return instructionDictionary?.instruction as LinkablePath;\n        } else if (isNode(linkNode, 'pdaLinkNode')) {\n            return programDictionary.pdas.get(linkNode.name) as LinkablePath;\n        } else if (isNode(linkNode, 'programLinkNode')) {\n            return programDictionary.program as LinkablePath;\n        }\n\n        return undefined;\n    }\n\n    getOrThrow<TLinkNode extends LinkNode>(linkPath: NodePath<TLinkNode>): GetLinkableFromLinkNode<TLinkNode> {\n        return getLastNodeFromPath(this.getPathOrThrow(linkPath));\n    }\n\n    get<TLinkNode extends LinkNode>(linkPath: NodePath<TLinkNode>): GetLinkableFromLinkNode<TLinkNode> | undefined {\n        const path = this.getPath(linkPath);\n        return path ? getLastNodeFromPath(path) : undefined;\n    }\n\n    has(linkPath: NodePath<LinkNode>): boolean {\n        const linkNode = getLastNodeFromPath(linkPath);\n        const programDictionary = this.getProgramDictionary(linkPath);\n        if (!programDictionary) return false;\n        const instructionDictionary = this.getInstructionDictionary(programDictionary, linkPath);\n\n        if (isNode(linkNode, 'accountLinkNode')) {\n            return programDictionary.accounts.has(linkNode.name);\n        } else if (isNode(linkNode, 'definedTypeLinkNode')) {\n            return programDictionary.definedTypes.has(linkNode.name);\n        } else if (isNode(linkNode, 'instructionAccountLinkNode')) {\n            return !!instructionDictionary && instructionDictionary.accounts.has(linkNode.name);\n        } else if (isNode(linkNode, 'instructionArgumentLinkNode')) {\n            return !!instructionDictionary && instructionDictionary.arguments.has(linkNode.name);\n        } else if (isNode(linkNode, 'instructionLinkNode')) {\n            return programDictionary.instructions.has(linkNode.name);\n        } else if (isNode(linkNode, 'pdaLinkNode')) {\n            return programDictionary.pdas.has(linkNode.name);\n        } else if (isNode(linkNode, 'programLinkNode')) {\n            return true;\n        }\n\n        return false;\n    }\n\n    private getOrCreateProgramDictionary(linkablePath: NodePath<LinkableNode>): ProgramDictionary | undefined {\n        const linkableNode = getLastNodeFromPath(linkablePath);\n        const programNode = isNode(linkableNode, 'programNode') ? linkableNode : findProgramNodeFromPath(linkablePath);\n        if (!programNode) return undefined;\n\n        let programDictionary = this.programs.get(programNode.name);\n        if (!programDictionary) {\n            programDictionary = {\n                accounts: new Map(),\n                definedTypes: new Map(),\n                instructions: new Map(),\n                pdas: new Map(),\n                program: getNodePathUntilLastNode(linkablePath, 'programNode')!,\n            };\n            this.programs.set(programNode.name, programDictionary);\n        }\n\n        return programDictionary;\n    }\n\n    private getOrCreateInstructionDictionary(\n        programDictionary: ProgramDictionary,\n        linkablePath: NodePath<LinkableNode>,\n    ): InstructionDictionary | undefined {\n        const linkableNode = getLastNodeFromPath(linkablePath);\n        const instructionNode = isNode(linkableNode, 'instructionNode')\n            ? linkableNode\n            : findInstructionNodeFromPath(linkablePath);\n        if (!instructionNode) return undefined;\n\n        let instructionDictionary = programDictionary.instructions.get(instructionNode.name);\n        if (!instructionDictionary) {\n            instructionDictionary = {\n                accounts: new Map(),\n                arguments: new Map(),\n                instruction: getNodePathUntilLastNode(linkablePath, 'instructionNode')!,\n            };\n            programDictionary.instructions.set(instructionNode.name, instructionDictionary);\n        }\n\n        return instructionDictionary;\n    }\n\n    private getProgramDictionary(linkPath: NodePath<LinkNode>): ProgramDictionary | undefined {\n        const linkNode = getLastNodeFromPath(linkPath);\n        let programName: CamelCaseString | undefined = undefined;\n        if (isNode(linkNode, 'programLinkNode')) {\n            programName = linkNode.name;\n        } else if ('program' in linkNode) {\n            programName = linkNode.program?.name;\n        } else if ('instruction' in linkNode) {\n            programName = linkNode.instruction?.program?.name;\n        }\n        programName = programName ?? findProgramNodeFromPath(linkPath)?.name;\n\n        return programName ? this.programs.get(programName) : undefined;\n    }\n\n    private getInstructionDictionary(\n        programDictionary: ProgramDictionary,\n        linkPath: NodePath<LinkNode>,\n    ): InstructionDictionary | undefined {\n        const linkNode = getLastNodeFromPath(linkPath);\n        let instructionName: CamelCaseString | undefined = undefined;\n        if (isNode(linkNode, 'instructionLinkNode')) {\n            instructionName = linkNode.name;\n        } else if ('instruction' in linkNode) {\n            instructionName = linkNode.instruction?.name;\n        }\n        instructionName = instructionName ?? findInstructionNodeFromPath(linkPath)?.name;\n\n        return instructionName ? programDictionary.instructions.get(instructionName) : undefined;\n    }\n}\n"
  },
  {
    "path": "packages/visitors-core/src/NodePath.ts",
    "content": "import { assertIsNode, GetNodeFromKind, InstructionNode, isNode, Node, NodeKind, ProgramNode } from '@codama/nodes';\n\nexport type NodePath<TNode extends Node | undefined = undefined> = TNode extends undefined\n    ? readonly Node[]\n    : readonly [...(readonly Node[]), TNode];\n\nexport function getLastNodeFromPath<TNode extends Node>(path: NodePath<TNode>): TNode {\n    return path[path.length - 1] as TNode;\n}\n\nexport function findFirstNodeFromPath<TKind extends NodeKind>(\n    path: NodePath,\n    kind: TKind | TKind[],\n): GetNodeFromKind<TKind> | undefined {\n    return path.find(node => isNode(node, kind));\n}\n\nexport function findLastNodeFromPath<TKind extends NodeKind>(\n    path: NodePath,\n    kind: TKind | TKind[],\n): GetNodeFromKind<TKind> | undefined {\n    for (let index = path.length - 1; index >= 0; index--) {\n        const node = path[index];\n        if (isNode(node, kind)) return node;\n    }\n    return undefined;\n}\n\nexport function findProgramNodeFromPath(path: NodePath): ProgramNode | undefined {\n    return findLastNodeFromPath(path, 'programNode');\n}\n\nexport function findInstructionNodeFromPath(path: NodePath): InstructionNode | undefined {\n    return findLastNodeFromPath(path, 'instructionNode');\n}\n\nexport function getNodePathUntilLastNode<TKind extends NodeKind>(\n    path: NodePath,\n    kind: TKind | TKind[],\n): NodePath<GetNodeFromKind<TKind>> | undefined {\n    const lastIndex = (() => {\n        for (let index = path.length - 1; index >= 0; index--) {\n            const node = path[index];\n            if (isNode(node, kind)) return index;\n        }\n        return -1;\n    })();\n    if (lastIndex === -1) return undefined;\n    return path.slice(0, lastIndex + 1) as unknown as NodePath<GetNodeFromKind<TKind>>;\n}\n\nexport function isFilledNodePath(path: NodePath | null | undefined): path is NodePath<Node> {\n    return !!path && path.length > 0;\n}\n\nexport function isNodePath<TKind extends NodeKind>(\n    path: NodePath | null | undefined,\n    kind: TKind | TKind[],\n): path is NodePath<GetNodeFromKind<TKind>> {\n    return isNode(isFilledNodePath(path) ? getLastNodeFromPath<Node>(path) : null, kind);\n}\n\nexport function assertIsNodePath<TKind extends NodeKind>(\n    path: NodePath | null | undefined,\n    kind: TKind | TKind[],\n): asserts path is NodePath<GetNodeFromKind<TKind>> {\n    assertIsNode(isFilledNodePath(path) ? getLastNodeFromPath<Node>(path) : null, kind);\n}\n\nexport function nodePathToStringArray(path: NodePath): string[] {\n    return path.map((node): string => {\n        return 'name' in node ? `[${node.kind}]${node.name}` : `[${node.kind}]`;\n    });\n}\n\nexport function nodePathToString(path: NodePath): string {\n    return nodePathToStringArray(path).join(' > ');\n}\n"
  },
  {
    "path": "packages/visitors-core/src/NodeSelector.ts",
    "content": "import { camelCase, CamelCaseString, Node } from '@codama/nodes';\n\nimport { NodePath } from './NodePath';\n\nexport type NodeSelector = NodeSelectorFunction | NodeSelectorPath;\n\n/**\n * A string that can be used to select a node in a Codama tree.\n * - `*` matches any node.\n * - `someText` matches the name of a node, if any.\n * - `[someNode]` matches a node of the given kind.\n * - `[someNode|someOtherNode]` matches a node with any of the given kind.\n * - `[someNode]someText` matches both the kind and the name of a node.\n * - `a.b.c` matches a node `c` such that its ancestors contains `a` and `b` in order (but not necessarily subsequent).\n */\nexport type NodeSelectorPath = string;\n\nexport type NodeSelectorFunction = (path: NodePath<Node>) => boolean;\n\nexport const getNodeSelectorFunction = (selector: NodeSelector): NodeSelectorFunction => {\n    if (typeof selector === 'function') return selector;\n\n    const checkNode = (node: Node, nodeSelector: string): boolean => {\n        if (nodeSelector === '*') return true;\n        const matches = nodeSelector.match(/^(?:\\[([^\\]]+)\\])?(.*)?$/);\n        if (!matches) return false;\n        const [, kinds, name] = matches;\n\n        // Check kinds.\n        const kindArray = kinds ? kinds.split('|').map(camelCase) : [];\n        if (kindArray.length > 0 && !kindArray.includes(node.kind as CamelCaseString)) {\n            return false;\n        }\n\n        // Check names.\n        if (name && (!('name' in node) || camelCase(name) !== node.name)) {\n            return false;\n        }\n\n        return true;\n    };\n\n    const checkPath = (path: Node[], nodeSelectors: string[]): boolean => {\n        if (nodeSelectors.length === 0) return true;\n        if (path.length === 0) return false;\n        const lastNode = path.pop() as Node;\n        const lastNodeSelector = nodeSelectors.pop() as string;\n        return checkNode(lastNode, lastNodeSelector)\n            ? checkPath(path, nodeSelectors)\n            : checkPath(path, [...nodeSelectors, lastNodeSelector]);\n    };\n\n    const checkInitialPath = (path: Node[], nodeSelectors: string[]): boolean => {\n        if (nodeSelectors.length === 0 || path.length === 0) return false;\n        const lastNode = path.pop() as Node;\n        const lastNodeSelector = nodeSelectors.pop() as string;\n        return checkNode(lastNode, lastNodeSelector) && checkPath(path, nodeSelectors);\n    };\n\n    const nodeSelectors = selector.split('.');\n    return path => checkInitialPath([...path], [...nodeSelectors]);\n};\n\nexport const getConjunctiveNodeSelectorFunction = (selector: NodeSelector | NodeSelector[]): NodeSelectorFunction => {\n    const selectors = Array.isArray(selector) ? selector : [selector];\n    const selectorFunctions = selectors.map(getNodeSelectorFunction);\n    return path => selectorFunctions.every(fn => fn(path));\n};\n"
  },
  {
    "path": "packages/visitors-core/src/NodeStack.ts",
    "content": "import { CODAMA_ERROR__VISITORS__CANNOT_REMOVE_LAST_PATH_IN_NODE_STACK, CodamaError } from '@codama/errors';\nimport { GetNodeFromKind, Node, NodeKind } from '@codama/nodes';\n\nimport { assertIsNodePath, NodePath, nodePathToString } from './NodePath';\n\ntype MutableNodePath = Node[];\n\nexport class NodeStack {\n    /**\n     * Contains all the node paths saved during the traversal.\n     *\n     * - The very last path is the current path which is being\n     *   used during the traversal.\n     * - The other paths can be used to save and restore the\n     *   current path when jumping to different parts of the tree.\n     *\n     * There must at least be one path in the stack at all times.\n     */\n    private readonly stack: [...MutableNodePath[], MutableNodePath];\n\n    constructor(...stack: readonly [...(readonly NodePath[]), NodePath] | readonly []) {\n        this.stack =\n            stack.length === 0\n                ? [[]]\n                : ([...stack.map(nodes => [...nodes])] as [...MutableNodePath[], MutableNodePath]);\n    }\n\n    private get currentPath(): MutableNodePath {\n        return this.stack[this.stack.length - 1];\n    }\n\n    public push(node: Node): void {\n        this.currentPath.push(node);\n    }\n\n    public pop(): Node | undefined {\n        return this.currentPath.pop();\n    }\n\n    public peek(): Node | undefined {\n        return this.isEmpty() ? undefined : this.currentPath[this.currentPath.length - 1];\n    }\n\n    public pushPath(newPath: NodePath = []): void {\n        this.stack.push([...newPath]);\n    }\n\n    public popPath(): NodePath {\n        if (this.stack.length <= 1) {\n            throw new CodamaError(CODAMA_ERROR__VISITORS__CANNOT_REMOVE_LAST_PATH_IN_NODE_STACK, {\n                path: [...this.stack[this.stack.length - 1]],\n            });\n        }\n        return [...this.stack.pop()!];\n    }\n\n    public getPath(): NodePath;\n    public getPath<TKind extends NodeKind>(kind: TKind | TKind[]): NodePath<GetNodeFromKind<TKind>>;\n    public getPath<TKind extends NodeKind>(kind?: TKind | TKind[]): NodePath {\n        const path = [...this.currentPath];\n        if (kind) {\n            assertIsNodePath(path, kind);\n        }\n        return path;\n    }\n\n    public isEmpty(): boolean {\n        return this.currentPath.length === 0;\n    }\n\n    public clone(): NodeStack {\n        return new NodeStack(...this.stack);\n    }\n\n    public toString(): string {\n        return nodePathToString(this.getPath());\n    }\n}\n"
  },
  {
    "path": "packages/visitors-core/src/bottomUpTransformerVisitor.ts",
    "content": "import { Node, NodeKind, REGISTERED_NODE_KINDS } from '@codama/nodes';\n\nimport { identityVisitor } from './identityVisitor';\nimport { interceptVisitor } from './interceptVisitor';\nimport { getConjunctiveNodeSelectorFunction, NodeSelector } from './NodeSelector';\nimport { NodeStack } from './NodeStack';\nimport { pipe } from './pipe';\nimport { recordNodeStackVisitor } from './recordNodeStackVisitor';\nimport { Visitor } from './visitor';\n\nexport type BottomUpNodeTransformer = (node: Node, stack: NodeStack) => Node | null;\n\nexport type BottomUpNodeTransformerWithSelector = {\n    select: NodeSelector | NodeSelector[];\n    transform: BottomUpNodeTransformer;\n};\n\nexport function bottomUpTransformerVisitor<TNodeKind extends NodeKind = NodeKind>(\n    transformers: (BottomUpNodeTransformer | BottomUpNodeTransformerWithSelector)[],\n    options: { keys?: TNodeKind[]; stack?: NodeStack } = {},\n): Visitor<Node | null, TNodeKind> {\n    const transformerFunctions = transformers.map((transformer): BottomUpNodeTransformer => {\n        if (typeof transformer === 'function') return transformer;\n        return (node, stack) =>\n            getConjunctiveNodeSelectorFunction(transformer.select)(stack.getPath(REGISTERED_NODE_KINDS))\n                ? transformer.transform(node, stack)\n                : node;\n    });\n\n    const stack = options.stack ?? new NodeStack();\n    return pipe(\n        identityVisitor(options),\n        v =>\n            interceptVisitor(v, (node, next) => {\n                return transformerFunctions.reduce(\n                    (acc, transformer) => (acc === null ? null : transformer(acc, stack)),\n                    next(node),\n                );\n            }),\n        v => recordNodeStackVisitor(v, stack),\n    );\n}\n"
  },
  {
    "path": "packages/visitors-core/src/consoleLogVisitor.ts",
    "content": "import { NodeKind } from '@codama/nodes';\n\nimport { mapVisitor } from './mapVisitor';\nimport { Visitor } from './visitor';\n\nexport function consoleLogVisitor<TNodeKind extends NodeKind = NodeKind>(\n    visitor: Visitor<string, TNodeKind>,\n): Visitor<void, TNodeKind> {\n    return mapVisitor(visitor, value => console.log(value));\n}\n"
  },
  {
    "path": "packages/visitors-core/src/deleteNodesVisitor.ts",
    "content": "import { NodeKind } from '@codama/nodes';\n\nimport { NodeSelector } from './NodeSelector';\nimport { TopDownNodeTransformerWithSelector, topDownTransformerVisitor } from './topDownTransformerVisitor';\n\nexport function deleteNodesVisitor<TNodeKind extends NodeKind = NodeKind>(\n    selectors: NodeSelector[],\n    options?: Parameters<typeof topDownTransformerVisitor<TNodeKind>>[1],\n) {\n    return topDownTransformerVisitor<TNodeKind>(\n        selectors.map(\n            (selector): TopDownNodeTransformerWithSelector => ({\n                select: selector,\n                transform: () => null,\n            }),\n        ),\n        options,\n    );\n}\n"
  },
  {
    "path": "packages/visitors-core/src/extendVisitor.ts",
    "content": "import { CODAMA_ERROR__VISITORS__CANNOT_EXTEND_MISSING_VISIT_FUNCTION, CodamaError } from '@codama/errors';\nimport { GetNodeFromKind, Node, NodeKind, REGISTERED_NODE_KINDS } from '@codama/nodes';\n\nimport { getVisitFunctionName, GetVisitorFunctionName, Visitor } from './visitor';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype DontInfer<T> = T extends any ? T : never;\n\nexport type VisitorOverrideFunction<TReturn, TNodeKind extends NodeKind, TNode extends Node> = (\n    node: TNode,\n    scope: {\n        next: (node: TNode) => TReturn;\n        self: Visitor<TReturn, TNodeKind>;\n    },\n) => TReturn;\n\nexport type VisitorOverrides<TReturn, TNodeKind extends NodeKind> = {\n    [K in TNodeKind as GetVisitorFunctionName<K>]?: VisitorOverrideFunction<TReturn, TNodeKind, GetNodeFromKind<K>>;\n};\n\nexport function extendVisitor<TReturn, TNodeKind extends NodeKind>(\n    visitor: Visitor<TReturn, TNodeKind>,\n    overrides: DontInfer<VisitorOverrides<TReturn, TNodeKind>>,\n): Visitor<TReturn, TNodeKind> {\n    const registeredVisitFunctions = REGISTERED_NODE_KINDS.map(getVisitFunctionName);\n\n    const overriddenFunctions = Object.fromEntries(\n        Object.keys(overrides).flatMap(key => {\n            if (!(registeredVisitFunctions as string[]).includes(key)) {\n                return [];\n            }\n\n            const castedKey = key as GetVisitorFunctionName<TNodeKind>;\n\n            if (!visitor[castedKey]) {\n                throw new CodamaError(CODAMA_ERROR__VISITORS__CANNOT_EXTEND_MISSING_VISIT_FUNCTION, {\n                    visitFunction: castedKey,\n                });\n            }\n\n            return [\n                [\n                    castedKey,\n                    function extendedVisitNode<TNode extends Node>(this: Visitor<TReturn, TNodeKind>, node: TNode) {\n                        const extendedFunction = overrides[castedKey] as VisitorOverrideFunction<\n                            TReturn,\n                            TNodeKind,\n                            TNode\n                        >;\n                        const nextFunction = visitor[castedKey] as unknown as (node: TNode) => TReturn;\n                        return extendedFunction.bind(this)(node, {\n                            next: nextFunction.bind(this),\n                            self: this,\n                        });\n                    },\n                ],\n            ];\n        }),\n    ) as Partial<Visitor<TReturn, TNodeKind>>;\n\n    return {\n        ...visitor,\n        ...overriddenFunctions,\n    };\n}\n"
  },
  {
    "path": "packages/visitors-core/src/getByteSizeVisitor.ts",
    "content": "import { CountNode, isNode, isScalarEnum, REGISTERED_TYPE_NODE_KINDS, RegisteredTypeNode } from '@codama/nodes';\n\nimport { extendVisitor } from './extendVisitor';\nimport { LinkableDictionary } from './LinkableDictionary';\nimport { mergeVisitor } from './mergeVisitor';\nimport { getLastNodeFromPath } from './NodePath';\nimport { NodeStack } from './NodeStack';\nimport { pipe } from './pipe';\nimport { recordNodeStackVisitor } from './recordNodeStackVisitor';\nimport { visit, Visitor } from './visitor';\n\nexport type ByteSizeVisitorKeys =\n    | RegisteredTypeNode['kind']\n    | 'accountNode'\n    | 'constantValueNode'\n    | 'definedTypeLinkNode'\n    | 'definedTypeNode'\n    | 'instructionArgumentNode'\n    | 'instructionNode';\n\nexport function getByteSizeVisitor(\n    linkables: LinkableDictionary,\n    options: { stack?: NodeStack } = {},\n): Visitor<number | null, ByteSizeVisitorKeys> {\n    const stack = options.stack ?? new NodeStack();\n\n    const visitedDefinedTypes = new Map<string, number | null>();\n    const definedTypeStack: string[] = [];\n\n    const sumSizes = (values: (number | null)[]): number | null =>\n        values.reduce((all, one) => (all === null || one === null ? null : all + one), 0 as number | null);\n\n    const baseVisitor = mergeVisitor(\n        () => null as number | null,\n        (_, values) => sumSizes(values),\n        {\n            keys: [\n                ...REGISTERED_TYPE_NODE_KINDS,\n                'accountNode',\n                'constantValueNode',\n                'definedTypeLinkNode',\n                'definedTypeNode',\n                'instructionArgumentNode',\n                'instructionNode',\n            ],\n        },\n    );\n\n    return pipe(\n        baseVisitor,\n        v =>\n            extendVisitor(v, {\n                visitAccount(node, { self }) {\n                    return visit(node.data, self);\n                },\n\n                visitArrayType(node, { self }) {\n                    return getArrayLikeSize(node.count, visit(node.item, self), self);\n                },\n\n                visitConstantValue(node, { self }) {\n                    const typeSize = visit(node.type, self);\n                    if (typeSize !== null) return typeSize;\n                    if (isNode(node.value, 'bytesValueNode') && node.value.encoding === 'base16') {\n                        return Math.ceil(node.value.data.length / 2);\n                    }\n                    if (\n                        isNode(node.type, 'stringTypeNode') &&\n                        node.type.encoding === 'base16' &&\n                        isNode(node.value, 'stringValueNode')\n                    ) {\n                        return Math.ceil(node.value.string.length / 2);\n                    }\n                    // Technically, we could still identify other fixed-size constants\n                    // but we'd need to import @solana/codecs to compute them.\n                    return null;\n                },\n\n                visitDefinedType(node, { self }) {\n                    if (visitedDefinedTypes.has(node.name)) {\n                        return visitedDefinedTypes.get(node.name)!;\n                    }\n                    definedTypeStack.push(node.name);\n                    const child = visit(node.type, self);\n                    definedTypeStack.pop();\n                    visitedDefinedTypes.set(node.name, child);\n                    return child;\n                },\n\n                visitDefinedTypeLink(node, { self }) {\n                    // Fetch the linked type and return null if not found.\n                    const linkedDefinedPath = linkables.getPath(stack.getPath(node.kind));\n                    if (!linkedDefinedPath) return null;\n                    const linkedDefinedType = getLastNodeFromPath(linkedDefinedPath);\n\n                    // This prevents infinite recursion by assuming cyclic types don't have a fixed size.\n                    if (definedTypeStack.includes(linkedDefinedType.name)) return null;\n\n                    stack.pushPath(linkedDefinedPath);\n                    const result = visit(linkedDefinedType, self);\n                    stack.popPath();\n                    return result;\n                },\n\n                visitEnumEmptyVariantType() {\n                    return 0;\n                },\n\n                visitEnumType(node, { self }) {\n                    const prefix = visit(node.size, self);\n                    if (prefix === null) return null;\n                    if (isScalarEnum(node)) return prefix;\n                    const variantSizes = node.variants.map(v => visit(v, self));\n                    const allVariantHaveTheSameFixedSize = variantSizes.every((one, _, all) => one === all[0]);\n                    return allVariantHaveTheSameFixedSize && variantSizes.length > 0 && variantSizes[0] !== null\n                        ? variantSizes[0] + prefix\n                        : null;\n                },\n\n                visitFixedSizeType(node) {\n                    return node.size;\n                },\n\n                visitInstruction(node, { self }) {\n                    return sumSizes(node.arguments.map(arg => visit(arg, self)));\n                },\n\n                visitInstructionArgument(node, { self }) {\n                    return visit(node.type, self);\n                },\n\n                visitMapType(node, { self }) {\n                    const innerSize = sumSizes([visit(node.key, self), visit(node.value, self)]);\n                    return getArrayLikeSize(node.count, innerSize, self);\n                },\n\n                visitNumberType(node) {\n                    if (node.format === 'shortU16') return null;\n                    return parseInt(node.format.slice(1), 10) / 8;\n                },\n\n                visitOptionType(node, { self }) {\n                    if (!node.fixed) return null;\n                    return sumSizes([visit(node.prefix, self), visit(node.item, self)]);\n                },\n\n                visitPostOffsetType(node, { self }) {\n                    const typeSize = visit(node.type, self);\n                    return node.strategy === 'padded' ? sumSizes([typeSize, node.offset]) : typeSize;\n                },\n\n                visitPreOffsetType(node, { self }) {\n                    const typeSize = visit(node.type, self);\n                    return node.strategy === 'padded' ? sumSizes([typeSize, node.offset]) : typeSize;\n                },\n\n                visitPublicKeyType() {\n                    return 32;\n                },\n\n                visitRemainderOptionType(node, { self }) {\n                    const itemSize = visit(node.item, self);\n                    return itemSize === 0 ? 0 : null;\n                },\n\n                visitSetType(node, { self }) {\n                    return getArrayLikeSize(node.count, visit(node.item, self), self);\n                },\n\n                visitZeroableOptionType(node, { self }) {\n                    const itemSize = visit(node.item, self);\n                    if (!node.zeroValue) return itemSize;\n                    const zeroSize = visit(node.zeroValue, self);\n                    return zeroSize === itemSize ? itemSize : null;\n                },\n            }),\n        v => recordNodeStackVisitor(v, stack),\n    );\n}\n\nfunction getArrayLikeSize(\n    count: CountNode,\n    innerSize: number | null,\n    self: Visitor<number | null, ByteSizeVisitorKeys>,\n): number | null {\n    if (innerSize === 0 && isNode(count, 'prefixedCountNode')) return visit(count.prefix, self);\n    if (innerSize === 0) return 0;\n    if (!isNode(count, 'fixedCountNode')) return null;\n    if (count.value === 0) return 0;\n    return innerSize !== null ? innerSize * count.value : null;\n}\n"
  },
  {
    "path": "packages/visitors-core/src/getDebugStringVisitor.ts",
    "content": "import { Node } from '@codama/nodes';\n\nimport { interceptVisitor } from './interceptVisitor';\nimport { mergeVisitor } from './mergeVisitor';\nimport { pipe } from './pipe';\nimport { Visitor } from './visitor';\n\nexport function getDebugStringVisitor(options: { indent?: boolean; indentSeparator?: string } = {}): Visitor<string> {\n    const indent = options.indent ?? false;\n    const indentSeparator = options.indentSeparator ?? '|   ';\n    let stackLevel = -1;\n\n    return pipe(\n        mergeVisitor<string>(\n            node => {\n                const details = getNodeDetails(node).join('.');\n                if (indent) {\n                    return `${indentSeparator.repeat(stackLevel)}${node.kind}${details ? ` [${details}]` : ''}`;\n                }\n                return `${node.kind}${details ? `[${details}]` : ''}`;\n            },\n            (node, values) => {\n                const details = getNodeDetails(node).join('.');\n                if (indent) {\n                    return [\n                        `${indentSeparator.repeat(stackLevel)}${node.kind}${details ? ` [${details}]` : ''}`,\n                        ...values,\n                    ].join('\\n');\n                }\n                return `${node.kind}${details ? `[${details}]` : ''}(${values.join(', ')})`;\n            },\n        ),\n        v =>\n            interceptVisitor(v, (node, next) => {\n                stackLevel += 1;\n                const newNode = next(node);\n                stackLevel -= 1;\n                return newNode;\n            }),\n    );\n}\n\nfunction getNodeDetails(node: Node): string[] {\n    switch (node.kind) {\n        case 'programNode':\n            return [node.name, node.publicKey];\n        case 'instructionAccountNode':\n            return [\n                node.name,\n                ...(node.isWritable ? ['writable'] : []),\n                ...(node.isSigner === true ? ['signer'] : []),\n                ...(node.isSigner === 'either' ? ['optionalSigner'] : []),\n                ...(node.isOptional ? ['optional'] : []),\n            ];\n        case 'instructionRemainingAccountsNode':\n            return [\n                ...(node.isOptional ? ['optional'] : []),\n                ...(node.isWritable ? ['writable'] : []),\n                ...(node.isSigner === true ? ['signer'] : []),\n                ...(node.isSigner === 'either' ? ['optionalSigner'] : []),\n            ];\n        case 'instructionByteDeltaNode':\n            return [...(node.subtract ? ['subtract'] : []), ...(node.withHeader ? ['withHeader'] : [])];\n        case 'instructionStatusNode':\n            return [node.lifecycle, ...(node.message ? [node.message] : [])];\n        case 'errorNode':\n            return [node.code.toString(), node.name];\n        case 'accountLinkNode':\n        case 'definedTypeLinkNode':\n        case 'instructionAccountLinkNode':\n        case 'instructionArgumentLinkNode':\n        case 'instructionLinkNode':\n        case 'pdaLinkNode':\n        case 'programLinkNode':\n            return [node.name];\n        case 'numberTypeNode':\n            return [node.format, ...(node.endian === 'be' ? ['bigEndian'] : [])];\n        case 'amountTypeNode':\n            return [node.decimals.toString(), ...(node.unit ? [node.unit] : [])];\n        case 'stringTypeNode':\n            return [node.encoding];\n        case 'optionTypeNode':\n            return node.fixed ? ['fixed'] : [];\n        case 'fixedCountNode':\n            return [node.value.toString()];\n        case 'numberValueNode':\n            return [node.number.toString()];\n        case 'stringValueNode':\n            return [node.string];\n        case 'booleanValueNode':\n            return [node.boolean ? 'true' : 'false'];\n        case 'bytesValueNode':\n            return [node.encoding, node.data];\n        case 'publicKeyValueNode':\n            return [...(node.identifier ? [`${node.identifier}`] : []), node.publicKey];\n        case 'enumValueNode':\n            return [node.variant];\n        case 'resolverValueNode':\n            return [node.name];\n        case 'constantDiscriminatorNode':\n            return [...(node.offset > 0 ? [`offset:${node.offset}`] : [])];\n        case 'fieldDiscriminatorNode':\n            return [node.name, ...(node.offset > 0 ? [`offset:${node.offset}`] : [])];\n        case 'sizeDiscriminatorNode':\n            return [node.size.toString()];\n        case 'fixedSizeTypeNode':\n            return [node.size.toString()];\n        case 'preOffsetTypeNode':\n            return [node.offset.toString(), node.strategy ?? 'relative'];\n        case 'postOffsetTypeNode':\n            return [node.offset.toString(), node.strategy ?? 'relative'];\n        default:\n            return 'name' in node ? [node.name] : [];\n    }\n}\n"
  },
  {
    "path": "packages/visitors-core/src/getMaxByteSizeVisitor.ts",
    "content": "import { CountNode, isNode, isScalarEnum, REGISTERED_TYPE_NODE_KINDS } from '@codama/nodes';\n\nimport { extendVisitor } from './extendVisitor';\nimport { ByteSizeVisitorKeys } from './getByteSizeVisitor';\nimport { LinkableDictionary } from './LinkableDictionary';\nimport { mergeVisitor } from './mergeVisitor';\nimport { getLastNodeFromPath } from './NodePath';\nimport { NodeStack } from './NodeStack';\nimport { pipe } from './pipe';\nimport { recordNodeStackVisitor } from './recordNodeStackVisitor';\nimport { visit, Visitor } from './visitor';\n\nexport function getMaxByteSizeVisitor(\n    linkables: LinkableDictionary,\n    options: { stack?: NodeStack } = {},\n): Visitor<number | null, ByteSizeVisitorKeys> {\n    const stack = options.stack ?? new NodeStack();\n\n    const visitedDefinedTypes = new Map<string, number | null>();\n    const definedTypeStack: string[] = [];\n\n    const sumSizes = (values: (number | null)[]): number | null =>\n        values.reduce((all, one) => (all === null || one === null ? null : all + one), 0 as number | null);\n\n    const baseVisitor = mergeVisitor(\n        () => null as number | null,\n        (_, values) => sumSizes(values),\n        {\n            keys: [\n                ...REGISTERED_TYPE_NODE_KINDS,\n                'accountNode',\n                'constantValueNode',\n                'definedTypeLinkNode',\n                'definedTypeNode',\n                'instructionArgumentNode',\n                'instructionNode',\n            ],\n        },\n    );\n\n    return pipe(\n        baseVisitor,\n        v =>\n            extendVisitor(v, {\n                visitAccount(node, { self }) {\n                    return visit(node.data, self);\n                },\n\n                visitArrayType(node, { self }) {\n                    return getArrayLikeSize(node.count, visit(node.item, self), self);\n                },\n\n                visitConstantValue(node, { self }) {\n                    const typeSize = visit(node.type, self);\n                    if (typeSize !== null) return typeSize;\n                    if (isNode(node.value, 'bytesValueNode') && node.value.encoding === 'base16') {\n                        return Math.ceil(node.value.data.length / 2);\n                    }\n                    if (\n                        isNode(node.type, 'stringTypeNode') &&\n                        node.type.encoding === 'base16' &&\n                        isNode(node.value, 'stringValueNode')\n                    ) {\n                        return Math.ceil(node.value.string.length / 2);\n                    }\n                    // Technically, we could still identify other fixed-size constants\n                    // but we'd need to import @solana/codecs to compute them.\n                    return null;\n                },\n\n                visitDefinedType(node, { self }) {\n                    if (visitedDefinedTypes.has(node.name)) {\n                        return visitedDefinedTypes.get(node.name)!;\n                    }\n                    definedTypeStack.push(node.name);\n                    const child = visit(node.type, self);\n                    definedTypeStack.pop();\n                    visitedDefinedTypes.set(node.name, child);\n                    return child;\n                },\n\n                visitDefinedTypeLink(node, { self }) {\n                    // Fetch the linked type and return null if not found.\n                    const linkedDefinedPath = linkables.getPath(stack.getPath(node.kind));\n                    if (!linkedDefinedPath) return null;\n                    const linkedDefinedType = getLastNodeFromPath(linkedDefinedPath);\n\n                    // This prevents infinite recursion by assuming cyclic types don't have a fixed size.\n                    if (definedTypeStack.includes(linkedDefinedType.name)) return null;\n\n                    stack.pushPath(linkedDefinedPath);\n                    const result = visit(linkedDefinedType, self);\n                    stack.popPath();\n                    return result;\n                },\n\n                visitEnumEmptyVariantType() {\n                    return 0;\n                },\n\n                visitEnumType(node, { self }) {\n                    const prefix = visit(node.size, self);\n                    if (prefix === null) return null;\n                    if (isScalarEnum(node)) return prefix;\n                    const variantSizes = node.variants.map(v => visit(v, self));\n                    if (variantSizes.includes(null)) return null;\n                    const maxVariantSize = Math.max(...(variantSizes as number[]));\n                    return prefix + maxVariantSize;\n                },\n\n                visitFixedSizeType(node) {\n                    return node.size;\n                },\n\n                visitInstruction(node, { self }) {\n                    return sumSizes(node.arguments.map(arg => visit(arg, self)));\n                },\n\n                visitInstructionArgument(node, { self }) {\n                    return visit(node.type, self);\n                },\n\n                visitMapType(node, { self }) {\n                    const innerSize = sumSizes([visit(node.key, self), visit(node.value, self)]);\n                    return getArrayLikeSize(node.count, innerSize, self);\n                },\n\n                visitNumberType(node) {\n                    if (node.format === 'shortU16') return 3;\n                    return parseInt(node.format.slice(1), 10) / 8;\n                },\n\n                visitOptionType(node, { self }) {\n                    return sumSizes([visit(node.prefix, self), visit(node.item, self)]);\n                },\n\n                visitPostOffsetType(node, { self }) {\n                    const typeSize = visit(node.type, self);\n                    return node.strategy === 'padded' ? sumSizes([typeSize, node.offset]) : typeSize;\n                },\n\n                visitPreOffsetType(node, { self }) {\n                    const typeSize = visit(node.type, self);\n                    return node.strategy === 'padded' ? sumSizes([typeSize, node.offset]) : typeSize;\n                },\n\n                visitPublicKeyType() {\n                    return 32;\n                },\n\n                visitRemainderOptionType(node, { self }) {\n                    const itemSize = visit(node.item, self);\n                    return itemSize === 0 ? 0 : null;\n                },\n\n                visitSetType(node, { self }) {\n                    return getArrayLikeSize(node.count, visit(node.item, self), self);\n                },\n\n                visitZeroableOptionType(node, { self }) {\n                    const itemSize = visit(node.item, self);\n                    if (!node.zeroValue) return itemSize;\n                    const zeroSize = visit(node.zeroValue, self);\n                    if (itemSize === null || zeroSize === null) return null;\n                    return Math.max(itemSize, zeroSize);\n                },\n            }),\n        v => recordNodeStackVisitor(v, stack),\n    );\n}\n\nfunction getArrayLikeSize(\n    count: CountNode,\n    innerSize: number | null,\n    self: Visitor<number | null, ByteSizeVisitorKeys>,\n): number | null {\n    if (innerSize === 0 && isNode(count, 'prefixedCountNode')) return visit(count.prefix, self);\n    if (innerSize === 0) return 0;\n    if (!isNode(count, 'fixedCountNode')) return null;\n    if (count.value === 0) return 0;\n    return innerSize !== null ? innerSize * count.value : null;\n}\n"
  },
  {
    "path": "packages/visitors-core/src/getResolvedInstructionInputsVisitor.ts",
    "content": "/* eslint-disable no-case-declarations */\nimport {\n    CODAMA_ERROR__VISITORS__CANNOT_USE_OPTIONAL_ACCOUNT_AS_PDA_SEED_VALUE,\n    CODAMA_ERROR__VISITORS__CYCLIC_DEPENDENCY_DETECTED_WHEN_RESOLVING_INSTRUCTION_DEFAULT_VALUES,\n    CODAMA_ERROR__VISITORS__INVALID_INSTRUCTION_DEFAULT_VALUE_DEPENDENCY,\n    CodamaError,\n} from '@codama/errors';\nimport {\n    AccountValueNode,\n    accountValueNode,\n    ArgumentValueNode,\n    argumentValueNode,\n    CamelCaseString,\n    getAllInstructionArguments,\n    InstructionAccountNode,\n    InstructionArgumentNode,\n    InstructionInputValueNode,\n    InstructionNode,\n    isNode,\n    VALUE_NODES,\n} from '@codama/nodes';\n\nimport { singleNodeVisitor } from './singleNodeVisitor';\nimport { Visitor } from './visitor';\n\nexport type ResolvedInstructionInput = ResolvedInstructionAccount | ResolvedInstructionArgument;\nexport type ResolvedInstructionAccount = InstructionAccountNode & {\n    dependsOn: InstructionDependency[];\n    isPda: boolean;\n    resolvedIsOptional: boolean;\n    resolvedIsSigner: boolean | 'either';\n};\nexport type ResolvedInstructionArgument = InstructionArgumentNode & {\n    dependsOn: InstructionDependency[];\n};\ntype InstructionInput = InstructionAccountNode | InstructionArgumentNode;\ntype InstructionDependency = AccountValueNode | ArgumentValueNode;\n\nexport function getResolvedInstructionInputsVisitor(\n    options: { includeDataArgumentValueNodes?: boolean } = {},\n): Visitor<ResolvedInstructionInput[], 'instructionNode'> {\n    const includeDataArgumentValueNodes = options.includeDataArgumentValueNodes ?? false;\n    let stack: InstructionInput[] = [];\n    let resolved: ResolvedInstructionInput[] = [];\n    let visitedAccounts = new Map<string, ResolvedInstructionAccount>();\n    let visitedArgs = new Map<string, ResolvedInstructionArgument>();\n\n    function resolveInstructionInput(instruction: InstructionNode, input: InstructionInput): void {\n        // Ensure we don't visit the same input twice.\n        if (\n            (isNode(input, 'instructionAccountNode') && visitedAccounts.has(input.name)) ||\n            (isNode(input, 'instructionArgumentNode') && visitedArgs.has(input.name))\n        ) {\n            return;\n        }\n\n        // Ensure we don't have a circular dependency.\n        const isCircular = stack.some(({ kind, name }) => kind === input.kind && name === input.name);\n        if (isCircular) {\n            const cycle = [...stack, input];\n            throw new CodamaError(\n                CODAMA_ERROR__VISITORS__CYCLIC_DEPENDENCY_DETECTED_WHEN_RESOLVING_INSTRUCTION_DEFAULT_VALUES,\n                {\n                    cycle,\n                    formattedCycle: cycle.map(({ name }) => name).join(' -> '),\n                    instruction,\n                    instructionName: instruction.name,\n                },\n            );\n        }\n\n        // Resolve whilst keeping track of the stack.\n        stack.push(input);\n        const localResolved =\n            input.kind === 'instructionAccountNode'\n                ? resolveInstructionAccount(instruction, input)\n                : resolveInstructionArgument(instruction, input);\n        stack.pop();\n\n        // Store the resolved input.\n        resolved.push(localResolved);\n        if (localResolved.kind === 'instructionAccountNode') {\n            visitedAccounts.set(input.name, localResolved);\n        } else {\n            visitedArgs.set(input.name, localResolved);\n        }\n    }\n\n    function resolveInstructionAccount(\n        instruction: InstructionNode,\n        account: InstructionAccountNode,\n    ): ResolvedInstructionAccount {\n        // Find and visit dependencies first.\n        const dependsOn = getInstructionDependencies(account);\n        resolveInstructionDependencies(instruction, account, dependsOn);\n\n        const localResolved: ResolvedInstructionAccount = {\n            ...account,\n            dependsOn,\n            isPda: getAllInstructionArguments(instruction).some(\n                argument =>\n                    isNode(argument.defaultValue, 'accountBumpValueNode') &&\n                    argument.defaultValue.name === account.name,\n            ),\n            resolvedIsOptional: !!account.isOptional,\n            resolvedIsSigner: account.isSigner,\n        };\n\n        switch (localResolved.defaultValue?.kind) {\n            case 'accountValueNode':\n                const defaultAccount = visitedAccounts.get(localResolved.defaultValue.name)!;\n                const resolvedIsPublicKey = account.isSigner === false && defaultAccount.isSigner === false;\n                const resolvedIsSigner = account.isSigner === true && defaultAccount.isSigner === true;\n                const resolvedIsOptionalSigner = !resolvedIsPublicKey && !resolvedIsSigner;\n                localResolved.resolvedIsSigner = resolvedIsOptionalSigner ? 'either' : resolvedIsSigner;\n                localResolved.resolvedIsOptional = !!defaultAccount.isOptional;\n                break;\n            case 'publicKeyValueNode':\n            case 'programLinkNode':\n            case 'programIdValueNode':\n                localResolved.resolvedIsSigner = account.isSigner === false ? false : 'either';\n                localResolved.resolvedIsOptional = false;\n                break;\n            case 'pdaValueNode':\n                localResolved.resolvedIsSigner = account.isSigner === false ? false : 'either';\n                localResolved.resolvedIsOptional = false;\n                const { seeds } = localResolved.defaultValue;\n                seeds.forEach(seed => {\n                    if (!isNode(seed.value, 'accountValueNode')) return;\n                    const dependency = visitedAccounts.get(seed.value.name)!;\n                    if (dependency.resolvedIsOptional) {\n                        throw new CodamaError(CODAMA_ERROR__VISITORS__CANNOT_USE_OPTIONAL_ACCOUNT_AS_PDA_SEED_VALUE, {\n                            instruction: instruction,\n                            instructionAccount: account,\n                            instructionAccountName: account.name,\n                            instructionName: instruction.name,\n                            seed,\n                            seedName: seed.name,\n                            seedValueName: seed.value.name,\n                        });\n                    }\n                });\n                break;\n            case 'identityValueNode':\n            case 'payerValueNode':\n            case 'resolverValueNode':\n                localResolved.resolvedIsOptional = false;\n                break;\n            default:\n                break;\n        }\n\n        return localResolved;\n    }\n\n    function resolveInstructionArgument(\n        instruction: InstructionNode,\n        argument: InstructionArgumentNode,\n    ): ResolvedInstructionArgument {\n        // Find and visit dependencies first.\n        const dependsOn = getInstructionDependencies(argument);\n        resolveInstructionDependencies(instruction, argument, dependsOn);\n\n        return { ...argument, dependsOn };\n    }\n\n    function resolveInstructionDependencies(\n        instruction: InstructionNode,\n        parent: InstructionInput,\n        dependencies: InstructionDependency[],\n    ): void {\n        dependencies.forEach(dependency => {\n            let input: InstructionInput | null = null;\n            if (isNode(dependency, 'accountValueNode')) {\n                const dependencyAccount = instruction.accounts.find(a => a.name === dependency.name);\n                if (!dependencyAccount) {\n                    throw new CodamaError(CODAMA_ERROR__VISITORS__INVALID_INSTRUCTION_DEFAULT_VALUE_DEPENDENCY, {\n                        dependency,\n                        dependencyKind: dependency.kind,\n                        dependencyName: dependency.name,\n                        instruction,\n                        instructionName: instruction.name,\n                        parent,\n                        parentKind: parent.kind,\n                        parentName: parent.name,\n                    });\n                }\n                input = { ...dependencyAccount };\n            } else if (isNode(dependency, 'argumentValueNode')) {\n                const dependencyArgument = getAllInstructionArguments(instruction).find(\n                    a => a.name === dependency.name,\n                );\n                if (!dependencyArgument) {\n                    throw new CodamaError(CODAMA_ERROR__VISITORS__INVALID_INSTRUCTION_DEFAULT_VALUE_DEPENDENCY, {\n                        dependency,\n                        dependencyKind: dependency.kind,\n                        dependencyName: dependency.name,\n                        instruction,\n                        instructionName: instruction.name,\n                        parent,\n                        parentKind: parent.kind,\n                        parentName: parent.name,\n                    });\n                }\n                input = { ...dependencyArgument };\n            }\n            if (input) {\n                resolveInstructionInput(instruction, input);\n            }\n        });\n    }\n\n    return singleNodeVisitor('instructionNode', (node): ResolvedInstructionInput[] => {\n        // Ensure we always start with a clean slate.\n        stack = [];\n        resolved = [];\n        visitedAccounts = new Map();\n        visitedArgs = new Map();\n\n        const inputs: InstructionInput[] = [\n            ...node.accounts,\n            ...node.arguments.filter(a => {\n                if (includeDataArgumentValueNodes) return a.defaultValue;\n                return a.defaultValue && !isNode(a.defaultValue, VALUE_NODES);\n            }),\n            ...(node.extraArguments ?? []).filter(a => a.defaultValue),\n        ];\n\n        // Visit all instruction accounts.\n        inputs.forEach(input => {\n            resolveInstructionInput(node, input);\n        });\n\n        return resolved;\n    });\n}\n\nexport function deduplicateInstructionDependencies(dependencies: InstructionDependency[]): InstructionDependency[] {\n    const accounts = new Map<CamelCaseString, InstructionDependency>();\n    const args = new Map<CamelCaseString, InstructionDependency>();\n    dependencies.forEach(dependency => {\n        if (isNode(dependency, 'accountValueNode')) {\n            accounts.set(dependency.name, dependency);\n        } else if (isNode(dependency, 'argumentValueNode')) {\n            args.set(dependency.name, dependency);\n        }\n    });\n    return [...accounts.values(), ...args.values()];\n}\n\nexport function getInstructionDependencies(input: InstructionInput | InstructionNode): InstructionDependency[] {\n    if (isNode(input, 'instructionNode')) {\n        return deduplicateInstructionDependencies([\n            ...input.accounts.flatMap(getInstructionDependencies),\n            ...input.arguments.flatMap(getInstructionDependencies),\n            ...(input.extraArguments ?? []).flatMap(getInstructionDependencies),\n        ]);\n    }\n\n    if (!input.defaultValue) return [];\n\n    const getNestedDependencies = (defaultValue: InstructionInputValueNode | undefined): InstructionDependency[] => {\n        if (!defaultValue) return [];\n        return getInstructionDependencies({ ...input, defaultValue });\n    };\n\n    if (isNode(input.defaultValue, ['accountValueNode', 'accountBumpValueNode'])) {\n        return [accountValueNode(input.defaultValue.name)];\n    }\n\n    if (isNode(input.defaultValue, ['argumentValueNode'])) {\n        return [argumentValueNode(input.defaultValue.name)];\n    }\n\n    if (isNode(input.defaultValue, 'pdaValueNode')) {\n        const dependencies = new Map<CamelCaseString, InstructionDependency>();\n        input.defaultValue.seeds.forEach(seed => {\n            if (isNode(seed.value, ['accountValueNode', 'argumentValueNode'])) {\n                dependencies.set(seed.value.name, { ...seed.value });\n            }\n        });\n        return <InstructionDependency[]>[\n            ...dependencies.values(),\n            ...(input.defaultValue.programId ? ([input.defaultValue.programId] as const) : []),\n        ];\n    }\n\n    if (isNode(input.defaultValue, 'resolverValueNode')) {\n        return input.defaultValue.dependsOn ?? [];\n    }\n\n    if (isNode(input.defaultValue, 'conditionalValueNode')) {\n        return deduplicateInstructionDependencies([\n            ...getNestedDependencies(input.defaultValue.condition),\n            ...getNestedDependencies(input.defaultValue.ifTrue),\n            ...getNestedDependencies(input.defaultValue.ifFalse),\n        ]);\n    }\n\n    return [];\n}\n"
  },
  {
    "path": "packages/visitors-core/src/getUniqueHashStringVisitor.ts",
    "content": "import stringify from 'json-stable-stringify';\n\nimport { mapVisitor } from './mapVisitor';\nimport { removeDocsVisitor } from './removeDocsVisitor';\nimport { staticVisitor } from './staticVisitor';\nimport { Visitor } from './visitor';\n\nexport function getUniqueHashStringVisitor(options: { removeDocs?: boolean } = {}): Visitor<string> {\n    const removeDocs = options.removeDocs ?? false;\n    if (!removeDocs) {\n        return staticVisitor(node => stringify(node) as string);\n    }\n    return mapVisitor(removeDocsVisitor(), node => stringify(node) as string);\n}\n"
  },
  {
    "path": "packages/visitors-core/src/identityVisitor.ts",
    "content": "import {\n    accountLinkNode,\n    accountNode,\n    amountTypeNode,\n    arrayTypeNode,\n    arrayValueNode,\n    assertIsNestedTypeNode,\n    assertIsNode,\n    booleanTypeNode,\n    conditionalValueNode,\n    constantDiscriminatorNode,\n    constantPdaSeedNode,\n    constantValueNode,\n    COUNT_NODES,\n    dateTimeTypeNode,\n    definedTypeLinkNode,\n    definedTypeNode,\n    DISCRIMINATOR_NODES,\n    ENUM_VARIANT_TYPE_NODES,\n    enumEmptyVariantTypeNode,\n    enumStructVariantTypeNode,\n    enumTupleVariantTypeNode,\n    enumTypeNode,\n    enumValueNode,\n    eventNode,\n    fixedSizeTypeNode,\n    hiddenPrefixTypeNode,\n    hiddenSuffixTypeNode,\n    INSTRUCTION_INPUT_VALUE_NODES,\n    instructionAccountLinkNode,\n    instructionAccountNode,\n    instructionArgumentLinkNode,\n    instructionArgumentNode,\n    instructionByteDeltaNode,\n    instructionLinkNode,\n    instructionNode,\n    instructionRemainingAccountsNode,\n    instructionStatusNode,\n    mapEntryValueNode,\n    mapTypeNode,\n    mapValueNode,\n    Node,\n    NodeKind,\n    optionTypeNode,\n    PDA_SEED_NODES,\n    pdaLinkNode,\n    pdaNode,\n    pdaSeedValueNode,\n    pdaValueNode,\n    postOffsetTypeNode,\n    prefixedCountNode,\n    preOffsetTypeNode,\n    programNode,\n    REGISTERED_NODE_KINDS,\n    remainderOptionTypeNode,\n    removeNullAndAssertIsNodeFilter,\n    resolverValueNode,\n    rootNode,\n    sentinelTypeNode,\n    setTypeNode,\n    setValueNode,\n    sizePrefixTypeNode,\n    solAmountTypeNode,\n    someValueNode,\n    structFieldTypeNode,\n    structFieldValueNode,\n    structTypeNode,\n    structValueNode,\n    tupleTypeNode,\n    tupleValueNode,\n    TYPE_NODES,\n    VALUE_NODES,\n    variablePdaSeedNode,\n    zeroableOptionTypeNode,\n} from '@codama/nodes';\n\nimport { staticVisitor } from './staticVisitor';\nimport { visit as baseVisit, Visitor } from './visitor';\n\nexport function identityVisitor<TNodeKind extends NodeKind = NodeKind>(\n    options: { keys?: TNodeKind[] } = {},\n): Visitor<Node | null, TNodeKind> {\n    const keys: NodeKind[] = options.keys ?? (REGISTERED_NODE_KINDS as TNodeKind[]);\n    const visitor = staticVisitor(node => Object.freeze({ ...node }), { keys }) as Visitor<Node | null>;\n    const visit =\n        (v: Visitor<Node | null>) =>\n        (node: Node): Node | null =>\n            keys.includes(node.kind) ? baseVisit(node, v) : Object.freeze({ ...node });\n\n    if (keys.includes('rootNode')) {\n        visitor.visitRoot = function visitRoot(node) {\n            const program = visit(this)(node.program);\n            if (program === null) return null;\n            assertIsNode(program, 'programNode');\n            return rootNode(\n                program,\n                node.additionalPrograms.map(visit(this)).filter(removeNullAndAssertIsNodeFilter('programNode')),\n            );\n        };\n    }\n\n    if (keys.includes('programNode')) {\n        visitor.visitProgram = function visitProgram(node) {\n            return programNode({\n                ...node,\n                accounts: node.accounts.map(visit(this)).filter(removeNullAndAssertIsNodeFilter('accountNode')),\n                definedTypes: node.definedTypes\n                    .map(visit(this))\n                    .filter(removeNullAndAssertIsNodeFilter('definedTypeNode')),\n                errors: node.errors.map(visit(this)).filter(removeNullAndAssertIsNodeFilter('errorNode')),\n                events: (node.events ?? []).map(visit(this)).filter(removeNullAndAssertIsNodeFilter('eventNode')),\n                instructions: node.instructions\n                    .map(visit(this))\n                    .filter(removeNullAndAssertIsNodeFilter('instructionNode')),\n                pdas: node.pdas.map(visit(this)).filter(removeNullAndAssertIsNodeFilter('pdaNode')),\n            });\n        };\n    }\n\n    if (keys.includes('pdaNode')) {\n        visitor.visitPda = function visitPda(node) {\n            return pdaNode({\n                ...node,\n                seeds: node.seeds.map(visit(this)).filter(removeNullAndAssertIsNodeFilter(PDA_SEED_NODES)),\n            });\n        };\n    }\n\n    if (keys.includes('accountNode')) {\n        visitor.visitAccount = function visitAccount(node) {\n            const data = visit(this)(node.data);\n            if (data === null) return null;\n            assertIsNode(data, 'structTypeNode');\n            const pda = node.pda ? (visit(this)(node.pda) ?? undefined) : undefined;\n            if (pda) assertIsNode(pda, 'pdaLinkNode');\n            return accountNode({ ...node, data, pda });\n        };\n    }\n\n    if (keys.includes('eventNode')) {\n        visitor.visitEvent = function visitEvent(node) {\n            const data = visit(this)(node.data);\n            if (data === null) return null;\n            assertIsNode(data, TYPE_NODES);\n            return eventNode({\n                ...node,\n                data,\n                discriminators: node.discriminators\n                    ? node.discriminators.map(visit(this)).filter(removeNullAndAssertIsNodeFilter(DISCRIMINATOR_NODES))\n                    : undefined,\n            });\n        };\n    }\n\n    if (keys.includes('instructionNode')) {\n        visitor.visitInstruction = function visitInstruction(node) {\n            const status = node.status ? (visit(this)(node.status) ?? undefined) : undefined;\n            if (status) assertIsNode(status, 'instructionStatusNode');\n            return instructionNode({\n                ...node,\n                accounts: node.accounts\n                    .map(visit(this))\n                    .filter(removeNullAndAssertIsNodeFilter('instructionAccountNode')),\n                arguments: node.arguments\n                    .map(visit(this))\n                    .filter(removeNullAndAssertIsNodeFilter('instructionArgumentNode')),\n                byteDeltas: node.byteDeltas\n                    ? node.byteDeltas\n                          .map(visit(this))\n                          .filter(removeNullAndAssertIsNodeFilter('instructionByteDeltaNode'))\n                    : undefined,\n                discriminators: node.discriminators\n                    ? node.discriminators.map(visit(this)).filter(removeNullAndAssertIsNodeFilter(DISCRIMINATOR_NODES))\n                    : undefined,\n                extraArguments: node.extraArguments\n                    ? node.extraArguments\n                          .map(visit(this))\n                          .filter(removeNullAndAssertIsNodeFilter('instructionArgumentNode'))\n                    : undefined,\n                remainingAccounts: node.remainingAccounts\n                    ? node.remainingAccounts\n                          .map(visit(this))\n                          .filter(removeNullAndAssertIsNodeFilter('instructionRemainingAccountsNode'))\n                    : undefined,\n                status,\n                subInstructions: node.subInstructions\n                    ? node.subInstructions.map(visit(this)).filter(removeNullAndAssertIsNodeFilter('instructionNode'))\n                    : undefined,\n            });\n        };\n    }\n\n    if (keys.includes('instructionAccountNode')) {\n        visitor.visitInstructionAccount = function visitInstructionAccount(node) {\n            const defaultValue = node.defaultValue ? (visit(this)(node.defaultValue) ?? undefined) : undefined;\n            if (defaultValue) assertIsNode(defaultValue, INSTRUCTION_INPUT_VALUE_NODES);\n            return instructionAccountNode({ ...node, defaultValue });\n        };\n    }\n\n    if (keys.includes('instructionArgumentNode')) {\n        visitor.visitInstructionArgument = function visitInstructionArgument(node) {\n            const type = visit(this)(node.type);\n            if (type === null) return null;\n            assertIsNode(type, TYPE_NODES);\n            const defaultValue = node.defaultValue ? (visit(this)(node.defaultValue) ?? undefined) : undefined;\n            if (defaultValue) assertIsNode(defaultValue, INSTRUCTION_INPUT_VALUE_NODES);\n            return instructionArgumentNode({ ...node, defaultValue, type });\n        };\n    }\n\n    if (keys.includes('instructionRemainingAccountsNode')) {\n        visitor.visitInstructionRemainingAccounts = function visitInstructionRemainingAccounts(node) {\n            const value = visit(this)(node.value);\n            if (value === null) return null;\n            assertIsNode(value, ['argumentValueNode', 'resolverValueNode']);\n            return instructionRemainingAccountsNode(value, { ...node });\n        };\n    }\n\n    if (keys.includes('instructionByteDeltaNode')) {\n        visitor.visitInstructionByteDelta = function visitInstructionByteDelta(node) {\n            const value = visit(this)(node.value);\n            if (value === null) return null;\n            assertIsNode(value, ['numberValueNode', 'accountLinkNode', 'argumentValueNode', 'resolverValueNode']);\n            return instructionByteDeltaNode(value, { ...node });\n        };\n    }\n\n    if (keys.includes('instructionStatusNode')) {\n        visitor.visitInstructionStatus = function visitInstructionStatus(node) {\n            return instructionStatusNode(node.lifecycle, node.message);\n        };\n    }\n\n    if (keys.includes('definedTypeNode')) {\n        visitor.visitDefinedType = function visitDefinedType(node) {\n            const type = visit(this)(node.type);\n            if (type === null) return null;\n            assertIsNode(type, TYPE_NODES);\n            return definedTypeNode({ ...node, type });\n        };\n    }\n\n    if (keys.includes('arrayTypeNode')) {\n        visitor.visitArrayType = function visitArrayType(node) {\n            const size = visit(this)(node.count);\n            if (size === null) return null;\n            assertIsNode(size, COUNT_NODES);\n            const item = visit(this)(node.item);\n            if (item === null) return null;\n            assertIsNode(item, TYPE_NODES);\n            return arrayTypeNode(item, size);\n        };\n    }\n\n    if (keys.includes('enumTypeNode')) {\n        visitor.visitEnumType = function visitEnumType(node) {\n            return enumTypeNode(\n                node.variants.map(visit(this)).filter(removeNullAndAssertIsNodeFilter(ENUM_VARIANT_TYPE_NODES)),\n                { size: node.size },\n            );\n        };\n    }\n\n    if (keys.includes('enumStructVariantTypeNode')) {\n        visitor.visitEnumStructVariantType = function visitEnumStructVariantType(node) {\n            const newStruct = visit(this)(node.struct);\n            if (!newStruct) {\n                return enumEmptyVariantTypeNode(node.name);\n            }\n            assertIsNode(newStruct, 'structTypeNode');\n            if (newStruct.fields.length === 0) {\n                return enumEmptyVariantTypeNode(node.name);\n            }\n            return enumStructVariantTypeNode(node.name, newStruct);\n        };\n    }\n\n    if (keys.includes('enumTupleVariantTypeNode')) {\n        visitor.visitEnumTupleVariantType = function visitEnumTupleVariantType(node) {\n            const newTuple = visit(this)(node.tuple);\n            if (!newTuple) {\n                return enumEmptyVariantTypeNode(node.name);\n            }\n            assertIsNode(newTuple, 'tupleTypeNode');\n            if (newTuple.items.length === 0) {\n                return enumEmptyVariantTypeNode(node.name);\n            }\n            return enumTupleVariantTypeNode(node.name, newTuple);\n        };\n    }\n\n    if (keys.includes('mapTypeNode')) {\n        visitor.visitMapType = function visitMapType(node) {\n            const size = visit(this)(node.count);\n            if (size === null) return null;\n            assertIsNode(size, COUNT_NODES);\n            const key = visit(this)(node.key);\n            if (key === null) return null;\n            assertIsNode(key, TYPE_NODES);\n            const value = visit(this)(node.value);\n            if (value === null) return null;\n            assertIsNode(value, TYPE_NODES);\n            return mapTypeNode(key, value, size);\n        };\n    }\n\n    if (keys.includes('optionTypeNode')) {\n        visitor.visitOptionType = function visitOptionType(node) {\n            const prefix = visit(this)(node.prefix);\n            if (prefix === null) return null;\n            assertIsNestedTypeNode(prefix, 'numberTypeNode');\n            const item = visit(this)(node.item);\n            if (item === null) return null;\n            assertIsNode(item, TYPE_NODES);\n            return optionTypeNode(item, { ...node, prefix });\n        };\n    }\n\n    if (keys.includes('zeroableOptionTypeNode')) {\n        visitor.visitZeroableOptionType = function visitZeroableOptionType(node) {\n            const item = visit(this)(node.item);\n            if (item === null) return null;\n            assertIsNode(item, TYPE_NODES);\n            const zeroValue = node.zeroValue ? (visit(this)(node.zeroValue) ?? undefined) : undefined;\n            if (zeroValue) assertIsNode(zeroValue, 'constantValueNode');\n            return zeroableOptionTypeNode(item, zeroValue);\n        };\n    }\n\n    if (keys.includes('remainderOptionTypeNode')) {\n        visitor.visitRemainderOptionType = function visitRemainderOptionType(node) {\n            const item = visit(this)(node.item);\n            if (item === null) return null;\n            assertIsNode(item, TYPE_NODES);\n            return remainderOptionTypeNode(item);\n        };\n    }\n\n    if (keys.includes('booleanTypeNode')) {\n        visitor.visitBooleanType = function visitBooleanType(node) {\n            const size = visit(this)(node.size);\n            if (size === null) return null;\n            assertIsNestedTypeNode(size, 'numberTypeNode');\n            return booleanTypeNode(size);\n        };\n    }\n\n    if (keys.includes('setTypeNode')) {\n        visitor.visitSetType = function visitSetType(node) {\n            const size = visit(this)(node.count);\n            if (size === null) return null;\n            assertIsNode(size, COUNT_NODES);\n            const item = visit(this)(node.item);\n            if (item === null) return null;\n            assertIsNode(item, TYPE_NODES);\n            return setTypeNode(item, size);\n        };\n    }\n\n    if (keys.includes('structTypeNode')) {\n        visitor.visitStructType = function visitStructType(node) {\n            const fields = node.fields.map(visit(this)).filter(removeNullAndAssertIsNodeFilter('structFieldTypeNode'));\n            return structTypeNode(fields);\n        };\n    }\n\n    if (keys.includes('structFieldTypeNode')) {\n        visitor.visitStructFieldType = function visitStructFieldType(node) {\n            const type = visit(this)(node.type);\n            if (type === null) return null;\n            assertIsNode(type, TYPE_NODES);\n            const defaultValue = node.defaultValue ? (visit(this)(node.defaultValue) ?? undefined) : undefined;\n            if (defaultValue) assertIsNode(defaultValue, VALUE_NODES);\n            return structFieldTypeNode({ ...node, defaultValue, type });\n        };\n    }\n\n    if (keys.includes('tupleTypeNode')) {\n        visitor.visitTupleType = function visitTupleType(node) {\n            const items = node.items.map(visit(this)).filter(removeNullAndAssertIsNodeFilter(TYPE_NODES));\n            return tupleTypeNode(items);\n        };\n    }\n\n    if (keys.includes('amountTypeNode')) {\n        visitor.visitAmountType = function visitAmountType(node) {\n            const number = visit(this)(node.number);\n            if (number === null) return null;\n            assertIsNestedTypeNode(number, 'numberTypeNode');\n            return amountTypeNode(number, node.decimals, node.unit);\n        };\n    }\n\n    if (keys.includes('dateTimeTypeNode')) {\n        visitor.visitDateTimeType = function visitDateTimeType(node) {\n            const number = visit(this)(node.number);\n            if (number === null) return null;\n            assertIsNestedTypeNode(number, 'numberTypeNode');\n            return dateTimeTypeNode(number);\n        };\n    }\n\n    if (keys.includes('solAmountTypeNode')) {\n        visitor.visitSolAmountType = function visitSolAmountType(node) {\n            const number = visit(this)(node.number);\n            if (number === null) return null;\n            assertIsNestedTypeNode(number, 'numberTypeNode');\n            return solAmountTypeNode(number);\n        };\n    }\n\n    if (keys.includes('prefixedCountNode')) {\n        visitor.visitPrefixedCount = function visitPrefixedCount(node) {\n            const prefix = visit(this)(node.prefix);\n            if (prefix === null) return null;\n            assertIsNestedTypeNode(prefix, 'numberTypeNode');\n            return prefixedCountNode(prefix);\n        };\n    }\n\n    if (keys.includes('arrayValueNode')) {\n        visitor.visitArrayValue = function visitArrayValue(node) {\n            return arrayValueNode(node.items.map(visit(this)).filter(removeNullAndAssertIsNodeFilter(VALUE_NODES)));\n        };\n    }\n\n    if (keys.includes('constantValueNode')) {\n        visitor.visitConstantValue = function visitConstantValue(node) {\n            const type = visit(this)(node.type);\n            if (type === null) return null;\n            assertIsNode(type, TYPE_NODES);\n            const value = visit(this)(node.value);\n            if (value === null) return null;\n            assertIsNode(value, VALUE_NODES);\n            return constantValueNode(type, value);\n        };\n    }\n\n    if (keys.includes('enumValueNode')) {\n        visitor.visitEnumValue = function visitEnumValue(node) {\n            const enumLink = visit(this)(node.enum);\n            if (enumLink === null) return null;\n            assertIsNode(enumLink, ['definedTypeLinkNode']);\n            const value = node.value ? (visit(this)(node.value) ?? undefined) : undefined;\n            if (value) assertIsNode(value, ['structValueNode', 'tupleValueNode']);\n            return enumValueNode(enumLink, node.variant, value);\n        };\n    }\n\n    if (keys.includes('mapValueNode')) {\n        visitor.visitMapValue = function visitMapValue(node) {\n            return mapValueNode(\n                node.entries.map(visit(this)).filter(removeNullAndAssertIsNodeFilter('mapEntryValueNode')),\n            );\n        };\n    }\n\n    if (keys.includes('mapEntryValueNode')) {\n        visitor.visitMapEntryValue = function visitMapEntryValue(node) {\n            const key = visit(this)(node.key);\n            if (key === null) return null;\n            assertIsNode(key, VALUE_NODES);\n            const value = visit(this)(node.value);\n            if (value === null) return null;\n            assertIsNode(value, VALUE_NODES);\n            return mapEntryValueNode(key, value);\n        };\n    }\n\n    if (keys.includes('setValueNode')) {\n        visitor.visitSetValue = function visitSetValue(node) {\n            return setValueNode(node.items.map(visit(this)).filter(removeNullAndAssertIsNodeFilter(VALUE_NODES)));\n        };\n    }\n\n    if (keys.includes('someValueNode')) {\n        visitor.visitSomeValue = function visitSomeValue(node) {\n            const value = visit(this)(node.value);\n            if (value === null) return null;\n            assertIsNode(value, VALUE_NODES);\n            return someValueNode(value);\n        };\n    }\n\n    if (keys.includes('structValueNode')) {\n        visitor.visitStructValue = function visitStructValue(node) {\n            return structValueNode(\n                node.fields.map(visit(this)).filter(removeNullAndAssertIsNodeFilter('structFieldValueNode')),\n            );\n        };\n    }\n\n    if (keys.includes('structFieldValueNode')) {\n        visitor.visitStructFieldValue = function visitStructFieldValue(node) {\n            const value = visit(this)(node.value);\n            if (value === null) return null;\n            assertIsNode(value, VALUE_NODES);\n            return structFieldValueNode(node.name, value);\n        };\n    }\n\n    if (keys.includes('tupleValueNode')) {\n        visitor.visitTupleValue = function visitTupleValue(node) {\n            return tupleValueNode(node.items.map(visit(this)).filter(removeNullAndAssertIsNodeFilter(VALUE_NODES)));\n        };\n    }\n\n    if (keys.includes('constantPdaSeedNode')) {\n        visitor.visitConstantPdaSeed = function visitConstantPdaSeed(node) {\n            const type = visit(this)(node.type);\n            if (type === null) return null;\n            assertIsNode(type, TYPE_NODES);\n            const value = visit(this)(node.value);\n            if (value === null) return null;\n            assertIsNode(value, [...VALUE_NODES, 'programIdValueNode']);\n            return constantPdaSeedNode(type, value);\n        };\n    }\n\n    if (keys.includes('variablePdaSeedNode')) {\n        visitor.visitVariablePdaSeed = function visitVariablePdaSeed(node) {\n            const type = visit(this)(node.type);\n            if (type === null) return null;\n            assertIsNode(type, TYPE_NODES);\n            return variablePdaSeedNode(node.name, type, node.docs);\n        };\n    }\n\n    if (keys.includes('resolverValueNode')) {\n        visitor.visitResolverValue = function visitResolverValue(node) {\n            const dependsOn = (node.dependsOn ?? [])\n                .map(visit(this))\n                .filter(removeNullAndAssertIsNodeFilter(['accountValueNode', 'argumentValueNode']));\n            return resolverValueNode(node.name, {\n                ...node,\n                dependsOn: dependsOn.length === 0 ? undefined : dependsOn,\n            });\n        };\n    }\n\n    if (keys.includes('conditionalValueNode')) {\n        visitor.visitConditionalValue = function visitConditionalValue(node) {\n            const condition = visit(this)(node.condition);\n            if (condition === null) return null;\n            assertIsNode(condition, ['resolverValueNode', 'accountValueNode', 'argumentValueNode']);\n            const value = node.value ? (visit(this)(node.value) ?? undefined) : undefined;\n            if (value) assertIsNode(value, VALUE_NODES);\n            const ifTrue = node.ifTrue ? (visit(this)(node.ifTrue) ?? undefined) : undefined;\n            if (ifTrue) assertIsNode(ifTrue, INSTRUCTION_INPUT_VALUE_NODES);\n            const ifFalse = node.ifFalse ? (visit(this)(node.ifFalse) ?? undefined) : undefined;\n            if (ifFalse) assertIsNode(ifFalse, INSTRUCTION_INPUT_VALUE_NODES);\n            if (!ifTrue && !ifFalse) return null;\n            return conditionalValueNode({ condition, ifFalse, ifTrue, value });\n        };\n    }\n\n    if (keys.includes('pdaValueNode')) {\n        visitor.visitPdaValue = function visitPdaValue(node) {\n            const pda = visit(this)(node.pda);\n            if (pda === null) return null;\n            assertIsNode(pda, ['pdaLinkNode', 'pdaNode']);\n            const seeds = node.seeds.map(visit(this)).filter(removeNullAndAssertIsNodeFilter('pdaSeedValueNode'));\n            return pdaValueNode(pda, seeds);\n        };\n    }\n\n    if (keys.includes('pdaSeedValueNode')) {\n        visitor.visitPdaSeedValue = function visitPdaSeedValue(node) {\n            const value = visit(this)(node.value);\n            if (value === null) return null;\n            assertIsNode(value, [...VALUE_NODES, 'accountValueNode', 'argumentValueNode']);\n            return pdaSeedValueNode(node.name, value);\n        };\n    }\n\n    if (keys.includes('fixedSizeTypeNode')) {\n        visitor.visitFixedSizeType = function visitFixedSizeType(node) {\n            const type = visit(this)(node.type);\n            if (type === null) return null;\n            assertIsNode(type, TYPE_NODES);\n            return fixedSizeTypeNode(type, node.size);\n        };\n    }\n\n    if (keys.includes('sizePrefixTypeNode')) {\n        visitor.visitSizePrefixType = function visitSizePrefixType(node) {\n            const prefix = visit(this)(node.prefix);\n            if (prefix === null) return null;\n            assertIsNestedTypeNode(prefix, 'numberTypeNode');\n            const type = visit(this)(node.type);\n            if (type === null) return null;\n            assertIsNode(type, TYPE_NODES);\n            return sizePrefixTypeNode(type, prefix);\n        };\n    }\n\n    if (keys.includes('preOffsetTypeNode')) {\n        visitor.visitPreOffsetType = function visitPreOffsetType(node) {\n            const type = visit(this)(node.type);\n            if (type === null) return null;\n            assertIsNode(type, TYPE_NODES);\n            return preOffsetTypeNode(type, node.offset, node.strategy);\n        };\n    }\n\n    if (keys.includes('postOffsetTypeNode')) {\n        visitor.visitPostOffsetType = function visitPostOffsetType(node) {\n            const type = visit(this)(node.type);\n            if (type === null) return null;\n            assertIsNode(type, TYPE_NODES);\n            return postOffsetTypeNode(type, node.offset, node.strategy);\n        };\n    }\n\n    if (keys.includes('sentinelTypeNode')) {\n        visitor.visitSentinelType = function visitSentinelType(node) {\n            const sentinel = visit(this)(node.sentinel);\n            if (sentinel === null) return null;\n            assertIsNode(sentinel, 'constantValueNode');\n            const type = visit(this)(node.type);\n            if (type === null) return null;\n            assertIsNode(type, TYPE_NODES);\n            return sentinelTypeNode(type, sentinel);\n        };\n    }\n\n    if (keys.includes('hiddenPrefixTypeNode')) {\n        visitor.visitHiddenPrefixType = function visitHiddenPrefixType(node) {\n            const type = visit(this)(node.type);\n            if (type === null) return null;\n            assertIsNode(type, TYPE_NODES);\n            const prefix = node.prefix.map(visit(this)).filter(removeNullAndAssertIsNodeFilter('constantValueNode'));\n            if (prefix.length === 0) return type;\n            return hiddenPrefixTypeNode(type, prefix);\n        };\n    }\n\n    if (keys.includes('hiddenSuffixTypeNode')) {\n        visitor.visitHiddenSuffixType = function visitHiddenSuffixType(node) {\n            const type = visit(this)(node.type);\n            if (type === null) return null;\n            assertIsNode(type, TYPE_NODES);\n            const suffix = node.suffix.map(visit(this)).filter(removeNullAndAssertIsNodeFilter('constantValueNode'));\n            if (suffix.length === 0) return type;\n            return hiddenSuffixTypeNode(type, suffix);\n        };\n    }\n\n    if (keys.includes('constantDiscriminatorNode')) {\n        visitor.visitConstantDiscriminator = function visitConstantDiscriminator(node) {\n            const constant = visit(this)(node.constant);\n            if (constant === null) return null;\n            assertIsNode(constant, 'constantValueNode');\n            return constantDiscriminatorNode(constant, node.offset);\n        };\n    }\n\n    if (keys.includes('accountLinkNode')) {\n        visitor.visitAccountLink = function visitAccountLink(node) {\n            const program = node.program ? (visit(this)(node.program) ?? undefined) : undefined;\n            if (program) assertIsNode(program, 'programLinkNode');\n            return accountLinkNode(node.name, program);\n        };\n    }\n\n    if (keys.includes('definedTypeLinkNode')) {\n        visitor.visitDefinedTypeLink = function visitDefinedTypeLink(node) {\n            const program = node.program ? (visit(this)(node.program) ?? undefined) : undefined;\n            if (program) assertIsNode(program, 'programLinkNode');\n            return definedTypeLinkNode(node.name, program);\n        };\n    }\n\n    if (keys.includes('instructionLinkNode')) {\n        visitor.visitInstructionLink = function visitInstructionLink(node) {\n            const program = node.program ? (visit(this)(node.program) ?? undefined) : undefined;\n            if (program) assertIsNode(program, 'programLinkNode');\n            return instructionLinkNode(node.name, program);\n        };\n    }\n\n    if (keys.includes('instructionAccountLinkNode')) {\n        visitor.visitInstructionAccountLink = function visitInstructionAccountLink(node) {\n            const instruction = node.instruction ? (visit(this)(node.instruction) ?? undefined) : undefined;\n            if (instruction) assertIsNode(instruction, 'instructionLinkNode');\n            return instructionAccountLinkNode(node.name, instruction);\n        };\n    }\n\n    if (keys.includes('instructionArgumentLinkNode')) {\n        visitor.visitInstructionArgumentLink = function visitInstructionArgumentLink(node) {\n            const instruction = node.instruction ? (visit(this)(node.instruction) ?? undefined) : undefined;\n            if (instruction) assertIsNode(instruction, 'instructionLinkNode');\n            return instructionArgumentLinkNode(node.name, instruction);\n        };\n    }\n\n    if (keys.includes('pdaLinkNode')) {\n        visitor.visitPdaLink = function visitPdaLink(node) {\n            const program = node.program ? (visit(this)(node.program) ?? undefined) : undefined;\n            if (program) assertIsNode(program, 'programLinkNode');\n            return pdaLinkNode(node.name, program);\n        };\n    }\n\n    return visitor as Visitor<Node, TNodeKind>;\n}\n"
  },
  {
    "path": "packages/visitors-core/src/index.ts",
    "content": "export * from './bottomUpTransformerVisitor';\nexport * from './consoleLogVisitor';\nexport * from './deleteNodesVisitor';\nexport * from './extendVisitor';\nexport * from './getByteSizeVisitor';\nexport * from './getDebugStringVisitor';\nexport * from './getMaxByteSizeVisitor';\nexport * from './getResolvedInstructionInputsVisitor';\nexport * from './getUniqueHashStringVisitor';\nexport * from './identityVisitor';\nexport * from './interceptFirstVisitVisitor';\nexport * from './interceptVisitor';\nexport * from './LinkableDictionary';\nexport * from './mapVisitor';\nexport * from './mergeVisitor';\nexport * from './NodePath';\nexport * from './NodeSelector';\nexport * from './NodeStack';\nexport * from './nonNullableIdentityVisitor';\nexport * from './pipe';\nexport * from './recordLinkablesVisitor';\nexport * from './recordNodeStackVisitor';\nexport * from './removeDocsVisitor';\nexport * from './singleNodeVisitor';\nexport * from './staticVisitor';\nexport * from './tapVisitor';\nexport * from './topDownTransformerVisitor';\nexport * from './visitor';\nexport * from './voidVisitor';\n"
  },
  {
    "path": "packages/visitors-core/src/interceptFirstVisitVisitor.ts",
    "content": "import type { NodeKind } from '@codama/nodes';\n\nimport { interceptVisitor, VisitorInterceptor } from './interceptVisitor';\nimport { Visitor } from './visitor';\n\nexport function interceptFirstVisitVisitor<TReturn, TNodeKind extends NodeKind>(\n    visitor: Visitor<TReturn, TNodeKind>,\n    interceptor: VisitorInterceptor<TReturn>,\n): Visitor<TReturn, TNodeKind> {\n    let isFirstVisit = true;\n\n    return interceptVisitor(visitor, (node, next) => {\n        try {\n            if (isFirstVisit) {\n                isFirstVisit = false;\n                const result = interceptor(node, next);\n                isFirstVisit = true;\n                return result;\n            }\n            return next(node);\n        } catch (error) {\n            isFirstVisit = true;\n            throw error;\n        }\n    });\n}\n"
  },
  {
    "path": "packages/visitors-core/src/interceptVisitor.ts",
    "content": "import { Node, NodeKind, REGISTERED_NODE_KINDS } from '@codama/nodes';\n\nimport { getVisitFunctionName, GetVisitorFunctionName, Visitor } from './visitor';\n\nexport type VisitorInterceptor<TReturn> = <TNode extends Node>(node: TNode, next: (node: TNode) => TReturn) => TReturn;\n\nexport function interceptVisitor<TReturn, TNodeKind extends NodeKind>(\n    visitor: Visitor<TReturn, TNodeKind>,\n    interceptor: VisitorInterceptor<TReturn>,\n): Visitor<TReturn, TNodeKind> {\n    const registeredVisitFunctions = REGISTERED_NODE_KINDS.map(getVisitFunctionName);\n\n    return Object.fromEntries(\n        Object.keys(visitor).flatMap(key => {\n            const castedKey = key as GetVisitorFunctionName<TNodeKind>;\n            if (!registeredVisitFunctions.includes(castedKey)) {\n                return [];\n            }\n\n            return [\n                [\n                    castedKey,\n                    function interceptedVisitNode<TNode extends Node>(this: Visitor<TReturn, TNodeKind>, node: TNode) {\n                        const baseFunction = visitor[castedKey] as (node: TNode) => TReturn;\n                        return interceptor<TNode>(node, baseFunction.bind(this));\n                    },\n                ],\n            ];\n        }),\n    ) as Visitor<TReturn, TNodeKind>;\n}\n"
  },
  {
    "path": "packages/visitors-core/src/mapVisitor.ts",
    "content": "import { GetNodeFromKind, NodeKind, REGISTERED_NODE_KINDS } from '@codama/nodes';\n\nimport { getVisitFunctionName, GetVisitorFunctionName, Visitor } from './visitor';\n\nexport function mapVisitor<TReturnFrom, TReturnTo, TNodeKind extends NodeKind>(\n    visitor: Visitor<TReturnFrom, TNodeKind>,\n    map: (from: TReturnFrom) => TReturnTo,\n): Visitor<TReturnTo, TNodeKind> {\n    const registeredVisitFunctions = REGISTERED_NODE_KINDS.map(getVisitFunctionName);\n    return Object.fromEntries(\n        Object.keys(visitor).flatMap(key => {\n            const castedKey = key as GetVisitorFunctionName<TNodeKind>;\n            if (!registeredVisitFunctions.includes(castedKey)) {\n                return [];\n            }\n\n            return [\n                [\n                    castedKey,\n                    (node: GetNodeFromKind<TNodeKind>) =>\n                        map((visitor[castedKey] as (node: GetNodeFromKind<TNodeKind>) => TReturnFrom)(node)),\n                ],\n            ];\n        }),\n    ) as unknown as Visitor<TReturnTo, TNodeKind>;\n}\n"
  },
  {
    "path": "packages/visitors-core/src/mergeVisitor.ts",
    "content": "import { getAllPrograms, Node, NodeKind, REGISTERED_NODE_KINDS } from '@codama/nodes';\n\nimport { staticVisitor } from './staticVisitor';\nimport { visit as baseVisit, Visitor } from './visitor';\n\nexport function mergeVisitor<TReturn, TNodeKind extends NodeKind = NodeKind>(\n    leafValue: (node: Node) => TReturn,\n    merge: (node: Node, values: TReturn[]) => TReturn,\n    options: { keys?: TNodeKind[] } = {},\n): Visitor<TReturn, TNodeKind> {\n    const keys: NodeKind[] = options.keys ?? REGISTERED_NODE_KINDS;\n    const visitor = staticVisitor(leafValue, { keys }) as Visitor<TReturn>;\n    const visit =\n        (v: Visitor<TReturn>) =>\n        (node: Node): TReturn[] =>\n            keys.includes(node.kind) ? [baseVisit(node, v)] : [];\n\n    if (keys.includes('rootNode')) {\n        visitor.visitRoot = function visitRoot(node) {\n            return merge(node, getAllPrograms(node).flatMap(visit(this)));\n        };\n    }\n\n    if (keys.includes('programNode')) {\n        visitor.visitProgram = function visitProgram(node) {\n            return merge(node, [\n                ...node.pdas.flatMap(visit(this)),\n                ...node.accounts.flatMap(visit(this)),\n                ...(node.events ?? []).flatMap(visit(this)),\n                ...node.instructions.flatMap(visit(this)),\n                ...node.definedTypes.flatMap(visit(this)),\n                ...node.errors.flatMap(visit(this)),\n            ]);\n        };\n    }\n\n    if (keys.includes('pdaNode')) {\n        visitor.visitPda = function visitPda(node) {\n            return merge(node, node.seeds.flatMap(visit(this)));\n        };\n    }\n\n    if (keys.includes('accountNode')) {\n        visitor.visitAccount = function visitAccount(node) {\n            return merge(node, [\n                ...visit(this)(node.data),\n                ...(node.pda ? visit(this)(node.pda) : []),\n                ...(node.discriminators ?? []).flatMap(visit(this)),\n            ]);\n        };\n    }\n\n    if (keys.includes('eventNode')) {\n        visitor.visitEvent = function visitEvent(node) {\n            return merge(node, [...visit(this)(node.data), ...(node.discriminators ?? []).flatMap(visit(this))]);\n        };\n    }\n\n    if (keys.includes('instructionNode')) {\n        visitor.visitInstruction = function visitInstruction(node) {\n            return merge(node, [\n                ...(node.status ? visit(this)(node.status) : []),\n                ...node.accounts.flatMap(visit(this)),\n                ...node.arguments.flatMap(visit(this)),\n                ...(node.extraArguments ?? []).flatMap(visit(this)),\n                ...(node.remainingAccounts ?? []).flatMap(visit(this)),\n                ...(node.byteDeltas ?? []).flatMap(visit(this)),\n                ...(node.discriminators ?? []).flatMap(visit(this)),\n                ...(node.subInstructions ?? []).flatMap(visit(this)),\n            ]);\n        };\n    }\n\n    if (keys.includes('instructionAccountNode')) {\n        visitor.visitInstructionAccount = function visitInstructionAccount(node) {\n            return merge(node, [...(node.defaultValue ? visit(this)(node.defaultValue) : [])]);\n        };\n    }\n\n    if (keys.includes('instructionArgumentNode')) {\n        visitor.visitInstructionArgument = function visitInstructionArgument(node) {\n            return merge(node, [\n                ...visit(this)(node.type),\n                ...(node.defaultValue ? visit(this)(node.defaultValue) : []),\n            ]);\n        };\n    }\n\n    if (keys.includes('instructionRemainingAccountsNode')) {\n        visitor.visitInstructionRemainingAccounts = function visitInstructionRemainingAccounts(node) {\n            return merge(node, visit(this)(node.value));\n        };\n    }\n\n    if (keys.includes('instructionByteDeltaNode')) {\n        visitor.visitInstructionByteDelta = function visitInstructionByteDelta(node) {\n            return merge(node, visit(this)(node.value));\n        };\n    }\n\n    if (keys.includes('instructionStatusNode')) {\n        visitor.visitInstructionStatus = function visitInstructionStatus(node) {\n            return merge(node, []);\n        };\n    }\n\n    if (keys.includes('definedTypeNode')) {\n        visitor.visitDefinedType = function visitDefinedType(node) {\n            return merge(node, visit(this)(node.type));\n        };\n    }\n\n    if (keys.includes('arrayTypeNode')) {\n        visitor.visitArrayType = function visitArrayType(node) {\n            return merge(node, [...visit(this)(node.count), ...visit(this)(node.item)]);\n        };\n    }\n\n    if (keys.includes('enumTypeNode')) {\n        visitor.visitEnumType = function visitEnumType(node) {\n            return merge(node, [...visit(this)(node.size), ...node.variants.flatMap(visit(this))]);\n        };\n    }\n\n    if (keys.includes('enumStructVariantTypeNode')) {\n        visitor.visitEnumStructVariantType = function visitEnumStructVariantType(node) {\n            return merge(node, visit(this)(node.struct));\n        };\n    }\n\n    if (keys.includes('enumTupleVariantTypeNode')) {\n        visitor.visitEnumTupleVariantType = function visitEnumTupleVariantType(node) {\n            return merge(node, visit(this)(node.tuple));\n        };\n    }\n\n    if (keys.includes('mapTypeNode')) {\n        visitor.visitMapType = function visitMapType(node) {\n            return merge(node, [...visit(this)(node.count), ...visit(this)(node.key), ...visit(this)(node.value)]);\n        };\n    }\n\n    if (keys.includes('optionTypeNode')) {\n        visitor.visitOptionType = function visitOptionType(node) {\n            return merge(node, [...visit(this)(node.prefix), ...visit(this)(node.item)]);\n        };\n    }\n\n    if (keys.includes('zeroableOptionTypeNode')) {\n        visitor.visitZeroableOptionType = function visitZeroableOptionType(node) {\n            return merge(node, [...visit(this)(node.item), ...(node.zeroValue ? visit(this)(node.zeroValue) : [])]);\n        };\n    }\n\n    if (keys.includes('remainderOptionTypeNode')) {\n        visitor.visitRemainderOptionType = function visitRemainderOptionType(node) {\n            return merge(node, visit(this)(node.item));\n        };\n    }\n\n    if (keys.includes('booleanTypeNode')) {\n        visitor.visitBooleanType = function visitBooleanType(node) {\n            return merge(node, visit(this)(node.size));\n        };\n    }\n\n    if (keys.includes('setTypeNode')) {\n        visitor.visitSetType = function visitSetType(node) {\n            return merge(node, [...visit(this)(node.count), ...visit(this)(node.item)]);\n        };\n    }\n\n    if (keys.includes('structTypeNode')) {\n        visitor.visitStructType = function visitStructType(node) {\n            return merge(node, node.fields.flatMap(visit(this)));\n        };\n    }\n\n    if (keys.includes('structFieldTypeNode')) {\n        visitor.visitStructFieldType = function visitStructFieldType(node) {\n            return merge(node, [\n                ...visit(this)(node.type),\n                ...(node.defaultValue ? visit(this)(node.defaultValue) : []),\n            ]);\n        };\n    }\n\n    if (keys.includes('tupleTypeNode')) {\n        visitor.visitTupleType = function visitTupleType(node) {\n            return merge(node, node.items.flatMap(visit(this)));\n        };\n    }\n\n    if (keys.includes('amountTypeNode')) {\n        visitor.visitAmountType = function visitAmountType(node) {\n            return merge(node, visit(this)(node.number));\n        };\n    }\n\n    if (keys.includes('dateTimeTypeNode')) {\n        visitor.visitDateTimeType = function visitDateTimeType(node) {\n            return merge(node, visit(this)(node.number));\n        };\n    }\n\n    if (keys.includes('solAmountTypeNode')) {\n        visitor.visitSolAmountType = function visitSolAmountType(node) {\n            return merge(node, visit(this)(node.number));\n        };\n    }\n\n    if (keys.includes('prefixedCountNode')) {\n        visitor.visitPrefixedCount = function visitPrefixedCount(node) {\n            return merge(node, visit(this)(node.prefix));\n        };\n    }\n\n    if (keys.includes('arrayValueNode')) {\n        visitor.visitArrayValue = function visitArrayValue(node) {\n            return merge(node, node.items.flatMap(visit(this)));\n        };\n    }\n\n    if (keys.includes('constantValueNode')) {\n        visitor.visitConstantValue = function visitConstantValue(node) {\n            return merge(node, [...visit(this)(node.type), ...visit(this)(node.value)]);\n        };\n    }\n\n    if (keys.includes('enumValueNode')) {\n        visitor.visitEnumValue = function visitEnumValue(node) {\n            return merge(node, [...visit(this)(node.enum), ...(node.value ? visit(this)(node.value) : [])]);\n        };\n    }\n\n    if (keys.includes('mapValueNode')) {\n        visitor.visitMapValue = function visitMapValue(node) {\n            return merge(node, node.entries.flatMap(visit(this)));\n        };\n    }\n\n    if (keys.includes('mapEntryValueNode')) {\n        visitor.visitMapEntryValue = function visitMapEntryValue(node) {\n            return merge(node, [...visit(this)(node.key), ...visit(this)(node.value)]);\n        };\n    }\n\n    if (keys.includes('setValueNode')) {\n        visitor.visitSetValue = function visitSetValue(node) {\n            return merge(node, node.items.flatMap(visit(this)));\n        };\n    }\n\n    if (keys.includes('someValueNode')) {\n        visitor.visitSomeValue = function visitSomeValue(node) {\n            return merge(node, visit(this)(node.value));\n        };\n    }\n\n    if (keys.includes('structValueNode')) {\n        visitor.visitStructValue = function visitStructValue(node) {\n            return merge(node, node.fields.flatMap(visit(this)));\n        };\n    }\n\n    if (keys.includes('structFieldValueNode')) {\n        visitor.visitStructFieldValue = function visitStructFieldValue(node) {\n            return merge(node, visit(this)(node.value));\n        };\n    }\n\n    if (keys.includes('tupleValueNode')) {\n        visitor.visitTupleValue = function visitTupleValue(node) {\n            return merge(node, node.items.flatMap(visit(this)));\n        };\n    }\n\n    if (keys.includes('constantPdaSeedNode')) {\n        visitor.visitConstantPdaSeed = function visitConstantPdaSeed(node) {\n            return merge(node, [...visit(this)(node.type), ...visit(this)(node.value)]);\n        };\n    }\n\n    if (keys.includes('variablePdaSeedNode')) {\n        visitor.visitVariablePdaSeed = function visitVariablePdaSeed(node) {\n            return merge(node, visit(this)(node.type));\n        };\n    }\n\n    if (keys.includes('resolverValueNode')) {\n        visitor.visitResolverValue = function visitResolverValue(node) {\n            return merge(node, (node.dependsOn ?? []).flatMap(visit(this)));\n        };\n    }\n\n    if (keys.includes('conditionalValueNode')) {\n        visitor.visitConditionalValue = function visitConditionalValue(node) {\n            return merge(node, [\n                ...visit(this)(node.condition),\n                ...(node.value ? visit(this)(node.value) : []),\n                ...(node.ifTrue ? visit(this)(node.ifTrue) : []),\n                ...(node.ifFalse ? visit(this)(node.ifFalse) : []),\n            ]);\n        };\n    }\n\n    if (keys.includes('pdaValueNode')) {\n        visitor.visitPdaValue = function visitPdaValue(node) {\n            return merge(node, [...visit(this)(node.pda), ...node.seeds.flatMap(visit(this))]);\n        };\n    }\n\n    if (keys.includes('pdaSeedValueNode')) {\n        visitor.visitPdaSeedValue = function visitPdaSeedValue(node) {\n            return merge(node, visit(this)(node.value));\n        };\n    }\n\n    if (keys.includes('fixedSizeTypeNode')) {\n        visitor.visitFixedSizeType = function visitFixedSizeType(node) {\n            return merge(node, visit(this)(node.type));\n        };\n    }\n\n    if (keys.includes('sizePrefixTypeNode')) {\n        visitor.visitSizePrefixType = function visitSizePrefixType(node) {\n            return merge(node, [...visit(this)(node.prefix), ...visit(this)(node.type)]);\n        };\n    }\n\n    if (keys.includes('preOffsetTypeNode')) {\n        visitor.visitPreOffsetType = function visitPreOffsetType(node) {\n            return merge(node, visit(this)(node.type));\n        };\n    }\n\n    if (keys.includes('postOffsetTypeNode')) {\n        visitor.visitPostOffsetType = function visitPostOffsetType(node) {\n            return merge(node, visit(this)(node.type));\n        };\n    }\n\n    if (keys.includes('sentinelTypeNode')) {\n        visitor.visitSentinelType = function visitSentinelType(node) {\n            return merge(node, [...visit(this)(node.sentinel), ...visit(this)(node.type)]);\n        };\n    }\n\n    if (keys.includes('hiddenPrefixTypeNode')) {\n        visitor.visitHiddenPrefixType = function visitHiddenPrefixType(node) {\n            return merge(node, [...node.prefix.flatMap(visit(this)), ...visit(this)(node.type)]);\n        };\n    }\n\n    if (keys.includes('hiddenSuffixTypeNode')) {\n        visitor.visitHiddenSuffixType = function visitHiddenSuffixType(node) {\n            return merge(node, [...visit(this)(node.type), ...node.suffix.flatMap(visit(this))]);\n        };\n    }\n\n    if (keys.includes('constantDiscriminatorNode')) {\n        visitor.visitConstantDiscriminator = function visitConstantDiscriminator(node) {\n            return merge(node, visit(this)(node.constant));\n        };\n    }\n\n    if (keys.includes('accountLinkNode')) {\n        visitor.visitAccountLink = function visitAccountLink(node) {\n            return merge(node, node.program ? visit(this)(node.program) : []);\n        };\n    }\n\n    if (keys.includes('definedTypeLinkNode')) {\n        visitor.visitDefinedTypeLink = function visitDefinedTypeLink(node) {\n            return merge(node, node.program ? visit(this)(node.program) : []);\n        };\n    }\n\n    if (keys.includes('instructionLinkNode')) {\n        visitor.visitInstructionLink = function visitInstructionLink(node) {\n            return merge(node, node.program ? visit(this)(node.program) : []);\n        };\n    }\n\n    if (keys.includes('instructionAccountLinkNode')) {\n        visitor.visitInstructionAccountLink = function visitInstructionAccountLink(node) {\n            return merge(node, node.instruction ? visit(this)(node.instruction) : []);\n        };\n    }\n\n    if (keys.includes('instructionArgumentLinkNode')) {\n        visitor.visitInstructionArgumentLink = function visitInstructionArgumentLink(node) {\n            return merge(node, node.instruction ? visit(this)(node.instruction) : []);\n        };\n    }\n\n    if (keys.includes('pdaLinkNode')) {\n        visitor.visitPdaLink = function visitPdaLink(node) {\n            return merge(node, node.program ? visit(this)(node.program) : []);\n        };\n    }\n\n    return visitor as Visitor<TReturn, TNodeKind>;\n}\n"
  },
  {
    "path": "packages/visitors-core/src/nonNullableIdentityVisitor.ts",
    "content": "import { Node, NodeKind } from '@codama/nodes';\n\nimport { identityVisitor } from './identityVisitor';\nimport { Visitor } from './visitor';\n\nexport function nonNullableIdentityVisitor<TNodeKind extends NodeKind = NodeKind>(\n    options: { keys?: TNodeKind[] } = {},\n): Visitor<Node, TNodeKind> {\n    return identityVisitor<TNodeKind>(options) as Visitor<Node, TNodeKind>;\n}\n"
  },
  {
    "path": "packages/visitors-core/src/pipe.ts",
    "content": "/**\n * Copied from @solana/functional.\n * @see https://github.com/anza-xyz/kit/blob/main/packages/functional/src/pipe.ts\n *\n * ---\n *\n * General pipe function.\n * Provide an initial value and a list of functions to pipe it through.\n *\n * Following common implementations of pipe functions that use TypeScript,\n * this function supports a maximum arity of 10 for type safety.\n * @see https://github.com/ramda/ramda/blob/master/source/pipe.js\n * @see https://github.com/darky/rocket-pipes/blob/master/index.ts\n *\n * Note you can use nested pipes to extend this limitation, like so:\n * ```typescript\n * const myValue = pipe(\n *      pipe(\n *          1,\n *          (x) => x + 1,\n *          (x) => x * 2,\n *          (x) => x - 1,\n *      ),\n *      (y) => y / 3,\n *      (y) => y + 1,\n * );\n * ```\n * @param init  The initial value\n * @param fns   Any number of functions to pipe the value through\n * @returns     The final value with all functions applied\n */\nexport function pipe<TInitial>(init: TInitial): TInitial;\nexport function pipe<TInitial, R1>(init: TInitial, init_r1: (init: TInitial) => R1): R1;\nexport function pipe<TInitial, R1, R2>(init: TInitial, init_r1: (init: TInitial) => R1, r1_r2: (r1: R1) => R2): R2;\nexport function pipe<TInitial, R1, R2, R3>(\n    init: TInitial,\n    init_r1: (init: TInitial) => R1,\n    r1_r2: (r1: R1) => R2,\n    r2_r3: (r2: R2) => R3,\n): R3;\nexport function pipe<TInitial, R1, R2, R3, R4>(\n    init: TInitial,\n    init_r1: (init: TInitial) => R1,\n    r1_r2: (r1: R1) => R2,\n    r2_r3: (r2: R2) => R3,\n    r3_r4: (r3: R3) => R4,\n): R4;\nexport function pipe<TInitial, R1, R2, R3, R4, R5>(\n    init: TInitial,\n    init_r1: (init: TInitial) => R1,\n    r1_r2: (r1: R1) => R2,\n    r2_r3: (r2: R2) => R3,\n    r3_r4: (r3: R3) => R4,\n    r4_r5: (r4: R4) => R5,\n): R5;\nexport function pipe<TInitial, R1, R2, R3, R4, R5, R6>(\n    init: TInitial,\n    init_r1: (init: TInitial) => R1,\n    r1_r2: (r1: R1) => R2,\n    r2_r3: (r2: R2) => R3,\n    r3_r4: (r3: R3) => R4,\n    r4_r5: (r4: R4) => R5,\n    r5_r6: (r5: R5) => R6,\n): R6;\nexport function pipe<TInitial, R1, R2, R3, R4, R5, R6, R7>(\n    init: TInitial,\n    init_r1: (init: TInitial) => R1,\n    r1_r2: (r1: R1) => R2,\n    r2_r3: (r2: R2) => R3,\n    r3_r4: (r3: R3) => R4,\n    r4_r5: (r4: R4) => R5,\n    r5_r6: (r5: R5) => R6,\n    r6_r7: (r6: R6) => R7,\n): R7;\nexport function pipe<TInitial, R1, R2, R3, R4, R5, R6, R7, R8>(\n    init: TInitial,\n    init_r1: (init: TInitial) => R1,\n    r1_r2: (r1: R1) => R2,\n    r2_r3: (r2: R2) => R3,\n    r3_r4: (r3: R3) => R4,\n    r4_r5: (r4: R4) => R5,\n    r5_r6: (r5: R5) => R6,\n    r6_r7: (r6: R6) => R7,\n    r7_r8: (r7: R7) => R8,\n): R8;\nexport function pipe<TInitial, R1, R2, R3, R4, R5, R6, R7, R8, R9>(\n    init: TInitial,\n    init_r1: (init: TInitial) => R1,\n    r1_r2: (r1: R1) => R2,\n    r2_r3: (r2: R2) => R3,\n    r3_r4: (r3: R3) => R4,\n    r4_r5: (r4: R4) => R5,\n    r5_r6: (r5: R5) => R6,\n    r6_r7: (r6: R6) => R7,\n    r7_r8: (r7: R7) => R8,\n    r8_r9: (r8: R8) => R9,\n): R9;\nexport function pipe<TInitial, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10>(\n    init: TInitial,\n    init_r1: (init: TInitial) => R1,\n    r1_r2: (r1: R1) => R2,\n    r2_r3: (r2: R2) => R3,\n    r3_r4: (r3: R3) => R4,\n    r4_r5: (r4: R4) => R5,\n    r5_r6: (r5: R5) => R6,\n    r6_r7: (r6: R6) => R7,\n    r7_r8: (r7: R7) => R8,\n    r8_r9: (r8: R8) => R9,\n    r9_r10: (r9: R9) => R10,\n): R10;\nexport function pipe<TInitial>(init: TInitial, ...fns: CallableFunction[]) {\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call\n    return fns.reduce((acc, fn) => fn(acc), init);\n}\n"
  },
  {
    "path": "packages/visitors-core/src/recordLinkablesVisitor.ts",
    "content": "import { isNode, type NodeKind } from '@codama/nodes';\n\nimport { interceptFirstVisitVisitor } from './interceptFirstVisitVisitor';\nimport { interceptVisitor } from './interceptVisitor';\nimport { LINKABLE_NODES, LinkableDictionary } from './LinkableDictionary';\nimport { NodeStack } from './NodeStack';\nimport { pipe } from './pipe';\nimport { recordNodeStackVisitor } from './recordNodeStackVisitor';\nimport { visit, Visitor } from './visitor';\nimport { voidVisitor } from './voidVisitor';\n\nexport function getRecordLinkablesVisitor<TNodeKind extends NodeKind>(\n    linkables: LinkableDictionary,\n): Visitor<void, TNodeKind> {\n    const stack = new NodeStack();\n    return pipe(\n        voidVisitor(),\n        v =>\n            interceptVisitor(v, (node, next) => {\n                if (isNode(node, LINKABLE_NODES)) {\n                    linkables.recordPath(stack.getPath(LINKABLE_NODES));\n                }\n                return next(node);\n            }),\n        v => recordNodeStackVisitor(v, stack),\n    );\n}\n\nexport function recordLinkablesOnFirstVisitVisitor<TReturn, TNodeKind extends NodeKind>(\n    visitor: Visitor<TReturn, TNodeKind>,\n    linkables: LinkableDictionary,\n): Visitor<TReturn, TNodeKind> {\n    const recordingVisitor = getRecordLinkablesVisitor(linkables);\n\n    return pipe(visitor, v =>\n        interceptFirstVisitVisitor(v, (node, next) => {\n            visit(node, recordingVisitor);\n            return next(node);\n        }),\n    );\n}\n"
  },
  {
    "path": "packages/visitors-core/src/recordNodeStackVisitor.ts",
    "content": "import { NodeKind } from '@codama/nodes';\n\nimport { interceptVisitor } from './interceptVisitor';\nimport { NodeStack } from './NodeStack';\nimport { Visitor } from './visitor';\n\nexport function recordNodeStackVisitor<TReturn, TNodeKind extends NodeKind>(\n    visitor: Visitor<TReturn, TNodeKind>,\n    stack: NodeStack,\n): Visitor<TReturn, TNodeKind> {\n    return interceptVisitor(visitor, (node, next) => {\n        stack.push(node);\n        const newNode = next(node);\n        stack.pop();\n        return newNode;\n    });\n}\n"
  },
  {
    "path": "packages/visitors-core/src/removeDocsVisitor.ts",
    "content": "import { NodeKind } from '@codama/nodes';\n\nimport { interceptVisitor } from './interceptVisitor';\nimport { nonNullableIdentityVisitor } from './nonNullableIdentityVisitor';\n\nexport function removeDocsVisitor<TNodeKind extends NodeKind = NodeKind>(options: { keys?: TNodeKind[] } = {}) {\n    return interceptVisitor(nonNullableIdentityVisitor(options), (node, next) => {\n        if ('docs' in node) {\n            return next({ ...node, docs: [] });\n        }\n        return next(node);\n    });\n}\n"
  },
  {
    "path": "packages/visitors-core/src/singleNodeVisitor.ts",
    "content": "import { GetNodeFromKind, NodeKind, RootNode } from '@codama/nodes';\n\nimport { getVisitFunctionName, GetVisitorFunctionName, Visitor } from './visitor';\n\nexport function singleNodeVisitor<TReturn, TNodeKey extends NodeKind = NodeKind>(\n    key: TNodeKey,\n    fn: (node: GetNodeFromKind<TNodeKey>) => TReturn,\n): Visitor<TReturn, TNodeKey> {\n    const visitor = {} as Visitor<TReturn, TNodeKey>;\n    visitor[getVisitFunctionName(key)] = fn as unknown as Visitor<TReturn, TNodeKey>[GetVisitorFunctionName<TNodeKey>];\n\n    return visitor;\n}\n\nexport function rootNodeVisitor<TReturn = RootNode>(fn: (node: RootNode) => TReturn) {\n    return singleNodeVisitor('rootNode', fn);\n}\n"
  },
  {
    "path": "packages/visitors-core/src/staticVisitor.ts",
    "content": "import { Node, NodeKind, REGISTERED_NODE_KINDS } from '@codama/nodes';\n\nimport { getVisitFunctionName, Visitor } from './visitor';\n\nexport function staticVisitor<TReturn, TNodeKind extends NodeKind = NodeKind>(\n    fn: (node: Node) => TReturn,\n    options: { keys?: TNodeKind[] } = {},\n): Visitor<TReturn, TNodeKind> {\n    const keys = options.keys ?? (REGISTERED_NODE_KINDS as TNodeKind[]);\n    const visitor = {} as Visitor<TReturn>;\n    keys.forEach(key => {\n        visitor[getVisitFunctionName(key)] = fn.bind(visitor);\n    });\n    return visitor;\n}\n"
  },
  {
    "path": "packages/visitors-core/src/tapVisitor.ts",
    "content": "import { GetNodeFromKind, NodeKind } from '@codama/nodes';\n\nimport { getVisitFunctionName, GetVisitorFunctionName, Visitor } from './visitor';\n\nexport function tapVisitor<TReturn, TNodeKey extends NodeKind, TVisitor extends Visitor<TReturn, TNodeKey>>(\n    visitor: TVisitor,\n    key: TNodeKey,\n    tap: (node: GetNodeFromKind<TNodeKey>) => void,\n): TVisitor {\n    const newVisitor = { ...visitor };\n    newVisitor[getVisitFunctionName(key)] = function tappedVisitNode(\n        this: TVisitor,\n        node: GetNodeFromKind<TNodeKey>,\n    ): TReturn {\n        tap(node);\n        const parentFunction = visitor[getVisitFunctionName(key)] as (node: GetNodeFromKind<TNodeKey>) => TReturn;\n        return parentFunction.bind(this)(node);\n    } as TVisitor[GetVisitorFunctionName<TNodeKey>];\n\n    return newVisitor;\n}\n"
  },
  {
    "path": "packages/visitors-core/src/topDownTransformerVisitor.ts",
    "content": "import { Node, NodeKind, REGISTERED_NODE_KINDS } from '@codama/nodes';\n\nimport { identityVisitor } from './identityVisitor';\nimport { interceptVisitor } from './interceptVisitor';\nimport { getConjunctiveNodeSelectorFunction, NodeSelector } from './NodeSelector';\nimport { NodeStack } from './NodeStack';\nimport { pipe } from './pipe';\nimport { recordNodeStackVisitor } from './recordNodeStackVisitor';\nimport { Visitor } from './visitor';\n\nexport type TopDownNodeTransformer = <TNode extends Node>(node: TNode, stack: NodeStack) => TNode | null;\n\nexport type TopDownNodeTransformerWithSelector = {\n    select: NodeSelector | NodeSelector[];\n    transform: TopDownNodeTransformer;\n};\n\nexport function topDownTransformerVisitor<TNodeKind extends NodeKind = NodeKind>(\n    transformers: (TopDownNodeTransformer | TopDownNodeTransformerWithSelector)[],\n    options: { keys?: TNodeKind[]; stack?: NodeStack } = {},\n): Visitor<Node | null, TNodeKind> {\n    const transformerFunctions = transformers.map((transformer): TopDownNodeTransformer => {\n        if (typeof transformer === 'function') return transformer;\n        return (node, stack) =>\n            getConjunctiveNodeSelectorFunction(transformer.select)(stack.getPath(REGISTERED_NODE_KINDS))\n                ? transformer.transform(node, stack)\n                : node;\n    });\n\n    const stack = options.stack ?? new NodeStack();\n    return pipe(\n        identityVisitor(options),\n        v =>\n            interceptVisitor(v, (node, next) => {\n                const appliedNode = transformerFunctions.reduce(\n                    (acc, transformer) => (acc === null ? null : transformer(acc, stack)),\n                    node as Parameters<typeof next>[0] | null,\n                );\n                if (appliedNode === null) return null;\n                return next(appliedNode);\n            }),\n        v => recordNodeStackVisitor(v, stack),\n    );\n}\n"
  },
  {
    "path": "packages/visitors-core/src/visitor.ts",
    "content": "import { CODAMA_ERROR__UNRECOGNIZED_NODE_KIND, CodamaError } from '@codama/errors';\nimport { type GetNodeFromKind, type Node, type NodeKind, pascalCase, REGISTERED_NODE_KINDS } from '@codama/nodes';\n\nexport type Visitor<TReturn, TNodeKind extends NodeKind = NodeKind> = {\n    [K in TNodeKind as GetVisitorFunctionName<K>]: (node: GetNodeFromKind<K>) => TReturn;\n};\n\nexport type GetVisitorFunctionName<T extends Node['kind']> = T extends `${infer TWithoutNode}Node`\n    ? `visit${Capitalize<TWithoutNode>}`\n    : never;\n\nexport function visit<TReturn, TNode extends Node>(node: TNode, visitor: Visitor<TReturn, TNode['kind']>): TReturn {\n    const key = getVisitFunctionName(node.kind) as GetVisitorFunctionName<TNode['kind']>;\n    return (visitor[key] as (typeof visitor)[typeof key] & ((node: TNode) => TReturn))(node);\n}\n\nexport function visitOrElse<TReturn, TNode extends Node, TNodeKind extends NodeKind>(\n    node: TNode,\n    visitor: Visitor<TReturn, TNodeKind>,\n    fallback: (node: TNode) => TReturn,\n): TReturn {\n    const key = getVisitFunctionName<TNode['kind']>(node.kind);\n    return (key in visitor ? (visitor[key] as (node: TNode) => TReturn) : fallback)(node);\n}\n\nexport function getVisitFunctionName<TNodeKind extends NodeKind>(nodeKind: TNodeKind) {\n    if (!REGISTERED_NODE_KINDS.includes(nodeKind)) {\n        throw new CodamaError(CODAMA_ERROR__UNRECOGNIZED_NODE_KIND, { kind: nodeKind });\n    }\n\n    return `visit${pascalCase(nodeKind.slice(0, -4))}` as GetVisitorFunctionName<TNodeKind>;\n}\n"
  },
  {
    "path": "packages/visitors-core/src/voidVisitor.ts",
    "content": "import type { NodeKind } from '@codama/nodes';\n\nimport { mergeVisitor } from './mergeVisitor';\nimport { Visitor } from './visitor';\n\nexport function voidVisitor<TNodeKind extends NodeKind = NodeKind>(\n    options: { keys?: TNodeKind[] } = {},\n): Visitor<void, TNodeKind> {\n    return mergeVisitor(\n        () => undefined,\n        () => undefined,\n        options,\n    );\n}\n"
  },
  {
    "path": "packages/visitors-core/test/NodeSelector.test.ts",
    "content": "import {\n    accountNode,\n    booleanTypeNode,\n    definedTypeLinkNode,\n    definedTypeNode,\n    enumEmptyVariantTypeNode,\n    enumStructVariantTypeNode,\n    enumTypeNode,\n    errorNode,\n    instructionAccountNode,\n    instructionArgumentNode,\n    instructionNode,\n    Node,\n    numberTypeNode,\n    optionTypeNode,\n    programNode,\n    publicKeyTypeNode,\n    rootNode,\n    structFieldTypeNode,\n    structTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport {\n    getLastNodeFromPath,\n    getNodeSelectorFunction,\n    identityVisitor,\n    interceptVisitor,\n    isNodePath,\n    NodePath,\n    NodeSelector,\n    NodeStack,\n    pipe,\n    recordNodeStackVisitor,\n    visit,\n} from '../src';\n\n// Given the following tree.\nconst tree = rootNode(\n    programNode({\n        accounts: [\n            accountNode({\n                data: structTypeNode([\n                    structFieldTypeNode({\n                        name: 'owner',\n                        type: publicKeyTypeNode(),\n                    }),\n                    structFieldTypeNode({\n                        name: 'mint',\n                        type: publicKeyTypeNode(),\n                    }),\n                    structFieldTypeNode({\n                        name: 'amount',\n                        type: numberTypeNode('u64'),\n                    }),\n                    structFieldTypeNode({\n                        name: 'delegatedAmount',\n                        type: optionTypeNode(numberTypeNode('u64'), {\n                            prefix: numberTypeNode('u32'),\n                        }),\n                    }),\n                ]),\n                name: 'token',\n            }),\n        ],\n        definedTypes: [],\n        errors: [\n            errorNode({\n                code: 0,\n                message: 'Invalid program ID',\n                name: 'invalidProgramId',\n            }),\n            errorNode({\n                code: 1,\n                message: 'Invalid token owner',\n                name: 'invalidTokenOwner',\n            }),\n        ],\n        instructions: [\n            instructionNode({\n                accounts: [\n                    instructionAccountNode({\n                        isSigner: false,\n                        isWritable: true,\n                        name: 'token',\n                    }),\n                    instructionAccountNode({\n                        isSigner: false,\n                        isWritable: true,\n                        name: 'mint',\n                    }),\n                    instructionAccountNode({\n                        isSigner: true,\n                        isWritable: false,\n                        name: 'mintAuthority',\n                    }),\n                ],\n                arguments: [\n                    instructionArgumentNode({\n                        name: 'amount',\n                        type: numberTypeNode('u64'),\n                    }),\n                ],\n                name: 'mintToken',\n            }),\n        ],\n        name: 'splToken',\n        publicKey: '1111',\n        version: '1.0.0',\n    }),\n    [\n        programNode({\n            accounts: [\n                accountNode({\n                    data: structTypeNode([\n                        structFieldTypeNode({\n                            name: 'owner',\n                            type: publicKeyTypeNode(),\n                        }),\n                        structFieldTypeNode({\n                            name: 'opened',\n                            type: booleanTypeNode(numberTypeNode('u64')),\n                        }),\n                        structFieldTypeNode({\n                            name: 'amount',\n                            type: numberTypeNode('u64'),\n                        }),\n                        structFieldTypeNode({\n                            name: 'wrappingPaper',\n                            type: definedTypeLinkNode('wrappingPaper'),\n                        }),\n                    ]),\n                    name: 'gift',\n                }),\n            ],\n            definedTypes: [\n                definedTypeNode({\n                    name: 'wrappingPaper',\n                    type: enumTypeNode([\n                        enumEmptyVariantTypeNode('blue'),\n                        enumEmptyVariantTypeNode('red'),\n                        enumStructVariantTypeNode(\n                            'gold',\n                            structTypeNode([\n                                structFieldTypeNode({\n                                    name: 'owner',\n                                    type: publicKeyTypeNode(),\n                                }),\n                            ]),\n                        ),\n                    ]),\n                }),\n            ],\n            errors: [\n                errorNode({\n                    code: 0,\n                    message: 'Invalid program ID',\n                    name: 'invalidProgramId',\n                }),\n            ],\n            instructions: [\n                instructionNode({\n                    accounts: [\n                        instructionAccountNode({\n                            isSigner: false,\n                            isWritable: true,\n                            name: 'gift',\n                        }),\n                        instructionAccountNode({\n                            isSigner: true,\n                            isWritable: false,\n                            name: 'owner',\n                        }),\n                    ],\n                    arguments: [],\n                    name: 'openGift',\n                }),\n            ],\n            name: 'christmasProgram',\n            publicKey: '2222',\n            version: '1.0.0',\n        }),\n    ],\n);\n\nconst macro = (selector: NodeSelector, expectedSelected: Node[]) => {\n    const title =\n        typeof selector === 'string'\n            ? `it can select nodes using paths: \"${selector}\"`\n            : 'it can select nodes using functions';\n\n    test(title, () => {\n        // Given a selector function created from the selector.\n        const selectorFunction = getNodeSelectorFunction(selector);\n\n        // And given a visitor that keeps track of selected nodes.\n        const stack = new NodeStack();\n        const selected = [] as Node[];\n        const visitor = pipe(\n            identityVisitor(),\n            v =>\n                interceptVisitor(v, (node, next) => {\n                    if (selectorFunction(stack.getPath() as NodePath<Node>)) selected.push(node);\n                    return next(node);\n                }),\n            v => recordNodeStackVisitor(v, stack),\n        );\n\n        // When we visit the tree.\n        visit(tree, visitor);\n\n        // Then the selected nodes are as expected.\n        expect(expectedSelected).toEqual(selected);\n        selected.forEach((node, index) => expect(node).toBe(expectedSelected[index]));\n    });\n};\n\n/**\n * [programNode] splToken\n *     [accountNode] token > [structTypeNode]\n *         [structFieldTypeNode] owner > [publicKeyTypeNode]\n *         [structFieldTypeNode] mint > [publicKeyTypeNode]\n *         [structFieldTypeNode] amount > [numberTypeNode] (u64)\n *         [structFieldTypeNode] delegatedAmount > [optionTypeNode] (prefix: [numberTypeNode] (u32)) > [numberTypeNode] (u64)\n *     [instructionNode] mintToken\n *         [instructionAccountNode] token\n *         [instructionAccountNode] mint\n *         [instructionAccountNode] mintAuthority\n *         [instructionArgumentNode] amount\n *             [numberTypeNode] (u64)\n *     [errorNode] invalidProgramId (0)\n *     [errorNode] invalidTokenOwner (1)\n * [programNode] christmasProgram\n *     [accountNode] gift > [structTypeNode]\n *         [structFieldTypeNode] owner > [publicKeyTypeNode]\n *         [structFieldTypeNode] opened > [booleanTypeNode] > [numberTypeNode] (u64)\n *         [structFieldTypeNode] amount > [numberTypeNode] (u64)\n *         [structFieldTypeNode] wrappingPaper > [definedTypeLinkNode] wrappingPaper\n *     [instructionNode] openGift\n *         [instructionAccountNode] gift\n *         [instructionAccountNode] owner\n *     [definedTypeNode] wrappingPaper > [enumTypeNode]\n *         [enumEmptyVariantTypeNode] blue\n *         [enumEmptyVariantTypeNode] red\n *         [enumStructVariantTypeNode] gold > [structTypeNode]\n *             [structFieldTypeNode] owner > [publicKeyTypeNode]\n *     [errorNode] invalidProgramId (0)\n */\n\nconst splTokenProgram = tree.program;\nconst christmasProgram = tree.additionalPrograms[0];\nconst tokenAccount = splTokenProgram.accounts[0];\nconst tokenDelegatedAmountOption = tokenAccount.data.fields[3].type;\nconst mintTokenInstruction = splTokenProgram.instructions[0];\nconst giftAccount = christmasProgram.accounts[0];\nconst openGiftInstruction = christmasProgram.instructions[0];\nconst wrappingPaper = christmasProgram.definedTypes[0];\nconst wrappingPaperEnum = wrappingPaper.type;\nconst wrappingPaperEnumGold = wrappingPaperEnum.variants[2];\n\n// Select programs.\nmacro('[programNode]', [splTokenProgram, christmasProgram]);\nmacro('[programNode]splToken', [splTokenProgram]);\nmacro('christmasProgram', [christmasProgram]);\n\n// Select and filter owner nodes.\nmacro('owner', [\n    tokenAccount.data.fields[0],\n    giftAccount.data.fields[0],\n    wrappingPaperEnumGold.struct.fields[0],\n    openGiftInstruction.accounts[1],\n]);\nmacro('[structFieldTypeNode]owner', [\n    tokenAccount.data.fields[0],\n    giftAccount.data.fields[0],\n    wrappingPaperEnumGold.struct.fields[0],\n]);\nmacro('splToken.owner', [tokenAccount.data.fields[0]]);\nmacro('[instructionNode].owner', [openGiftInstruction.accounts[1]]);\nmacro('[accountNode].owner', [tokenAccount.data.fields[0], giftAccount.data.fields[0]]);\nmacro('[accountNode]token.owner', [tokenAccount.data.fields[0]]);\nmacro('christmasProgram.[accountNode].owner', [giftAccount.data.fields[0]]);\nmacro('[programNode]christmasProgram.[definedTypeNode]wrappingPaper.[enumStructVariantTypeNode]gold.owner', [\n    wrappingPaperEnumGold.struct.fields[0],\n]);\nmacro('christmasProgram.wrappingPaper.gold.owner', [wrappingPaperEnumGold.struct.fields[0]]);\n\n// Select all descendants of a node.\nmacro('wrappingPaper.*', [\n    giftAccount.data.fields[3].type,\n    wrappingPaperEnum,\n    wrappingPaperEnum.variants[0],\n    wrappingPaperEnum.variants[1],\n    wrappingPaperEnum.variants[2],\n    wrappingPaperEnumGold.struct,\n    wrappingPaperEnumGold.struct.fields[0],\n    wrappingPaperEnumGold.struct.fields[0].type,\n]);\nmacro('wrappingPaper.[structFieldTypeNode]', [wrappingPaperEnumGold.struct.fields[0]]);\nmacro('wrappingPaper.blue', [wrappingPaperEnum.variants[0]]);\nmacro('amount.*', [\n    tokenAccount.data.fields[2].type,\n    mintTokenInstruction.arguments[0].type,\n    giftAccount.data.fields[2].type,\n]);\nmacro('[instructionNode].amount.*', [mintTokenInstruction.arguments[0].type]);\nmacro('[structFieldTypeNode].*', [\n    tokenAccount.data.fields[0].type,\n    tokenAccount.data.fields[1].type,\n    tokenAccount.data.fields[2].type,\n    tokenAccount.data.fields[3].type,\n    tokenDelegatedAmountOption.prefix,\n    tokenDelegatedAmountOption.item,\n    giftAccount.data.fields[0].type,\n    giftAccount.data.fields[1].type,\n    giftAccount.data.fields[1].type.size,\n    giftAccount.data.fields[2].type,\n    giftAccount.data.fields[3].type,\n    wrappingPaperEnumGold.struct.fields[0].type,\n]);\nmacro('[structFieldTypeNode].*.*', [\n    tokenDelegatedAmountOption.prefix,\n    tokenDelegatedAmountOption.item,\n    giftAccount.data.fields[1].type.size,\n]);\n\n// Select multiple node kinds.\nmacro('[accountNode]gift.[publicKeyTypeNode|booleanTypeNode]', [\n    giftAccount.data.fields[0].type,\n    giftAccount.data.fields[1].type,\n]);\n\n// Select using functions.\nmacro(\n    path => isNodePath(path, 'numberTypeNode') && getLastNodeFromPath(path).format === 'u32',\n    [tokenDelegatedAmountOption.prefix],\n);\n"
  },
  {
    "path": "packages/visitors-core/test/bottomUpTransformerVisitor.test.ts",
    "content": "import {\n    definedTypeNode,\n    isNode,\n    numberTypeNode,\n    programNode,\n    publicKeyTypeNode,\n    stringTypeNode,\n    tupleTypeNode,\n    TYPE_NODES,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport {\n    BottomUpNodeTransformerWithSelector,\n    bottomUpTransformerVisitor,\n    findProgramNodeFromPath,\n    NodeStack,\n    visit,\n} from '../src';\n\ntest('it can transform nodes into other nodes', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()])]);\n\n    // And a transformer visitor that transforms all number nodes into string nodes.\n    const visitor = bottomUpTransformerVisitor([\n        node => (isNode(node, 'numberTypeNode') ? stringTypeNode('utf8') : node),\n    ]);\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect the number nodes to have been transformed into string nodes.\n    expect(result).toEqual(\n        tupleTypeNode([stringTypeNode('utf8'), tupleTypeNode([stringTypeNode('utf8'), publicKeyTypeNode()])]),\n    );\n});\n\ntest('it can transform nodes using node selectors', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()])]);\n\n    // And a transformer visitor that selects all number nodes and transforms them into string nodes.\n    const visitor = bottomUpTransformerVisitor([\n        {\n            select: '[numberTypeNode]',\n            transform: () => stringTypeNode('utf8'),\n        },\n    ]);\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect the number nodes to have been transformed into string nodes.\n    expect(result).toEqual(\n        tupleTypeNode([stringTypeNode('utf8'), tupleTypeNode([stringTypeNode('utf8'), publicKeyTypeNode()])]),\n    );\n});\n\ntest('it can create partial transformer visitors', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()])]);\n\n    // And a transformer visitor that wraps every node into another tuple node\n    // but that does not transform public key nodes.\n    const visitor = bottomUpTransformerVisitor([node => (isNode(node, TYPE_NODES) ? tupleTypeNode([node]) : node)], {\n        keys: ['tupleTypeNode', 'numberTypeNode'],\n    });\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect the following tree.\n    expect(result).toEqual(\n        tupleTypeNode([\n            tupleTypeNode([\n                tupleTypeNode([numberTypeNode('u32')]),\n                tupleTypeNode([tupleTypeNode([tupleTypeNode([numberTypeNode('u32')]), publicKeyTypeNode()])]),\n            ]),\n        ]),\n    );\n\n    // And the public key node cannot be visited.\n    // @ts-expect-error PublicKeyTypeNode is not supported.\n    expect(() => visit(publicKeyTypeNode(), visitor)).toThrow();\n});\n\ntest('it can be used to delete nodes', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()])]);\n\n    // And a transformer visitor that deletes all number nodes.\n    const visitor = bottomUpTransformerVisitor([{ select: '[numberTypeNode]', transform: () => null }]);\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect the number nodes to have been deleted.\n    expect(result).toEqual(tupleTypeNode([tupleTypeNode([publicKeyTypeNode()])]));\n});\n\ntest('it can transform nodes using multiple node selectors', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()])]);\n\n    // And a transformer visitor that uses two node selectors such that\n    // - the first one selects all number nodes, and\n    // - the second one selects all nodes with more than one ancestor.\n    const visitor = bottomUpTransformerVisitor([\n        {\n            select: ['[numberTypeNode]', path => path.length > 2],\n            transform: () => stringTypeNode('utf8'),\n        },\n    ]);\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect both node selectors to have been applied.\n    expect(result).toEqual(\n        tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([stringTypeNode('utf8'), publicKeyTypeNode()])]),\n    );\n});\n\ntest('it can start from an existing stack', () => {\n    // Given the following tuple node inside a program node.\n    const tuple = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n    const program = programNode({\n        definedTypes: [definedTypeNode({ name: 'myTuple', type: tuple })],\n        name: 'myProgram',\n        publicKey: '1111',\n    });\n\n    // And a transformer that removes all number nodes\n    // from programs whose public key is '1111'.\n    const transformer: BottomUpNodeTransformerWithSelector = {\n        select: ['[numberTypeNode]', path => findProgramNodeFromPath(path)?.publicKey === '1111'],\n        transform: () => null,\n    };\n\n    // When we visit the tuple with an existing stack that contains the program node.\n    const stack = new NodeStack([program, program.definedTypes[0]]);\n    const resultWithStack = visit(tuple, bottomUpTransformerVisitor([transformer], { stack }));\n\n    // Then we expect the number node to have been removed.\n    expect(resultWithStack).toStrictEqual(tupleTypeNode([publicKeyTypeNode()]));\n\n    // But when we visit the tuple without the stack.\n    const resultWithoutStack = visit(tuple, bottomUpTransformerVisitor([transformer]));\n\n    // Then we expect the number node to have been kept.\n    expect(resultWithoutStack).toStrictEqual(tuple);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/deleteNodesVisitor.test.ts",
    "content": "import { numberTypeNode, publicKeyTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { deleteNodesVisitor, visit } from '../src';\n\ntest('it can delete nodes using selectors', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()])]);\n\n    // And a visitor that deletes all number nodes.\n    const visitor = deleteNodesVisitor(['[numberTypeNode]']);\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect the number nodes to have been deleted.\n    expect(result).toEqual(tupleTypeNode([tupleTypeNode([publicKeyTypeNode()])]));\n});\n\ntest('it can create partial visitors', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()])]);\n\n    // And a visitor that deletes all number nodes and public key nodes\n    // but does not support public key nodes.\n    const visitor = deleteNodesVisitor(['[numberTypeNode]', '[publicKeyTypeNode]'], {\n        keys: ['tupleTypeNode', 'numberTypeNode'],\n    });\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then only the number nodes have been deleted.\n    expect(result).toEqual(tupleTypeNode([tupleTypeNode([publicKeyTypeNode()])]));\n\n    // And the public key node cannot be visited.\n    // @ts-expect-error PublicKeyTypeNode is not supported.\n    expect(() => visit(publicKeyTypeNode(), visitor)).toThrow();\n});\n"
  },
  {
    "path": "packages/visitors-core/test/extendVisitor.test.ts",
    "content": "import { CODAMA_ERROR__VISITORS__CANNOT_EXTEND_MISSING_VISIT_FUNCTION, CodamaError } from '@codama/errors';\nimport { numberTypeNode, publicKeyTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { extendVisitor, mergeVisitor, visit, voidVisitor } from '../src';\n\ntest('it returns a new visitor that extends a subset of visits with a next function', () => {\n    // Given the following 3-nodes tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u64'), publicKeyTypeNode()])]);\n\n    // And an extended sum visitor that adds an extra 10 to tuple and public key nodes.\n    const baseVisitor = mergeVisitor(\n        () => 1,\n        (_, values) => values.reduce((a, b) => a + b, 1),\n    );\n    const visitor = extendVisitor(baseVisitor, {\n        visitPublicKeyType: (node, { next }) => next(node) + 10,\n        visitTupleType: (node, { next }) => next(node) + 10,\n    });\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect the following count.\n    expect(result).toBe(35);\n\n    // And the extended visitor is a new instance.\n    expect(baseVisitor).not.toBe(visitor);\n});\n\ntest('it can visit itself using the exposed self argument', () => {\n    // Given the following 3-nodes tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u64'), publicKeyTypeNode()])]);\n\n    // And an extended sum visitor that only visit the first item of tuple nodes.\n    const baseVisitor = mergeVisitor(\n        () => 1,\n        (_, values) => values.reduce((a, b) => a + b, 1),\n    );\n    const visitor = extendVisitor(baseVisitor, {\n        visitTupleType: (node, { self }) => (node.items.length > 1 ? visit(node.items[0], self) : 0) + 1,\n    });\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect the following count.\n    expect(result).toBe(2);\n});\n\ntest('it cannot extends nodes that are not supported by the base visitor', () => {\n    // Given a base visitor that only supports tuple nodes.\n    const baseVisitor = voidVisitor({ keys: ['tupleTypeNode'] });\n\n    // Then we expect an error when we try to extend other nodes for that visitor.\n    expect(() =>\n        extendVisitor(baseVisitor, {\n            // @ts-expect-error NumberTypeNode is not part of the base visitor.\n            visitNumberType: () => undefined,\n        }),\n    ).toThrow(\n        new CodamaError(CODAMA_ERROR__VISITORS__CANNOT_EXTEND_MISSING_VISIT_FUNCTION, {\n            visitFunction: 'visitNumberType',\n        }),\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/getByteSizeVisitor.test.ts",
    "content": "import {\n    accountNode,\n    amountTypeNode,\n    arrayTypeNode,\n    booleanTypeNode,\n    bytesTypeNode,\n    bytesValueNode,\n    constantValueNode,\n    constantValueNodeFromString,\n    dateTimeTypeNode,\n    definedTypeLinkNode,\n    definedTypeNode,\n    enumEmptyVariantTypeNode,\n    enumStructVariantTypeNode,\n    enumTupleVariantTypeNode,\n    enumTypeNode,\n    fixedCountNode,\n    fixedSizeTypeNode,\n    GetNodeFromKind,\n    hiddenPrefixTypeNode,\n    hiddenSuffixTypeNode,\n    instructionArgumentNode,\n    instructionNode,\n    mapTypeNode,\n    NumberFormat,\n    numberTypeNode,\n    numberValueNode,\n    optionTypeNode,\n    postOffsetTypeNode,\n    prefixedCountNode,\n    preOffsetTypeNode,\n    programLinkNode,\n    programNode,\n    publicKeyTypeNode,\n    remainderCountNode,\n    remainderOptionTypeNode,\n    rootNode,\n    sentinelTypeNode,\n    setTypeNode,\n    sizePrefixTypeNode,\n    solAmountTypeNode,\n    stringTypeNode,\n    stringValueNode,\n    structFieldTypeNode,\n    structTypeNode,\n    tupleTypeNode,\n    zeroableOptionTypeNode,\n} from '@codama/nodes';\nimport { describe, expect, test } from 'vitest';\n\nimport {\n    ByteSizeVisitorKeys,\n    getByteSizeVisitor,\n    getLastNodeFromPath,\n    getRecordLinkablesVisitor,\n    LinkableDictionary,\n    NodePath,\n    NodeStack,\n    visit,\n} from '../src';\n\nconst expectSize = (\n    node: GetNodeFromKind<ByteSizeVisitorKeys>,\n    expectedSize: number | null,\n    linkables?: LinkableDictionary,\n    stack?: NodeStack,\n) => {\n    expect(visit(node, getByteSizeVisitor(linkables ?? new LinkableDictionary(), { stack }))).toBe(expectedSize);\n};\n\nconst expectSizeWithContext = (\n    nodePath: NodePath<GetNodeFromKind<ByteSizeVisitorKeys>>,\n    expectedSize: number | null,\n) => {\n    const node = getLastNodeFromPath(nodePath);\n    const stack = new NodeStack(nodePath.slice(0, -1));\n    const linkables = new LinkableDictionary();\n    visit(nodePath[0], getRecordLinkablesVisitor(linkables));\n    expectSize(node, expectedSize, linkables, stack);\n};\n\ndescribe('accountNode', () => {\n    test('it returns the size of the account data', () => {\n        expectSize(\n            accountNode({\n                data: structTypeNode([\n                    structFieldTypeNode({ name: 'mint', type: publicKeyTypeNode() }),\n                    structFieldTypeNode({ name: 'owner', type: publicKeyTypeNode() }),\n                    structFieldTypeNode({ name: 'amount', type: numberTypeNode('u64') }),\n                ]),\n                name: 'token',\n            }),\n            32 + 32 + 8,\n        );\n    });\n});\n\ndescribe('amountTypeNode', () => {\n    test('it delegates to the underlying number type', () => {\n        expectSize(amountTypeNode(numberTypeNode('u64'), 2, 'GBP'), 8);\n        expectSize(amountTypeNode(numberTypeNode('shortU16'), 2, 'GBP'), null);\n    });\n});\n\ndescribe('arrayTypeNode', () => {\n    test('it returns a size if the count is fixed and the inner type is sized', () => {\n        expectSize(arrayTypeNode(numberTypeNode('u16'), fixedCountNode(3)), 2 * 3);\n    });\n    test('it returns 0 if the count is 0 and the inner type is unsized', () => {\n        expectSize(arrayTypeNode(stringTypeNode('utf8'), fixedCountNode(0)), 0);\n    });\n    test('it returns null if the count is not fixed', () => {\n        expectSize(arrayTypeNode(numberTypeNode('u16'), prefixedCountNode(numberTypeNode('u8'))), null);\n        expectSize(arrayTypeNode(numberTypeNode('u16'), remainderCountNode()), null);\n    });\n    test('it returns null if the inner type is unsized', () => {\n        expectSize(arrayTypeNode(stringTypeNode('utf8'), fixedCountNode(3)), null);\n        expectSize(arrayTypeNode(stringTypeNode('utf8'), prefixedCountNode(numberTypeNode('u8'))), null);\n        expectSize(arrayTypeNode(stringTypeNode('utf8'), remainderCountNode()), null);\n    });\n    test('it returns 0 if the inner type size is 0 and the count is fixed', () => {\n        expectSize(arrayTypeNode(tupleTypeNode([]), fixedCountNode(3)), 0);\n    });\n    test('it returns 0 if the inner type size is 0 and the count is remainder', () => {\n        expectSize(arrayTypeNode(tupleTypeNode([]), remainderCountNode()), 0);\n    });\n    test('it returns the prefix size if the inner type size is 0 and the count is prefixed', () => {\n        expectSize(arrayTypeNode(tupleTypeNode([]), prefixedCountNode(numberTypeNode('u32'))), 4);\n        expectSize(arrayTypeNode(tupleTypeNode([]), prefixedCountNode(numberTypeNode('shortU16'))), null);\n    });\n});\n\ndescribe('booleanTypeNode', () => {\n    test('it returns 1 by default', () => {\n        expectSize(booleanTypeNode(), 1);\n    });\n    test('it delegates to the custom boolean size otherwise', () => {\n        expectSize(booleanTypeNode(numberTypeNode('u64')), 8);\n        expectSize(booleanTypeNode(numberTypeNode('shortU16')), null);\n    });\n});\n\ndescribe('bytesTypeNode', () => {\n    test('it always returns null', () => {\n        expectSize(bytesTypeNode(), null);\n    });\n});\n\ndescribe('constantValueNode', () => {\n    test('it returns the type size if fixed', () => {\n        expectSize(constantValueNode(numberTypeNode('u32'), numberValueNode(42)), 4);\n        expectSize(constantValueNode(fixedSizeTypeNode(stringTypeNode('utf8'), 42), stringValueNode('Hello')), 42);\n    });\n    test('it returns the size of byte value nodes when used with a base16 encoding', () => {\n        expectSize(constantValueNode(bytesTypeNode(), bytesValueNode('base16', '11223344')), 4);\n    });\n    test('it returns the size of string value nodes when used with a base16 encoding', () => {\n        expectSize(constantValueNode(stringTypeNode('base16'), stringValueNode('11223344')), 4);\n    });\n});\n\ndescribe('dateTimeTypeNode', () => {\n    test('it delegates to the underlying number type', () => {\n        expectSize(dateTimeTypeNode(numberTypeNode('u64')), 8);\n        expectSize(dateTimeTypeNode(numberTypeNode('shortU16')), null);\n    });\n});\n\ndescribe('definedTypeNode', () => {\n    test('it returns the size of the inner type', () => {\n        expectSize(definedTypeNode({ name: 'fixed', type: numberTypeNode('u32') }), 4);\n        expectSize(definedTypeNode({ name: 'variable', type: stringTypeNode('utf8') }), null);\n    });\n});\n\ndescribe('definedTypeLinkNode', () => {\n    test('it returns the size of the type being linked', () => {\n        const context = programNode({\n            definedTypes: [definedTypeNode({ name: 'myType', type: numberTypeNode('u64') })],\n            name: 'myProgram',\n            publicKey: '1111',\n        });\n\n        expectSizeWithContext([context, definedTypeLinkNode('myType')], 8);\n    });\n    test('it returns null if the linked type is variable', () => {\n        const context = programNode({\n            definedTypes: [definedTypeNode({ name: 'myType', type: stringTypeNode('utf8') })],\n            name: 'myProgram',\n            publicKey: '1111',\n        });\n\n        expectSizeWithContext([context, definedTypeLinkNode('myType')], null);\n    });\n    test('it returns null if the linked type cannot be found', () => {\n        const context = programNode({ name: 'myProgram', publicKey: '1111' });\n        expectSizeWithContext([context, definedTypeLinkNode('myMissingType')], null);\n    });\n    test('it returns null if the linked type is circular', () => {\n        const context = programNode({\n            definedTypes: [definedTypeNode({ name: 'myType', type: definedTypeLinkNode('myType') })],\n            name: 'myProgram',\n            publicKey: '1111',\n        });\n\n        expectSizeWithContext([context, definedTypeLinkNode('myType')], null);\n    });\n    test('it follows linked nodes using the correct paths when jumping between programs', () => {\n        const programA = programNode({\n            definedTypes: [\n                definedTypeNode({\n                    name: 'typeA',\n                    type: definedTypeLinkNode('typeB1', programLinkNode('programB')),\n                }),\n            ],\n            name: 'programA',\n            publicKey: '1111',\n        });\n        const programB = programNode({\n            definedTypes: [\n                definedTypeNode({ name: 'typeB1', type: definedTypeLinkNode('typeB2') }),\n                definedTypeNode({ name: 'typeB2', type: numberTypeNode('u64') }),\n            ],\n            name: 'programB',\n            publicKey: '2222',\n        });\n        const context = rootNode(programA, [programB]);\n\n        expectSizeWithContext([context, programA, programA.definedTypes[0]], 8);\n    });\n});\n\ndescribe('enumTypeNode', () => {\n    test('it returns 1 by default for scalar enums', () => {\n        expectSize(\n            enumTypeNode([enumEmptyVariantTypeNode('A'), enumEmptyVariantTypeNode('B'), enumEmptyVariantTypeNode('C')]),\n            1,\n        );\n    });\n    test('it returns the custom size for scalar enums', () => {\n        expectSize(\n            enumTypeNode(\n                [enumEmptyVariantTypeNode('A'), enumEmptyVariantTypeNode('B'), enumEmptyVariantTypeNode('C')],\n                { size: numberTypeNode('u64') },\n            ),\n            8,\n        );\n    });\n    test('it returns a fixed size for data enums if all variants are the same fixed size', () => {\n        expectSize(\n            enumTypeNode(\n                [\n                    // 4 bytes\n                    enumTupleVariantTypeNode('A', tupleTypeNode([numberTypeNode('u32')])),\n                    // 4 bytes\n                    enumStructVariantTypeNode(\n                        'B',\n                        structTypeNode([\n                            structFieldTypeNode({ name: 'x', type: numberTypeNode('u16') }),\n                            structFieldTypeNode({ name: 'y', type: numberTypeNode('u16') }),\n                        ]),\n                    ),\n                ],\n                // 8 bytes prefix\n                { size: numberTypeNode('u64') },\n            ),\n            8 + 4,\n        );\n    });\n    test('it returns null if variants have different sizes', () => {\n        expectSize(\n            enumTypeNode([\n                enumTupleVariantTypeNode('A', tupleTypeNode([numberTypeNode('u16')])), // 2 bytes\n                enumTupleVariantTypeNode('B', tupleTypeNode([numberTypeNode('u32')])), // 4 bytes\n            ]),\n            null,\n        );\n    });\n    test('it returns null if at least one variant is unsized', () => {\n        expectSize(enumTypeNode([enumTupleVariantTypeNode('A', tupleTypeNode([stringTypeNode('utf8')]))]), null);\n    });\n});\n\ndescribe('fixedSizeTypeNode', () => {\n    test('it returns the fixed size assigned on the node', () => {\n        expectSize(fixedSizeTypeNode(numberTypeNode('u8'), 32), 32);\n        expectSize(fixedSizeTypeNode(stringTypeNode('utf8'), 32), 32);\n    });\n});\n\ndescribe('hiddenPrefixTypeNode', () => {\n    test('it returns the sum of all prefixes and the inner item if all of them are fixed', () => {\n        const prefix1 = constantValueNodeFromString('base16', '2222');\n        const prefix2 = constantValueNodeFromString('base16', '333333');\n        expectSize(hiddenPrefixTypeNode(numberTypeNode('u32'), [prefix1, prefix2]), 2 + 3 + 4);\n    });\n    test('it returns null if the inner item is variable', () => {\n        const prefix = constantValueNodeFromString('base16', 'ffff');\n        expectSize(hiddenPrefixTypeNode(stringTypeNode('utf8'), [prefix]), null);\n    });\n});\n\ndescribe('hiddenSuffixTypeNode', () => {\n    test('it returns the sum of all suffixes and the inner item if all of them are fixed', () => {\n        const suffix1 = constantValueNodeFromString('base16', '2222');\n        const suffix2 = constantValueNodeFromString('base16', '333333');\n        expectSize(hiddenSuffixTypeNode(numberTypeNode('u32'), [suffix1, suffix2]), 4 + 2 + 3);\n    });\n    test('it returns null if the inner item is variable', () => {\n        const suffix = constantValueNodeFromString('base16', 'ffff');\n        expectSize(hiddenSuffixTypeNode(stringTypeNode('utf8'), [suffix]), null);\n    });\n});\n\ndescribe('instructionNode', () => {\n    test('it returns the total size of all arguments in the instruction', () => {\n        expectSize(\n            instructionNode({\n                arguments: [\n                    instructionArgumentNode({ name: 'lamports', type: numberTypeNode('u64') }),\n                    instructionArgumentNode({ name: 'space', type: numberTypeNode('u32') }),\n                ],\n                name: 'createAccount',\n            }),\n            8 + 4,\n        );\n    });\n    test('it returns null if any argument is unsized', () => {\n        expectSize(\n            instructionNode({\n                arguments: [\n                    instructionArgumentNode({ name: 'lamports', type: numberTypeNode('u64') }),\n                    instructionArgumentNode({ name: 'name', type: stringTypeNode('utf8') }),\n                ],\n                name: 'createAccount',\n            }),\n            null,\n        );\n    });\n});\n\ndescribe('instructionArgumentNode', () => {\n    test('it returns the size of the argument type', () => {\n        expectSize(instructionArgumentNode({ name: 'lamports', type: numberTypeNode('u64') }), 8);\n    });\n});\n\ndescribe('mapTypeNode', () => {\n    test('it returns a size if the count is fixed and the inner type is sized', () => {\n        const key = numberTypeNode('u8'); // Fixed\n        const value = numberTypeNode('u16'); // Fixed\n        expectSize(mapTypeNode(key, value, fixedCountNode(3)), (1 + 2) * 3);\n    });\n    test('it returns 0 if the count is 0 and the inner type is unsized', () => {\n        const key = stringTypeNode('utf8'); // Variable\n        const value = numberTypeNode('u16'); // Fixed\n        expectSize(mapTypeNode(key, value, fixedCountNode(0)), 0);\n    });\n    test('it returns null if the count is not fixed', () => {\n        const key = numberTypeNode('u8'); // Fixed\n        const value = numberTypeNode('u16'); // Fixed\n        expectSize(mapTypeNode(key, value, prefixedCountNode(numberTypeNode('u8'))), null);\n        expectSize(mapTypeNode(key, value, remainderCountNode()), null);\n    });\n    test('it returns null if the inner type is unsized', () => {\n        const key = numberTypeNode('u8');\n        const value = stringTypeNode('utf8');\n        expectSize(mapTypeNode(key, value, fixedCountNode(3)), null);\n        expectSize(mapTypeNode(key, value, prefixedCountNode(numberTypeNode('u8'))), null);\n        expectSize(mapTypeNode(key, value, remainderCountNode()), null);\n    });\n    test('it returns 0 if the inner type size is 0 and the count is fixed', () => {\n        const zeroSizeType = tupleTypeNode([]);\n        expectSize(mapTypeNode(zeroSizeType, zeroSizeType, fixedCountNode(3)), 0);\n    });\n    test('it returns 0 if the inner type size is 0 and the count is remainder', () => {\n        const zeroSizeType = tupleTypeNode([]);\n        expectSize(mapTypeNode(zeroSizeType, zeroSizeType, remainderCountNode()), 0);\n    });\n    test('it returns the prefix size if the inner type size is 0 and the count is prefixed', () => {\n        const zeroSizeType = tupleTypeNode([]);\n        expectSize(mapTypeNode(zeroSizeType, zeroSizeType, prefixedCountNode(numberTypeNode('u32'))), 4);\n        expectSize(mapTypeNode(zeroSizeType, zeroSizeType, prefixedCountNode(numberTypeNode('shortU16'))), null);\n    });\n});\n\ndescribe('numberTypeNode', () => {\n    test.each([\n        ['u8', 1],\n        ['i8', 1],\n        ['u16', 2],\n        ['i16', 2],\n        ['u32', 4],\n        ['i32', 4],\n        ['u64', 8],\n        ['i64', 8],\n        ['u128', 16],\n        ['i128', 16],\n        ['f32', 4],\n        ['f64', 8],\n    ])('it returns the size of %s numbers', (format, expectedSize) => {\n        expectSize(numberTypeNode(format as NumberFormat), expectedSize);\n    });\n    test('it returns null if the format is shortU16', () => {\n        expectSize(numberTypeNode('shortU16'), null);\n    });\n});\n\ndescribe('optionTypeNode', () => {\n    test('it returns the sum of the prefix and the inner item sizes if both of them are fixed', () => {\n        expectSize(optionTypeNode(numberTypeNode('u32'), { fixed: true }), 5);\n        expectSize(optionTypeNode(numberTypeNode('u32'), { fixed: true, prefix: numberTypeNode('u16') }), 6);\n    });\n    test('it returns null if the inner item is not fixed', () => {\n        expectSize(optionTypeNode(stringTypeNode('utf8'), { fixed: true }), null);\n    });\n    test('it returns null if the prefixed is not fixed', () => {\n        expectSize(optionTypeNode(numberTypeNode('u32'), { fixed: true, prefix: numberTypeNode('shortU16') }), null);\n    });\n    test('it returns null if the option is not fixed', () => {\n        expectSize(optionTypeNode(numberTypeNode('u32')), null);\n        expectSize(optionTypeNode(numberTypeNode('u32'), { prefix: numberTypeNode('u16') }), null);\n    });\n});\n\ndescribe('postOffsetTypeNode', () => {\n    test('it increases the size by the offset when using a padded offset', () => {\n        expectSize(postOffsetTypeNode(numberTypeNode('u16'), 10, 'padded'), 12);\n    });\n    test('it returns null if the inner item is not fixed', () => {\n        expectSize(postOffsetTypeNode(stringTypeNode('utf8'), 4, 'padded'), null);\n    });\n    test('it returns the size of the inner item for other offset strategies', () => {\n        // Fixed.\n        expectSize(postOffsetTypeNode(numberTypeNode('u8'), 42), 1);\n        expectSize(postOffsetTypeNode(numberTypeNode('u8'), 42, 'absolute'), 1);\n        expectSize(postOffsetTypeNode(numberTypeNode('u8'), 42, 'preOffset'), 1);\n        expectSize(postOffsetTypeNode(numberTypeNode('u8'), 42, 'relative'), 1);\n\n        // Variable.\n        expectSize(postOffsetTypeNode(stringTypeNode('utf8'), 42), null);\n        expectSize(postOffsetTypeNode(stringTypeNode('utf8'), 42, 'absolute'), null);\n        expectSize(postOffsetTypeNode(stringTypeNode('utf8'), 42, 'preOffset'), null);\n        expectSize(postOffsetTypeNode(stringTypeNode('utf8'), 42, 'relative'), null);\n    });\n});\n\ndescribe('preOffsetTypeNode', () => {\n    test('it increases the size by the offset when using a padded offset', () => {\n        expectSize(preOffsetTypeNode(numberTypeNode('u16'), 10, 'padded'), 12);\n    });\n    test('it returns null if the inner item is not fixed', () => {\n        expectSize(preOffsetTypeNode(stringTypeNode('utf8'), 4, 'padded'), null);\n    });\n    test('it returns the size of the inner item for other offset strategies', () => {\n        // Fixed.\n        expectSize(preOffsetTypeNode(numberTypeNode('u8'), 42), 1);\n        expectSize(preOffsetTypeNode(numberTypeNode('u8'), 42, 'absolute'), 1);\n        expectSize(preOffsetTypeNode(numberTypeNode('u8'), 42, 'relative'), 1);\n\n        // Variable.\n        expectSize(preOffsetTypeNode(stringTypeNode('utf8'), 42), null);\n        expectSize(preOffsetTypeNode(stringTypeNode('utf8'), 42, 'absolute'), null);\n        expectSize(preOffsetTypeNode(stringTypeNode('utf8'), 42, 'relative'), null);\n    });\n});\n\ndescribe('publicKeyTypeNode', () => {\n    test('it returns 32', () => {\n        expectSize(publicKeyTypeNode(), 32);\n    });\n});\n\ndescribe('remainderOptionTypeNode', () => {\n    test('it returns 0 if the inner item size is also 0', () => {\n        expectSize(remainderOptionTypeNode(tupleTypeNode([])), 0);\n    });\n    test('it returns null in all other cases', () => {\n        expectSize(remainderOptionTypeNode(numberTypeNode('u16')), null);\n        expectSize(remainderOptionTypeNode(stringTypeNode('utf8')), null);\n    });\n});\n\ndescribe('sentinelTypeNode', () => {\n    test('it returns the inner type and the sentinel size if both of them are fixed', () => {\n        const sentinel = constantValueNodeFromString('base16', 'ffff');\n        expectSize(sentinelTypeNode(numberTypeNode('u32'), sentinel), 6);\n    });\n    test('it returns null if the inner type is variable', () => {\n        const sentinel = constantValueNodeFromString('base16', 'ffff');\n        expectSize(sentinelTypeNode(stringTypeNode('utf8'), sentinel), null);\n    });\n});\n\ndescribe('setTypeNode', () => {\n    test('it returns a size if the count is fixed and the inner type is sized', () => {\n        expectSize(setTypeNode(numberTypeNode('u16'), fixedCountNode(3)), 2 * 3);\n    });\n    test('it returns 0 if the count is 0 and the inner type is unsized', () => {\n        expectSize(setTypeNode(stringTypeNode('utf8'), fixedCountNode(0)), 0);\n    });\n    test('it returns null if the count is not fixed', () => {\n        expectSize(setTypeNode(numberTypeNode('u16'), prefixedCountNode(numberTypeNode('u8'))), null);\n        expectSize(setTypeNode(numberTypeNode('u16'), remainderCountNode()), null);\n    });\n    test('it returns null if the inner type is unsized', () => {\n        expectSize(setTypeNode(stringTypeNode('utf8'), fixedCountNode(3)), null);\n        expectSize(setTypeNode(stringTypeNode('utf8'), prefixedCountNode(numberTypeNode('u8'))), null);\n        expectSize(setTypeNode(stringTypeNode('utf8'), remainderCountNode()), null);\n    });\n    test('it returns 0 if the inner type size is 0 and the count is fixed', () => {\n        expectSize(setTypeNode(tupleTypeNode([]), fixedCountNode(3)), 0);\n    });\n    test('it returns 0 if the inner type size is 0 and the count is remainder', () => {\n        expectSize(setTypeNode(tupleTypeNode([]), remainderCountNode()), 0);\n    });\n    test('it returns the prefix size if the inner type size is 0 and the count is prefixed', () => {\n        expectSize(setTypeNode(tupleTypeNode([]), prefixedCountNode(numberTypeNode('u32'))), 4);\n        expectSize(setTypeNode(tupleTypeNode([]), prefixedCountNode(numberTypeNode('shortU16'))), null);\n    });\n});\n\ndescribe('sizePrefixTypeNode', () => {\n    test('it returns the size of the size prefix if the inner type size is 0', () => {\n        expectSize(sizePrefixTypeNode(tupleTypeNode([]), numberTypeNode('u32')), 4);\n    });\n    test('it returns the sum of the prefix and the inner type if both are fixed', () => {\n        expectSize(sizePrefixTypeNode(publicKeyTypeNode(), numberTypeNode('u32')), 4 + 32);\n    });\n    test('it returns null if the inner type is variable', () => {\n        expectSize(sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u32')), null);\n    });\n});\n\ndescribe('solAmountTypeNode', () => {\n    test('it delegates to the underlying number type', () => {\n        expectSize(solAmountTypeNode(numberTypeNode('u64')), 8);\n        expectSize(solAmountTypeNode(numberTypeNode('shortU16')), null);\n    });\n});\n\ndescribe('stringTypeNode', () => {\n    test('it always returns null', () => {\n        expectSize(stringTypeNode('base16'), null);\n        expectSize(stringTypeNode('base58'), null);\n        expectSize(stringTypeNode('base64'), null);\n        expectSize(stringTypeNode('utf8'), null);\n    });\n});\n\ndescribe('structFieldTypeNode', () => {\n    test('it returns the size of the inner type', () => {\n        expectSize(structFieldTypeNode({ name: 'fixed', type: numberTypeNode('u32') }), 4);\n        expectSize(structFieldTypeNode({ name: 'variable', type: stringTypeNode('utf8') }), null);\n    });\n});\n\ndescribe('structTypeNode', () => {\n    test('it returns the sum of fields if all fields are fixed size', () => {\n        expectSize(\n            structTypeNode([\n                structFieldTypeNode({ name: 'age', type: numberTypeNode('u32') }),\n                structFieldTypeNode({ name: 'firstname', type: fixedSizeTypeNode(stringTypeNode('utf8'), 42) }),\n            ]),\n            4 + 42,\n        );\n    });\n    test('it returns null if any field is variable', () => {\n        expectSize(\n            structTypeNode([\n                structFieldTypeNode({ name: 'age', type: numberTypeNode('u32') }),\n                structFieldTypeNode({ name: 'firstname', type: stringTypeNode('utf8') }),\n            ]),\n            null,\n        );\n    });\n});\n\ndescribe('tupleTypeNode', () => {\n    test('it returns the sum of all sizes if all elements are fixed', () => {\n        expectSize(tupleTypeNode([numberTypeNode('u16'), numberTypeNode('u32')]), 2 + 4);\n    });\n    test('it returns null if any item is variable', () => {\n        expectSize(tupleTypeNode([numberTypeNode('u16'), stringTypeNode('utf8')]), null);\n    });\n});\n\ndescribe('zeroableOptionTypeNode', () => {\n    test('it returns the inner item size if it is fixed', () => {\n        expectSize(zeroableOptionTypeNode(publicKeyTypeNode()), 32);\n    });\n    test('it returns null if the inner item is variable', () => {\n        expectSize(zeroableOptionTypeNode(stringTypeNode('utf8')), null);\n    });\n    test('it returns the inner item size if it matches the zero value when provided', () => {\n        const zeroValue = constantValueNodeFromString('base16', 'ffffffff');\n        expectSize(zeroableOptionTypeNode(numberTypeNode('u32'), zeroValue), 4);\n    });\n    test('it returns null if the provided zero value does not match the inner item size', () => {\n        const zeroValue = constantValueNodeFromString('base16', 'ffffffff');\n        expectSize(zeroableOptionTypeNode(numberTypeNode('u64'), zeroValue), null);\n    });\n});\n"
  },
  {
    "path": "packages/visitors-core/test/getDebugStringVisitor.test.ts",
    "content": "import {\n    enumEmptyVariantTypeNode,\n    enumTypeNode,\n    numberTypeNode,\n    optionTypeNode,\n    publicKeyTypeNode,\n    sizePrefixTypeNode,\n    stringTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n    tupleTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getDebugStringVisitor, visit } from '../src';\n\ntest('it returns a string representing the main information of a node for debugging purposes', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([\n        numberTypeNode('u32'),\n        structTypeNode([\n            structFieldTypeNode({\n                name: 'firstname',\n                type: sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u64')),\n            }),\n            structFieldTypeNode({ name: 'age', type: numberTypeNode('u32') }),\n            structFieldTypeNode({\n                name: 'wallet',\n                type: optionTypeNode(publicKeyTypeNode(), {\n                    prefix: numberTypeNode('u16'),\n                }),\n            }),\n            structFieldTypeNode({\n                name: 'industry',\n                type: enumTypeNode([\n                    enumEmptyVariantTypeNode('programming'),\n                    enumEmptyVariantTypeNode('crypto'),\n                    enumEmptyVariantTypeNode('music'),\n                ]),\n            }),\n        ]),\n    ]);\n\n    // When we get its unique hash string.\n    const result = visit(node, getDebugStringVisitor());\n\n    // Then we expect the following string.\n    expect(result).toEqual(\n        'tupleTypeNode(numberTypeNode[u32], structTypeNode(structFieldTypeNode[firstname](sizePrefixTypeNode(numberTypeNode[u64], stringTypeNode[utf8])), structFieldTypeNode[age](numberTypeNode[u32]), structFieldTypeNode[wallet](optionTypeNode(numberTypeNode[u16], publicKeyTypeNode)), structFieldTypeNode[industry](enumTypeNode(numberTypeNode[u8], enumEmptyVariantTypeNode[programming], enumEmptyVariantTypeNode[crypto], enumEmptyVariantTypeNode[music]))))',\n    );\n});\n\ntest('it can create indented strings', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([\n        numberTypeNode('u32'),\n        structTypeNode([\n            structFieldTypeNode({\n                name: 'firstname',\n                type: sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u64')),\n            }),\n            structFieldTypeNode({ name: 'age', type: numberTypeNode('u32') }),\n            structFieldTypeNode({\n                name: 'wallet',\n                type: optionTypeNode(publicKeyTypeNode(), {\n                    prefix: numberTypeNode('u16'),\n                }),\n            }),\n            structFieldTypeNode({\n                name: 'industry',\n                type: enumTypeNode([\n                    enumEmptyVariantTypeNode('programming'),\n                    enumEmptyVariantTypeNode('crypto'),\n                    enumEmptyVariantTypeNode('music'),\n                ]),\n            }),\n        ]),\n    ]);\n\n    // When we get its unique hash string.\n    const result = visit(node, getDebugStringVisitor({ indent: true }));\n\n    // Then we expect the following string.\n    expect(result).toEqual(`tupleTypeNode\n|   numberTypeNode [u32]\n|   structTypeNode\n|   |   structFieldTypeNode [firstname]\n|   |   |   sizePrefixTypeNode\n|   |   |   |   numberTypeNode [u64]\n|   |   |   |   stringTypeNode [utf8]\n|   |   structFieldTypeNode [age]\n|   |   |   numberTypeNode [u32]\n|   |   structFieldTypeNode [wallet]\n|   |   |   optionTypeNode\n|   |   |   |   numberTypeNode [u16]\n|   |   |   |   publicKeyTypeNode\n|   |   structFieldTypeNode [industry]\n|   |   |   enumTypeNode\n|   |   |   |   numberTypeNode [u8]\n|   |   |   |   enumEmptyVariantTypeNode [programming]\n|   |   |   |   enumEmptyVariantTypeNode [crypto]\n|   |   |   |   enumEmptyVariantTypeNode [music]`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/getMaxByteSizeVisitor.test.ts",
    "content": "import {\n    accountNode,\n    amountTypeNode,\n    arrayTypeNode,\n    booleanTypeNode,\n    bytesTypeNode,\n    bytesValueNode,\n    constantValueNode,\n    constantValueNodeFromString,\n    dateTimeTypeNode,\n    definedTypeLinkNode,\n    definedTypeNode,\n    enumEmptyVariantTypeNode,\n    enumTupleVariantTypeNode,\n    enumTypeNode,\n    fixedCountNode,\n    fixedSizeTypeNode,\n    GetNodeFromKind,\n    hiddenPrefixTypeNode,\n    hiddenSuffixTypeNode,\n    instructionArgumentNode,\n    instructionNode,\n    mapTypeNode,\n    NumberFormat,\n    numberTypeNode,\n    numberValueNode,\n    optionTypeNode,\n    postOffsetTypeNode,\n    prefixedCountNode,\n    preOffsetTypeNode,\n    programLinkNode,\n    programNode,\n    publicKeyTypeNode,\n    remainderCountNode,\n    remainderOptionTypeNode,\n    rootNode,\n    sentinelTypeNode,\n    setTypeNode,\n    sizePrefixTypeNode,\n    solAmountTypeNode,\n    someValueNode,\n    stringTypeNode,\n    stringValueNode,\n    structFieldTypeNode,\n    structTypeNode,\n    tupleTypeNode,\n    zeroableOptionTypeNode,\n} from '@codama/nodes';\nimport { describe, expect, test } from 'vitest';\n\nimport {\n    ByteSizeVisitorKeys,\n    getLastNodeFromPath,\n    getMaxByteSizeVisitor,\n    getRecordLinkablesVisitor,\n    LinkableDictionary,\n    NodePath,\n    NodeStack,\n    visit,\n} from '../src';\n\nconst expectMaxSize = (\n    node: GetNodeFromKind<ByteSizeVisitorKeys>,\n    expectedMaxSize: number | null,\n    linkables?: LinkableDictionary,\n    stack?: NodeStack,\n) => {\n    expect(visit(node, getMaxByteSizeVisitor(linkables ?? new LinkableDictionary(), { stack }))).toBe(expectedMaxSize);\n};\n\nconst expectMaxSizeWithContext = (\n    nodePath: NodePath<GetNodeFromKind<ByteSizeVisitorKeys>>,\n    expectedMaxSize: number | null,\n) => {\n    const node = getLastNodeFromPath(nodePath);\n    const stack = new NodeStack(nodePath.slice(0, -1));\n    const linkables = new LinkableDictionary();\n    visit(nodePath[0], getRecordLinkablesVisitor(linkables));\n    expectMaxSize(node, expectedMaxSize, linkables, stack);\n};\n\ndescribe('accountNode', () => {\n    test('it returns the max size of the account data', () => {\n        expectMaxSize(\n            accountNode({\n                data: structTypeNode([\n                    structFieldTypeNode({ name: 'authority', type: publicKeyTypeNode() }),\n                    structFieldTypeNode({ name: 'maxSupply', type: optionTypeNode(numberTypeNode('u64')) }),\n                ]),\n                name: 'mint',\n            }),\n            32 + 9,\n        );\n    });\n});\n\ndescribe('amountTypeNode', () => {\n    test('it delegates to the underlying number type', () => {\n        expectMaxSize(amountTypeNode(numberTypeNode('u64'), 2, 'GBP'), 8);\n        expectMaxSize(amountTypeNode(numberTypeNode('shortU16'), 2, 'GBP'), 3);\n    });\n});\n\ndescribe('arrayTypeNode', () => {\n    test('it multiplies the max size of the inner item with the fixed count', () => {\n        expectMaxSize(arrayTypeNode(optionTypeNode(numberTypeNode('u32')), fixedCountNode(3)), 5 * 3);\n    });\n    test('it returns 0 if the count is 0 and the inner type is unsized', () => {\n        expectMaxSize(arrayTypeNode(stringTypeNode('utf8'), fixedCountNode(0)), 0);\n    });\n    test('it returns null if the count is not fixed', () => {\n        expectMaxSize(arrayTypeNode(numberTypeNode('u16'), prefixedCountNode(numberTypeNode('u8'))), null);\n        expectMaxSize(arrayTypeNode(numberTypeNode('u16'), remainderCountNode()), null);\n    });\n    test('it returns null if the inner type has no max size', () => {\n        expectMaxSize(arrayTypeNode(stringTypeNode('utf8'), fixedCountNode(3)), null);\n        expectMaxSize(arrayTypeNode(stringTypeNode('utf8'), prefixedCountNode(numberTypeNode('u8'))), null);\n        expectMaxSize(arrayTypeNode(stringTypeNode('utf8'), remainderCountNode()), null);\n    });\n    test('it returns 0 if the inner type max size is 0 and the count is fixed', () => {\n        expectMaxSize(arrayTypeNode(tupleTypeNode([]), fixedCountNode(3)), 0);\n    });\n    test('it returns 0 if the inner type max size is 0 and the count is remainder', () => {\n        expectMaxSize(arrayTypeNode(tupleTypeNode([]), remainderCountNode()), 0);\n    });\n    test('it returns the prefix max size if the inner type size is 0 and the count is prefixed', () => {\n        expectMaxSize(arrayTypeNode(tupleTypeNode([]), prefixedCountNode(numberTypeNode('u32'))), 4);\n        expectMaxSize(arrayTypeNode(tupleTypeNode([]), prefixedCountNode(numberTypeNode('shortU16'))), 3);\n    });\n});\n\ndescribe('booleanTypeNode', () => {\n    test('it returns 1 by default', () => {\n        expectMaxSize(booleanTypeNode(), 1);\n    });\n    test('it delegates to the custom boolean size otherwise', () => {\n        expectMaxSize(booleanTypeNode(numberTypeNode('u64')), 8);\n        expectMaxSize(booleanTypeNode(numberTypeNode('shortU16')), 3);\n    });\n});\n\ndescribe('bytesTypeNode', () => {\n    test('it always returns null', () => {\n        expectMaxSize(bytesTypeNode(), null);\n    });\n});\n\ndescribe('constantValueNode', () => {\n    test('it returns the type size if it has a max size', () => {\n        expectMaxSize(constantValueNode(optionTypeNode(numberTypeNode('u32')), someValueNode(numberValueNode(42))), 5);\n        expectMaxSize(constantValueNode(fixedSizeTypeNode(stringTypeNode('utf8'), 42), stringValueNode('Hello')), 42);\n    });\n    test('it returns the size of byte value nodes when used with a base16 encoding', () => {\n        expectMaxSize(constantValueNode(bytesTypeNode(), bytesValueNode('base16', '11223344')), 4);\n    });\n    test('it returns the size of string value nodes when used with a base16 encoding', () => {\n        expectMaxSize(constantValueNode(stringTypeNode('base16'), stringValueNode('11223344')), 4);\n    });\n});\n\ndescribe('dateTimeTypeNode', () => {\n    test('it delegates to the underlying number type', () => {\n        expectMaxSize(dateTimeTypeNode(numberTypeNode('u64')), 8);\n        expectMaxSize(dateTimeTypeNode(numberTypeNode('shortU16')), 3);\n    });\n});\n\ndescribe('definedTypeNode', () => {\n    test('it returns the size of the inner type', () => {\n        expectMaxSize(definedTypeNode({ name: 'withMaxSize', type: numberTypeNode('shortU16') }), 3);\n        expectMaxSize(definedTypeNode({ name: 'withoutMaxSize', type: stringTypeNode('utf8') }), null);\n    });\n});\n\ndescribe('definedTypeLinkNode', () => {\n    test('it returns the max size of the type being linked', () => {\n        const context = programNode({\n            definedTypes: [definedTypeNode({ name: 'myType', type: numberTypeNode('shortU16') })],\n            name: 'myProgram',\n            publicKey: '1111',\n        });\n\n        expectMaxSizeWithContext([context, definedTypeLinkNode('myType')], 3);\n    });\n    test('it returns null if the linked type has no max size', () => {\n        const context = programNode({\n            definedTypes: [definedTypeNode({ name: 'myType', type: stringTypeNode('utf8') })],\n            name: 'myProgram',\n            publicKey: '1111',\n        });\n\n        expectMaxSizeWithContext([context, definedTypeLinkNode('myType')], null);\n    });\n    test('it returns null if the linked type cannot be found', () => {\n        const context = programNode({ name: 'myProgram', publicKey: '1111' });\n        expectMaxSizeWithContext([context, definedTypeLinkNode('myMissingType')], null);\n    });\n    test('it returns null if the linked type is circular', () => {\n        const context = programNode({\n            definedTypes: [definedTypeNode({ name: 'myType', type: definedTypeLinkNode('myType') })],\n            name: 'myProgram',\n            publicKey: '1111',\n        });\n\n        expectMaxSizeWithContext([context, definedTypeLinkNode('myType')], null);\n    });\n    test('it follows linked nodes using the correct paths when jumping between programs', () => {\n        const programA = programNode({\n            definedTypes: [\n                definedTypeNode({\n                    name: 'typeA',\n                    type: definedTypeLinkNode('typeB1', programLinkNode('programB')),\n                }),\n            ],\n            name: 'programA',\n            publicKey: '1111',\n        });\n        const programB = programNode({\n            definedTypes: [\n                definedTypeNode({ name: 'typeB1', type: definedTypeLinkNode('typeB2') }),\n                definedTypeNode({ name: 'typeB2', type: numberTypeNode('shortU16') }),\n            ],\n            name: 'programB',\n            publicKey: '2222',\n        });\n        const context = rootNode(programA, [programB]);\n\n        expectMaxSizeWithContext([context, programA, programA.definedTypes[0]], 3);\n    });\n});\n\ndescribe('enumTypeNode', () => {\n    test('it returns 1 by default for scalar enums', () => {\n        expectMaxSize(\n            enumTypeNode([enumEmptyVariantTypeNode('A'), enumEmptyVariantTypeNode('B'), enumEmptyVariantTypeNode('C')]),\n            1,\n        );\n    });\n    test('it returns the custom size for scalar enums', () => {\n        expectMaxSize(\n            enumTypeNode(\n                [enumEmptyVariantTypeNode('A'), enumEmptyVariantTypeNode('B'), enumEmptyVariantTypeNode('C')],\n                { size: numberTypeNode('shortU16') },\n            ),\n            3,\n        );\n    });\n    test('it returns the size of the largest variant plus the prefix', () => {\n        expectMaxSize(\n            enumTypeNode(\n                [\n                    enumTupleVariantTypeNode('A', tupleTypeNode([numberTypeNode('u16')])), // 2 bytes\n                    enumTupleVariantTypeNode('B', tupleTypeNode([numberTypeNode('u32')])), // 4 bytes\n                ],\n                { size: numberTypeNode('u64') },\n            ),\n            8 + 4,\n        );\n    });\n    test('it returns null if at least one variant has no max size', () => {\n        expectMaxSize(enumTypeNode([enumTupleVariantTypeNode('A', tupleTypeNode([stringTypeNode('utf8')]))]), null);\n    });\n});\n\ndescribe('fixedSizeTypeNode', () => {\n    test('it returns the fixed size assigned on the node', () => {\n        expectMaxSize(fixedSizeTypeNode(numberTypeNode('u8'), 32), 32);\n        expectMaxSize(fixedSizeTypeNode(stringTypeNode('utf8'), 32), 32);\n    });\n});\n\ndescribe('hiddenPrefixTypeNode', () => {\n    test('it returns the sum of all prefixes and the inner item if all of them have a max size', () => {\n        const prefix1 = constantValueNodeFromString('base16', '2222');\n        const prefix2 = constantValueNodeFromString('base16', '333333');\n        expectMaxSize(hiddenPrefixTypeNode(numberTypeNode('shortU16'), [prefix1, prefix2]), 2 + 3 + 3);\n    });\n    test('it returns null if the inner item has no max size', () => {\n        const prefix = constantValueNodeFromString('base16', 'ffff');\n        expectMaxSize(hiddenPrefixTypeNode(stringTypeNode('utf8'), [prefix]), null);\n    });\n});\n\ndescribe('hiddenSuffixTypeNode', () => {\n    test('it returns the sum of all suffixes and the inner item if all of them have a max size', () => {\n        const suffix1 = constantValueNodeFromString('base16', '2222');\n        const suffix2 = constantValueNodeFromString('base16', '333333');\n        expectMaxSize(hiddenSuffixTypeNode(numberTypeNode('shortU16'), [suffix1, suffix2]), 3 + 2 + 3);\n    });\n    test('it returns null if the inner item has no max size', () => {\n        const suffix = constantValueNodeFromString('base16', 'ffff');\n        expectMaxSize(hiddenSuffixTypeNode(stringTypeNode('utf8'), [suffix]), null);\n    });\n});\n\ndescribe('instructionNode', () => {\n    test('it returns the total max size of all arguments in the instruction', () => {\n        expectMaxSize(\n            instructionNode({\n                arguments: [\n                    instructionArgumentNode({ name: 'lamports', type: optionTypeNode(numberTypeNode('u64')) }),\n                    instructionArgumentNode({ name: 'space', type: numberTypeNode('shortU16') }),\n                ],\n                name: 'createAccount',\n            }),\n            9 + 3,\n        );\n    });\n    test('it returns null if any argument has no max size', () => {\n        expectMaxSize(\n            instructionNode({\n                arguments: [\n                    instructionArgumentNode({ name: 'lamports', type: numberTypeNode('u64') }),\n                    instructionArgumentNode({ name: 'name', type: stringTypeNode('utf8') }),\n                ],\n                name: 'createAccount',\n            }),\n            null,\n        );\n    });\n});\n\ndescribe('instructionArgumentNode', () => {\n    test('it returns the max size of the argument type', () => {\n        expectMaxSize(instructionArgumentNode({ name: 'lamports', type: numberTypeNode('shortU16') }), 3);\n    });\n});\n\ndescribe('mapTypeNode', () => {\n    test('it multiplies the max size of the inner item with the fixed count', () => {\n        const key = numberTypeNode('u8');\n        const value = optionTypeNode(numberTypeNode('u16'));\n        expectMaxSize(mapTypeNode(key, value, fixedCountNode(4)), (1 + 3) * 4);\n    });\n    test('it returns 0 if the count is 0 and the inner type is unsized', () => {\n        const key = stringTypeNode('utf8');\n        const value = numberTypeNode('u16');\n        expectMaxSize(mapTypeNode(key, value, fixedCountNode(0)), 0);\n    });\n    test('it returns null if the count is not fixed', () => {\n        const key = numberTypeNode('u8');\n        const value = numberTypeNode('u16');\n        expectMaxSize(mapTypeNode(key, value, prefixedCountNode(numberTypeNode('u8'))), null);\n        expectMaxSize(mapTypeNode(key, value, remainderCountNode()), null);\n    });\n    test('it returns null if the inner type has no max size', () => {\n        const key = numberTypeNode('u8');\n        const value = stringTypeNode('utf8');\n        expectMaxSize(mapTypeNode(key, value, fixedCountNode(3)), null);\n        expectMaxSize(mapTypeNode(key, value, prefixedCountNode(numberTypeNode('u8'))), null);\n        expectMaxSize(mapTypeNode(key, value, remainderCountNode()), null);\n    });\n    test('it returns 0 if the inner type max size is 0 and the count is fixed', () => {\n        const zeroSizeType = tupleTypeNode([]);\n        expectMaxSize(mapTypeNode(zeroSizeType, zeroSizeType, fixedCountNode(3)), 0);\n    });\n    test('it returns 0 if the inner type max size is 0 and the count is remainder', () => {\n        const zeroSizeType = tupleTypeNode([]);\n        expectMaxSize(mapTypeNode(zeroSizeType, zeroSizeType, remainderCountNode()), 0);\n    });\n    test('it returns the prefix max size if the inner type size is 0 and the count is prefixed', () => {\n        const zeroSizeType = tupleTypeNode([]);\n        expectMaxSize(mapTypeNode(zeroSizeType, zeroSizeType, prefixedCountNode(numberTypeNode('u32'))), 4);\n        expectMaxSize(mapTypeNode(zeroSizeType, zeroSizeType, prefixedCountNode(numberTypeNode('shortU16'))), 3);\n    });\n});\n\ndescribe('numberTypeNode', () => {\n    test.each([\n        ['u8', 1],\n        ['i8', 1],\n        ['u16', 2],\n        ['i16', 2],\n        ['u32', 4],\n        ['i32', 4],\n        ['u64', 8],\n        ['i64', 8],\n        ['u128', 16],\n        ['i128', 16],\n        ['f32', 4],\n        ['f64', 8],\n        ['shortU16', 3],\n    ])('it returns the size of %s numbers', (format, expectedSize) => {\n        expectMaxSize(numberTypeNode(format as NumberFormat), expectedSize);\n    });\n});\n\ndescribe('optionTypeNode', () => {\n    test('it returns the max size of the inner item plus 1 by default', () => {\n        expectMaxSize(optionTypeNode(numberTypeNode('u32')), 1 + 4);\n        expectMaxSize(optionTypeNode(numberTypeNode('u32'), { fixed: true }), 1 + 4);\n    });\n    test('it returns the sum of the prefix and inner item max sizes', () => {\n        expectMaxSize(optionTypeNode(numberTypeNode('u32'), { prefix: numberTypeNode('u16') }), 2 + 4);\n        expectMaxSize(optionTypeNode(numberTypeNode('u32'), { fixed: true, prefix: numberTypeNode('u16') }), 2 + 4);\n    });\n});\n\ndescribe('postOffsetTypeNode', () => {\n    test('it increases the max size by the offset when using a padded offset', () => {\n        expectMaxSize(postOffsetTypeNode(numberTypeNode('shortU16'), 10, 'padded'), 13);\n    });\n    test('it returns null if the inner item is has no max size', () => {\n        expectMaxSize(postOffsetTypeNode(stringTypeNode('utf8'), 4, 'padded'), null);\n    });\n    test('it returns the max size of the inner item for other offset strategies', () => {\n        // Fixed.\n        expectMaxSize(postOffsetTypeNode(numberTypeNode('shortU16'), 42), 3);\n        expectMaxSize(postOffsetTypeNode(numberTypeNode('shortU16'), 42, 'absolute'), 3);\n        expectMaxSize(postOffsetTypeNode(numberTypeNode('shortU16'), 42, 'preOffset'), 3);\n        expectMaxSize(postOffsetTypeNode(numberTypeNode('shortU16'), 42, 'relative'), 3);\n\n        // Variable.\n        expectMaxSize(postOffsetTypeNode(stringTypeNode('utf8'), 42), null);\n        expectMaxSize(postOffsetTypeNode(stringTypeNode('utf8'), 42, 'absolute'), null);\n        expectMaxSize(postOffsetTypeNode(stringTypeNode('utf8'), 42, 'preOffset'), null);\n        expectMaxSize(postOffsetTypeNode(stringTypeNode('utf8'), 42, 'relative'), null);\n    });\n});\n\ndescribe('preOffsetTypeNode', () => {\n    test('it increases the max size by the offset when using a padded offset', () => {\n        expectMaxSize(preOffsetTypeNode(numberTypeNode('shortU16'), 10, 'padded'), 13);\n    });\n    test('it returns null if the inner item has no max size', () => {\n        expectMaxSize(preOffsetTypeNode(stringTypeNode('utf8'), 4, 'padded'), null);\n    });\n    test('it returns the max size of the inner item for other offset strategies', () => {\n        // Fixed.\n        expectMaxSize(preOffsetTypeNode(numberTypeNode('shortU16'), 42), 3);\n        expectMaxSize(preOffsetTypeNode(numberTypeNode('shortU16'), 42, 'absolute'), 3);\n        expectMaxSize(preOffsetTypeNode(numberTypeNode('shortU16'), 42, 'relative'), 3);\n\n        // Variable.\n        expectMaxSize(preOffsetTypeNode(stringTypeNode('utf8'), 42), null);\n        expectMaxSize(preOffsetTypeNode(stringTypeNode('utf8'), 42, 'absolute'), null);\n        expectMaxSize(preOffsetTypeNode(stringTypeNode('utf8'), 42, 'relative'), null);\n    });\n});\n\ndescribe('publicKeyTypeNode', () => {\n    test('it returns 32', () => {\n        expectMaxSize(publicKeyTypeNode(), 32);\n    });\n});\n\ndescribe('remainderOptionTypeNode', () => {\n    test('it returns 0 if the inner item max size is also 0', () => {\n        expectMaxSize(remainderOptionTypeNode(tupleTypeNode([])), 0);\n    });\n    test('it returns null in all other cases', () => {\n        expectMaxSize(remainderOptionTypeNode(numberTypeNode('u16')), null);\n        expectMaxSize(remainderOptionTypeNode(stringTypeNode('utf8')), null);\n    });\n});\n\ndescribe('sentinelTypeNode', () => {\n    test('it returns the sum of the inner type and the sentinel max sizes if both of them exist', () => {\n        const sentinel = constantValueNodeFromString('base16', 'ffff');\n        expectMaxSize(sentinelTypeNode(numberTypeNode('shortU16'), sentinel), 2 + 3);\n    });\n    test('it returns null if the inner type has no max size', () => {\n        const sentinel = constantValueNodeFromString('base16', 'ffff');\n        expectMaxSize(sentinelTypeNode(stringTypeNode('utf8'), sentinel), null);\n    });\n});\n\ndescribe('setTypeNode', () => {\n    test('it multiplies the max size of the inner item with the fixed count', () => {\n        expectMaxSize(setTypeNode(optionTypeNode(numberTypeNode('u32')), fixedCountNode(3)), 5 * 3);\n    });\n    test('it returns 0 if the count is 0 and the inner type is unsized', () => {\n        expectMaxSize(setTypeNode(stringTypeNode('utf8'), fixedCountNode(0)), 0);\n    });\n    test('it returns null if the count is not fixed', () => {\n        expectMaxSize(setTypeNode(numberTypeNode('u16'), prefixedCountNode(numberTypeNode('u8'))), null);\n        expectMaxSize(setTypeNode(numberTypeNode('u16'), remainderCountNode()), null);\n    });\n    test('it returns null if the inner type has no max size', () => {\n        expectMaxSize(setTypeNode(stringTypeNode('utf8'), fixedCountNode(3)), null);\n        expectMaxSize(setTypeNode(stringTypeNode('utf8'), prefixedCountNode(numberTypeNode('u8'))), null);\n        expectMaxSize(setTypeNode(stringTypeNode('utf8'), remainderCountNode()), null);\n    });\n    test('it returns 0 if the inner type max size is 0 and the count is fixed', () => {\n        expectMaxSize(setTypeNode(tupleTypeNode([]), fixedCountNode(3)), 0);\n    });\n    test('it returns 0 if the inner type max size is 0 and the count is remainder', () => {\n        expectMaxSize(setTypeNode(tupleTypeNode([]), remainderCountNode()), 0);\n    });\n    test('it returns the prefix max size if the inner type size is 0 and the count is prefixed', () => {\n        expectMaxSize(setTypeNode(tupleTypeNode([]), prefixedCountNode(numberTypeNode('u32'))), 4);\n        expectMaxSize(setTypeNode(tupleTypeNode([]), prefixedCountNode(numberTypeNode('shortU16'))), 3);\n    });\n});\n\ndescribe('sizePrefixTypeNode', () => {\n    test('it returns the max size of the prefix if the inner type size is 0', () => {\n        expectMaxSize(sizePrefixTypeNode(tupleTypeNode([]), numberTypeNode('shortU16')), 3);\n    });\n    test('it returns the sum of the prefix and the inner type max sizes if they both exist', () => {\n        expectMaxSize(sizePrefixTypeNode(optionTypeNode(publicKeyTypeNode()), numberTypeNode('shortU16')), 3 + 33);\n    });\n    test('it returns null if the inner type has no max size', () => {\n        expectMaxSize(sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u32')), null);\n    });\n});\n\ndescribe('solAmountTypeNode', () => {\n    test('it delegates to the underlying number type', () => {\n        expectMaxSize(solAmountTypeNode(numberTypeNode('u64')), 8);\n        expectMaxSize(solAmountTypeNode(numberTypeNode('shortU16')), 3);\n    });\n});\n\ndescribe('stringTypeNode', () => {\n    test('it always returns null', () => {\n        expectMaxSize(stringTypeNode('base16'), null);\n        expectMaxSize(stringTypeNode('base58'), null);\n        expectMaxSize(stringTypeNode('base64'), null);\n        expectMaxSize(stringTypeNode('utf8'), null);\n    });\n});\n\ndescribe('structFieldTypeNode', () => {\n    test('it returns the max size of the inner type', () => {\n        expectMaxSize(structFieldTypeNode({ name: 'withMaxSize', type: numberTypeNode('shortU16') }), 3);\n        expectMaxSize(structFieldTypeNode({ name: 'withoutMaxSize', type: stringTypeNode('utf8') }), null);\n    });\n});\n\ndescribe('structTypeNode', () => {\n    test('it returns the sum of the field max sizes if they all have one', () => {\n        expectMaxSize(\n            structTypeNode([\n                structFieldTypeNode({ name: 'age', type: numberTypeNode('shortU16') }),\n                structFieldTypeNode({\n                    name: 'firstname',\n                    type: optionTypeNode(fixedSizeTypeNode(stringTypeNode('utf8'), 42)),\n                }),\n            ]),\n            3 + 43,\n        );\n    });\n    test('it returns null if any field has no max size', () => {\n        expectMaxSize(\n            structTypeNode([\n                structFieldTypeNode({ name: 'age', type: numberTypeNode('u32') }),\n                structFieldTypeNode({ name: 'firstname', type: stringTypeNode('utf8') }),\n            ]),\n            null,\n        );\n    });\n});\n\ndescribe('tupleTypeNode', () => {\n    test('it returns the sum of all max sizes if all items have one', () => {\n        expectMaxSize(tupleTypeNode([numberTypeNode('shortU16'), optionTypeNode(numberTypeNode('u32'))]), 3 + 5);\n    });\n    test('it returns null if any item has no max size', () => {\n        expectMaxSize(tupleTypeNode([numberTypeNode('u16'), stringTypeNode('utf8')]), null);\n    });\n});\n\ndescribe('zeroableOptionTypeNode', () => {\n    test('it returns the inner item max size if is has one', () => {\n        expectMaxSize(zeroableOptionTypeNode(numberTypeNode('shortU16')), 3);\n    });\n    test('it returns null if the inner item has no max size', () => {\n        expectMaxSize(zeroableOptionTypeNode(stringTypeNode('utf8')), null);\n    });\n    test('it returns the maximum value between the inner item max size and the zero value when provided', () => {\n        const zeroValue = (bytes: number) => constantValueNodeFromString('base16', 'ff'.repeat(bytes));\n        expectMaxSize(zeroableOptionTypeNode(numberTypeNode('u32'), zeroValue(2)), 4);\n        expectMaxSize(zeroableOptionTypeNode(numberTypeNode('u32'), zeroValue(42)), 42);\n    });\n});\n"
  },
  {
    "path": "packages/visitors-core/test/getResolvedInstructionInputsVisitor.test.ts",
    "content": "import {\n    accountValueNode,\n    instructionAccountNode,\n    instructionArgumentNode,\n    instructionNode,\n    numberTypeNode,\n    pdaSeedValueNode,\n    pdaValueNode,\n    publicKeyTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getResolvedInstructionInputsVisitor, visit } from '../src';\n\ntest('it returns all instruction accounts in order of resolution', () => {\n    // Given the following instruction node with an account that defaults to another account.\n    const node = instructionNode({\n        accounts: [\n            instructionAccountNode({\n                defaultValue: accountValueNode('authority'),\n                isSigner: true,\n                isWritable: false,\n                name: 'owner',\n            }),\n            instructionAccountNode({\n                isSigner: true,\n                isWritable: false,\n                name: 'authority',\n            }),\n        ],\n        name: 'myInstruction',\n    });\n\n    // When we get its resolved inputs.\n    const result = visit(node, getResolvedInstructionInputsVisitor());\n\n    // Then we expect the accounts to be in order of resolution.\n    expect(result).toEqual([\n        {\n            ...node.accounts[1],\n            dependsOn: [],\n            isPda: false,\n            resolvedIsOptional: false,\n            resolvedIsSigner: true,\n        },\n        {\n            ...node.accounts[0],\n            dependsOn: [accountValueNode('authority')],\n            isPda: false,\n            resolvedIsOptional: false,\n            resolvedIsSigner: true,\n        },\n    ]);\n});\n\ntest('it sets the resolved signer to either when a non signer defaults to a signer account', () => {\n    // Given the following instruction node such that a non signer account defaults to a signer account.\n    const node = instructionNode({\n        accounts: [\n            instructionAccountNode({\n                defaultValue: accountValueNode('authority'),\n                isSigner: false,\n                isWritable: false,\n                name: 'owner',\n            }),\n            instructionAccountNode({\n                isSigner: true,\n                isWritable: false,\n                name: 'authority',\n            }),\n        ],\n        name: 'myInstruction',\n    });\n\n    // When we get its resolved inputs.\n    const result = visit(node, getResolvedInstructionInputsVisitor());\n\n    // Then we expect the resolved signer to be either for the non signer account.\n    expect(result[1]).toEqual({\n        ...node.accounts[0],\n        dependsOn: [accountValueNode('authority')],\n        isPda: false,\n        resolvedIsOptional: false,\n        resolvedIsSigner: 'either',\n    });\n});\n\ntest('it sets the resolved signer to either when a signer defaults to a non signer account', () => {\n    // Given the following instruction node such that a signer account defaults to a non signer account.\n    const node = instructionNode({\n        accounts: [\n            instructionAccountNode({\n                defaultValue: accountValueNode('authority'),\n                isSigner: true,\n                isWritable: false,\n                name: 'owner',\n            }),\n            instructionAccountNode({\n                isSigner: false,\n                isWritable: false,\n                name: 'authority',\n            }),\n        ],\n        name: 'myInstruction',\n    });\n\n    // When we get its resolved inputs.\n    const result = visit(node, getResolvedInstructionInputsVisitor());\n\n    // Then we expect the resolved signer to be either for the signer account.\n    expect(result[1]).toEqual({\n        ...node.accounts[0],\n        dependsOn: [accountValueNode('authority')],\n        isPda: false,\n        resolvedIsOptional: false,\n        resolvedIsSigner: 'either',\n    });\n});\n\ntest('it includes instruction data arguments with default values', () => {\n    // Given the following instruction node with two arguments such that:\n    // - The first argument defaults to an account.\n    // - The second argument has no default value.\n    const node = instructionNode({\n        accounts: [\n            instructionAccountNode({\n                isSigner: true,\n                isWritable: false,\n                name: 'owner',\n            }),\n        ],\n        arguments: [\n            instructionArgumentNode({\n                defaultValue: accountValueNode('owner'),\n                name: 'ownerArg',\n                type: publicKeyTypeNode(),\n            }),\n            instructionArgumentNode({\n                name: 'argWithoutDefaults',\n                type: numberTypeNode('u8'),\n            }),\n        ],\n        name: 'myInstruction',\n    });\n\n    // When we get its resolved inputs.\n    const result = visit(node, getResolvedInstructionInputsVisitor());\n\n    // Then we expect the following inputs.\n    expect(result).toEqual([\n        {\n            ...node.accounts[0],\n            dependsOn: [],\n            isPda: false,\n            resolvedIsOptional: false,\n            resolvedIsSigner: true,\n        },\n        {\n            ...node.arguments[0],\n            dependsOn: [accountValueNode('owner')],\n        },\n    ]);\n\n    // And the argument without default value is not included.\n    expect(result.some(input => input.name === 'argWithoutDefaults')).toBe(false);\n});\n\ntest('it includes instruction extra arguments with default values', () => {\n    // Given the following instruction node with two extra arguments such that:\n    // - The first argument defaults to an account.\n    // - The second argument has no default value.\n    const node = instructionNode({\n        accounts: [\n            instructionAccountNode({\n                isSigner: true,\n                isWritable: false,\n                name: 'owner',\n            }),\n        ],\n        extraArguments: [\n            instructionArgumentNode({\n                defaultValue: accountValueNode('owner'),\n                name: 'ownerArg',\n                type: publicKeyTypeNode(),\n            }),\n            instructionArgumentNode({\n                name: 'argWithoutDefaults',\n                type: numberTypeNode('u8'),\n            }),\n        ],\n        name: 'myInstruction',\n    });\n\n    // When we get its resolved inputs.\n    const result = visit(node, getResolvedInstructionInputsVisitor());\n\n    // Then we expect the following inputs.\n    expect(result).toEqual([\n        {\n            ...node.accounts[0],\n            dependsOn: [],\n            isPda: false,\n            resolvedIsOptional: false,\n            resolvedIsSigner: true,\n        },\n        {\n            ...node.extraArguments![0],\n            dependsOn: [accountValueNode('owner')],\n        },\n    ]);\n\n    // And the argument without default value is not included.\n    expect(result.some(input => input.name === 'argWithoutDefaults')).toBe(false);\n});\n\ntest('it returns an empty array for empty instructions', () => {\n    // Given the following empty instruction node.\n    const node = instructionNode({ name: 'myInstruction' });\n\n    // When we get its resolved inputs.\n    const result = visit(node, getResolvedInstructionInputsVisitor());\n\n    // Then we expect an empty array.\n    expect(result).toEqual([]);\n});\n\ntest('it resolves the seeds of a PdaValueNode first', () => {\n    // Given the following instruction node with an account that defaults to another account.\n    const node = instructionNode({\n        accounts: [\n            instructionAccountNode({\n                defaultValue: pdaValueNode('counter', [pdaSeedValueNode('authority', accountValueNode('payer'))]),\n                isSigner: false,\n                isWritable: false,\n                name: 'counter',\n            }),\n            instructionAccountNode({\n                isSigner: true,\n                isWritable: false,\n                name: 'payer',\n            }),\n        ],\n        name: 'myInstruction',\n    });\n\n    // When we get its resolved inputs.\n    const result = visit(node, getResolvedInstructionInputsVisitor());\n\n    // Then we expect the accounts to be in order of resolution.\n    expect(result).toEqual([\n        {\n            ...node.accounts[1],\n            dependsOn: [],\n            isPda: false,\n            resolvedIsOptional: false,\n            resolvedIsSigner: true,\n        },\n        {\n            ...node.accounts[0],\n            dependsOn: [accountValueNode('payer')],\n            isPda: false,\n            resolvedIsOptional: false,\n            resolvedIsSigner: false,\n        },\n    ]);\n});\n\ntest('it resolves the program id of a PdaValueNode first', () => {\n    // Given the following instruction node with an account that defaults to another account.\n    const node = instructionNode({\n        accounts: [\n            instructionAccountNode({\n                defaultValue: pdaValueNode('counter', [], accountValueNode('counterProgram')),\n                isSigner: false,\n                isWritable: false,\n                name: 'counter',\n            }),\n            instructionAccountNode({\n                isSigner: false,\n                isWritable: false,\n                name: 'counterProgram',\n            }),\n        ],\n        name: 'myInstruction',\n    });\n\n    // When we get its resolved inputs.\n    const result = visit(node, getResolvedInstructionInputsVisitor());\n\n    // Then we expect the accounts to be in order of resolution.\n    expect(result).toEqual([\n        {\n            ...node.accounts[1],\n            dependsOn: [],\n            isPda: false,\n            resolvedIsOptional: false,\n            resolvedIsSigner: false,\n        },\n        {\n            ...node.accounts[0],\n            dependsOn: [accountValueNode('counterProgram')],\n            isPda: false,\n            resolvedIsOptional: false,\n            resolvedIsSigner: false,\n        },\n    ]);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/getUniqueHashStringVisitor.test.ts",
    "content": "import { numberTypeNode, publicKeyTypeNode, structFieldTypeNode, structTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { getUniqueHashStringVisitor, visit } from '../src';\n\ntest('it returns a unique string representing the whole node', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()])]);\n\n    // When we get its unique hash string.\n    const result = visit(node, getUniqueHashStringVisitor());\n\n    // Then we expect the following string.\n    expect(result).toEqual(\n        '{\"items\":[' +\n            '{\"endian\":\"le\",\"format\":\"u32\",\"kind\":\"numberTypeNode\"},' +\n            '{\"items\":[{\"endian\":\"le\",\"format\":\"u32\",\"kind\":\"numberTypeNode\"},{\"kind\":\"publicKeyTypeNode\"}],\"kind\":\"tupleTypeNode\"}' +\n            '],\"kind\":\"tupleTypeNode\"}',\n    );\n});\n\ntest('it returns a unique string whilst discard docs', () => {\n    // Given the following tree with docs.\n    const node = structTypeNode([\n        structFieldTypeNode({\n            docs: ['The owner of the account.'],\n            name: 'owner',\n            type: publicKeyTypeNode(),\n        }),\n    ]);\n\n    // When we get its unique hash string whilst discarding docs.\n    const result = visit(node, getUniqueHashStringVisitor({ removeDocs: true }));\n\n    // Then we expect the following string.\n    expect(result).toEqual(\n        '{\"fields\":[' +\n            '{\"docs\":[],\"kind\":\"structFieldTypeNode\",\"name\":\"owner\",\"type\":{\"kind\":\"publicKeyTypeNode\"}}' +\n            '],\"kind\":\"structTypeNode\"}',\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/identityVisitor.test.ts",
    "content": "import { assertIsNode, numberTypeNode, publicKeyTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { identityVisitor, interceptVisitor, visit } from '../src';\n\ntest('it visits all nodes and returns different instances of the same nodes', () => {\n    // Given the following 3-nodes tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n\n    // When we visit it using the identity visitor.\n    const result = visit(node, identityVisitor());\n\n    // Then we get the same tree back.\n    expect(result).toEqual(node);\n\n    // But the nodes are different instances.\n    expect(result).not.toBe(node);\n    assertIsNode(result, 'tupleTypeNode');\n    expect(result.items[0]).not.toBe(node.items[0]);\n    expect(result.items[1]).not.toBe(node.items[1]);\n});\n\ntest('it can remove nodes by returning null', () => {\n    // Given the following 3-nodes tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n\n    // And given an identity visitor overidden to remove all public key nodes.\n    const visitor = identityVisitor();\n    visitor.visitPublicKeyType = () => null;\n\n    // When we visit it using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect the following tree back.\n    expect(result).toEqual(tupleTypeNode([numberTypeNode('u32')]));\n});\n\ntest('it can create partial visitors', () => {\n    // Given the following 3-nodes tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n\n    // And an identity visitor that only supports 2 of these nodes\n    // whilst using an interceptor to record the events that happened.\n    const events: string[] = [];\n    const visitor = interceptVisitor(identityVisitor({ keys: ['tupleTypeNode', 'numberTypeNode'] }), (node, next) => {\n        events.push(`visiting:${node.kind}`);\n        return next(node);\n    });\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we still get the full tree back as different instances.\n    expect(result).toEqual(node);\n    expect(result).not.toBe(node);\n    assertIsNode(result, 'tupleTypeNode');\n    expect(result.items[0]).not.toBe(node.items[0]);\n    expect(result.items[1]).not.toBe(node.items[1]);\n\n    // But the unsupported node was not visited.\n    expect(events).toEqual(['visiting:tupleTypeNode', 'visiting:numberTypeNode']);\n\n    // And the unsupported node cannot be visited.\n    // @ts-expect-error PublicKeyTypeNode is not supported.\n    expect(() => visit(publicKeyTypeNode(), visitor)).toThrow();\n});\n"
  },
  {
    "path": "packages/visitors-core/test/interceptFirstVisitVisitor.test.ts",
    "content": "import { numberTypeNode, publicKeyTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { extendVisitor, interceptFirstVisitVisitor, visit, voidVisitor } from '../src';\n\ntest('it returns a new visitor that only intercepts the first visit of a visitor', () => {\n    // Given the following 3-nodes tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n\n    // And an intercepted void visitor that records the events that happened during the first visit.\n    const events: string[] = [];\n    const baseVisitor = voidVisitor();\n    const visitor = interceptFirstVisitVisitor(baseVisitor, (node, next) => {\n        events.push(`down:${node.kind}`);\n        next(node);\n        events.push(`up:${node.kind}`);\n    });\n\n    // When we visit the tree using that visitor.\n    visit(node, visitor);\n\n    // Then we expect the following events to have happened.\n    expect(events).toEqual(['down:tupleTypeNode', 'up:tupleTypeNode']);\n\n    // And the intercepted visitor is a new instance.\n    expect(baseVisitor).not.toBe(visitor);\n});\n\ntest('it still works on subsequent calls', () => {\n    // Given the following 3-nodes tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n\n    // And an intercepted void visitor that records the events that happened during the first visit.\n    const events: string[] = [];\n    const baseVisitor = voidVisitor();\n    const visitor = interceptFirstVisitVisitor(baseVisitor, (node, next) => {\n        events.push(`intercepting:${node.kind}`);\n        next(node);\n    });\n\n    // When we visit the tree twice using that visitor.\n    visit(node, visitor);\n    visit(node, visitor);\n\n    // Then we expect the following events to have happened.\n    expect(events).toEqual(['intercepting:tupleTypeNode', 'intercepting:tupleTypeNode']);\n});\n\ntest('it resets the first visit boolean if an error is thrown', () => {\n    // Given the following 3-nodes tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n\n    // And an intercepted visitor that records the events that happened during the first visit\n    // but throws an error when it visits publicKeyTypeNodes.\n    const events: string[] = [];\n    const baseVisitor = extendVisitor(voidVisitor(), {\n        visitPublicKeyType: () => {\n            throw new Error('public key error');\n        },\n    });\n    const visitor = interceptFirstVisitVisitor(baseVisitor, (node, next) => {\n        events.push(`intercepting:${node.kind}`);\n        next(node);\n    });\n\n    // Then we expect errors to be thrown whenever we visit the three.\n    expect(() => visit(node, visitor)).toThrow('public key error');\n    expect(() => visit(node, visitor)).toThrow('public key error');\n\n    // But we still expect the following events to have happened.\n    expect(events).toEqual(['intercepting:tupleTypeNode', 'intercepting:tupleTypeNode']);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/interceptVisitor.test.ts",
    "content": "import { numberTypeNode, publicKeyTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { interceptVisitor, visit, voidVisitor } from '../src';\n\ntest('it returns a new visitor that intercepts all visits of a visitor', () => {\n    // Given the following 3-nodes tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n\n    // And an intercepted void visitor that records the events that happened during each visit.\n    const events: string[] = [];\n    const baseVisitor = voidVisitor();\n    const visitor = interceptVisitor(baseVisitor, (node, next) => {\n        events.push(`down:${node.kind}`);\n        next(node);\n        events.push(`up:${node.kind}`);\n    });\n\n    // When we visit the tree using that visitor.\n    visit(node, visitor);\n\n    // Then we expect the following events to have happened.\n    expect(events).toEqual([\n        'down:tupleTypeNode',\n        'down:numberTypeNode',\n        'up:numberTypeNode',\n        'down:publicKeyTypeNode',\n        'up:publicKeyTypeNode',\n        'up:tupleTypeNode',\n    ]);\n\n    // And the intercepted visitor is a new instance.\n    expect(baseVisitor).not.toBe(visitor);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/mapVisitor.test.ts",
    "content": "import { numberTypeNode, publicKeyTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { mapVisitor, mergeVisitor, staticVisitor, visit, Visitor } from '../src';\n\ntest('it maps the return value of a visitor to another', () => {\n    // Given the following 3-nodes tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n\n    // And a merge visitor A that lists the kind of each node.\n    const visitorA = mergeVisitor(\n        node => node.kind as string,\n        (node, values) => `${node.kind}(${values.join(',')})`,\n    );\n\n    // And a mapped visitor B that returns the number of characters returned by visitor A.\n    const visitorB = mapVisitor(visitorA, value => value.length);\n\n    // Then we expect the following results when visiting different nodes.\n    expect(visit(node, visitorB)).toBe(47);\n    expect(visit(node.items[0], visitorB)).toBe(14);\n    expect(visit(node.items[1], visitorB)).toBe(17);\n});\n\ntest('it creates partial visitors from partial visitors', () => {\n    // Given the following 3-nodes tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n\n    // And partial static visitor A that supports only 2 of these nodes.\n    const visitorA = staticVisitor(node => node.kind, { keys: ['tupleTypeNode', 'numberTypeNode'] });\n\n    // And a mapped visitor B that returns the number of characters returned by visitor A.\n    const visitorB = mapVisitor(visitorA, value => value.length);\n\n    // Then both visitors are partial.\n    visitorA satisfies Visitor<string, 'numberTypeNode' | 'tupleTypeNode'>;\n    visitorB satisfies Visitor<number, 'numberTypeNode' | 'tupleTypeNode'>;\n\n    // Then we expect an error when visiting an unsupported node.\n    // @ts-expect-error PublicKeyTypeNode is not supported.\n    expect(() => visit(node.items[1], visitorB)).toThrow();\n});\n"
  },
  {
    "path": "packages/visitors-core/test/mergeVisitor.test.ts",
    "content": "import { numberTypeNode, publicKeyTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { mergeVisitor, visit } from '../src';\n\ntest('it sets a value for all leaves and merges node values together', () => {\n    // Given the following 3-nodes tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n\n    // And a visitor that sets the node kind for all leaves and combines\n    // them together such that each node lists the kind of its children.\n    const visitor = mergeVisitor(\n        node => node.kind as string,\n        (node, values) => `${node.kind}(${values.join(',')})`,\n    );\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we get the following result.\n    expect(result).toBe('tupleTypeNode(numberTypeNode,publicKeyTypeNode)');\n});\n\ntest('it can be used to count nodes', () => {\n    // Given the following 3-nodes tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n\n    // When we visit the tree with a visitor that counts nodes.\n    const visitor = mergeVisitor(\n        () => 1,\n        (_, values) => values.reduce((a, b) => a + b, 1),\n    );\n    const result = visit(node, visitor);\n\n    // Then we expect to have 3 nodes.\n    expect(result).toBe(3);\n});\n\ntest('it can create partial visitors', () => {\n    // Given the following 3-nodes tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n\n    // And a visitor that only supports 2 of these nodes.\n    const visitor = mergeVisitor(\n        node => node.kind as string,\n        (node, values) => `${node.kind}(${values.join(',')})`,\n        { keys: ['tupleTypeNode', 'numberTypeNode'] },\n    );\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then the unsupported node is not included in the result.\n    expect(result).toBe('tupleTypeNode(numberTypeNode)');\n\n    // And the unsupported node cannot be visited.\n    // @ts-expect-error PublicKeyTypeNode is not supported.\n    expect(() => visit(publicKeyTypeNode(), visitor)).toThrow();\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/AccountNode.test.ts",
    "content": "import {\n    accountNode,\n    numberTypeNode,\n    pdaLinkNode,\n    publicKeyTypeNode,\n    sizeDiscriminatorNode,\n    structFieldTypeNode,\n    structTypeNode,\n} from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from './_setup';\n\nconst node = accountNode({\n    data: structTypeNode([\n        structFieldTypeNode({ name: 'mint', type: publicKeyTypeNode() }),\n        structFieldTypeNode({ name: 'owner', type: publicKeyTypeNode() }),\n        structFieldTypeNode({ name: 'amount', type: numberTypeNode('u64') }),\n    ]),\n    discriminators: [sizeDiscriminatorNode(72)],\n    name: 'token',\n    pda: pdaLinkNode('associatedToken'),\n    size: 72,\n});\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 10);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[accountNode]', null);\n    expectDeleteNodesVisitor(node, '[pdaLinkNode]', accountNode({ ...node, pda: undefined }));\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\naccountNode [token]\n|   structTypeNode\n|   |   structFieldTypeNode [mint]\n|   |   |   publicKeyTypeNode\n|   |   structFieldTypeNode [owner]\n|   |   |   publicKeyTypeNode\n|   |   structFieldTypeNode [amount]\n|   |   |   numberTypeNode [u64]\n|   pdaLinkNode [associatedToken]\n|   sizeDiscriminatorNode [72]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/DefinedTypeNode.test.ts",
    "content": "import {\n    definedTypeNode,\n    fixedSizeTypeNode,\n    numberTypeNode,\n    stringTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n} from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from './_setup';\n\nconst node = definedTypeNode({\n    name: 'person',\n    type: structTypeNode([\n        structFieldTypeNode({\n            name: 'name',\n            type: fixedSizeTypeNode(stringTypeNode('utf8'), 42),\n        }),\n        structFieldTypeNode({ name: 'age', type: numberTypeNode('u64') }),\n    ]),\n});\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 7);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[definedTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[structTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\ndefinedTypeNode [person]\n|   structTypeNode\n|   |   structFieldTypeNode [name]\n|   |   |   fixedSizeTypeNode [42]\n|   |   |   |   stringTypeNode [utf8]\n|   |   structFieldTypeNode [age]\n|   |   |   numberTypeNode [u64]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/ErrorNode.test.ts",
    "content": "import { errorNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from './_setup';\n\nconst node = errorNode({\n    code: 42,\n    message: 'The provided account does not match the owner of the token account.',\n    name: 'InvalidTokenOwner',\n});\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[errorNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `errorNode [42.invalidTokenOwner]`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/EventNode.test.ts",
    "content": "import {\n    eventNode,\n    numberTypeNode,\n    publicKeyTypeNode,\n    sizeDiscriminatorNode,\n    structFieldTypeNode,\n    structTypeNode,\n} from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from './_setup';\n\nconst node = eventNode({\n    data: structTypeNode([\n        structFieldTypeNode({ name: 'authority', type: publicKeyTypeNode() }),\n        structFieldTypeNode({ name: 'amount', type: numberTypeNode('u64') }),\n    ]),\n    discriminators: [sizeDiscriminatorNode(40)],\n    name: 'transferEvent',\n});\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 7);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[eventNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\neventNode [transferEvent]\n|   structTypeNode\n|   |   structFieldTypeNode [authority]\n|   |   |   publicKeyTypeNode\n|   |   structFieldTypeNode [amount]\n|   |   |   numberTypeNode [u64]\n|   sizeDiscriminatorNode [40]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/InstructionAccountNode.test.ts",
    "content": "import { accountValueNode, instructionAccountNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from './_setup';\n\nconst node = instructionAccountNode({\n    defaultValue: accountValueNode('authority'),\n    isOptional: false,\n    isSigner: 'either',\n    isWritable: true,\n    name: 'owner',\n});\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[instructionAccountNode]', null);\n    expectDeleteNodesVisitor(node, '[accountValueNode]', instructionAccountNode({ ...node, defaultValue: undefined }));\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\ninstructionAccountNode [owner.writable.optionalSigner]\n|   accountValueNode [authority]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/InstructionArgumentNode.test.ts",
    "content": "import { instructionArgumentNode, numberTypeNode, numberValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from './_setup';\n\nconst node = instructionArgumentNode({\n    defaultValue: numberValueNode(1),\n    name: 'amount',\n    type: numberTypeNode('u64'),\n});\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 3);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[instructionArgumentNode]', null);\n    expectDeleteNodesVisitor(node, '[numberTypeNode]', null);\n    expectDeleteNodesVisitor(\n        node,\n        '[numberValueNode]',\n        instructionArgumentNode({ name: 'amount', type: numberTypeNode('u64') }),\n    );\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\ninstructionArgumentNode [amount]\n|   numberTypeNode [u64]\n|   numberValueNode [1]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/InstructionByteDeltaNode.test.ts",
    "content": "import { instructionByteDeltaNode, numberValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from './_setup';\n\nconst node = instructionByteDeltaNode(numberValueNode(42), {\n    subtract: true,\n});\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[instructionByteDeltaNode]', null);\n    expectDeleteNodesVisitor(node, '[numberValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\ninstructionByteDeltaNode [subtract.withHeader]\n|   numberValueNode [42]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/InstructionNode.test.ts",
    "content": "import {\n    fieldDiscriminatorNode,\n    instructionAccountNode,\n    instructionArgumentNode,\n    instructionByteDeltaNode,\n    instructionNode,\n    instructionRemainingAccountsNode,\n    instructionStatusNode,\n    numberTypeNode,\n    numberValueNode,\n    publicKeyTypeNode,\n    resolverValueNode,\n} from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from './_setup';\n\nconst node = instructionNode({\n    accounts: [\n        instructionAccountNode({\n            isSigner: true,\n            isWritable: true,\n            name: 'source',\n        }),\n        instructionAccountNode({\n            isSigner: false,\n            isWritable: true,\n            name: 'destination',\n        }),\n    ],\n    arguments: [\n        instructionArgumentNode({\n            name: 'discriminator',\n            type: numberTypeNode('u32'),\n        }),\n        instructionArgumentNode({\n            name: 'amount',\n            type: numberTypeNode('u64'),\n        }),\n    ],\n    discriminators: [fieldDiscriminatorNode('discriminator')],\n    name: 'transferSol',\n});\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 8);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[instructionNode]', null);\n    expectDeleteNodesVisitor(node, '[instructionAccountNode]', { ...node, accounts: [] });\n    expectDeleteNodesVisitor(node, '[instructionArgumentNode]', { ...node, arguments: [] });\n    expectDeleteNodesVisitor(node, '[fieldDiscriminatorNode]', { ...node, discriminators: [] });\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\ninstructionNode [transferSol]\n|   instructionAccountNode [source.writable.signer]\n|   instructionAccountNode [destination.writable]\n|   instructionArgumentNode [discriminator]\n|   |   numberTypeNode [u32]\n|   instructionArgumentNode [amount]\n|   |   numberTypeNode [u64]\n|   fieldDiscriminatorNode [discriminator]`,\n    );\n});\n\ntest('extra arguments', () => {\n    const nodeWithExtraArguments = instructionNode({\n        extraArguments: [\n            instructionArgumentNode({\n                name: 'myExtraArgument',\n                type: publicKeyTypeNode(),\n            }),\n        ],\n        name: 'myInstruction',\n    });\n\n    expectMergeVisitorCount(nodeWithExtraArguments, 3);\n    expectIdentityVisitor(nodeWithExtraArguments);\n});\n\ntest('remaining accounts', () => {\n    const nodeWithRemainingAccounts = instructionNode({\n        name: 'myInstruction',\n        remainingAccounts: [instructionRemainingAccountsNode(resolverValueNode('myResolver'))],\n    });\n\n    expectMergeVisitorCount(nodeWithRemainingAccounts, 3);\n    expectIdentityVisitor(nodeWithRemainingAccounts);\n});\n\ntest('byte deltas', () => {\n    const nodeWithByteDeltas = instructionNode({\n        byteDeltas: [instructionByteDeltaNode(numberValueNode(42))],\n        name: 'myInstruction',\n    });\n\n    expectMergeVisitorCount(nodeWithByteDeltas, 3);\n    expectIdentityVisitor(nodeWithByteDeltas);\n});\n\ntest('sub instructions', () => {\n    const nodeWithSubInstructions = instructionNode({\n        name: 'myInstruction',\n        subInstructions: [\n            instructionNode({ name: 'mySubInstruction1' }),\n            instructionNode({ name: 'mySubInstruction2' }),\n        ],\n    });\n\n    expectMergeVisitorCount(nodeWithSubInstructions, 3);\n    expectIdentityVisitor(nodeWithSubInstructions);\n});\n\ntest('status mode', () => {\n    const nodeWithStatus = instructionNode({\n        name: 'deprecatedInstruction',\n        status: instructionStatusNode('deprecated', 'Use newInstruction instead'),\n    });\n\n    expectMergeVisitorCount(nodeWithStatus, 2);\n    expectIdentityVisitor(nodeWithStatus);\n    expectDebugStringVisitor(\n        nodeWithStatus,\n        `\ninstructionNode [deprecatedInstruction]\n|   instructionStatusNode [deprecated.Use newInstruction instead]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/InstructionRemainingAccountsNode.test.ts",
    "content": "import { argumentValueNode, instructionRemainingAccountsNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from './_setup';\n\nconst node = instructionRemainingAccountsNode(argumentValueNode('remainingAccounts'), {\n    isSigner: 'either',\n    isWritable: true,\n});\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[instructionRemainingAccountsNode]', null);\n    expectDeleteNodesVisitor(node, '[argumentValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\ninstructionRemainingAccountsNode [writable.optionalSigner]\n|   argumentValueNode [remainingAccounts]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/PdaNode.test.ts",
    "content": "import {\n    constantPdaSeedNode,\n    numberTypeNode,\n    numberValueNode,\n    pdaNode,\n    publicKeyTypeNode,\n    variablePdaSeedNode,\n} from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from './_setup';\n\nconst node = pdaNode({\n    name: 'associatedToken',\n    seeds: [\n        variablePdaSeedNode('owner', publicKeyTypeNode()),\n        constantPdaSeedNode(numberTypeNode('u8'), numberValueNode(123456)),\n        variablePdaSeedNode('mint', publicKeyTypeNode()),\n    ],\n});\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 8);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[pdaNode]', null);\n    expectDeleteNodesVisitor(node, ['[variablePdaSeedNode]', '[constantPdaSeedNode]'], { ...node, seeds: [] });\n    expectDeleteNodesVisitor(node, '[publicKeyTypeNode]', {\n        ...node,\n        seeds: [constantPdaSeedNode(numberTypeNode('u8'), numberValueNode(123456))],\n    });\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\npdaNode [associatedToken]\n|   variablePdaSeedNode [owner]\n|   |   publicKeyTypeNode\n|   constantPdaSeedNode\n|   |   numberTypeNode [u8]\n|   |   numberValueNode [123456]\n|   variablePdaSeedNode [mint]\n|   |   publicKeyTypeNode`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/ProgramNode.test.ts",
    "content": "import {\n    accountNode,\n    definedTypeNode,\n    enumTypeNode,\n    errorNode,\n    eventNode,\n    instructionNode,\n    pdaNode,\n    programNode,\n    structTypeNode,\n} from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from './_setup';\n\nconst node = programNode({\n    accounts: [\n        accountNode({ data: structTypeNode([]), name: 'mint' }),\n        accountNode({ data: structTypeNode([]), name: 'token' }),\n    ],\n    definedTypes: [definedTypeNode({ name: 'tokenState', type: enumTypeNode([]) })],\n    errors: [\n        errorNode({ code: 1, message: 'Invalid mint', name: 'invalidMint' }),\n        errorNode({ code: 2, message: 'Invalid token', name: 'invalidToken' }),\n    ],\n    events: [eventNode({ data: structTypeNode([]), name: 'transferEvent' })],\n    instructions: [instructionNode({ name: 'mintTokens' }), instructionNode({ name: 'transferTokens' })],\n    name: 'splToken',\n    pdas: [pdaNode({ name: 'associatedToken', seeds: [] })],\n    publicKey: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',\n    version: '1.2.3',\n});\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 15);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[programNode]', null);\n    expectDeleteNodesVisitor(node, '[pdaNode]', { ...node, pdas: [] });\n    expectDeleteNodesVisitor(node, '[accountNode]', { ...node, accounts: [] });\n    expectDeleteNodesVisitor(node, '[eventNode]', { ...node, events: [] });\n    expectDeleteNodesVisitor(node, '[instructionNode]', { ...node, instructions: [] });\n    expectDeleteNodesVisitor(node, '[definedTypeNode]', { ...node, definedTypes: [] });\n    expectDeleteNodesVisitor(node, '[errorNode]', { ...node, errors: [] });\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nprogramNode [splToken.TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA]\n|   pdaNode [associatedToken]\n|   accountNode [mint]\n|   |   structTypeNode\n|   accountNode [token]\n|   |   structTypeNode\n|   eventNode [transferEvent]\n|   |   structTypeNode\n|   instructionNode [mintTokens]\n|   instructionNode [transferTokens]\n|   definedTypeNode [tokenState]\n|   |   enumTypeNode\n|   |   |   numberTypeNode [u8]\n|   errorNode [1.invalidMint]\n|   errorNode [2.invalidToken]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/RootNode.test.ts",
    "content": "import { programNode, rootNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from './_setup';\n\nconst node = rootNode(\n    programNode({\n        name: 'splToken',\n        publicKey: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',\n    }),\n    [\n        programNode({\n            name: 'splAddressLookupTable',\n            publicKey: 'AddressLookupTab1e1111111111111111111111111',\n        }),\n    ],\n);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 3);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[rootNode]', null);\n    expectDeleteNodesVisitor(node, '[programNode]', null);\n    expectDeleteNodesVisitor(node, '[programNode]splAddressLookupTable', { ...node, additionalPrograms: [] });\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nrootNode\n|   programNode [splToken.TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA]\n|   programNode [splAddressLookupTable.AddressLookupTab1e1111111111111111111111111]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/_setup.ts",
    "content": "import type { Node } from '@codama/nodes';\nimport { expect } from 'vitest';\n\nimport {\n    deleteNodesVisitor,\n    getDebugStringVisitor,\n    identityVisitor,\n    mergeVisitor,\n    NodeSelector,\n    visit,\n} from '../../src';\n\nexport const expectMergeVisitorCount = (node: Node, expectedNodeCount: number) => {\n    const visitor = mergeVisitor(\n        () => 1,\n        (_, values) => values.reduce((a, b) => a + b, 1),\n    );\n    const result = visit(node, visitor);\n    expect(result).toBe(expectedNodeCount);\n};\n\nexport const expectIdentityVisitor = (node: Node) => {\n    const visitor = identityVisitor();\n    const result = visit(node, visitor);\n    expect(result).toEqual(node);\n    expect(result).not.toBe(node);\n    expect(Object.isFrozen(result)).toBe(true);\n};\n\nexport const expectDeleteNodesVisitor = (\n    node: Node,\n    selector: NodeSelector | NodeSelector[],\n    expectedResult: Node | null,\n) => {\n    const selectors = Array.isArray(selector) ? selector : [selector];\n    const visitor = deleteNodesVisitor(selectors);\n    const result = visit(node, visitor);\n    if (expectedResult === null) {\n        expect(result).toBeNull();\n    } else {\n        expect(result).toEqual(expectedResult);\n        expect(result).not.toBe(expectedResult);\n        expect(Object.isFrozen(result)).toBe(true);\n    }\n};\n\nexport const expectDebugStringVisitor = (node: Node, expectedIndentedString: string) => {\n    const visitor = getDebugStringVisitor({ indent: true });\n    const result = visit(node, visitor);\n    expect(result).toBe(expectedIndentedString.trim());\n};\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/contextualValueNodes/AccountBumpValueNode.test.ts",
    "content": "import { accountBumpValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = accountBumpValueNode('metadata');\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[accountBumpValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `accountBumpValueNode [metadata]`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/contextualValueNodes/AccountValueNode.test.ts",
    "content": "import { accountValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = accountValueNode('mint');\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[accountValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `accountValueNode [mint]`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/contextualValueNodes/ArgumentValueNode.test.ts",
    "content": "import { argumentValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = argumentValueNode('space');\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[argumentValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `argumentValueNode [space]`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/contextualValueNodes/ConditionalValueNode.test.ts",
    "content": "import {\n    accountValueNode,\n    argumentValueNode,\n    conditionalValueNode,\n    enumValueNode,\n    programIdValueNode,\n} from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = conditionalValueNode({\n    condition: argumentValueNode('tokenStandard'),\n    ifFalse: programIdValueNode(),\n    ifTrue: accountValueNode('mint'),\n    value: enumValueNode('tokenStandard', 'ProgrammableNonFungible'),\n});\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 6);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[conditionalValueNode]', null);\n    expectDeleteNodesVisitor(node, '[enumValueNode]', conditionalValueNode({ ...node, value: undefined }));\n    expectDeleteNodesVisitor(node, '[accountValueNode]', conditionalValueNode({ ...node, ifTrue: undefined }));\n    expectDeleteNodesVisitor(node, '[programIdValueNode]', conditionalValueNode({ ...node, ifFalse: undefined }));\n    expectDeleteNodesVisitor(node, ['[accountValueNode]', '[programIdValueNode]'], null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nconditionalValueNode\n|   argumentValueNode [tokenStandard]\n|   enumValueNode [programmableNonFungible]\n|   |   definedTypeLinkNode [tokenStandard]\n|   accountValueNode [mint]\n|   programIdValueNode`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/contextualValueNodes/IdentityValueNode.test.ts",
    "content": "import { identityValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = identityValueNode();\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[identityValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `identityValueNode`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/contextualValueNodes/PayerValueNode.test.ts",
    "content": "import { payerValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = payerValueNode();\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[payerValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `payerValueNode`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/contextualValueNodes/PdaSeedValueNode.test.ts",
    "content": "import { accountValueNode, pdaSeedValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = pdaSeedValueNode('mint', accountValueNode('mint'));\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[pdaSeedValueNode]', null);\n    expectDeleteNodesVisitor(node, '[accountValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\npdaSeedValueNode [mint]\n|   accountValueNode [mint]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/contextualValueNodes/PdaValueNode.test.ts",
    "content": "import {\n    accountValueNode,\n    constantPdaSeedNode,\n    pdaLinkNode,\n    pdaNode,\n    pdaSeedValueNode,\n    pdaValueNode,\n    publicKeyTypeNode,\n    publicKeyValueNode,\n    variablePdaSeedNode,\n} from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = pdaValueNode(pdaLinkNode('associatedToken'), [\n    pdaSeedValueNode('mint', accountValueNode('mint')),\n    pdaSeedValueNode('owner', publicKeyValueNode('8sphVBHQxufE4Jc1HMuWwWdKgoDjncQyPHwxYhfATRtF')),\n]);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 6);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('identityVisitor with inlined PdaNode', () => {\n    const inlinedPdaNode = pdaNode({\n        name: 'associatedToken',\n        seeds: [\n            variablePdaSeedNode('mint', publicKeyTypeNode()),\n            constantPdaSeedNode(\n                publicKeyTypeNode(),\n                publicKeyValueNode('ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'),\n            ),\n            variablePdaSeedNode('owner', publicKeyTypeNode()),\n        ],\n    });\n    const inlinedPdaValueNode = pdaValueNode(inlinedPdaNode, [\n        pdaSeedValueNode('mint', accountValueNode('mint')),\n        pdaSeedValueNode('owner', publicKeyValueNode('8sphVBHQxufE4Jc1HMuWwWdKgoDjncQyPHwxYhfATRtF')),\n    ]);\n    expectIdentityVisitor(inlinedPdaValueNode);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[pdaValueNode]', null);\n    expectDeleteNodesVisitor(node, '[pdaLinkNode]', null);\n    expectDeleteNodesVisitor(node, '[pdaSeedValueNode]', { ...node, seeds: [] });\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\npdaValueNode\n|   pdaLinkNode [associatedToken]\n|   pdaSeedValueNode [mint]\n|   |   accountValueNode [mint]\n|   pdaSeedValueNode [owner]\n|   |   publicKeyValueNode [8sphVBHQxufE4Jc1HMuWwWdKgoDjncQyPHwxYhfATRtF]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/contextualValueNodes/ProgramIdValueNode.test.ts",
    "content": "import { programIdValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = programIdValueNode();\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[programIdValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `programIdValueNode`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/contextualValueNodes/ResolverValueNode.test.ts",
    "content": "import { accountValueNode, argumentValueNode, resolverValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = resolverValueNode('myCustomResolver', {\n    dependsOn: [accountValueNode('mint'), argumentValueNode('tokenStandard')],\n});\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 3);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[resolverValueNode]', null);\n    expectDeleteNodesVisitor(node, ['[accountValueNode]', '[argumentValueNode]'], { ...node, dependsOn: undefined });\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nresolverValueNode [myCustomResolver]\n|   accountValueNode [mint]\n|   argumentValueNode [tokenStandard]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/discriminatorNodes/ConstantDiscriminatorNode.test.ts",
    "content": "import { constantDiscriminatorNode, constantValueNodeFromBytes } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = constantDiscriminatorNode(constantValueNodeFromBytes('base16', '01020304'), 42);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 4);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[constantDiscriminatorNode]', null);\n    expectDeleteNodesVisitor(node, '[constantValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nconstantDiscriminatorNode [offset:42]\n|   constantValueNode\n|   |   bytesTypeNode\n|   |   bytesValueNode [base16.01020304]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/discriminatorNodes/FieldDiscriminatorNode.test.ts",
    "content": "import { fieldDiscriminatorNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = fieldDiscriminatorNode('discriminator', 42);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[fieldDiscriminatorNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `fieldDiscriminatorNode [discriminator.offset:42]`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/discriminatorNodes/SizeDiscriminatorNode.test.ts",
    "content": "import { sizeDiscriminatorNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = sizeDiscriminatorNode(42);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[sizeDiscriminatorNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `sizeDiscriminatorNode [42]`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/linkNodes/AccountLinkNode.test.ts",
    "content": "import { accountLinkNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = accountLinkNode('token', 'splToken');\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[accountLinkNode]', null);\n    expectDeleteNodesVisitor(node, '[programLinkNode]', accountLinkNode('token'));\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\naccountLinkNode [token]\n|   programLinkNode [splToken]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/linkNodes/DefinedTypeLinkNode.test.ts",
    "content": "import { definedTypeLinkNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = definedTypeLinkNode('tokenState', 'splToken');\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[definedTypeLinkNode]', null);\n    expectDeleteNodesVisitor(node, '[programLinkNode]', definedTypeLinkNode('tokenState'));\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\ndefinedTypeLinkNode [tokenState]\n|   programLinkNode [splToken]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/linkNodes/InstructionAccountLinkNode.test.ts",
    "content": "import { instructionAccountLinkNode, instructionLinkNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = instructionAccountLinkNode('mint', instructionLinkNode('transferTokens', 'splToken'));\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 3);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[instructionAccountLinkNode]', null);\n    expectDeleteNodesVisitor(node, '[instructionLinkNode]', instructionAccountLinkNode('mint'));\n    expectDeleteNodesVisitor(node, '[programLinkNode]', instructionAccountLinkNode('mint', 'transferTokens'));\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\ninstructionAccountLinkNode [mint]\n|   instructionLinkNode [transferTokens]\n|   |   programLinkNode [splToken]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/linkNodes/InstructionArgumentLinkNode.test.ts",
    "content": "import { instructionArgumentLinkNode, instructionLinkNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = instructionArgumentLinkNode('amount', instructionLinkNode('transferTokens', 'splToken'));\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 3);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[instructionArgumentLinkNode]', null);\n    expectDeleteNodesVisitor(node, '[instructionLinkNode]', instructionArgumentLinkNode('amount'));\n    expectDeleteNodesVisitor(node, '[programLinkNode]', instructionArgumentLinkNode('amount', 'transferTokens'));\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\ninstructionArgumentLinkNode [amount]\n|   instructionLinkNode [transferTokens]\n|   |   programLinkNode [splToken]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/linkNodes/InstructionLinkNode.test.ts",
    "content": "import { instructionLinkNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = instructionLinkNode('transferTokens', 'splToken');\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[instructionLinkNode]', null);\n    expectDeleteNodesVisitor(node, '[programLinkNode]', instructionLinkNode('transferTokens'));\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\ninstructionLinkNode [transferTokens]\n|   programLinkNode [splToken]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/linkNodes/PdaLinkNode.test.ts",
    "content": "import { pdaLinkNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = pdaLinkNode('associatedToken', 'splToken');\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[pdaLinkNode]', null);\n    expectDeleteNodesVisitor(node, '[programLinkNode]', pdaLinkNode('associatedToken'));\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\npdaLinkNode [associatedToken]\n|   programLinkNode [splToken]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/linkNodes/ProgramLinkNode.test.ts",
    "content": "import { programLinkNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = programLinkNode('mplCandyGuard');\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[programLinkNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `programLinkNode [mplCandyGuard]`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/pdaSeedNodes/ConstantPdaSeedNode.test.ts",
    "content": "import { constantPdaSeedNode, numberTypeNode, numberValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = constantPdaSeedNode(numberTypeNode('u8'), numberValueNode(42));\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 3);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[constantPdaSeedNode]', null);\n    expectDeleteNodesVisitor(node, '[numberTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[numberValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nconstantPdaSeedNode\n|   numberTypeNode [u8]\n|   numberValueNode [42]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/pdaSeedNodes/VariablePdaSeedNode.test.ts",
    "content": "import { publicKeyTypeNode, variablePdaSeedNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = variablePdaSeedNode('mint', publicKeyTypeNode());\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[variablePdaSeedNode]', null);\n    expectDeleteNodesVisitor(node, '[publicKeyTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nvariablePdaSeedNode [mint]\n|   publicKeyTypeNode`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/sizeNodes/FixedSizeNode.test.ts",
    "content": "import { fixedCountNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = fixedCountNode(42);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[fixedCountNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `fixedCountNode [42]`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/sizeNodes/PrefixedSizeNode.test.ts",
    "content": "import { numberTypeNode, prefixedCountNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = prefixedCountNode(numberTypeNode('u64'));\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[prefixedCountNode]', null);\n    expectDeleteNodesVisitor(node, '[numberTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nprefixedCountNode\n|   numberTypeNode [u64]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/sizeNodes/RemainderSizeNode.test.ts",
    "content": "import { remainderCountNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = remainderCountNode();\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[remainderCountNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `remainderCountNode`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/AmountTypeNode.test.ts",
    "content": "import { amountTypeNode, numberTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = amountTypeNode(numberTypeNode('u64'), 9, 'SOL');\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[amountTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[numberTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\namountTypeNode [9.SOL]\n|   numberTypeNode [u64]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/ArrayTypeNode.test.ts",
    "content": "import { arrayTypeNode, numberTypeNode, prefixedCountNode, publicKeyTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = arrayTypeNode(publicKeyTypeNode(), prefixedCountNode(numberTypeNode('u64')));\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 4);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[arrayTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[publicKeyTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[prefixedCountNode]', null);\n    expectDeleteNodesVisitor(node, '[numberTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\narrayTypeNode\n|   prefixedCountNode\n|   |   numberTypeNode [u64]\n|   publicKeyTypeNode`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/BooleanTypeNode.test.ts",
    "content": "import { booleanTypeNode, numberTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = booleanTypeNode(numberTypeNode('u32'));\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[booleanTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[numberTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nbooleanTypeNode\n|   numberTypeNode [u32]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/BytesTypeNode.test.ts",
    "content": "import { bytesTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = bytesTypeNode();\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[bytesTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `bytesTypeNode`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/DateTimeTypeNode.test.ts",
    "content": "import { dateTimeTypeNode, numberTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = dateTimeTypeNode(numberTypeNode('u64'));\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[dateTimeTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[numberTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\ndateTimeTypeNode\n|   numberTypeNode [u64]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/EnumEmptyVariantTypeNode.test.ts",
    "content": "import { enumEmptyVariantTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = enumEmptyVariantTypeNode('initialized');\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[enumEmptyVariantTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `enumEmptyVariantTypeNode [initialized]`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/EnumStructVariantTypeNode.test.ts",
    "content": "import {\n    enumEmptyVariantTypeNode,\n    enumStructVariantTypeNode,\n    numberTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n} from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = enumStructVariantTypeNode(\n    'mouseClick',\n    structTypeNode([\n        structFieldTypeNode({ name: 'x', type: numberTypeNode('u32') }),\n        structFieldTypeNode({ name: 'y', type: numberTypeNode('u32') }),\n    ]),\n);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 6);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[enumStructVariantTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[structTypeNode]', enumEmptyVariantTypeNode('mouseClick'));\n    expectDeleteNodesVisitor(node, '[structFieldTypeNode]', enumEmptyVariantTypeNode('mouseClick'));\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nenumStructVariantTypeNode [mouseClick]\n|   structTypeNode\n|   |   structFieldTypeNode [x]\n|   |   |   numberTypeNode [u32]\n|   |   structFieldTypeNode [y]\n|   |   |   numberTypeNode [u32]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/EnumTupleVariantTypeNode.test.ts",
    "content": "import { enumEmptyVariantTypeNode, enumTupleVariantTypeNode, numberTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = enumTupleVariantTypeNode('coordinates', tupleTypeNode([numberTypeNode('u32'), numberTypeNode('u32')]));\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 4);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[enumTupleVariantTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[tupleTypeNode]', enumEmptyVariantTypeNode('coordinates'));\n    expectDeleteNodesVisitor(node, '[numberTypeNode]', enumEmptyVariantTypeNode('coordinates'));\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nenumTupleVariantTypeNode [coordinates]\n|   tupleTypeNode\n|   |   numberTypeNode [u32]\n|   |   numberTypeNode [u32]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/EnumTypeNode.test.ts",
    "content": "import {\n    enumEmptyVariantTypeNode,\n    enumStructVariantTypeNode,\n    enumTupleVariantTypeNode,\n    enumTypeNode,\n    fixedSizeTypeNode,\n    numberTypeNode,\n    stringTypeNode,\n    structFieldTypeNode,\n    structTypeNode,\n    tupleTypeNode,\n} from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = enumTypeNode(\n    [\n        enumEmptyVariantTypeNode('quit'),\n        enumTupleVariantTypeNode('write', tupleTypeNode([fixedSizeTypeNode(stringTypeNode('utf8'), 32)])),\n        enumStructVariantTypeNode(\n            'move',\n            structTypeNode([\n                structFieldTypeNode({ name: 'x', type: numberTypeNode('u32') }),\n                structFieldTypeNode({ name: 'y', type: numberTypeNode('u32') }),\n            ]),\n        ),\n    ],\n    { size: numberTypeNode('u64') },\n);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 13);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[enumTypeNode]', null);\n    expectDeleteNodesVisitor(\n        node,\n        ['[enumEmptyVariantTypeNode]', '[enumTupleVariantTypeNode]', '[enumStructVariantTypeNode]'],\n        { ...node, variants: [] },\n    );\n    expectDeleteNodesVisitor(node, ['[tupleTypeNode]', '[structFieldTypeNode]'], {\n        ...node,\n        variants: [\n            enumEmptyVariantTypeNode('quit'),\n            enumEmptyVariantTypeNode('write'),\n            enumEmptyVariantTypeNode('move'),\n        ],\n    });\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nenumTypeNode\n|   numberTypeNode [u64]\n|   enumEmptyVariantTypeNode [quit]\n|   enumTupleVariantTypeNode [write]\n|   |   tupleTypeNode\n|   |   |   fixedSizeTypeNode [32]\n|   |   |   |   stringTypeNode [utf8]\n|   enumStructVariantTypeNode [move]\n|   |   structTypeNode\n|   |   |   structFieldTypeNode [x]\n|   |   |   |   numberTypeNode [u32]\n|   |   |   structFieldTypeNode [y]\n|   |   |   |   numberTypeNode [u32]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/FixedSizeTypeNode.test.ts",
    "content": "import { fixedSizeTypeNode, stringTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = fixedSizeTypeNode(stringTypeNode('utf8'), 42);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[fixedSizeTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[stringTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nfixedSizeTypeNode [42]\n|   stringTypeNode [utf8]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/HiddenPrefixTypeNode.test.ts",
    "content": "import {\n    constantValueNodeFromBytes,\n    constantValueNodeFromString,\n    hiddenPrefixTypeNode,\n    numberTypeNode,\n} from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = hiddenPrefixTypeNode(numberTypeNode('u32'), [\n    constantValueNodeFromString('utf8', 'hello world'),\n    constantValueNodeFromBytes('base16', 'ffff'),\n]);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 8);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[hiddenPrefixTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[numberTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[constantValueNode]', numberTypeNode('u32'));\n    expectDeleteNodesVisitor(\n        node,\n        '[stringTypeNode]',\n        hiddenPrefixTypeNode(numberTypeNode('u32'), [constantValueNodeFromBytes('base16', 'ffff')]),\n    );\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nhiddenPrefixTypeNode\n|   constantValueNode\n|   |   stringTypeNode [utf8]\n|   |   stringValueNode [hello world]\n|   constantValueNode\n|   |   bytesTypeNode\n|   |   bytesValueNode [base16.ffff]\n|   numberTypeNode [u32]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/HiddenSuffixTypeNode.test.ts",
    "content": "import {\n    constantValueNodeFromBytes,\n    constantValueNodeFromString,\n    hiddenSuffixTypeNode,\n    numberTypeNode,\n} from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = hiddenSuffixTypeNode(numberTypeNode('u32'), [\n    constantValueNodeFromString('utf8', 'hello world'),\n    constantValueNodeFromBytes('base16', 'ffff'),\n]);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 8);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[hiddenSuffixTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[numberTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[constantValueNode]', numberTypeNode('u32'));\n    expectDeleteNodesVisitor(\n        node,\n        '[stringTypeNode]',\n        hiddenSuffixTypeNode(numberTypeNode('u32'), [constantValueNodeFromBytes('base16', 'ffff')]),\n    );\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nhiddenSuffixTypeNode\n|   numberTypeNode [u32]\n|   constantValueNode\n|   |   stringTypeNode [utf8]\n|   |   stringValueNode [hello world]\n|   constantValueNode\n|   |   bytesTypeNode\n|   |   bytesValueNode [base16.ffff]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/MapTypeNode.test.ts",
    "content": "import {\n    fixedSizeTypeNode,\n    mapTypeNode,\n    numberTypeNode,\n    prefixedCountNode,\n    publicKeyTypeNode,\n    stringTypeNode,\n} from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = mapTypeNode(\n    fixedSizeTypeNode(stringTypeNode('utf8'), 32),\n    publicKeyTypeNode(),\n    prefixedCountNode(numberTypeNode('u8')),\n);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 6);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[mapTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[stringTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[publicKeyTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[prefixedCountNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nmapTypeNode\n|   prefixedCountNode\n|   |   numberTypeNode [u8]\n|   fixedSizeTypeNode [32]\n|   |   stringTypeNode [utf8]\n|   publicKeyTypeNode`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/NumberTypeNode.test.ts",
    "content": "import { numberTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = numberTypeNode('f64');\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[numberTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `numberTypeNode [f64]`);\n    expectDebugStringVisitor(numberTypeNode('f64', 'be'), `numberTypeNode [f64.bigEndian]`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/OptionTypeNode.test.ts",
    "content": "import { numberTypeNode, optionTypeNode, publicKeyTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = optionTypeNode(publicKeyTypeNode(), {\n    fixed: true,\n    prefix: numberTypeNode('u64'),\n});\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 3);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[optionTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[publicKeyTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[numberTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\noptionTypeNode [fixed]\n|   numberTypeNode [u64]\n|   publicKeyTypeNode`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/PostOffsetTypeNode.test.ts",
    "content": "import { postOffsetTypeNode, stringTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = postOffsetTypeNode(stringTypeNode('utf8'), 42);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[stringTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[postOffsetTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\npostOffsetTypeNode [42.relative]\n|   stringTypeNode [utf8]`,\n    );\n\n    expectDebugStringVisitor(\n        postOffsetTypeNode(stringTypeNode('utf8'), 42, 'absolute'),\n        `\npostOffsetTypeNode [42.absolute]\n|   stringTypeNode [utf8]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/PreOffsetTypeNode.test.ts",
    "content": "import { preOffsetTypeNode, stringTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = preOffsetTypeNode(stringTypeNode('utf8'), 42);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[stringTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[preOffsetTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\npreOffsetTypeNode [42.relative]\n|   stringTypeNode [utf8]`,\n    );\n\n    expectDebugStringVisitor(\n        preOffsetTypeNode(stringTypeNode('utf8'), 42, 'absolute'),\n        `\npreOffsetTypeNode [42.absolute]\n|   stringTypeNode [utf8]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/PublicKeyTypeNode.test.ts",
    "content": "import { publicKeyTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = publicKeyTypeNode();\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[publicKeyTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `publicKeyTypeNode`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/RemainderOptionTypeNode.test.ts",
    "content": "import { publicKeyTypeNode, remainderOptionTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = remainderOptionTypeNode(publicKeyTypeNode());\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[remainderOptionTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[publicKeyTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nremainderOptionTypeNode\n|   publicKeyTypeNode`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/SentinelTypeNode.test.ts",
    "content": "import { constantValueNodeFromBytes, sentinelTypeNode, stringTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = sentinelTypeNode(stringTypeNode('utf8'), constantValueNodeFromBytes('base16', 'ffff'));\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 5);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[sentinelTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[stringTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[constantValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nsentinelTypeNode\n|   constantValueNode\n|   |   bytesTypeNode\n|   |   bytesValueNode [base16.ffff]\n|   stringTypeNode [utf8]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/SetTypeNode.test.ts",
    "content": "import { publicKeyTypeNode, remainderCountNode, setTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = setTypeNode(publicKeyTypeNode(), remainderCountNode());\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 3);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[setTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[publicKeyTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[remainderCountNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nsetTypeNode\n|   remainderCountNode\n|   publicKeyTypeNode`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/SizePrefixTypeNode.test.ts",
    "content": "import { numberTypeNode, sizePrefixTypeNode, stringTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = sizePrefixTypeNode(stringTypeNode('utf8'), numberTypeNode('u32'));\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 3);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[sizePrefixTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[stringTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[numberTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nsizePrefixTypeNode\n|   numberTypeNode [u32]\n|   stringTypeNode [utf8]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/SolAmountTypeNode.test.ts",
    "content": "import { numberTypeNode, solAmountTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = solAmountTypeNode(numberTypeNode('u64'));\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[solAmountTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[numberTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nsolAmountTypeNode\n|   numberTypeNode [u64]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/StringTypeNode.test.ts",
    "content": "import { stringTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = stringTypeNode('utf8');\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[stringTypeNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `stringTypeNode [utf8]`);\n    expectDebugStringVisitor(stringTypeNode('base58'), `stringTypeNode [base58]`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/StructFieldTypeNode.test.ts",
    "content": "import { publicKeyTypeNode, publicKeyValueNode, structFieldTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = structFieldTypeNode({\n    defaultValue: publicKeyValueNode('CzC5HidG6kR5J4haV7pKZmenYYVS7rw3SoBkqeStxZ9U'),\n    name: 'owner',\n    type: publicKeyTypeNode(),\n});\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 3);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[structFieldTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[publicKeyTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[publicKeyValueNode]', structFieldTypeNode({ ...node, defaultValue: undefined }));\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nstructFieldTypeNode [owner]\n|   publicKeyTypeNode\n|   publicKeyValueNode [CzC5HidG6kR5J4haV7pKZmenYYVS7rw3SoBkqeStxZ9U]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/StructTypeNode.test.ts",
    "content": "import { numberTypeNode, publicKeyTypeNode, structFieldTypeNode, structTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = structTypeNode([\n    structFieldTypeNode({ name: 'owner', type: publicKeyTypeNode() }),\n    structFieldTypeNode({ name: 'amount', type: numberTypeNode('u64') }),\n]);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 5);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[structTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[structFieldTypeNode]', { ...node, fields: [] });\n    expectDeleteNodesVisitor(node, ['[publicKeyTypeNode]', '[numberTypeNode]'], { ...node, fields: [] });\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nstructTypeNode\n|   structFieldTypeNode [owner]\n|   |   publicKeyTypeNode\n|   structFieldTypeNode [amount]\n|   |   numberTypeNode [u64]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/TupleTypeNode.test.ts",
    "content": "import { numberTypeNode, publicKeyTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = tupleTypeNode([publicKeyTypeNode(), numberTypeNode('u64')]);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 3);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[tupleTypeNode]', null);\n    expectDeleteNodesVisitor(node, ['[publicKeyTypeNode]', '[numberTypeNode]'], { ...node, items: [] });\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\ntupleTypeNode\n|   publicKeyTypeNode\n|   numberTypeNode [u64]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/typeNodes/ZeroableOptionTypeNode.test.ts",
    "content": "import { constantValueNodeFromBytes, publicKeyTypeNode, zeroableOptionTypeNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = zeroableOptionTypeNode(publicKeyTypeNode(), constantValueNodeFromBytes('base16', 'ff'.repeat(32)));\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 5);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[zeroableOptionTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[publicKeyTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[constantValueNode]', zeroableOptionTypeNode(publicKeyTypeNode()));\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nzeroableOptionTypeNode\n|   publicKeyTypeNode\n|   constantValueNode\n|   |   bytesTypeNode\n|   |   bytesValueNode [base16.ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff]`,\n    );\n\n    expectDebugStringVisitor(\n        zeroableOptionTypeNode(publicKeyTypeNode()),\n        `\nzeroableOptionTypeNode\n|   publicKeyTypeNode`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/valueNodes/ArrayValueNode.test.ts",
    "content": "import { arrayValueNode, publicKeyValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = arrayValueNode([\n    publicKeyValueNode('8jeCDm1zPb68kfzv5MaUo9BK7beGzFrGHA9hhMGL1ay1'),\n    publicKeyValueNode('8PEBfDem8yb5aUkrhKgNKMraB9gR8WtJDprEW3QwLFz'),\n    publicKeyValueNode('97hChLjFswwqBrE82Q4wqctpFfB2jZ91svxCv68iCrqG'),\n]);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 4);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[arrayValueNode]', null);\n    expectDeleteNodesVisitor(node, '[publicKeyValueNode]', { ...node, items: [] });\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\narrayValueNode\n|   publicKeyValueNode [8jeCDm1zPb68kfzv5MaUo9BK7beGzFrGHA9hhMGL1ay1]\n|   publicKeyValueNode [8PEBfDem8yb5aUkrhKgNKMraB9gR8WtJDprEW3QwLFz]\n|   publicKeyValueNode [97hChLjFswwqBrE82Q4wqctpFfB2jZ91svxCv68iCrqG]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/valueNodes/BooleanValueNode.test.ts",
    "content": "import { booleanValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = booleanValueNode(true);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[booleanValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `booleanValueNode [true]`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/valueNodes/BytesValueNode.test.ts",
    "content": "import { bytesValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = bytesValueNode('base64', 'SGVsbG8gV29ybGQ=');\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[bytesValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `bytesValueNode [base64.SGVsbG8gV29ybGQ=]`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/valueNodes/ConstantValueNode.test.ts",
    "content": "import { constantValueNode, numberTypeNode, numberValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = constantValueNode(numberTypeNode('u8'), numberValueNode(42));\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 3);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[constantValueNode]', null);\n    expectDeleteNodesVisitor(node, '[numberTypeNode]', null);\n    expectDeleteNodesVisitor(node, '[numberValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nconstantValueNode\n|   numberTypeNode [u8]\n|   numberValueNode [42]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/valueNodes/EnumValueNode.test.ts",
    "content": "import {\n    definedTypeLinkNode,\n    enumValueNode,\n    numberValueNode,\n    stringValueNode,\n    structFieldValueNode,\n    structValueNode,\n} from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = enumValueNode(\n    definedTypeLinkNode('entity'),\n    'person',\n    structValueNode([\n        structFieldValueNode('name', stringValueNode('Alice')),\n        structFieldValueNode('age', numberValueNode(42)),\n    ]),\n);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 7);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[enumValueNode]', null);\n    expectDeleteNodesVisitor(node, '[definedTypeLinkNode]', null);\n    expectDeleteNodesVisitor(node, '[structValueNode]', enumValueNode(node.enum, node.variant));\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nenumValueNode [person]\n|   definedTypeLinkNode [entity]\n|   structValueNode\n|   |   structFieldValueNode [name]\n|   |   |   stringValueNode [Alice]\n|   |   structFieldValueNode [age]\n|   |   |   numberValueNode [42]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/valueNodes/MapEntryValueNode.test.ts",
    "content": "import { mapEntryValueNode, publicKeyValueNode, stringValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = mapEntryValueNode(\n    stringValueNode('Alice'),\n    publicKeyValueNode('GaxDPeNfXXgtwJXwHiDYVSDiM53RchFSRFTn2z2Jztuw'),\n);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 3);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[mapEntryValueNode]', null);\n    expectDeleteNodesVisitor(node, '[stringValueNode]', null);\n    expectDeleteNodesVisitor(node, '[publicKeyValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nmapEntryValueNode\n|   stringValueNode [Alice]\n|   publicKeyValueNode [GaxDPeNfXXgtwJXwHiDYVSDiM53RchFSRFTn2z2Jztuw]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/valueNodes/MapValueNode.test.ts",
    "content": "import { mapEntryValueNode, mapValueNode, numberValueNode, stringValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = mapValueNode([\n    mapEntryValueNode(stringValueNode('Alice'), numberValueNode(42)),\n    mapEntryValueNode(stringValueNode('Bob'), numberValueNode(37)),\n    mapEntryValueNode(stringValueNode('Carla'), numberValueNode(29)),\n]);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 10);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[mapValueNode]', null);\n    expectDeleteNodesVisitor(node, '[mapEntryValueNode]', { ...node, entries: [] });\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nmapValueNode\n|   mapEntryValueNode\n|   |   stringValueNode [Alice]\n|   |   numberValueNode [42]\n|   mapEntryValueNode\n|   |   stringValueNode [Bob]\n|   |   numberValueNode [37]\n|   mapEntryValueNode\n|   |   stringValueNode [Carla]\n|   |   numberValueNode [29]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/valueNodes/NoneValueNode.test.ts",
    "content": "import { noneValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = noneValueNode();\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[noneValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `noneValueNode`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/valueNodes/NumberValueNode.test.ts",
    "content": "import { numberValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = numberValueNode(42);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[numberValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `numberValueNode [42]`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/valueNodes/PublicKeyValueNode.test.ts",
    "content": "import { publicKeyValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = publicKeyValueNode('HqJgWgvkn5wMGU8LpzkRw8389N5Suvu2nZcmpya9JyJB');\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[publicKeyValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `publicKeyValueNode [HqJgWgvkn5wMGU8LpzkRw8389N5Suvu2nZcmpya9JyJB]`);\n    expectDebugStringVisitor(\n        publicKeyValueNode('HqJgWgvkn5wMGU8LpzkRw8389N5Suvu2nZcmpya9JyJB', 'myIdentifier'),\n        `publicKeyValueNode [myIdentifier.HqJgWgvkn5wMGU8LpzkRw8389N5Suvu2nZcmpya9JyJB]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/valueNodes/SetValueNode.test.ts",
    "content": "import { publicKeyValueNode, setValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = setValueNode([\n    publicKeyValueNode('8jeCDm1zPb68kfzv5MaUo9BK7beGzFrGHA9hhMGL1ay1'),\n    publicKeyValueNode('8PEBfDem8yb5aUkrhKgNKMraB9gR8WtJDprEW3QwLFz'),\n    publicKeyValueNode('97hChLjFswwqBrE82Q4wqctpFfB2jZ91svxCv68iCrqG'),\n]);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 4);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[setValueNode]', null);\n    expectDeleteNodesVisitor(node, '[publicKeyValueNode]', { ...node, items: [] });\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nsetValueNode\n|   publicKeyValueNode [8jeCDm1zPb68kfzv5MaUo9BK7beGzFrGHA9hhMGL1ay1]\n|   publicKeyValueNode [8PEBfDem8yb5aUkrhKgNKMraB9gR8WtJDprEW3QwLFz]\n|   publicKeyValueNode [97hChLjFswwqBrE82Q4wqctpFfB2jZ91svxCv68iCrqG]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/valueNodes/SomeValueNode.test.ts",
    "content": "import { publicKeyValueNode, someValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = someValueNode(publicKeyValueNode('73na6yX22Xw3w7q3z39MAwtZyQehEMnUQceszCt94GJ3'));\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[someValueNode]', null);\n    expectDeleteNodesVisitor(node, '[publicKeyValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nsomeValueNode\n|   publicKeyValueNode [73na6yX22Xw3w7q3z39MAwtZyQehEMnUQceszCt94GJ3]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/valueNodes/StringValueNode.test.ts",
    "content": "import { stringValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = stringValueNode('Hello world!');\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 1);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[stringValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(node, `stringValueNode [Hello world!]`);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/valueNodes/StructFieldValueNode.test.ts",
    "content": "import { stringValueNode, structFieldValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = structFieldValueNode('name', stringValueNode('Alice'));\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 2);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[structFieldValueNode]', null);\n    expectDeleteNodesVisitor(node, '[stringValueNode]', null);\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nstructFieldValueNode [name]\n|   stringValueNode [Alice]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/valueNodes/StructValueNode.test.ts",
    "content": "import { numberValueNode, stringValueNode, structFieldValueNode, structValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = structValueNode([\n    structFieldValueNode('name', stringValueNode('Alice')),\n    structFieldValueNode('age', numberValueNode(42)),\n]);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 5);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[structValueNode]', null);\n    expectDeleteNodesVisitor(node, '[structFieldValueNode]', { ...node, fields: [] });\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\nstructValueNode\n|   structFieldValueNode [name]\n|   |   stringValueNode [Alice]\n|   structFieldValueNode [age]\n|   |   numberValueNode [42]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nodes/valueNodes/TupleValueNode.test.ts",
    "content": "import { numberValueNode, publicKeyValueNode, stringValueNode, tupleValueNode } from '@codama/nodes';\nimport { test } from 'vitest';\n\nimport {\n    expectDebugStringVisitor,\n    expectDeleteNodesVisitor,\n    expectIdentityVisitor,\n    expectMergeVisitorCount,\n} from '../_setup';\n\nconst node = tupleValueNode([\n    stringValueNode('Hello'),\n    numberValueNode(42),\n    publicKeyValueNode('9sL9D2kshFgZSHz98pUQxGphwVUbCNBGqhYGaWWNJags'),\n]);\n\ntest('mergeVisitor', () => {\n    expectMergeVisitorCount(node, 4);\n});\n\ntest('identityVisitor', () => {\n    expectIdentityVisitor(node);\n});\n\ntest('deleteNodesVisitor', () => {\n    expectDeleteNodesVisitor(node, '[tupleValueNode]', null);\n    expectDeleteNodesVisitor(node, ['[stringValueNode]', '[numberValueNode]', '[publicKeyValueNode]'], {\n        ...node,\n        items: [],\n    });\n});\n\ntest('debugStringVisitor', () => {\n    expectDebugStringVisitor(\n        node,\n        `\ntupleValueNode\n|   stringValueNode [Hello]\n|   numberValueNode [42]\n|   publicKeyValueNode [9sL9D2kshFgZSHz98pUQxGphwVUbCNBGqhYGaWWNJags]`,\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/nonNullableIdentityVisitor.test.ts",
    "content": "import { assertIsNode, Node, numberTypeNode, publicKeyTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { nonNullableIdentityVisitor, visit } from '../src';\n\ntest('it visits all nodes and returns different instances of the same nodes without returning null', () => {\n    // Given the following 3-nodes tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n\n    // When we visit it using the non-nullable identity visitor.\n    const result = visit(node, nonNullableIdentityVisitor());\n\n    // Then the typed result isn't null.\n    result satisfies Node;\n\n    // And we get the same tree back.\n    expect(result).toEqual(node);\n\n    // But the nodes are different instances.\n    expect(result).not.toBe(node);\n    assertIsNode(result, 'tupleTypeNode');\n    expect(result.items[0]).not.toBe(node.items[0]);\n    expect(result.items[1]).not.toBe(node.items[1]);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/recordLinkablesVisitor.test.ts",
    "content": "import { CODAMA_ERROR__LINKED_NODE_NOT_FOUND, CodamaError } from '@codama/errors';\nimport {\n    accountLinkNode,\n    AccountNode,\n    accountNode,\n    definedTypeLinkNode,\n    definedTypeNode,\n    instructionAccountLinkNode,\n    InstructionAccountNode,\n    instructionAccountNode,\n    instructionArgumentLinkNode,\n    instructionArgumentNode,\n    instructionLinkNode,\n    instructionNode,\n    isNode,\n    numberTypeNode,\n    pdaLinkNode,\n    pdaNode,\n    programLinkNode,\n    programNode,\n    rootNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport {\n    interceptFirstVisitVisitor,\n    interceptVisitor,\n    LinkableDictionary,\n    NodeStack,\n    recordLinkablesOnFirstVisitVisitor,\n    visit,\n    voidVisitor,\n} from '../src';\n\ntest('it records program nodes', () => {\n    // Given the following root node containing multiple program nodes.\n    const node = rootNode(programNode({ name: 'programA', publicKey: '1111' }), [\n        programNode({ name: 'programB', publicKey: '2222' }),\n    ]);\n\n    // And a recordLinkablesOnFirstVisitVisitor extending any visitor.\n    const linkables = new LinkableDictionary();\n    const visitor = recordLinkablesOnFirstVisitVisitor(voidVisitor(), linkables);\n\n    // When we visit the tree.\n    visit(node, visitor);\n\n    // Then we expect program paths to be recorded and retrievable.\n    expect(linkables.getPath([programLinkNode('programA')])).toEqual([node, node.program]);\n    expect(linkables.getPath([programLinkNode('programB')])).toEqual([node, node.additionalPrograms[0]]);\n});\n\ntest('it records account nodes', () => {\n    // Given the following program node containing multiple accounts nodes.\n    const node = programNode({\n        accounts: [accountNode({ name: 'accountA' }), accountNode({ name: 'accountB' })],\n        name: 'myProgram',\n        publicKey: '1111',\n    });\n\n    // And a recordLinkablesOnFirstVisitVisitor extending any visitor.\n    const linkables = new LinkableDictionary();\n    const visitor = recordLinkablesOnFirstVisitVisitor(voidVisitor(), linkables);\n\n    // When we visit the tree.\n    visit(node, visitor);\n\n    // Then we expect account paths to be recorded and retrievable.\n    expect(linkables.getPath([accountLinkNode('accountA', 'myProgram')])).toEqual([node, node.accounts[0]]);\n    expect(linkables.getPath([accountLinkNode('accountB', 'myProgram')])).toEqual([node, node.accounts[1]]);\n});\n\ntest('it records defined type nodes', () => {\n    // Given the following program node containing multiple defined type nodes.\n    const node = programNode({\n        definedTypes: [\n            definedTypeNode({ name: 'typeA', type: numberTypeNode('u32') }),\n            definedTypeNode({ name: 'typeB', type: numberTypeNode('u32') }),\n        ],\n        name: 'myProgram',\n        publicKey: '1111',\n    });\n\n    // And a recordLinkablesOnFirstVisitVisitor extending any visitor.\n    const linkables = new LinkableDictionary();\n    const visitor = recordLinkablesOnFirstVisitVisitor(voidVisitor(), linkables);\n\n    // When we visit the tree.\n    visit(node, visitor);\n\n    // Then we expect defined type paths to be recorded and retrievable.\n    expect(linkables.getPath([definedTypeLinkNode('typeA', 'myProgram')])).toEqual([node, node.definedTypes[0]]);\n    expect(linkables.getPath([definedTypeLinkNode('typeB', 'myProgram')])).toEqual([node, node.definedTypes[1]]);\n});\n\ntest('it records pda nodes', () => {\n    // Given the following program node containing multiple pda nodes.\n    const node = programNode({\n        name: 'myProgram',\n        pdas: [pdaNode({ name: 'pdaA', seeds: [] }), pdaNode({ name: 'pdaB', seeds: [] })],\n        publicKey: '1111',\n    });\n\n    // And a recordLinkablesOnFirstVisitVisitor extending any visitor.\n    const linkables = new LinkableDictionary();\n    const visitor = recordLinkablesOnFirstVisitVisitor(voidVisitor(), linkables);\n\n    // When we visit the tree.\n    visit(node, visitor);\n\n    // Then we expect pda paths to be recorded and retrievable.\n    expect(linkables.getPath([pdaLinkNode('pdaA', 'myProgram')])).toEqual([node, node.pdas[0]]);\n    expect(linkables.getPath([pdaLinkNode('pdaB', 'myProgram')])).toEqual([node, node.pdas[1]]);\n});\n\ntest('it records instruction nodes', () => {\n    // Given the following program node containing multiple instruction nodes.\n    const node = programNode({\n        instructions: [instructionNode({ name: 'instructionA' }), instructionNode({ name: 'instructionB' })],\n        name: 'myProgram',\n        publicKey: '1111',\n    });\n\n    // And a recordLinkablesOnFirstVisitVisitor extending any visitor.\n    const linkables = new LinkableDictionary();\n    const visitor = recordLinkablesOnFirstVisitVisitor(voidVisitor(), linkables);\n\n    // When we visit the tree.\n    visit(node, visitor);\n\n    // Then we expect instruction paths to be recorded and retrievable.\n    expect(linkables.getPath([instructionLinkNode('instructionA', 'myProgram')])).toEqual([node, node.instructions[0]]);\n    expect(linkables.getPath([instructionLinkNode('instructionB', 'myProgram')])).toEqual([node, node.instructions[1]]);\n});\n\ntest('it records instruction account nodes', () => {\n    // Given the following instruction node containing multiple accounts.\n    const instructionAccounts = [\n        instructionAccountNode({ isSigner: true, isWritable: false, name: 'accountA' }),\n        instructionAccountNode({ isSigner: false, isWritable: true, name: 'accountB' }),\n    ];\n    const node = programNode({\n        instructions: [instructionNode({ accounts: instructionAccounts, name: 'myInstruction' })],\n        name: 'myProgram',\n        publicKey: '1111',\n    });\n\n    // And a recordLinkablesOnFirstVisitVisitor extending any visitor.\n    const linkables = new LinkableDictionary();\n    const visitor = recordLinkablesOnFirstVisitVisitor(voidVisitor(), linkables);\n\n    // When we visit the tree.\n    visit(node, visitor);\n\n    // Then we expect instruction account paths to be recorded and retrievable.\n    const instruction = instructionLinkNode('myInstruction', 'myProgram');\n    expect(linkables.getPath([instructionAccountLinkNode('accountA', instruction)])).toEqual([\n        node,\n        node.instructions[0],\n        instructionAccounts[0],\n    ]);\n    expect(linkables.getPath([instructionAccountLinkNode('accountB', instruction)])).toEqual([\n        node,\n        node.instructions[0],\n        instructionAccounts[1],\n    ]);\n});\n\ntest('it records instruction argument nodes', () => {\n    // Given the following instruction node containing multiple arguments.\n    const instructionArguments = [\n        instructionArgumentNode({ name: 'argumentA', type: numberTypeNode('u32') }),\n        instructionArgumentNode({ name: 'argumentB', type: numberTypeNode('u32') }),\n    ];\n    const node = programNode({\n        instructions: [instructionNode({ arguments: instructionArguments, name: 'myInstruction' })],\n        name: 'myProgram',\n        publicKey: '1111',\n    });\n\n    // And a recordLinkablesOnFirstVisitVisitor extending any visitor.\n    const linkables = new LinkableDictionary();\n    const visitor = recordLinkablesOnFirstVisitVisitor(voidVisitor(), linkables);\n\n    // When we visit the tree.\n    visit(node, visitor);\n\n    // Then we expect instruction argument paths to be recorded and retrievable.\n    const instruction = instructionLinkNode('myInstruction', 'myProgram');\n    expect(linkables.getPath([instructionArgumentLinkNode('argumentA', instruction)])).toEqual([\n        node,\n        node.instructions[0],\n        instructionArguments[0],\n    ]);\n    expect(linkables.getPath([instructionArgumentLinkNode('argumentB', instruction)])).toEqual([\n        node,\n        node.instructions[0],\n        instructionArguments[1],\n    ]);\n});\n\ntest('it records all linkable before the first visit of the base visitor', () => {\n    // Given the following root node with two programs.\n    const node = rootNode(programNode({ name: 'programA', publicKey: '1111' }), [\n        programNode({ name: 'programB', publicKey: '2222' }),\n    ]);\n\n    // And a recordLinkablesOnFirstVisitVisitor extending a base visitor that\n    // stores the linkable programs available at every visit.\n    const linkables = new LinkableDictionary();\n    const events: string[] = [];\n    const baseVisitor = interceptFirstVisitVisitor(voidVisitor(), (node, next) => {\n        events.push(`programA:${linkables.has([programLinkNode('programA')])}`);\n        events.push(`programB:${linkables.has([programLinkNode('programB')])}`);\n        next(node);\n    });\n    const visitor = recordLinkablesOnFirstVisitVisitor(baseVisitor, linkables);\n\n    // When we visit the tree.\n    visit(node, visitor);\n\n    // Then we expect all linkable nodes to be recorded.\n    expect(events).toEqual(['programA:true', 'programB:true']);\n});\n\ntest('it keeps track of the current program when extending a visitor', () => {\n    // Given the following root node containing two program containing an account with the same name.\n    const programA = programNode({\n        accounts: [accountNode({ name: 'someAccount' })],\n        name: 'programA',\n        publicKey: '1111',\n    });\n    const programB = programNode({\n        accounts: [accountNode({ name: 'someAccount' })],\n        name: 'programB',\n        publicKey: '2222',\n    });\n    const node = rootNode(programA, [programB]);\n\n    // And a recordLinkablesOnFirstVisitVisitor extending a base visitor that checks\n    // the result of getting the linkable node with the same name for each program.\n    const linkables = new LinkableDictionary();\n    const stack = new NodeStack();\n    const dictionary: Record<string, AccountNode> = {};\n    const baseVisitor = interceptVisitor(voidVisitor(), (node, next) => {\n        stack.push(node);\n        if (isNode(node, 'programNode')) {\n            dictionary[node.name] = linkables.getOrThrow([...stack.getPath(), accountLinkNode('someAccount')]);\n        }\n        next(node);\n        stack.pop();\n    });\n    const visitor = recordLinkablesOnFirstVisitVisitor(baseVisitor, linkables);\n\n    // When we visit the tree.\n    visit(node, visitor);\n\n    // Then we expect each program to have its own account.\n    expect(dictionary.programA).toBe(programA.accounts[0]);\n    expect(dictionary.programB).toBe(programB.accounts[0]);\n});\n\ntest('it keeps track of the current instruction when extending a visitor', () => {\n    // Given the following program node containing two instructions each containing an account with the same name.\n    const node = programNode({\n        instructions: [\n            instructionNode({\n                accounts: [instructionAccountNode({ isSigner: true, isWritable: false, name: 'someAccount' })],\n                name: 'instructionA',\n            }),\n            instructionNode({\n                accounts: [instructionAccountNode({ isSigner: true, isWritable: false, name: 'someAccount' })],\n                name: 'instructionB',\n            }),\n        ],\n        name: 'myProgram',\n        publicKey: '1111',\n    });\n\n    // And a recordLinkablesOnFirstVisitVisitor extending a base visitor that checks\n    // the result of getting the linkable node with the same name for each instruction.\n    const linkables = new LinkableDictionary();\n    const stack = new NodeStack();\n    const dictionary: Record<string, InstructionAccountNode> = {};\n    const baseVisitor = interceptVisitor(voidVisitor(), (node, next) => {\n        stack.push(node);\n        if (isNode(node, 'instructionNode')) {\n            dictionary[node.name] = linkables.getOrThrow([\n                ...stack.getPath(),\n                instructionAccountLinkNode('someAccount'),\n            ]);\n        }\n        next(node);\n        stack.pop();\n    });\n    const visitor = recordLinkablesOnFirstVisitVisitor(baseVisitor, linkables);\n\n    // When we visit the tree.\n    visit(node, visitor);\n\n    // Then we expect each instruction to have its own account.\n    expect(dictionary.instructionA).toBe(node.instructions[0].accounts[0]);\n    expect(dictionary.instructionB).toBe(node.instructions[1].accounts[0]);\n});\n\ntest('it does not record linkable types that are not under a program node', () => {\n    // Given the following account node that is not under a program node.\n    const node = accountNode({ name: 'someAccount' });\n\n    // And a recordLinkablesOnFirstVisitVisitor extending a void visitor.\n    const linkables = new LinkableDictionary();\n    const visitor = recordLinkablesOnFirstVisitVisitor(voidVisitor(), linkables);\n\n    // When we visit the node.\n    visit(node, visitor);\n\n    // Then we expect the account node to not be recorded.\n    expect(linkables.has([accountLinkNode('someAccount')])).toBe(false);\n});\n\ntest('it can throw an exception when trying to retrieve a missing linked node', () => {\n    // Given the following program node with one account.\n    const node = programNode({\n        accounts: [accountNode({ name: 'myAccount' })],\n        name: 'myProgram',\n        publicKey: '1111',\n    });\n\n    // And a recorded LinkableDictionary.\n    const linkables = new LinkableDictionary();\n    const visitor = recordLinkablesOnFirstVisitVisitor(voidVisitor(), linkables);\n    visit(node, visitor);\n\n    // When we try to retrieve a missing account node.\n    const linkNode = accountLinkNode('missingAccount', 'myProgram');\n    const getMissingAccount = () => linkables.getOrThrow([node, linkNode]);\n\n    // Then we expect an exception to be thrown.\n    expect(getMissingAccount).toThrow(\n        new CodamaError(CODAMA_ERROR__LINKED_NODE_NOT_FOUND, {\n            kind: 'accountLinkNode',\n            linkNode,\n            name: 'missingAccount',\n            path: [node, linkNode],\n        }),\n    );\n});\n"
  },
  {
    "path": "packages/visitors-core/test/recordNodeStackVisitor.test.ts",
    "content": "import { definedTypeNode, numberTypeNode, publicKeyTypeNode, TupleTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { NodeStack, pipe, recordNodeStackVisitor, tapVisitor, visit, voidVisitor } from '../src';\n\ntest('it records the current node stack of a visit', () => {\n    // Given the following tree.\n    const node = definedTypeNode({\n        name: 'myType',\n        type: tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]),\n    });\n\n    // And a visitor that records the current node stack and stores the number stacks in an array.\n    const stack = new NodeStack();\n    const numberStacks: NodeStack[] = [];\n    const visitor = pipe(\n        voidVisitor(),\n        v => recordNodeStackVisitor(v, stack),\n        v => tapVisitor(v, 'numberTypeNode', () => numberStacks.push(stack.clone())),\n    );\n\n    // When we visit the tree.\n    visit(node, visitor);\n\n    // Then we expect the number stacks to have been recorded.\n    expect(numberStacks.length).toBe(1);\n    expect(numberStacks[0].getPath()).toEqual([node, node.type]);\n\n    // And the current node stack to be empty.\n    expect(stack.isEmpty()).toBe(true);\n});\n\ntest('it includes the current node when applied last', () => {\n    // Given the following tree.\n    const node = definedTypeNode({\n        name: 'myType',\n        type: tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]),\n    });\n\n    // And a visitor that records the current node stack as the last visitor modifier.\n    const stack = new NodeStack();\n    const numberStacks: NodeStack[] = [];\n    const visitor = pipe(\n        voidVisitor(),\n        v => tapVisitor(v, 'numberTypeNode', () => numberStacks.push(stack.clone())),\n        v => recordNodeStackVisitor(v, stack),\n    );\n\n    // When we visit the tree.\n    visit(node, visitor);\n\n    // Then we expect the number stacks to have been recorded\n    // such that the number node themselves are included in the stack.\n    expect(numberStacks.length).toBe(1);\n    expect(numberStacks[0].getPath()).toEqual([node, node.type, (node.type as TupleTypeNode).items[0]]);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/removeDocsVisitor.test.ts",
    "content": "import { numberTypeNode, publicKeyTypeNode, structFieldTypeNode, structTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { removeDocsVisitor, visit } from '../src';\n\ntest('it empties the docs array of any node that contains docs', () => {\n    // Given the following struct node with docs.\n    const node = structTypeNode([\n        structFieldTypeNode({\n            docs: ['The owner of the account.'],\n            name: 'owner',\n            type: publicKeyTypeNode(),\n        }),\n        structFieldTypeNode({\n            docs: ['The wallet allowed to modify the account.'],\n            name: 'authority',\n            type: publicKeyTypeNode(),\n        }),\n        structFieldTypeNode({\n            docs: ['The amount of tokens in basis points.'],\n            name: 'amount',\n            type: numberTypeNode('u64'),\n        }),\n    ]);\n\n    // When we remove the docs from the node.\n    const result = visit(node, removeDocsVisitor());\n\n    // Then we expect the following node.\n    expect(result).toEqual(\n        structTypeNode([\n            structFieldTypeNode({\n                docs: [],\n                name: 'owner',\n                type: publicKeyTypeNode(),\n            }),\n            structFieldTypeNode({\n                docs: [],\n                name: 'authority',\n                type: publicKeyTypeNode(),\n            }),\n            structFieldTypeNode({\n                docs: [],\n                name: 'amount',\n                type: numberTypeNode('u64'),\n            }),\n        ]),\n    );\n});\n\ntest('it freezes the returned node', () => {\n    // Given the following struct node with docs.\n    const node = structTypeNode([\n        structFieldTypeNode({\n            docs: ['The owner of the account.'],\n            name: 'owner',\n            type: publicKeyTypeNode(),\n        }),\n    ]);\n\n    // When we remove the docs from the node.\n    const result = visit(node, removeDocsVisitor());\n\n    // Then we expect the returned node to be frozen.\n    expect(Object.isFrozen(result)).toBe(true);\n});\n\ntest('it can create partial visitors', () => {\n    // Given the following struct node with docs.\n    const node = structTypeNode([\n        structFieldTypeNode({\n            docs: ['The owner of the account.'],\n            name: 'owner',\n            type: publicKeyTypeNode(),\n        }),\n    ]);\n\n    // And a remove docs visitor that only supports struct type nodes.\n    const visitor = removeDocsVisitor({ keys: ['structTypeNode'] });\n\n    // When we use it on our struct node.\n    const result = visit(node, visitor);\n\n    // Then we expect the same node back.\n    expect(result).toEqual(node);\n\n    // And we expect an error when visiting an unsupported node.\n    // @ts-expect-error StructFieldTypeNode is not supported.\n    expect(() => visit(node.fields[0], visitor)).toThrow();\n});\n"
  },
  {
    "path": "packages/visitors-core/test/singleNodeVisitor.test.ts",
    "content": "import { numberTypeNode, ProgramNode, publicKeyTypeNode, rootNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { rootNodeVisitor, singleNodeVisitor, visit } from '../src';\n\ntest('it visits a single node and return a custom value', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()])]);\n\n    // And a visitor that counts the number of direct items in a tuple node.\n    const visitor = singleNodeVisitor('tupleTypeNode', node => node.items.length);\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect 2 direct items in the tuple node.\n    expect(result).toEqual(2);\n\n    // And no other nodes can be visited.\n    // @ts-expect-error NumberTypeNode is not supported.\n    expect(() => visit(numberTypeNode('u64'), visitor)).toThrow();\n    // @ts-expect-error PublicKeyTypeNode is not supported.\n    expect(() => visit(publicKeyTypeNode(), visitor)).toThrow();\n});\n\ntest('it can create rootNode only visitors that return new rootNode instances', () => {\n    // Given a root node.\n    const node = rootNode({} as ProgramNode);\n\n    // And a root node visitor that adds an additional program node.\n    const visitor = rootNodeVisitor(node => rootNode(node.program, [...node.additionalPrograms, {} as ProgramNode]));\n\n    // When we visit the empty root node using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect the returned root node to have one additional program node.\n    expect(result.additionalPrograms.length).toBe(1);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/staticVisitor.test.ts",
    "content": "import { numberTypeNode, publicKeyTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { staticVisitor, visit } from '../src';\n\ntest('it returns the same value for any visited node', () => {\n    // Given the following 3-nodes tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n\n    // And a static visitor that returns the node kind for any visited node.\n    const visitor = staticVisitor(node => node.kind);\n\n    // Then we expect the following results when visiting different nodes.\n    expect(visit(node, visitor)).toBe('tupleTypeNode');\n    expect(visit(node.items[0], visitor)).toBe('numberTypeNode');\n    expect(visit(node.items[1], visitor)).toBe('publicKeyTypeNode');\n});\n\ntest('it can create partial visitor', () => {\n    // Given the following 3-nodes tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n\n    // And a static visitor that supports only 2 of these nodes.\n    const visitor = staticVisitor(node => node.kind, { keys: ['tupleTypeNode', 'numberTypeNode'] });\n\n    // Then we expect the following results when visiting supported nodes.\n    expect(visit(node, visitor)).toBe('tupleTypeNode');\n    expect(visit(node.items[0], visitor)).toBe('numberTypeNode');\n\n    // But expect an error when visiting an unsupported node.\n    // @ts-expect-error PublicKeyTypeNode is not supported.\n    expect(() => visit(node.items[1], visitor)).toThrow();\n});\n"
  },
  {
    "path": "packages/visitors-core/test/tapVisitor.test.ts",
    "content": "import { NumberTypeNode, numberTypeNode, publicKeyTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { mergeVisitor, tapVisitor, visit } from '../src';\n\ntest('it returns a new instance of the same visitor whilst tapping into one of its visits', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()])]);\n\n    // And a sum visitor that counts the nodes.\n    const visitor = mergeVisitor(\n        () => 1,\n        (_, values) => values.reduce((a, b) => a + b, 1),\n    );\n\n    // And a tap visitor that taps into the numberTypeNode visit and counts them.\n    let numberOfNumberNodes = 0;\n    const tappedVisitor = tapVisitor(visitor, 'numberTypeNode', node => {\n        node satisfies NumberTypeNode;\n        numberOfNumberNodes++;\n    });\n\n    // When we visit the tree using the tapped visitor.\n    const result = visit(node, tappedVisitor);\n\n    // Then we get the expected result.\n    expect(result).toBe(5);\n\n    // And the tapped counter is also correct.\n    expect(numberOfNumberNodes).toBe(2);\n\n    // And the tapped visitor is a new instance.\n    expect(visitor).not.toBe(tappedVisitor);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/topDownTransformerVisitor.test.ts",
    "content": "import {\n    assertIsNode,\n    definedTypeNode,\n    isNode,\n    numberTypeNode,\n    programNode,\n    publicKeyTypeNode,\n    tupleTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport {\n    findProgramNodeFromPath,\n    NodeStack,\n    TopDownNodeTransformerWithSelector,\n    topDownTransformerVisitor,\n    visit,\n} from '../src';\n\ntest('it can transform nodes to the same kind of node', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()])]);\n\n    // And a transformer visitor that transforms all number nodes into u64 number nodes.\n    const visitor = topDownTransformerVisitor([\n        node => (isNode(node, 'numberTypeNode') ? (numberTypeNode('u64') as typeof node) : node),\n    ]);\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect the number nodes to have been transformed into u64 number nodes.\n    expect(result).toEqual(\n        tupleTypeNode([numberTypeNode('u64'), tupleTypeNode([numberTypeNode('u64'), publicKeyTypeNode()])]),\n    );\n});\n\ntest('it can transform nodes using node selectors', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()])]);\n\n    // And a transformer visitor that uses a node selector to select all number nodes.\n    const visitor = topDownTransformerVisitor([\n        {\n            select: '[numberTypeNode]',\n            transform: _node => numberTypeNode('u64') as typeof _node,\n        },\n    ]);\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect the number nodes to have been transformed into u64 number nodes.\n    expect(result).toEqual(\n        tupleTypeNode([numberTypeNode('u64'), tupleTypeNode([numberTypeNode('u64'), publicKeyTypeNode()])]),\n    );\n});\n\ntest('it can create partial transformer visitors', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()])]);\n\n    // And a tuple-only transformer visitor that prefixes all tuples with another number node.\n    const visitor = topDownTransformerVisitor(\n        [\n            {\n                select: '[tupleTypeNode]',\n                transform: node => {\n                    assertIsNode(node, 'tupleTypeNode');\n                    return tupleTypeNode([numberTypeNode('u64'), ...node.items]) as unknown as typeof node;\n                },\n            },\n        ],\n        { keys: ['tupleTypeNode'] },\n    );\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect the following tree.\n    expect(result).toEqual(\n        tupleTypeNode([\n            numberTypeNode('u64'),\n            numberTypeNode('u32'),\n            tupleTypeNode([numberTypeNode('u64'), numberTypeNode('u32'), publicKeyTypeNode()]),\n        ]),\n    );\n\n    // And the other nodes cannot be visited.\n    // @ts-expect-error NumberTypeNode is not a tuple node.\n    expect(() => visit(numberTypeNode('u64'), visitor)).toThrow();\n    // @ts-expect-error PublicKeyTypeNode is not a tuple node.\n    expect(() => visit(publicKeyTypeNode(), visitor)).toThrow();\n});\n\ntest('it can be used to delete nodes', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()])]);\n\n    // And a transformer visitor that deletes all number nodes.\n    const visitor = topDownTransformerVisitor([{ select: '[numberTypeNode]', transform: () => null }]);\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect the number nodes to have been deleted.\n    expect(result).toEqual(tupleTypeNode([tupleTypeNode([publicKeyTypeNode()])]));\n});\n\ntest('it can transform nodes using multiple node selectors', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()])]);\n\n    // And a transformer visitor that uses two node selectors such that\n    // - the first one selects all number nodes, and\n    // - the second one selects all nodes with more than one ancestor.\n    const visitor = topDownTransformerVisitor([\n        {\n            select: ['[numberTypeNode]', path => path.length > 2],\n            transform: _node => numberTypeNode('u64') as typeof _node,\n        },\n    ]);\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect both node selectors to have been applied.\n    expect(result).toEqual(\n        tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u64'), publicKeyTypeNode()])]),\n    );\n});\n\ntest('it can start from an existing stack', () => {\n    // Given the following tuple node inside a program node.\n    const tuple = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n    const program = programNode({\n        definedTypes: [definedTypeNode({ name: 'myTuple', type: tuple })],\n        name: 'myProgram',\n        publicKey: '1111',\n    });\n\n    // And a transformer that removes all number nodes\n    // from programs whose public key is '1111'.\n    const transformer: TopDownNodeTransformerWithSelector = {\n        select: ['[numberTypeNode]', path => findProgramNodeFromPath(path)?.publicKey === '1111'],\n        transform: () => null,\n    };\n\n    // When we visit the tuple with an existing stack that contains the program node.\n    const stack = new NodeStack([program, program.definedTypes[0]]);\n    const resultWithStack = visit(tuple, topDownTransformerVisitor([transformer], { stack }));\n\n    // Then we expect the number node to have been removed.\n    expect(resultWithStack).toStrictEqual(tupleTypeNode([publicKeyTypeNode()]));\n\n    // But when we visit the tuple without the stack.\n    const resultWithoutStack = visit(tuple, topDownTransformerVisitor([transformer]));\n\n    // Then we expect the number node to have been kept.\n    expect(resultWithoutStack).toStrictEqual(tuple);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/visitor.test.ts",
    "content": "import {\n    NumberTypeNode,\n    numberTypeNode,\n    PublicKeyTypeNode,\n    publicKeyTypeNode,\n    TupleTypeNode,\n    tupleTypeNode,\n} from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { visit, Visitor, visitOrElse } from '../src';\n\ntest('it can create visitors as plain objects', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()])]);\n\n    // And a plain object visitor that counts the nodes with different weights.\n    const visitor: Visitor<number, 'numberTypeNode' | 'publicKeyTypeNode' | 'tupleTypeNode'> = {\n        visitNumberType() {\n            return 1;\n        },\n        visitPublicKeyType() {\n            return 2;\n        },\n        visitTupleType(node) {\n            const castedChildren = node.items as (NumberTypeNode | PublicKeyTypeNode | TupleTypeNode)[];\n            return castedChildren.map(child => visit(child, this)).reduce((a, b) => a + b, 10);\n        },\n    };\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect the following count.\n    expect(result).toBe(24);\n});\n\ntest('it can use visitOrElse to fallback if a nested node is not supported by the visitor', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()]);\n\n    // And a plain object visitor that counts the tuples and numbers nodes only\n    // Such that it falls back to 42 for any other node.\n    const visitor: Visitor<number, 'numberTypeNode' | 'tupleTypeNode'> = {\n        visitNumberType() {\n            return 1;\n        },\n        visitTupleType(node) {\n            return node.items.map(child => visitOrElse(child, this, () => 42)).reduce((a, b) => a + b, 1);\n        },\n    };\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect the following count.\n    expect(result).toBe(44);\n});\n"
  },
  {
    "path": "packages/visitors-core/test/voidVisitor.test.ts",
    "content": "import { numberTypeNode, publicKeyTypeNode, tupleTypeNode } from '@codama/nodes';\nimport { expect, test } from 'vitest';\n\nimport { extendVisitor, visit, voidVisitor } from '../src';\n\ntest('it visits all nodes and returns void', () => {\n    // Given the following tree.\n    const node = tupleTypeNode([numberTypeNode('u32'), tupleTypeNode([numberTypeNode('u32'), publicKeyTypeNode()])]);\n\n    // And a void visitor extended such that it counts the tuple nodes.\n    let counter = 0;\n    const visitor = extendVisitor(voidVisitor(), {\n        visitTupleType: (node, { next }) => {\n            counter++;\n            return next(node);\n        },\n    });\n\n    // When we visit the tree using that visitor.\n    const result = visit(node, visitor);\n\n    // Then we expect the counter to match the amount of tuple nodes.\n    expect(counter).toBe(2);\n\n    // And a void result.\n    expect(result).toBeUndefined();\n});\n"
  },
  {
    "path": "packages/visitors-core/tsconfig.declarations.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"declarationMap\": true,\n        \"emitDeclarationOnly\": true,\n        \"outDir\": \"./dist/types\"\n    },\n    \"extends\": \"./tsconfig.json\",\n    \"include\": [\"src/index.ts\", \"src/types\"]\n}\n"
  },
  {
    "path": "packages/visitors-core/tsconfig.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": { \"lib\": [] },\n    \"display\": \"@codama/visitors-core\",\n    \"extends\": \"../../tsconfig.json\",\n    \"include\": [\"src\", \"test\"]\n}\n"
  },
  {
    "path": "packages/visitors-core/tsup.config.ts",
    "content": "import { defineConfig } from 'tsup';\n\nimport { getPackageBuildConfigs } from '../../tsup.config.base';\n\nexport default defineConfig(getPackageBuildConfigs());\n"
  },
  {
    "path": "packages/visitors-core/vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\nimport { getVitestConfig } from '../../vitest.config.base.mjs';\n\nexport default defineConfig({\n    test: {\n        projects: [getVitestConfig('browser'), getVitestConfig('node'), getVitestConfig('react-native')],\n    },\n});\n"
  },
  {
    "path": "pnpm-workspace.yaml",
    "content": "packages:\n  - \"packages/*\"\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n    \"$schema\": \"https://json.schemastore.org/tsconfig\",\n    \"compilerOptions\": {\n        \"composite\": false,\n        \"declaration\": true,\n        \"declarationMap\": true,\n        \"esModuleInterop\": true,\n        \"forceConsistentCasingInFileNames\": true,\n        \"inlineSources\": false,\n        \"isolatedModules\": true,\n        \"moduleResolution\": \"node\",\n        \"noFallthroughCasesInSwitch\": true,\n        \"noUnusedLocals\": true,\n        \"noUnusedParameters\": true,\n        \"preserveWatchOutput\": true,\n        \"skipLibCheck\": true,\n        \"strict\": true,\n        \"target\": \"ESNext\"\n    },\n    \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "tsup.config.base.ts",
    "content": "import { env } from 'node:process';\n\nimport browsersListToEsBuild from 'browserslist-to-esbuild';\nimport { Format, Options as TsupConfig } from 'tsup';\n\ntype Platform = 'browser' | 'node' | 'react-native';\n\ntype BuildOptions = {\n    format: Format;\n    platform: Platform;\n};\n\nconst BROWSERSLIST_TARGETS = browsersListToEsBuild();\n\nexport function getBuildConfig(options: BuildOptions): TsupConfig {\n    const { format, platform } = options;\n    return {\n        define: {\n            __BROWSER__: `${platform === 'browser'}`,\n            __ESM__: `${format === 'esm'}`,\n            __NODEJS__: `${platform === 'node'}`,\n            __REACTNATIVE__: `${platform === 'react-native'}`,\n            __TEST__: 'false',\n            __VERSION__: `\"${env.npm_package_version}\"`,\n        },\n        entry: [`./src/index.ts`],\n        esbuildOptions(options, context) {\n            if (context.format === 'iife') {\n                options.target = BROWSERSLIST_TARGETS;\n                options.minify = true;\n            } else {\n                options.define = {\n                    ...options.define,\n                    'process.env.NODE_ENV': 'process.env.NODE_ENV',\n                };\n            }\n        },\n        external: ['node:fs', 'node:path', 'node:url'],\n        format,\n        globalName: 'globalThis.codama',\n        name: platform,\n        // Inline private, non-published packages.\n        // WARNING: This inlines packages recursively. Make sure these don't have deep dep trees.\n        noExternal: [\n            // @noble/hashes/sha256 is an ESM-only module, so we have to inline it in CJS builds.\n            ...(format === 'cjs' ? ['@noble/hashes/sha256', '@noble/hashes/crypto'] : []),\n        ],\n        outExtension({ format }) {\n            const extension =\n                format === 'iife' ? `.production.min.js` : `.${platform}.${format === 'cjs' ? 'cjs' : 'mjs'}`;\n            return { js: extension };\n        },\n        platform: platform === 'node' ? 'node' : 'browser',\n        publicDir: true,\n        pure: ['process'],\n        sourcemap: format !== 'iife',\n        treeshake: true,\n    };\n}\n\nexport function getPackageBuildConfigs(): TsupConfig[] {\n    return [\n        getBuildConfig({ format: 'cjs', platform: 'node' }),\n        getBuildConfig({ format: 'esm', platform: 'node' }),\n        getBuildConfig({ format: 'cjs', platform: 'browser' }),\n        getBuildConfig({ format: 'esm', platform: 'browser' }),\n        getBuildConfig({ format: 'esm', platform: 'react-native' }),\n    ];\n}\n\nexport function getCliBuildConfig(): TsupConfig {\n    return {\n        ...getBuildConfig({ format: 'cjs', platform: 'node' }),\n        entry: { cli: './src/cli/index.ts' },\n        outExtension() {\n            return { js: `.cjs` };\n        },\n    };\n}\n"
  },
  {
    "path": "turbo.json",
    "content": "{\n    \"$schema\": \"https://turbo.build/schema.json\",\n    \"globalEnv\": [\"NODE_ENV\"],\n    \"remoteCache\": {\n        \"signature\": true\n    },\n    \"tasks\": {\n        \"build\": {\n            \"dependsOn\": [\"^build\"]\n        },\n        \"test\": {\n            \"dependsOn\": [\"build\"]\n        },\n        \"test:browser\": {\n            \"dependsOn\": [\"^build\"]\n        },\n        \"test:node\": {\n            \"dependsOn\": [\"^build\"]\n        },\n        \"test:react-native\": {\n            \"dependsOn\": [\"^build\"]\n        },\n        \"test:treeshakability\": {\n            \"dependsOn\": [\"build\"]\n        },\n        \"test:types\": {},\n        \"lint\": {\n            \"inputs\": [\"$TURBO_DEFAULT$\", \"../../eslint.config.*\"],\n            \"outputs\": []\n        },\n        \"lint:fix\": {\n            \"inputs\": [\"$TURBO_DEFAULT$\", \"../../eslint.config.*\"],\n            \"outputs\": [\"*\"]\n        }\n    }\n}\n"
  },
  {
    "path": "vitest.config.base.mts",
    "content": "import { env } from 'node:process';\n\nimport { configDefaults, defineConfig } from 'vitest/config';\n\nexport type Platform = 'browser' | 'node' | 'react-native';\n\nexport function getVitestConfig(platform: Platform) {\n    return defineConfig({\n        define: {\n            __BROWSER__: `${platform === 'browser'}`,\n            __ESM__: 'true',\n            __NODEJS__: `${platform === 'node'}`,\n            __REACTNATIVE__: `${platform === 'react-native'}`,\n            __TEST__: 'true',\n            __VERSION__: `\"${env.npm_package_version}\"`,\n        },\n        test: {\n            environment: platform === 'browser' ? 'happy-dom' : 'node',\n            exclude: [...configDefaults.exclude, '**/e2e/**'],\n            name: platform,\n        },\n    });\n}\n"
  },
  {
    "path": "vitest.config.mts",
    "content": "import { defineConfig } from 'vitest/config';\nimport { getVitestConfig } from './vitest.config.base.mjs';\n\n/**\n * This config file is not directly used by packages scripts or CI.\n * It's only purpose is to provide IDEs with a default configuration\n * so features from Vitest extensions can work out of the box.\n *\n * Ideally, this will be used in the future once Vitest supports hierarchical subprojects.\n * @see https://github.com/vitest-dev/vitest/issues/8226\n */\nexport default defineConfig(getVitestConfig('node'));\n"
  }
]