Copy disabled (too large)
Download .txt
Showing preview only (91,499K chars total). Download the full file to get everything.
Repository: solana-dev-adv/solana-cookbook
Branch: master
Commit: 7f42c6cc4ca4
Files: 1968
Total size: 86.1 MB
Directory structure:
gitextract_wogrekbi/
├── .ci/
│ ├── .exclude_files
│ └── scripts.py
├── .devcontainer/
│ ├── Dockerfile
│ └── devcontainer.json
├── .github/
│ ├── dependabot.yml
│ └── workflows/
│ └── python.yml
├── .gitignore
├── .husky/
│ ├── .gitignore
│ └── pre-commit
├── .prettierignore
├── CONTRIBUTING.md
├── README.md
├── code/
│ ├── account-maps/
│ │ ├── deriving-pda/
│ │ │ ├── anchor-pda-map.preview.rs
│ │ │ ├── anchor-pda-map.rs
│ │ │ ├── client.preview.ts
│ │ │ ├── client.ts
│ │ │ ├── vanilla-pda-map.preview.rs
│ │ │ └── vanilla-pda-map.rs
│ │ └── trivial/
│ │ ├── client.preview.ts
│ │ ├── client.ts
│ │ ├── vanilla-trivial-map.preview.rs
│ │ └── vanilla-trivial-map.rs
│ ├── accounts/
│ │ ├── close-account/
│ │ │ ├── client/
│ │ │ │ ├── close-account.adapter.en.tsx
│ │ │ │ ├── close-account.adapter.preview.en.tsx
│ │ │ │ ├── main.en.ts
│ │ │ │ └── main.preview.en.ts
│ │ │ └── program/
│ │ │ ├── Cargo.toml
│ │ │ ├── Xargo.toml
│ │ │ └── src/
│ │ │ ├── lib.preview.rs
│ │ │ └── lib.rs
│ │ ├── create-account-with-seed/
│ │ │ ├── creation/
│ │ │ │ ├── main.en.rs
│ │ │ │ ├── main.en.ts
│ │ │ │ ├── main.preview.en.rs
│ │ │ │ └── main.preview.en.ts
│ │ │ ├── generate/
│ │ │ │ ├── main.en.rs
│ │ │ │ ├── main.en.ts
│ │ │ │ ├── main.preview.en.rs
│ │ │ │ └── main.preview.en.ts
│ │ │ └── transfer/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── create-system-account/
│ │ │ ├── create-system-account.en.rs
│ │ │ ├── create-system-account.en.ts
│ │ │ ├── create-system-account.preview.en.rs
│ │ │ └── create-system-account.preview.en.ts
│ │ ├── get-balance/
│ │ │ ├── main.en.cpp
│ │ │ ├── main.en.py
│ │ │ ├── main.en.rs
│ │ │ ├── main.en.ts
│ │ │ ├── main.preview.en.cpp
│ │ │ ├── main.preview.en.py
│ │ │ ├── main.preview.en.rs
│ │ │ └── main.preview.en.ts
│ │ ├── program-derived-address/
│ │ │ ├── create-a-pda/
│ │ │ │ ├── client/
│ │ │ │ │ ├── main.en.ts
│ │ │ │ │ └── main.preview.en.ts
│ │ │ │ └── program/
│ │ │ │ ├── Cargo.toml
│ │ │ │ ├── Xargo.toml
│ │ │ │ └── src/
│ │ │ │ ├── lib.preview.rs
│ │ │ │ └── lib.rs
│ │ │ ├── derived-a-pda/
│ │ │ │ ├── find-program-address.en.rs
│ │ │ │ └── find-program-address.en.ts
│ │ │ └── sign-a-pda/
│ │ │ ├── client/
│ │ │ │ ├── main.en.ts
│ │ │ │ └── main.preview.en.ts
│ │ │ └── program/
│ │ │ ├── .gitignore
│ │ │ ├── Cargo.toml
│ │ │ ├── Xargo.toml
│ │ │ └── src/
│ │ │ ├── lib.preview.rs
│ │ │ └── lib.rs
│ │ └── rent-exemption/
│ │ ├── rent-exemption.en.rs
│ │ ├── rent-exemption.en.sh
│ │ └── rent-exemption.en.ts
│ ├── anchor/
│ │ ├── calculating-account-space-size/
│ │ │ ├── Cargo.toml
│ │ │ ├── Xargo.toml
│ │ │ └── src/
│ │ │ ├── account.preview.lib.rs
│ │ │ ├── deserializer.preview.lib.rs
│ │ │ ├── implementation-space.preview.lib.rs
│ │ │ └── lib.rs
│ │ ├── define-program/
│ │ │ ├── Cargo.toml
│ │ │ ├── Xargo.toml
│ │ │ └── src/
│ │ │ ├── define-account.preview.lib.rs
│ │ │ ├── define-deserializer.preview.lib.rs
│ │ │ ├── define-program-and-instructions.preview.lib.rs
│ │ │ └── lib.rs
│ │ └── testing-with-anchor/
│ │ ├── client/
│ │ │ ├── testing-with-anchor.js
│ │ │ └── testing_with_anchor.py
│ │ └── program/
│ │ ├── Cargo.toml
│ │ ├── Xargo.toml
│ │ └── src/
│ │ ├── define-increment.preview.lib.rs
│ │ └── lib.rs
│ ├── basic-transactions/
│ │ ├── calc-tx-cost/
│ │ │ ├── calc-tx-cost.en.ts
│ │ │ ├── calc-tx-cost.preview.en.ts
│ │ │ ├── calc-tx-est-fees-for-message.en.ts
│ │ │ ├── calc-tx-est-fees-for-message.preview.en.ts
│ │ │ ├── calc-tx-est-fees.en.ts
│ │ │ └── calc-tx-est-fees.preview.en.ts
│ │ ├── compute-budget/
│ │ │ ├── computeBudget.en.rs
│ │ │ ├── computeBudget.en.tsx
│ │ │ ├── computeBudget.preview.en.rs
│ │ │ ├── computeBudget.preview.en.tsx
│ │ │ ├── log_output.txt
│ │ │ └── solana_program.rs
│ │ ├── memo/
│ │ │ ├── memo.adapter.en.tsx
│ │ │ ├── memo.adapter.preview.en.tsx
│ │ │ ├── memo.en.sh
│ │ │ ├── memo.en.ts
│ │ │ └── memo.preview.en.ts
│ │ ├── sending-sol/
│ │ │ ├── sending-sol.adapter.en.tsx
│ │ │ ├── sending-sol.adapter.preview.en.tsx
│ │ │ ├── sending-sol.en.py
│ │ │ ├── sending-sol.en.rs
│ │ │ ├── sending-sol.en.sh
│ │ │ ├── sending-sol.en.ts
│ │ │ ├── sending-sol.preview.en.py
│ │ │ ├── sending-sol.preview.en.ts
│ │ │ └── sending-sol.preview.rs
│ │ └── sending-spl-token/
│ │ ├── sending-spl-token.adapter.en.tsx
│ │ ├── sending-spl-token.adapter.preview.en.tsx
│ │ ├── sending-spl-token.en.sh
│ │ ├── sending-spl-token.en.ts
│ │ └── sending-spl-token.preview.en.ts
│ ├── data-migration/
│ │ ├── account-v0.en.rs
│ │ ├── account-v0.preview.en.rs
│ │ ├── account-v1.en.rs
│ │ ├── account-v1.preview.en.rs
│ │ ├── rust.instruction.en.rs
│ │ ├── rust.instruction.preview.en.rs
│ │ ├── rust.instruction1.en.rs
│ │ ├── rust.processor.en.rs
│ │ ├── rust.processor.preview.en.rs
│ │ └── rust.processor1.en.rs
│ ├── feature-parity-testing/
│ │ ├── deactivate_one.rs
│ │ ├── deactivate_scfs.rs
│ │ ├── deactivate_two.rs
│ │ ├── preamble.rs
│ │ └── preamble_short.rs
│ ├── get-program-accounts/
│ │ ├── basic/
│ │ │ ├── basic.en.rs
│ │ │ ├── basic.en.sh
│ │ │ └── basic.en.ts
│ │ ├── dataSlice/
│ │ │ ├── dataSlice.en.rs
│ │ │ ├── dataSlice.en.sh
│ │ │ └── dataSlice.en.ts
│ │ └── memcmp/
│ │ ├── memcmp.en.rs
│ │ ├── memcmp.en.sh
│ │ └── memcmp.en.ts
│ ├── jupiter/
│ │ ├── executeapi/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── getRoutesapi/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── getTxapi/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── inputSetup/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── installationapi/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── loading-instance/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── providerSetup/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── react-token-list/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── reactSwap/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── retriveapi/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── route-map/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── routes/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── swap/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── token-list/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ └── useJupiter/
│ │ ├── main.en.ts
│ │ └── main.preview.en.ts
│ ├── keypairs-and-wallets/
│ │ ├── check-valid-publickey/
│ │ │ ├── check-valid-publickey.cpp
│ │ │ ├── check-valid-publickey.preview.cpp
│ │ │ ├── check-valid-publickey.preview.py
│ │ │ ├── check-valid-publickey.preview.rs
│ │ │ ├── check-valid-publickey.preview.ts
│ │ │ ├── check-valid-publickey.py
│ │ │ ├── check-valid-publickey.rs
│ │ │ └── check-valid-publickey.ts
│ │ ├── connect-to-wallet/
│ │ │ ├── connect-to-wallet-react.en.tsx
│ │ │ ├── connect-to-wallet-react.preview.en.tsx
│ │ │ ├── connect-to-wallet-svelte.en.html
│ │ │ ├── connect-to-wallet-svelte.preview.en.html
│ │ │ ├── connect-to-wallet-vue.en.vue
│ │ │ └── connect-to-wallet-vue.preview.en.vue
│ │ ├── generate-keypair/
│ │ │ ├── generate-keypair.en.cpp
│ │ │ ├── generate-keypair.en.py
│ │ │ ├── generate-keypair.en.rs
│ │ │ ├── generate-keypair.en.sh
│ │ │ ├── generate-keypair.en.ts
│ │ │ ├── generate-keypair.preview.en.cpp
│ │ │ ├── generate-keypair.preview.en.py
│ │ │ ├── generate-keypair.preview.en.rs
│ │ │ ├── generate-keypair.preview.en.sh
│ │ │ └── generate-keypair.preview.en.ts
│ │ ├── generate-mnemonic/
│ │ │ ├── from-bip39.preview.py
│ │ │ ├── from-bip39.preview.ts
│ │ │ ├── from-bip39.py
│ │ │ ├── from-bip39.sh
│ │ │ └── from-bip39.ts
│ │ ├── keypair-from-secret/
│ │ │ ├── from-bs58.en.py
│ │ │ ├── from-bs58.en.rs
│ │ │ ├── from-bs58.en.ts
│ │ │ ├── from-bs58.preview.en.py
│ │ │ ├── from-bs58.preview.en.rs
│ │ │ ├── from-bs58.preview.en.ts
│ │ │ ├── keypair-from-secret.en.cpp
│ │ │ ├── keypair-from-secret.en.py
│ │ │ ├── keypair-from-secret.en.rs
│ │ │ ├── keypair-from-secret.en.sh
│ │ │ ├── keypair-from-secret.en.ts
│ │ │ ├── keypair-from-secret.preview.en.cpp
│ │ │ ├── keypair-from-secret.preview.en.py
│ │ │ ├── keypair-from-secret.preview.en.rs
│ │ │ └── keypair-from-secret.preview.en.ts
│ │ ├── mnemonic-to-keypair/
│ │ │ ├── from-bip39.preview.py
│ │ │ ├── from-bip39.preview.ts
│ │ │ ├── from-bip39.py
│ │ │ ├── from-bip39.sh
│ │ │ ├── from-bip39.ts
│ │ │ ├── from-bip44.preview.py
│ │ │ ├── from-bip44.preview.ts
│ │ │ ├── from-bip44.py
│ │ │ ├── from-bip44.sh
│ │ │ └── from-bip44.ts
│ │ ├── sign-verify-message/
│ │ │ ├── sign-verify-message.en.py
│ │ │ ├── sign-verify-message.en.ts
│ │ │ ├── sign-verify-message.preview.en.py
│ │ │ └── sign-verify-message.preview.en.ts
│ │ ├── vanity-publickeys/
│ │ │ ├── vanity-publickeys.en.cpp
│ │ │ ├── vanity-publickeys.en.py
│ │ │ ├── vanity-publickeys.en.sh
│ │ │ ├── vanity-publickeys.en.ts
│ │ │ ├── vanity-publickeys.preview.en.cpp
│ │ │ ├── vanity-publickeys.preview.en.py
│ │ │ └── vanity-publickeys.preview.en.ts
│ │ └── verify-keypair/
│ │ ├── verify-keypair.en.cpp
│ │ ├── verify-keypair.en.py
│ │ ├── verify-keypair.en.sh
│ │ ├── verify-keypair.en.ts
│ │ ├── verify-keypair.preview.en.cpp
│ │ ├── verify-keypair.preview.en.py
│ │ └── verify-keypair.preview.en.ts
│ ├── local-development/
│ │ ├── airdropping-sol/
│ │ │ ├── airdropping-sol.en.cpp
│ │ │ ├── airdropping-sol.en.py
│ │ │ ├── airdropping-sol.en.rs
│ │ │ ├── airdropping-sol.en.sh
│ │ │ ├── airdropping-sol.en.ts
│ │ │ ├── airdropping-sol.preview.en.cpp
│ │ │ ├── airdropping-sol.preview.en.py
│ │ │ ├── airdropping-sol.preview.en.rs
│ │ │ ├── airdropping-sol.preview.en.sh
│ │ │ └── airdropping-sol.preview.en.ts
│ │ ├── connecting-cluster/
│ │ │ ├── connecting-cluster.en.cpp
│ │ │ ├── connecting-cluster.en.py
│ │ │ ├── connecting-cluster.en.rs
│ │ │ ├── connecting-cluster.en.sh
│ │ │ ├── connecting-cluster.en.ts
│ │ │ ├── connecting-cluster.preview.en.cpp
│ │ │ ├── connecting-cluster.preview.en.py
│ │ │ ├── connecting-cluster.preview.en.rs
│ │ │ └── connecting-cluster.preview.en.ts
│ │ ├── connecting-private-cluster/
│ │ │ ├── connecting-private-cluster.en.cpp
│ │ │ ├── connecting-private-cluster.en.py
│ │ │ ├── connecting-private-cluster.en.rs
│ │ │ ├── connecting-private-cluster.en.sh
│ │ │ ├── connecting-private-cluster.en.ts
│ │ │ ├── connecting-private-cluster.preview.en.cpp
│ │ │ ├── connecting-private-cluster.preview.en.py
│ │ │ ├── connecting-private-cluster.preview.en.rs
│ │ │ └── connecting-private-cluster.preview.en.ts
│ │ ├── connecting-websocket/
│ │ │ ├── connecting-websocket.en.cpp
│ │ │ ├── connecting-websocket.en.py
│ │ │ ├── connecting-websocket.en.rs
│ │ │ ├── connecting-websocket.en.ts
│ │ │ ├── connecting-websocket.preview.en.cpp
│ │ │ ├── connecting-websocket.preview.en.py
│ │ │ ├── connecting-websocket.preview.en.rs
│ │ │ └── connecting-websocket.preview.en.ts
│ │ └── using-mainnet-accounts/
│ │ ├── dump-accounts.en.sh
│ │ ├── dump-accounts.preview.en.sh
│ │ ├── dump-programs.en.sh
│ │ ├── dump-programs.preview.en.sh
│ │ ├── load-accounts.en.sh
│ │ ├── load-accounts.preview.en.sh
│ │ ├── load-programs.en.sh
│ │ └── load-programs.preview.en.sh
│ ├── mango/
│ │ ├── create-account/
│ │ │ ├── create-account.en.rs
│ │ │ ├── create-account.en.ts
│ │ │ ├── create-account.preview.en.rs
│ │ │ └── create-account.preview.en.ts
│ │ ├── deposit/
│ │ │ ├── deposit.en.ts
│ │ │ └── deposit.preview.en.ts
│ │ ├── load-asks/
│ │ │ ├── load-asks.en.ts
│ │ │ └── load-asks.preview.en.ts
│ │ ├── load-bids/
│ │ │ ├── load-bids.en.ts
│ │ │ └── load-bids.preview.en.ts
│ │ ├── load-group/
│ │ │ ├── load-group.en.ts
│ │ │ └── load-group.preview.en.ts
│ │ └── place-spot-order/
│ │ ├── place-spot-order.en.ts
│ │ └── place-spot-order.preview.en.ts
│ ├── name-service/
│ │ ├── find-for-owner/
│ │ │ ├── find-for-owner.en.ts
│ │ │ └── find-for-owner.preview.en.ts
│ │ ├── resolve-sol-domain/
│ │ │ ├── resolve-sol-domain.en.ts
│ │ │ └── resolve-sol-domain.preview.en.ts
│ │ ├── resolve-sub-domain/
│ │ │ ├── resolve-sub-domain.en.ts
│ │ │ └── resolve-sub-domain.preview.en.ts
│ │ ├── resolve-twitter/
│ │ │ ├── resolve-twitter.en.ts
│ │ │ └── resolve-twitter.preview.en.ts
│ │ ├── reverse-look-up-domain/
│ │ │ ├── reverse-look-up-domain.en.ts
│ │ │ └── reverse-look-up-domain.preview.en.ts
│ │ ├── reverse-look-up-twitter/
│ │ │ ├── reverse-look-up-twitter.en.ts
│ │ │ └── reverse-look-up-twitter.preview.en.ts
│ │ └── schema/
│ │ ├── schema.en.ts
│ │ └── schema.preview.en.ts
│ ├── nfts/
│ │ ├── candy-machine/
│ │ │ ├── create-candy-machine.en.ts
│ │ │ ├── create-candy-machine.preview.en.ts
│ │ │ ├── delete-candy-machine.en.ts
│ │ │ ├── delete-candy-machine.preview.en.ts
│ │ │ ├── find-minted-nfts.en.ts
│ │ │ ├── find-minted-nfts.preview.en.ts
│ │ │ ├── find-via-address.en.ts
│ │ │ ├── find-via-address.preview.en.ts
│ │ │ ├── find-via-authority.en.ts
│ │ │ ├── find-via-authority.preview.en.ts
│ │ │ ├── find-via-wallet.en.ts
│ │ │ ├── find-via-wallet.preview.en.ts
│ │ │ ├── insert-items.en.ts
│ │ │ ├── insert-items.preview.en.ts
│ │ │ ├── mint-nft.en.ts
│ │ │ └── mint-nft.preview.en.ts
│ │ ├── create-nft-token/
│ │ │ ├── create-nft-token.en.ts
│ │ │ └── create-nft-token.preview.en.ts
│ │ ├── get-all-nfts/
│ │ │ ├── get-all-nfts.en.ts
│ │ │ └── get-all-nfts.preview.en.ts
│ │ ├── get-metadata/
│ │ │ ├── get-metadata.en.ts
│ │ │ └── get-metadata.preview.en.ts
│ │ ├── get-owner/
│ │ │ ├── get-owner.en.ts
│ │ │ └── get-owner.preview.en.ts
│ │ ├── mint-nft/
│ │ │ ├── mint-nft.en.ts
│ │ │ └── mint-nft.preview.en.ts
│ │ ├── nfts-mint-addresses/
│ │ │ ├── mint-addresses-preview-v2.en.ts
│ │ │ ├── mint-addresses-preview.en.ts
│ │ │ ├── mint-addresses-v2.en.ts
│ │ │ └── mint-addresses.en.ts
│ │ └── upload-arweave/
│ │ ├── upload-arweave.en.py
│ │ ├── upload-arweave.en.ts
│ │ ├── upload-arweave.preview.en.py
│ │ └── upload-arweave.preview.en.ts
│ ├── offline-transactions/
│ │ ├── durable-nonce/
│ │ │ ├── create-nonce-account/
│ │ │ │ ├── main.en.ts
│ │ │ │ └── main.preview.en.ts
│ │ │ ├── get-nonce-account/
│ │ │ │ ├── main.en.ts
│ │ │ │ └── main.preview.en.ts
│ │ │ └── use-nonce-account/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── partial-sign/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ └── sign-transaction/
│ │ ├── main.en.ts
│ │ └── main.preview.en.ts
│ ├── programs/
│ │ ├── cpi-transfer/
│ │ │ ├── client/
│ │ │ │ ├── main.en.ts
│ │ │ │ └── main.preview.en.ts
│ │ │ ├── client-system/
│ │ │ │ ├── main.en.ts
│ │ │ │ └── main.preview.en.ts
│ │ │ ├── program/
│ │ │ │ ├── Cargo.toml
│ │ │ │ └── src/
│ │ │ │ ├── lib.preview.rs
│ │ │ │ └── lib.rs
│ │ │ └── program-system/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── lib.preview.rs
│ │ │ └── lib.rs
│ │ ├── create-pda/
│ │ │ ├── client/
│ │ │ │ ├── main.en.ts
│ │ │ │ └── main.preview.en.ts
│ │ │ └── program/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── lib.preview.rs
│ │ │ └── lib.rs
│ │ ├── get-clock/
│ │ │ ├── method-one/
│ │ │ │ ├── client/
│ │ │ │ │ ├── main.en.ts
│ │ │ │ │ └── main.preview.en.ts
│ │ │ │ └── program/
│ │ │ │ ├── Cargo.toml
│ │ │ │ └── src/
│ │ │ │ ├── lib.preview.rs
│ │ │ │ └── lib.rs
│ │ │ └── method-two/
│ │ │ ├── client/
│ │ │ │ ├── main.en.ts
│ │ │ │ └── main.preview.en.ts
│ │ │ └── program/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── lib.preview.rs
│ │ │ └── lib.rs
│ │ ├── read-account/
│ │ │ └── program/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── lib.preview.rs
│ │ │ └── lib.rs
│ │ ├── read-multiple-instructions/
│ │ │ └── program/
│ │ │ ├── lib.preview.rs
│ │ │ └── lib.rs
│ │ ├── realloc/
│ │ │ ├── realloc.en.rs
│ │ │ └── realloc.preview.en.rs
│ │ ├── transferring-lamports/
│ │ │ └── transferring-lamports.rs
│ │ └── verify-account/
│ │ └── program/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── lib.preview.rs
│ │ └── lib.rs
│ ├── pyth/
│ │ ├── client/
│ │ │ ├── client.en.ts
│ │ │ └── client.preview.en.ts
│ │ └── on-chain/
│ │ ├── on-chain.en.rs
│ │ └── on-chain.preview.en.rs
│ ├── retrying-transactions/
│ │ ├── retry.en.ts
│ │ └── retry.preview.en.ts
│ ├── serialization/
│ │ ├── clientdata/
│ │ │ ├── python.client.data.py
│ │ │ ├── rust.client.data.en.rs
│ │ │ └── ts.client.data.en.ts
│ │ ├── coption/
│ │ │ ├── demo_coption.en.ts
│ │ │ └── src/
│ │ │ └── main.rs
│ │ ├── instruction/
│ │ │ ├── python.client.py
│ │ │ ├── rust.client.mint.en.rs
│ │ │ ├── rust.program.instruction.en.rs
│ │ │ └── ts.client.mint.en.ts
│ │ ├── primitives/
│ │ │ ├── demo_primitives.en.ts
│ │ │ ├── python.demo_primitives.py
│ │ │ └── src/
│ │ │ └── main.rs
│ │ ├── program/
│ │ │ ├── rust.program.initialize.en.rs
│ │ │ ├── rust.program.mint.en.rs
│ │ │ ├── rust.program.packimpl.en.rs
│ │ │ └── rust.program.serdeser.en.rs
│ │ └── setup/
│ │ ├── Cargo.cli.en.toml
│ │ ├── Cargo.program.en.toml
│ │ ├── Node.package.en.json
│ │ └── requirements.txt
│ ├── serum/
│ │ ├── get-books/
│ │ │ ├── get-books.en.ts
│ │ │ └── get-books.preview.en.ts
│ │ ├── get-orders/
│ │ │ ├── get-orders.en.ts
│ │ │ └── get-orders.preview.en.ts
│ │ └── load-market/
│ │ ├── load-market.en.ts
│ │ └── load-market.preview.en.ts
│ ├── staking/
│ │ ├── create-stake-account/
│ │ │ ├── create-stake-account.en.ts
│ │ │ └── create-stake-account.preview.en.ts
│ │ ├── deactivate-stake/
│ │ │ ├── deactivate-stake.en.ts
│ │ │ └── deactivate-stake.preview.en.ts
│ │ ├── delegate-stake/
│ │ │ ├── delegate-stake.en.ts
│ │ │ └── delegate-stake.preview.en.ts
│ │ ├── get-current-validators/
│ │ │ ├── get-current-validators.en.sh
│ │ │ └── get-current-validators.en.ts
│ │ ├── get-delegators-by-validators/
│ │ │ ├── get-delegators-by-validators.en.ts
│ │ │ └── get-delegators-by-validators.preview.en.ts
│ │ ├── get-stake-amount/
│ │ │ ├── get-stake-amount.en.ts
│ │ │ └── get-stake-amount.preview.en.ts
│ │ └── withdraw-stake/
│ │ ├── withdraw-stake.en.ts
│ │ └── withdraw-stake.preview.en.ts
│ ├── strata/
│ │ ├── fully-managed/
│ │ │ ├── buy-token.en.ts
│ │ │ ├── buy-token.preview.en.ts
│ │ │ ├── create-token.en.ts
│ │ │ ├── create-token.preview.en.ts
│ │ │ ├── sell-token.en.ts
│ │ │ └── sell-token.preview.en.ts
│ │ └── lbc/
│ │ ├── create.en.ts
│ │ └── create.preview.en.ts
│ ├── switchboard/
│ │ ├── client/
│ │ │ ├── create.client.en.ts
│ │ │ ├── create.client.preview.en.ts
│ │ │ ├── create.oracle.client.en.ts
│ │ │ ├── create.oracle.client.preview.en.ts
│ │ │ ├── create.vrf.client.en.ts
│ │ │ ├── create.vrf.client.preview.en.ts
│ │ │ ├── read.client.en.ts
│ │ │ ├── read.client.preview.en.ts
│ │ │ ├── read.vrf.client.en.ts
│ │ │ ├── read.vrf.client.preview.en.ts
│ │ │ ├── request.vrf.client.en.ts
│ │ │ └── request.vrf.client.preview.en.ts
│ │ ├── local/
│ │ │ └── docker-compose.oracle.local.en.yml
│ │ └── on-chain/
│ │ ├── read.on-chain.en.rs
│ │ ├── read.on-chain.preview.en.rs
│ │ ├── read.vrf.on-chain.en.rs
│ │ ├── read.vrf.on-chain.preview.en.rs
│ │ ├── request.vrf.on-chain.en.rs
│ │ └── request.vrf.on-chain.preview.en.rs
│ ├── token/
│ │ ├── approve/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── burn-token/
│ │ │ ├── burn-token.en.ts
│ │ │ └── burn-token.preview.en.ts
│ │ ├── close-token-account/
│ │ │ ├── close-token-account.en.ts
│ │ │ └── close-token-account.preview.en.ts
│ │ ├── create-mint-account/
│ │ │ ├── create-mint-account.en.ts
│ │ │ ├── create-mint-account.preview.en.ts
│ │ │ └── create-mint-account.sh
│ │ ├── create-token-account/
│ │ │ ├── ata.en.ts
│ │ │ ├── ata.preview.en.ts
│ │ │ ├── random.en.ts
│ │ │ └── random.preview.en.ts
│ │ ├── get-mint-account/
│ │ │ ├── get-mint-account.en.ts
│ │ │ └── get-mint-account.preview.en.ts
│ │ ├── get-token-account/
│ │ │ ├── get-token-account.en.ts
│ │ │ └── get-token-account.preview.en.ts
│ │ ├── get-token-account-by-owner/
│ │ │ ├── all.en.ts
│ │ │ ├── all.preview.en.ts
│ │ │ ├── by-mint.en.ts
│ │ │ └── by-mint.preview.en.ts
│ │ ├── get-token-balance/
│ │ │ ├── get-token-balance.en.rs
│ │ │ ├── get-token-balance.en.ts
│ │ │ ├── get-token-balance.preview.en.rs
│ │ │ └── get-token-balance.preview.en.ts
│ │ ├── mint-token/
│ │ │ ├── mint-token.en.ts
│ │ │ └── mint-token.preview.en.ts
│ │ ├── revoke/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── set-authority/
│ │ │ ├── main.en.ts
│ │ │ └── main.preview.en.ts
│ │ ├── transfer-token/
│ │ │ ├── transfer-token.en.ts
│ │ │ └── transfer-token.preview.en.ts
│ │ └── wrapped-sol/
│ │ ├── add-balance-by-sol.en.ts
│ │ ├── add-balance-by-sol.preview.en.ts
│ │ ├── add-balance-by-token.en.ts
│ │ └── add-balance-by-token.preview.en.ts
│ └── wallet/
│ └── Web3Auth/
│ ├── initialize-instance.en.ts
│ ├── initialize-instance.preview.en.ts
│ ├── login.en.ts
│ ├── login.preview.en.ts
│ ├── logout.en.ts
│ ├── logout.preview.en.ts
│ ├── send-transaction.en.ts
│ ├── send-transaction.preview.en.ts
│ ├── sign-message.en.ts
│ ├── sign-message.preview.en.ts
│ ├── topup.en.ts
│ ├── topup.preview.en.ts
│ ├── user-info.en.ts
│ └── user-info.preview.en.ts
├── docs/
│ ├── .vuepress/
│ │ ├── clientAppEnhance.js
│ │ ├── components/
│ │ │ ├── SolanaCodeGroup.vue
│ │ │ └── SolanaCodeGroupItem.vue
│ │ ├── config.ts
│ │ ├── dist/
│ │ │ ├── 404.html
│ │ │ ├── assets/
│ │ │ │ ├── 404.e671120d.js
│ │ │ │ ├── 404.html.1873b0e7.js
│ │ │ │ ├── 404.html.f166316b.js
│ │ │ │ ├── Layout.4ba2f342.js
│ │ │ │ ├── account-maps.html.17bd8d7d.js
│ │ │ │ ├── account-maps.html.2bc51567.js
│ │ │ │ ├── account-maps.html.2bcb32db.js
│ │ │ │ ├── account-maps.html.2fa44b58.js
│ │ │ │ ├── account-maps.html.47c84b4e.js
│ │ │ │ ├── account-maps.html.54fde3f5.js
│ │ │ │ ├── account-maps.html.5696ae7f.js
│ │ │ │ ├── account-maps.html.573ed2b1.js
│ │ │ │ ├── account-maps.html.6070c007.js
│ │ │ │ ├── account-maps.html.61224aa4.js
│ │ │ │ ├── account-maps.html.62c5a232.js
│ │ │ │ ├── account-maps.html.6ef9e96e.js
│ │ │ │ ├── account-maps.html.84532932.js
│ │ │ │ ├── account-maps.html.84595114.js
│ │ │ │ ├── account-maps.html.84c98fd3.js
│ │ │ │ ├── account-maps.html.8c6e008e.js
│ │ │ │ ├── account-maps.html.938d8c12.js
│ │ │ │ ├── account-maps.html.a6d163f8.js
│ │ │ │ ├── account-maps.html.a75e89c2.js
│ │ │ │ ├── account-maps.html.bdfb893c.js
│ │ │ │ ├── account-maps.html.c1ccf667.js
│ │ │ │ ├── account-maps.html.c84ca06e.js
│ │ │ │ ├── account-maps.html.c9249bbc.js
│ │ │ │ ├── account-maps.html.cd84fe7b.js
│ │ │ │ ├── account-maps.html.d79562dd.js
│ │ │ │ ├── account-maps.html.ec99597b.js
│ │ │ │ ├── account-maps.html.f32682b9.js
│ │ │ │ ├── account-maps.html.f4daf1b2.js
│ │ │ │ ├── accounts.html.05949c32.js
│ │ │ │ ├── accounts.html.0636922d.js
│ │ │ │ ├── accounts.html.0cab14f0.js
│ │ │ │ ├── accounts.html.149df989.js
│ │ │ │ ├── accounts.html.17535e68.js
│ │ │ │ ├── accounts.html.1c2ce3f3.js
│ │ │ │ ├── accounts.html.25738f4e.js
│ │ │ │ ├── accounts.html.27fae06b.js
│ │ │ │ ├── accounts.html.339a7b82.js
│ │ │ │ ├── accounts.html.34134782.js
│ │ │ │ ├── accounts.html.369da584.js
│ │ │ │ ├── accounts.html.3d33092a.js
│ │ │ │ ├── accounts.html.4965c1bb.js
│ │ │ │ ├── accounts.html.527d0e94.js
│ │ │ │ ├── accounts.html.5a2213a5.js
│ │ │ │ ├── accounts.html.5a5d0844.js
│ │ │ │ ├── accounts.html.5ae3ae45.js
│ │ │ │ ├── accounts.html.5affc5f4.js
│ │ │ │ ├── accounts.html.629a8060.js
│ │ │ │ ├── accounts.html.62c56dc7.js
│ │ │ │ ├── accounts.html.6a7a3655.js
│ │ │ │ ├── accounts.html.705daa54.js
│ │ │ │ ├── accounts.html.70ea6ada.js
│ │ │ │ ├── accounts.html.79c0ca0e.js
│ │ │ │ ├── accounts.html.7d878d86.js
│ │ │ │ ├── accounts.html.85e3e0a4.js
│ │ │ │ ├── accounts.html.8879a9c1.js
│ │ │ │ ├── accounts.html.89eb8977.js
│ │ │ │ ├── accounts.html.8c2c7d40.js
│ │ │ │ ├── accounts.html.8e89eb52.js
│ │ │ │ ├── accounts.html.8f47d5db.js
│ │ │ │ ├── accounts.html.91bec01d.js
│ │ │ │ ├── accounts.html.928ccf41.js
│ │ │ │ ├── accounts.html.9a24f48b.js
│ │ │ │ ├── accounts.html.9bb37cd5.js
│ │ │ │ ├── accounts.html.9e729942.js
│ │ │ │ ├── accounts.html.b3e83490.js
│ │ │ │ ├── accounts.html.b91c3a6f.js
│ │ │ │ ├── accounts.html.bcf82d40.js
│ │ │ │ ├── accounts.html.c4066a49.js
│ │ │ │ ├── accounts.html.c9e84ab5.js
│ │ │ │ ├── accounts.html.cf985a2a.js
│ │ │ │ ├── accounts.html.d07565e6.js
│ │ │ │ ├── accounts.html.d0cb3dfd.js
│ │ │ │ ├── accounts.html.d16b618e.js
│ │ │ │ ├── accounts.html.d5fa2c98.js
│ │ │ │ ├── accounts.html.d65e9141.js
│ │ │ │ ├── accounts.html.d72d5885.js
│ │ │ │ ├── accounts.html.dde6cff9.js
│ │ │ │ ├── accounts.html.e2d2d050.js
│ │ │ │ ├── accounts.html.e2d854ed.js
│ │ │ │ ├── accounts.html.ef2241b1.js
│ │ │ │ ├── accounts.html.f6ab334e.js
│ │ │ │ ├── accounts.html.fab56f07.js
│ │ │ │ ├── accounts.html.fedf3c54.js
│ │ │ │ ├── accounts.html.ff5e6a4d.js
│ │ │ │ ├── app.07ce7a66.js
│ │ │ │ ├── auto-approve.html.00c95edb.js
│ │ │ │ ├── auto-approve.html.1e147577.js
│ │ │ │ ├── auto-approve.html.4e3677ac.js
│ │ │ │ ├── auto-approve.html.78a21927.js
│ │ │ │ ├── auto-approve.html.e352de0c.js
│ │ │ │ ├── auto-approve.html.f8eb4c51.js
│ │ │ │ ├── basic-transactions.html.13d601ed.js
│ │ │ │ ├── basic-transactions.html.145d9f79.js
│ │ │ │ ├── basic-transactions.html.18d8290f.js
│ │ │ │ ├── basic-transactions.html.1913df43.js
│ │ │ │ ├── basic-transactions.html.1abb92a6.js
│ │ │ │ ├── basic-transactions.html.22d5c3fa.js
│ │ │ │ ├── basic-transactions.html.351c7904.js
│ │ │ │ ├── basic-transactions.html.3e9e6a63.js
│ │ │ │ ├── basic-transactions.html.508e4c5e.js
│ │ │ │ ├── basic-transactions.html.598e40ad.js
│ │ │ │ ├── basic-transactions.html.710d7d5d.js
│ │ │ │ ├── basic-transactions.html.75aca1d6.js
│ │ │ │ ├── basic-transactions.html.8104955c.js
│ │ │ │ ├── basic-transactions.html.81d4c6bc.js
│ │ │ │ ├── basic-transactions.html.85ad631b.js
│ │ │ │ ├── basic-transactions.html.8d04a74c.js
│ │ │ │ ├── basic-transactions.html.9492ba81.js
│ │ │ │ ├── basic-transactions.html.a069dbca.js
│ │ │ │ ├── basic-transactions.html.ab11cb9f.js
│ │ │ │ ├── basic-transactions.html.ae0f79a3.js
│ │ │ │ ├── basic-transactions.html.b8e697ee.js
│ │ │ │ ├── basic-transactions.html.c93eecf9.js
│ │ │ │ ├── basic-transactions.html.dfe4490b.js
│ │ │ │ ├── basic-transactions.html.e416b8f1.js
│ │ │ │ ├── basic-transactions.html.e4233694.js
│ │ │ │ ├── basic-transactions.html.e7edd2e8.js
│ │ │ │ ├── basic-transactions.html.f38dcb54.js
│ │ │ │ ├── basic-transactions.html.f7122c53.js
│ │ │ │ ├── cpi.html.1a2d6d74.js
│ │ │ │ ├── cpi.html.25f2d5bd.js
│ │ │ │ ├── cpi.html.667a7166.js
│ │ │ │ ├── cpi.html.68e45f97.js
│ │ │ │ ├── cpi.html.7575fce3.js
│ │ │ │ ├── cpi.html.9d257983.js
│ │ │ │ ├── cpi.html.a071110c.js
│ │ │ │ ├── cpi.html.a340693f.js
│ │ │ │ ├── cpi.html.dc41f18c.js
│ │ │ │ ├── cpi.html.fc0ddd7a.js
│ │ │ │ ├── data-migration.html.06870b65.js
│ │ │ │ ├── data-migration.html.07b84548.js
│ │ │ │ ├── data-migration.html.084ac250.js
│ │ │ │ ├── data-migration.html.159d137d.js
│ │ │ │ ├── data-migration.html.352a418b.js
│ │ │ │ ├── data-migration.html.42889ad1.js
│ │ │ │ ├── data-migration.html.50964a4b.js
│ │ │ │ ├── data-migration.html.51e5d8f8.js
│ │ │ │ ├── data-migration.html.611a3316.js
│ │ │ │ ├── data-migration.html.6e4730c8.js
│ │ │ │ ├── data-migration.html.6ed17ef4.js
│ │ │ │ ├── data-migration.html.81a46ce7.js
│ │ │ │ ├── data-migration.html.8520d86d.js
│ │ │ │ ├── data-migration.html.86082ff9.js
│ │ │ │ ├── data-migration.html.95cc310f.js
│ │ │ │ ├── data-migration.html.9963dda2.js
│ │ │ │ ├── data-migration.html.a0b30eb8.js
│ │ │ │ ├── data-migration.html.aa7491d7.js
│ │ │ │ ├── data-migration.html.ac61c119.js
│ │ │ │ ├── data-migration.html.c9b6d0c5.js
│ │ │ │ ├── data-migration.html.cd8a5967.js
│ │ │ │ ├── data-migration.html.ce4aed9f.js
│ │ │ │ ├── data-migration.html.d0acee8e.js
│ │ │ │ ├── data-migration.html.d5010d02.js
│ │ │ │ ├── data-migration.html.db91eb39.js
│ │ │ │ ├── data-migration.html.e0a081db.js
│ │ │ │ ├── data-migration.html.ec2afdd1.js
│ │ │ │ ├── data-migration.html.f3e868ea.js
│ │ │ │ ├── debugging-solana-programs.html.02363b40.js
│ │ │ │ ├── debugging-solana-programs.html.125832d7.js
│ │ │ │ ├── debugging-solana-programs.html.1d099feb.js
│ │ │ │ ├── debugging-solana-programs.html.24149e6d.js
│ │ │ │ ├── debugging-solana-programs.html.29a6acd8.js
│ │ │ │ ├── debugging-solana-programs.html.2a0d6ae2.js
│ │ │ │ ├── debugging-solana-programs.html.2f9160d7.js
│ │ │ │ ├── debugging-solana-programs.html.30d528f0.js
│ │ │ │ ├── debugging-solana-programs.html.3408b860.js
│ │ │ │ ├── debugging-solana-programs.html.3aacc1a8.js
│ │ │ │ ├── debugging-solana-programs.html.3eeeb833.js
│ │ │ │ ├── debugging-solana-programs.html.43aa08db.js
│ │ │ │ ├── debugging-solana-programs.html.56d02641.js
│ │ │ │ ├── debugging-solana-programs.html.696e8511.js
│ │ │ │ ├── debugging-solana-programs.html.6d280979.js
│ │ │ │ ├── debugging-solana-programs.html.73a43e11.js
│ │ │ │ ├── debugging-solana-programs.html.a0e3b858.js
│ │ │ │ ├── debugging-solana-programs.html.a9ad9801.js
│ │ │ │ ├── debugging-solana-programs.html.afe6a517.js
│ │ │ │ ├── debugging-solana-programs.html.b7fb9288.js
│ │ │ │ ├── debugging-solana-programs.html.be9db9a6.js
│ │ │ │ ├── debugging-solana-programs.html.c57d7b64.js
│ │ │ │ ├── debugging-solana-programs.html.c5eb5f04.js
│ │ │ │ ├── debugging-solana-programs.html.d0ab2086.js
│ │ │ │ ├── debugging-solana-programs.html.d82f151d.js
│ │ │ │ ├── debugging-solana-programs.html.ede954b0.js
│ │ │ │ ├── debugging-solana-programs.html.f0229576.js
│ │ │ │ ├── debugging-solana-programs.html.ff3a8325.js
│ │ │ │ ├── distribution.html.1a2e0c57.js
│ │ │ │ ├── distribution.html.1e4a8b99.js
│ │ │ │ ├── distribution.html.5054629b.js
│ │ │ │ ├── distribution.html.566e7a4c.js
│ │ │ │ ├── distribution.html.e6e2641f.js
│ │ │ │ ├── distribution.html.ebcec652.js
│ │ │ │ ├── energy-system.html.1af785c7.js
│ │ │ │ ├── energy-system.html.247dc971.js
│ │ │ │ ├── energy-system.html.36ae62eb.js
│ │ │ │ ├── energy-system.html.446d0efc.js
│ │ │ │ ├── energy-system.html.71e02b64.js
│ │ │ │ ├── energy-system.html.c939c46f.js
│ │ │ │ ├── feature-parity-testing.html.0478ce69.js
│ │ │ │ ├── feature-parity-testing.html.110a0e04.js
│ │ │ │ ├── feature-parity-testing.html.1da58904.js
│ │ │ │ ├── feature-parity-testing.html.270f9679.js
│ │ │ │ ├── feature-parity-testing.html.2d03e4b5.js
│ │ │ │ ├── feature-parity-testing.html.441250fa.js
│ │ │ │ ├── feature-parity-testing.html.5be01a44.js
│ │ │ │ ├── feature-parity-testing.html.60d0cda5.js
│ │ │ │ ├── feature-parity-testing.html.61551d89.js
│ │ │ │ ├── feature-parity-testing.html.61786585.js
│ │ │ │ ├── feature-parity-testing.html.64de3bfa.js
│ │ │ │ ├── feature-parity-testing.html.6b5afb2f.js
│ │ │ │ ├── feature-parity-testing.html.7eebcb7c.js
│ │ │ │ ├── feature-parity-testing.html.8332b8fc.js
│ │ │ │ ├── feature-parity-testing.html.90d3050b.js
│ │ │ │ ├── feature-parity-testing.html.93063fd3.js
│ │ │ │ ├── feature-parity-testing.html.94cf4ee3.js
│ │ │ │ ├── feature-parity-testing.html.9895d411.js
│ │ │ │ ├── feature-parity-testing.html.9edac1d3.js
│ │ │ │ ├── feature-parity-testing.html.a793ec94.js
│ │ │ │ ├── feature-parity-testing.html.a8a66110.js
│ │ │ │ ├── feature-parity-testing.html.abd7566e.js
│ │ │ │ ├── feature-parity-testing.html.b2696a90.js
│ │ │ │ ├── feature-parity-testing.html.c3ce27d5.js
│ │ │ │ ├── feature-parity-testing.html.c4705572.js
│ │ │ │ ├── feature-parity-testing.html.d784a27d.js
│ │ │ │ ├── feature-parity-testing.html.e7b6289c.js
│ │ │ │ ├── feature-parity-testing.html.e87e0e6e.js
│ │ │ │ ├── game-examples.html.2dcfe766.js
│ │ │ │ ├── game-examples.html.40ac5dd2.js
│ │ │ │ ├── game-examples.html.4c517700.js
│ │ │ │ ├── game-examples.html.4e1c4e80.js
│ │ │ │ ├── game-examples.html.8ba930cd.js
│ │ │ │ ├── game-examples.html.e048eba1.js
│ │ │ │ ├── game-sdks.html.3a17cfa1.js
│ │ │ │ ├── game-sdks.html.75e8b177.js
│ │ │ │ ├── game-sdks.html.92d7e729.js
│ │ │ │ ├── game-sdks.html.b7b1489e.js
│ │ │ │ ├── game-sdks.html.c0176ba6.js
│ │ │ │ ├── game-sdks.html.d18bd9d2.js
│ │ │ │ ├── get-program-accounts.html.01717eeb.js
│ │ │ │ ├── get-program-accounts.html.05c9c5aa.js
│ │ │ │ ├── get-program-accounts.html.1208b27a.js
│ │ │ │ ├── get-program-accounts.html.18585c23.js
│ │ │ │ ├── get-program-accounts.html.19ef2dee.js
│ │ │ │ ├── get-program-accounts.html.2b6451b4.js
│ │ │ │ ├── get-program-accounts.html.2d157240.js
│ │ │ │ ├── get-program-accounts.html.34a6b3c3.js
│ │ │ │ ├── get-program-accounts.html.382d13c1.js
│ │ │ │ ├── get-program-accounts.html.43b20beb.js
│ │ │ │ ├── get-program-accounts.html.4f4498ed.js
│ │ │ │ ├── get-program-accounts.html.58aa1eba.js
│ │ │ │ ├── get-program-accounts.html.5f716fa3.js
│ │ │ │ ├── get-program-accounts.html.703fb6bd.js
│ │ │ │ ├── get-program-accounts.html.7e74d8ff.js
│ │ │ │ ├── get-program-accounts.html.88cda781.js
│ │ │ │ ├── get-program-accounts.html.94ffca18.js
│ │ │ │ ├── get-program-accounts.html.a9d0e53c.js
│ │ │ │ ├── get-program-accounts.html.b068cc8a.js
│ │ │ │ ├── get-program-accounts.html.bc5b3f33.js
│ │ │ │ ├── get-program-accounts.html.bcc96381.js
│ │ │ │ ├── get-program-accounts.html.beec38ff.js
│ │ │ │ ├── get-program-accounts.html.c29868e4.js
│ │ │ │ ├── get-program-accounts.html.d60be8fc.js
│ │ │ │ ├── get-program-accounts.html.d8ef5734.js
│ │ │ │ ├── get-program-accounts.html.dfc1f9ed.js
│ │ │ │ ├── get-program-accounts.html.f1b24dac.js
│ │ │ │ ├── get-program-accounts.html.f563091d.js
│ │ │ │ ├── hello-world.html.46100458.js
│ │ │ │ ├── hello-world.html.7962bd1c.js
│ │ │ │ ├── hello-world.html.97d1eb37.js
│ │ │ │ ├── hello-world.html.dbee0508.js
│ │ │ │ ├── hello-world.html.e42a81e2.js
│ │ │ │ ├── hello-world.html.e99409d5.js
│ │ │ │ ├── index.html.10c6341f.js
│ │ │ │ ├── index.html.2017fef1.js
│ │ │ │ ├── index.html.25f20e37.js
│ │ │ │ ├── index.html.4943c0a7.js
│ │ │ │ ├── index.html.4eb1f1ba.js
│ │ │ │ ├── index.html.550d93c2.js
│ │ │ │ ├── index.html.5b3f2ada.js
│ │ │ │ ├── index.html.60dd15bd.js
│ │ │ │ ├── index.html.618f6255.js
│ │ │ │ ├── index.html.7ae71288.js
│ │ │ │ ├── index.html.7d9ea062.js
│ │ │ │ ├── index.html.8977d14d.js
│ │ │ │ ├── index.html.92035043.js
│ │ │ │ ├── index.html.9bb2504f.js
│ │ │ │ ├── index.html.9bb5a8db.js
│ │ │ │ ├── index.html.abf8251d.js
│ │ │ │ ├── index.html.b4991d27.js
│ │ │ │ ├── index.html.b594f3cc.js
│ │ │ │ ├── index.html.b6c39787.js
│ │ │ │ ├── index.html.c5a39464.js
│ │ │ │ ├── index.html.c8f43f44.js
│ │ │ │ ├── index.html.ca0d0ddc.js
│ │ │ │ ├── index.html.caa2e1b4.js
│ │ │ │ ├── index.html.d04c9063.js
│ │ │ │ ├── index.html.dd541d3c.js
│ │ │ │ ├── index.html.e7deec39.js
│ │ │ │ ├── index.html.ed59c6f5.js
│ │ │ │ ├── index.html.f4a1e63e.js
│ │ │ │ ├── installation.html.04bddf91.js
│ │ │ │ ├── installation.html.0539cd42.js
│ │ │ │ ├── installation.html.0fd43b03.js
│ │ │ │ ├── installation.html.1f30223e.js
│ │ │ │ ├── installation.html.2e4550cf.js
│ │ │ │ ├── installation.html.33a0283b.js
│ │ │ │ ├── installation.html.3865f03a.js
│ │ │ │ ├── installation.html.3b279ba8.js
│ │ │ │ ├── installation.html.3ee204bb.js
│ │ │ │ ├── installation.html.447c9172.js
│ │ │ │ ├── installation.html.4e98836a.js
│ │ │ │ ├── installation.html.5338573c.js
│ │ │ │ ├── installation.html.5e200cbd.js
│ │ │ │ ├── installation.html.75866756.js
│ │ │ │ ├── installation.html.7b74d3ce.js
│ │ │ │ ├── installation.html.81cc1ff4.js
│ │ │ │ ├── installation.html.91886c17.js
│ │ │ │ ├── installation.html.98badae7.js
│ │ │ │ ├── installation.html.9dc89678.js
│ │ │ │ ├── installation.html.a516e599.js
│ │ │ │ ├── installation.html.aa25ac0f.js
│ │ │ │ ├── installation.html.aa3edf44.js
│ │ │ │ ├── installation.html.cff7de51.js
│ │ │ │ ├── installation.html.dad10efa.js
│ │ │ │ ├── installation.html.eeb039ec.js
│ │ │ │ ├── installation.html.ef551b6c.js
│ │ │ │ ├── installation.html.f389c1e2.js
│ │ │ │ ├── installation.html.fd583852.js
│ │ │ │ ├── interact-with-tokens.html.2bce6086.js
│ │ │ │ ├── interact-with-tokens.html.3c85d257.js
│ │ │ │ ├── interact-with-tokens.html.4c6e3333.js
│ │ │ │ ├── interact-with-tokens.html.64318398.js
│ │ │ │ ├── interact-with-tokens.html.98196941.js
│ │ │ │ ├── interact-with-tokens.html.f2419630.js
│ │ │ │ ├── intro.html.48bcd940.js
│ │ │ │ ├── intro.html.51f00446.js
│ │ │ │ ├── intro.html.5c2ad8c4.js
│ │ │ │ ├── intro.html.afd41fab.js
│ │ │ │ ├── intro.html.cccca287.js
│ │ │ │ ├── intro.html.e782eb8d.js
│ │ │ │ ├── keypairs-and-wallets.html.06b48140.js
│ │ │ │ ├── keypairs-and-wallets.html.06ba1dde.js
│ │ │ │ ├── keypairs-and-wallets.html.35579864.js
│ │ │ │ ├── keypairs-and-wallets.html.41fab86d.js
│ │ │ │ ├── keypairs-and-wallets.html.4fa11b3e.js
│ │ │ │ ├── keypairs-and-wallets.html.51f378e3.js
│ │ │ │ ├── keypairs-and-wallets.html.52178133.js
│ │ │ │ ├── keypairs-and-wallets.html.5d3230ee.js
│ │ │ │ ├── keypairs-and-wallets.html.61911f3c.js
│ │ │ │ ├── keypairs-and-wallets.html.67ed01d6.js
│ │ │ │ ├── keypairs-and-wallets.html.68a4f8a1.js
│ │ │ │ ├── keypairs-and-wallets.html.7c422ff4.js
│ │ │ │ ├── keypairs-and-wallets.html.7c453b59.js
│ │ │ │ ├── keypairs-and-wallets.html.7c474929.js
│ │ │ │ ├── keypairs-and-wallets.html.87a50ba3.js
│ │ │ │ ├── keypairs-and-wallets.html.8a36f79a.js
│ │ │ │ ├── keypairs-and-wallets.html.8d42bf89.js
│ │ │ │ ├── keypairs-and-wallets.html.96505086.js
│ │ │ │ ├── keypairs-and-wallets.html.9ba5746a.js
│ │ │ │ ├── keypairs-and-wallets.html.af37857f.js
│ │ │ │ ├── keypairs-and-wallets.html.c98a65c6.js
│ │ │ │ ├── keypairs-and-wallets.html.caac507d.js
│ │ │ │ ├── keypairs-and-wallets.html.cc8fbf04.js
│ │ │ │ ├── keypairs-and-wallets.html.cc9959ad.js
│ │ │ │ ├── keypairs-and-wallets.html.de41b5c5.js
│ │ │ │ ├── keypairs-and-wallets.html.e67c0c51.js
│ │ │ │ ├── keypairs-and-wallets.html.f22c3901.js
│ │ │ │ ├── keypairs-and-wallets.html.f62ce6aa.js
│ │ │ │ ├── local-development.html.04b39972.js
│ │ │ │ ├── local-development.html.0592ee0b.js
│ │ │ │ ├── local-development.html.0eff045a.js
│ │ │ │ ├── local-development.html.2a116d81.js
│ │ │ │ ├── local-development.html.2abc6315.js
│ │ │ │ ├── local-development.html.3d4bf8da.js
│ │ │ │ ├── local-development.html.46e27ce6.js
│ │ │ │ ├── local-development.html.56a49f49.js
│ │ │ │ ├── local-development.html.57651167.js
│ │ │ │ ├── local-development.html.5b9c11f5.js
│ │ │ │ ├── local-development.html.61336a2a.js
│ │ │ │ ├── local-development.html.6fe99a83.js
│ │ │ │ ├── local-development.html.720fba0c.js
│ │ │ │ ├── local-development.html.7e1bd7bf.js
│ │ │ │ ├── local-development.html.83d30cd3.js
│ │ │ │ ├── local-development.html.87708b9b.js
│ │ │ │ ├── local-development.html.8d6577e9.js
│ │ │ │ ├── local-development.html.94d5f03d.js
│ │ │ │ ├── local-development.html.987c051d.js
│ │ │ │ ├── local-development.html.a46df64b.js
│ │ │ │ ├── local-development.html.b97186da.js
│ │ │ │ ├── local-development.html.c30f3958.js
│ │ │ │ ├── local-development.html.c3972821.js
│ │ │ │ ├── local-development.html.c5836b09.js
│ │ │ │ ├── local-development.html.d92b65d2.js
│ │ │ │ ├── local-development.html.edd1e5da.js
│ │ │ │ ├── local-development.html.f5643536.js
│ │ │ │ ├── local-development.html.fd41bc0d.js
│ │ │ │ ├── name-service.html.1a8fc34e.js
│ │ │ │ ├── name-service.html.2a6127d5.js
│ │ │ │ ├── name-service.html.2caf8c15.js
│ │ │ │ ├── name-service.html.31d70b32.js
│ │ │ │ ├── name-service.html.326a6c13.js
│ │ │ │ ├── name-service.html.34b8f57a.js
│ │ │ │ ├── name-service.html.38938728.js
│ │ │ │ ├── name-service.html.40d37cf7.js
│ │ │ │ ├── name-service.html.5051d1dd.js
│ │ │ │ ├── name-service.html.569777a7.js
│ │ │ │ ├── name-service.html.625e197d.js
│ │ │ │ ├── name-service.html.65503a5f.js
│ │ │ │ ├── name-service.html.73354d4f.js
│ │ │ │ ├── name-service.html.7f713da1.js
│ │ │ │ ├── name-service.html.84a68d08.js
│ │ │ │ ├── name-service.html.87ead710.js
│ │ │ │ ├── name-service.html.8945e238.js
│ │ │ │ ├── name-service.html.8fa8af28.js
│ │ │ │ ├── name-service.html.9126ccbb.js
│ │ │ │ ├── name-service.html.92fe381f.js
│ │ │ │ ├── name-service.html.b1fdc398.js
│ │ │ │ ├── name-service.html.c487eb0f.js
│ │ │ │ ├── name-service.html.c5f60f0b.js
│ │ │ │ ├── name-service.html.d6069fdf.js
│ │ │ │ ├── name-service.html.e0d6e448.js
│ │ │ │ ├── name-service.html.e670bb57.js
│ │ │ │ ├── name-service.html.ea9b0216.js
│ │ │ │ ├── name-service.html.f9dd90b0.js
│ │ │ │ ├── nfts-in-games.html.2b65cbf5.js
│ │ │ │ ├── nfts-in-games.html.31ac6411.js
│ │ │ │ ├── nfts-in-games.html.46772392.js
│ │ │ │ ├── nfts-in-games.html.5898ff02.js
│ │ │ │ ├── nfts-in-games.html.cbea4492.js
│ │ │ │ ├── nfts-in-games.html.e1b77b87.js
│ │ │ │ ├── nfts.html.06449cbe.js
│ │ │ │ ├── nfts.html.0870f8d4.js
│ │ │ │ ├── nfts.html.1e42ca51.js
│ │ │ │ ├── nfts.html.2c1ad270.js
│ │ │ │ ├── nfts.html.39ed8786.js
│ │ │ │ ├── nfts.html.3a4dc806.js
│ │ │ │ ├── nfts.html.4488b5bf.js
│ │ │ │ ├── nfts.html.522cff97.js
│ │ │ │ ├── nfts.html.595f8f64.js
│ │ │ │ ├── nfts.html.61f329ef.js
│ │ │ │ ├── nfts.html.6cf05cb7.js
│ │ │ │ ├── nfts.html.73b95415.js
│ │ │ │ ├── nfts.html.75a819e1.js
│ │ │ │ ├── nfts.html.8062119a.js
│ │ │ │ ├── nfts.html.88b22980.js
│ │ │ │ ├── nfts.html.8ab155e7.js
│ │ │ │ ├── nfts.html.8f57b7b1.js
│ │ │ │ ├── nfts.html.93f43d02.js
│ │ │ │ ├── nfts.html.965a9b0c.js
│ │ │ │ ├── nfts.html.b43c7325.js
│ │ │ │ ├── nfts.html.cb306959.js
│ │ │ │ ├── nfts.html.cf97bb6d.js
│ │ │ │ ├── nfts.html.d0725425.js
│ │ │ │ ├── nfts.html.d679a608.js
│ │ │ │ ├── nfts.html.d9599439.js
│ │ │ │ ├── nfts.html.f28f6d5c.js
│ │ │ │ ├── nfts.html.f3815a10.js
│ │ │ │ ├── nfts.html.fdb7230c.js
│ │ │ │ ├── offline-transactions.html.0ba69adc.js
│ │ │ │ ├── offline-transactions.html.0bf4dc0d.js
│ │ │ │ ├── offline-transactions.html.1cebdb75.js
│ │ │ │ ├── offline-transactions.html.1d7f75c0.js
│ │ │ │ ├── offline-transactions.html.269432a1.js
│ │ │ │ ├── offline-transactions.html.26de122f.js
│ │ │ │ ├── offline-transactions.html.328bb708.js
│ │ │ │ ├── offline-transactions.html.411f2083.js
│ │ │ │ ├── offline-transactions.html.5d4f9b52.js
│ │ │ │ ├── offline-transactions.html.62c2bb84.js
│ │ │ │ ├── offline-transactions.html.694e5a9c.js
│ │ │ │ ├── offline-transactions.html.6bb56d3c.js
│ │ │ │ ├── offline-transactions.html.7dc3f34e.js
│ │ │ │ ├── offline-transactions.html.805d36b8.js
│ │ │ │ ├── offline-transactions.html.81a50c51.js
│ │ │ │ ├── offline-transactions.html.8d1d2de8.js
│ │ │ │ ├── offline-transactions.html.93364c85.js
│ │ │ │ ├── offline-transactions.html.9b30c0d6.js
│ │ │ │ ├── offline-transactions.html.9e334e4b.js
│ │ │ │ ├── offline-transactions.html.a7cb4369.js
│ │ │ │ ├── offline-transactions.html.afa81fed.js
│ │ │ │ ├── offline-transactions.html.c95a953c.js
│ │ │ │ ├── offline-transactions.html.cd22f1cb.js
│ │ │ │ ├── offline-transactions.html.cff454eb.js
│ │ │ │ ├── offline-transactions.html.d0d3f6bf.js
│ │ │ │ ├── offline-transactions.html.d4e0be3d.js
│ │ │ │ ├── offline-transactions.html.dad115e4.js
│ │ │ │ ├── offline-transactions.html.ef38def6.js
│ │ │ │ ├── pdas.html.02bdc9f3.js
│ │ │ │ ├── pdas.html.08e26e07.js
│ │ │ │ ├── pdas.html.19706e9c.js
│ │ │ │ ├── pdas.html.1bf322c2.js
│ │ │ │ ├── pdas.html.27a51730.js
│ │ │ │ ├── pdas.html.2b207b9f.js
│ │ │ │ ├── pdas.html.35c6152a.js
│ │ │ │ ├── pdas.html.360db77f.js
│ │ │ │ ├── pdas.html.3b9289a8.js
│ │ │ │ ├── pdas.html.4a946dac.js
│ │ │ │ ├── pdas.html.56ea1967.js
│ │ │ │ ├── pdas.html.580eb019.js
│ │ │ │ ├── pdas.html.6cdffc98.js
│ │ │ │ ├── pdas.html.6d743213.js
│ │ │ │ ├── pdas.html.6fd7b3e7.js
│ │ │ │ ├── pdas.html.77efba8f.js
│ │ │ │ ├── pdas.html.8ac3fb57.js
│ │ │ │ ├── pdas.html.9841e8a1.js
│ │ │ │ ├── pdas.html.a117908d.js
│ │ │ │ ├── pdas.html.a4275910.js
│ │ │ │ ├── pdas.html.b3879735.js
│ │ │ │ ├── pdas.html.cf2a36cd.js
│ │ │ │ ├── pdas.html.da9ce228.js
│ │ │ │ ├── pdas.html.dd1806d8.js
│ │ │ │ ├── pdas.html.e5cff056.js
│ │ │ │ ├── pdas.html.ea02eb75.js
│ │ │ │ ├── pdas.html.eaddc26f.js
│ │ │ │ ├── pdas.html.eca9a894.js
│ │ │ │ ├── porting-anchor-to-unity.html.29a097d5.js
│ │ │ │ ├── porting-anchor-to-unity.html.2d7da15e.js
│ │ │ │ ├── porting-anchor-to-unity.html.8ad16b00.js
│ │ │ │ ├── porting-anchor-to-unity.html.a3b74cb4.js
│ │ │ │ ├── porting-anchor-to-unity.html.a9555d2b.js
│ │ │ │ ├── porting-anchor-to-unity.html.d93d3149.js
│ │ │ │ ├── programs.html.01e229c2.js
│ │ │ │ ├── programs.html.072a911a.js
│ │ │ │ ├── programs.html.09c93a73.js
│ │ │ │ ├── programs.html.11032af6.js
│ │ │ │ ├── programs.html.12722776.js
│ │ │ │ ├── programs.html.135d8a1e.js
│ │ │ │ ├── programs.html.23836cb0.js
│ │ │ │ ├── programs.html.23a73b36.js
│ │ │ │ ├── programs.html.2a06f575.js
│ │ │ │ ├── programs.html.2d618e60.js
│ │ │ │ ├── programs.html.340e959e.js
│ │ │ │ ├── programs.html.34dde9fb.js
│ │ │ │ ├── programs.html.39ac6b79.js
│ │ │ │ ├── programs.html.3c48317e.js
│ │ │ │ ├── programs.html.3d46bb1d.js
│ │ │ │ ├── programs.html.3f12c384.js
│ │ │ │ ├── programs.html.48b1db94.js
│ │ │ │ ├── programs.html.4d7d8768.js
│ │ │ │ ├── programs.html.55412d52.js
│ │ │ │ ├── programs.html.555fde3c.js
│ │ │ │ ├── programs.html.5860dd01.js
│ │ │ │ ├── programs.html.602c11ba.js
│ │ │ │ ├── programs.html.6801ed73.js
│ │ │ │ ├── programs.html.6895a158.js
│ │ │ │ ├── programs.html.6d41107a.js
│ │ │ │ ├── programs.html.6e6eaba0.js
│ │ │ │ ├── programs.html.740744ad.js
│ │ │ │ ├── programs.html.7c34ad36.js
│ │ │ │ ├── programs.html.7db6ff71.js
│ │ │ │ ├── programs.html.90aa36af.js
│ │ │ │ ├── programs.html.96701793.js
│ │ │ │ ├── programs.html.96b262ce.js
│ │ │ │ ├── programs.html.98e92214.js
│ │ │ │ ├── programs.html.98fb8b49.js
│ │ │ │ ├── programs.html.9cdb4de3.js
│ │ │ │ ├── programs.html.a2b54a7a.js
│ │ │ │ ├── programs.html.a673792c.js
│ │ │ │ ├── programs.html.b67b45cc.js
│ │ │ │ ├── programs.html.bc91a8b3.js
│ │ │ │ ├── programs.html.c4b45e07.js
│ │ │ │ ├── programs.html.d01e378b.js
│ │ │ │ ├── programs.html.d0219ea7.js
│ │ │ │ ├── programs.html.d21ae222.js
│ │ │ │ ├── programs.html.d77781f0.js
│ │ │ │ ├── programs.html.d7e559f7.js
│ │ │ │ ├── programs.html.db98f647.js
│ │ │ │ ├── programs.html.dd60d7aa.js
│ │ │ │ ├── programs.html.dec531fb.js
│ │ │ │ ├── programs.html.e8e9b38e.js
│ │ │ │ ├── programs.html.ea9dd7e3.js
│ │ │ │ ├── programs.html.ebf949b0.js
│ │ │ │ ├── programs.html.ee69815a.js
│ │ │ │ ├── programs.html.f54b94ed.js
│ │ │ │ ├── programs.html.f73d3347.js
│ │ │ │ ├── programs.html.fb2104eb.js
│ │ │ │ ├── programs.html.fcfb4c07.js
│ │ │ │ ├── retrying-transactions.html.63745293.js
│ │ │ │ ├── retrying-transactions.html.8880b234.js
│ │ │ │ ├── saving-game-state.html.0656b997.js
│ │ │ │ ├── saving-game-state.html.2ee97311.js
│ │ │ │ ├── saving-game-state.html.40bb41f5.js
│ │ │ │ ├── saving-game-state.html.9d6e5e66.js
│ │ │ │ ├── saving-game-state.html.aa5750ab.js
│ │ │ │ ├── saving-game-state.html.e30bfd02.js
│ │ │ │ ├── serialization.html.0d68a263.js
│ │ │ │ ├── serialization.html.0fd086ee.js
│ │ │ │ ├── serialization.html.279a312f.js
│ │ │ │ ├── serialization.html.32c33a1b.js
│ │ │ │ ├── serialization.html.4b397ef0.js
│ │ │ │ ├── serialization.html.4cfc0d5a.js
│ │ │ │ ├── serialization.html.6a6635c1.js
│ │ │ │ ├── serialization.html.7c84274e.js
│ │ │ │ ├── serialization.html.7fc385dd.js
│ │ │ │ ├── serialization.html.89a2791f.js
│ │ │ │ ├── serialization.html.8a29cfeb.js
│ │ │ │ ├── serialization.html.932862af.js
│ │ │ │ ├── serialization.html.99337bc6.js
│ │ │ │ ├── serialization.html.a08f50dc.js
│ │ │ │ ├── serialization.html.a34c46cf.js
│ │ │ │ ├── serialization.html.a93f580e.js
│ │ │ │ ├── serialization.html.aa4dde2f.js
│ │ │ │ ├── serialization.html.b36b4ad5.js
│ │ │ │ ├── serialization.html.b936ab13.js
│ │ │ │ ├── serialization.html.baac0ece.js
│ │ │ │ ├── serialization.html.bb0b6d3d.js
│ │ │ │ ├── serialization.html.cd6e6685.js
│ │ │ │ ├── serialization.html.d1ade7c6.js
│ │ │ │ ├── serialization.html.d1b35c96.js
│ │ │ │ ├── serialization.html.d3083af5.js
│ │ │ │ ├── serialization.html.f6d36f31.js
│ │ │ │ ├── serialization.html.fc2b2085.js
│ │ │ │ ├── serialization.html.ff6ce54c.js
│ │ │ │ ├── staking.html.04e151a8.js
│ │ │ │ ├── staking.html.0e9ae4bd.js
│ │ │ │ ├── staking.html.0fd3c3b6.js
│ │ │ │ ├── staking.html.122e3dd7.js
│ │ │ │ ├── staking.html.192ee479.js
│ │ │ │ ├── staking.html.420a515f.js
│ │ │ │ ├── staking.html.48d1bd77.js
│ │ │ │ ├── staking.html.4f958a15.js
│ │ │ │ ├── staking.html.59211856.js
│ │ │ │ ├── staking.html.5cf7a6ff.js
│ │ │ │ ├── staking.html.6485c86f.js
│ │ │ │ ├── staking.html.65c2cb9f.js
│ │ │ │ ├── staking.html.6dbe22bd.js
│ │ │ │ ├── staking.html.76101920.js
│ │ │ │ ├── staking.html.79740434.js
│ │ │ │ ├── staking.html.7be45709.js
│ │ │ │ ├── staking.html.87a92c5a.js
│ │ │ │ ├── staking.html.8f95d604.js
│ │ │ │ ├── staking.html.8fb2ba56.js
│ │ │ │ ├── staking.html.9a3a894a.js
│ │ │ │ ├── staking.html.9da955fb.js
│ │ │ │ ├── staking.html.a5ae14b2.js
│ │ │ │ ├── staking.html.ad2f2638.js
│ │ │ │ ├── staking.html.bbc62dff.js
│ │ │ │ ├── staking.html.bbf4c1ac.js
│ │ │ │ ├── staking.html.cffbd136.js
│ │ │ │ ├── staking.html.e8c26eca.js
│ │ │ │ ├── staking.html.f374e09a.js
│ │ │ │ ├── store-sol-in-pda.html.11610e9c.js
│ │ │ │ ├── store-sol-in-pda.html.4ff617de.js
│ │ │ │ ├── store-sol-in-pda.html.9ee3497a.js
│ │ │ │ ├── store-sol-in-pda.html.c79c00ec.js
│ │ │ │ ├── store-sol-in-pda.html.e343d4f5.js
│ │ │ │ ├── store-sol-in-pda.html.e4ee6008.js
│ │ │ │ ├── style.fecd2c41.css
│ │ │ │ ├── token.html.060a50ce.js
│ │ │ │ ├── token.html.0e5aea93.js
│ │ │ │ ├── token.html.12804e59.js
│ │ │ │ ├── token.html.1da2f0eb.js
│ │ │ │ ├── token.html.36202d18.js
│ │ │ │ ├── token.html.3affc20f.js
│ │ │ │ ├── token.html.43db4402.js
│ │ │ │ ├── token.html.495dbb1a.js
│ │ │ │ ├── token.html.59c78a7f.js
│ │ │ │ ├── token.html.5b1ae1a2.js
│ │ │ │ ├── token.html.64ba1d3c.js
│ │ │ │ ├── token.html.77adbbb4.js
│ │ │ │ ├── token.html.7f6e6e11.js
│ │ │ │ ├── token.html.858f2429.js
│ │ │ │ ├── token.html.87c9f9ba.js
│ │ │ │ ├── token.html.997564bc.js
│ │ │ │ ├── token.html.a4239a10.js
│ │ │ │ ├── token.html.abb20884.js
│ │ │ │ ├── token.html.b6c1e5ff.js
│ │ │ │ ├── token.html.c555b525.js
│ │ │ │ ├── token.html.c6b0e0c2.js
│ │ │ │ ├── token.html.cb53fbdc.js
│ │ │ │ ├── token.html.de032bea.js
│ │ │ │ ├── token.html.e135cbcd.js
│ │ │ │ ├── token.html.e2d8e013.js
│ │ │ │ ├── token.html.ea1f1398.js
│ │ │ │ ├── token.html.edd7bd6b.js
│ │ │ │ ├── token.html.edf00ffd.js
│ │ │ │ ├── transactions.html.0168eb8a.js
│ │ │ │ ├── transactions.html.0b44a37d.js
│ │ │ │ ├── transactions.html.188c913a.js
│ │ │ │ ├── transactions.html.1cb6f901.js
│ │ │ │ ├── transactions.html.263aeafa.js
│ │ │ │ ├── transactions.html.46bc8b92.js
│ │ │ │ ├── transactions.html.48ea2bf1.js
│ │ │ │ ├── transactions.html.4904b5fe.js
│ │ │ │ ├── transactions.html.50802ba1.js
│ │ │ │ ├── transactions.html.5f4184a8.js
│ │ │ │ ├── transactions.html.63c9ce66.js
│ │ │ │ ├── transactions.html.73b8d7c4.js
│ │ │ │ ├── transactions.html.74d43318.js
│ │ │ │ ├── transactions.html.8e008dcb.js
│ │ │ │ ├── transactions.html.93abdb49.js
│ │ │ │ ├── transactions.html.999eb3d9.js
│ │ │ │ ├── transactions.html.a1a988c9.js
│ │ │ │ ├── transactions.html.a94c32b0.js
│ │ │ │ ├── transactions.html.aceea138.js
│ │ │ │ ├── transactions.html.b7388dfe.js
│ │ │ │ ├── transactions.html.ba8c17fa.js
│ │ │ │ ├── transactions.html.bc7f0379.js
│ │ │ │ ├── transactions.html.cfd147cc.js
│ │ │ │ ├── transactions.html.e6d9a389.js
│ │ │ │ ├── transactions.html.ee5db7dc.js
│ │ │ │ ├── transactions.html.f33ee4e9.js
│ │ │ │ ├── transactions.html.f505a02d.js
│ │ │ │ ├── transactions.html.f5f36a28.js
│ │ │ │ ├── versioned-transactions.html.027ceb3d.js
│ │ │ │ ├── versioned-transactions.html.1e1e264b.js
│ │ │ │ ├── versioned-transactions.html.1e457979.js
│ │ │ │ ├── versioned-transactions.html.20e4c983.js
│ │ │ │ ├── versioned-transactions.html.5b1ec8d4.js
│ │ │ │ ├── versioned-transactions.html.7131c1ef.js
│ │ │ │ ├── versioned-transactions.html.7972f188.js
│ │ │ │ ├── versioned-transactions.html.82642eca.js
│ │ │ │ ├── versioned-transactions.html.8ddb12df.js
│ │ │ │ ├── versioned-transactions.html.8ea1a104.js
│ │ │ │ ├── versioned-transactions.html.acaac8aa.js
│ │ │ │ ├── versioned-transactions.html.cb88ab6b.js
│ │ │ │ ├── versioned-transactions.html.dc527468.js
│ │ │ │ ├── versioned-transactions.html.dd6b2982.js
│ │ │ │ ├── versioned-transactions.html.e1209342.js
│ │ │ │ └── versioned-transactions.html.f7668ac4.js
│ │ │ ├── core-concepts/
│ │ │ │ ├── accounts.html
│ │ │ │ ├── cpi.html
│ │ │ │ ├── pdas.html
│ │ │ │ ├── programs.html
│ │ │ │ └── transactions.html
│ │ │ ├── de/
│ │ │ │ ├── core-concepts/
│ │ │ │ │ ├── accounts.html
│ │ │ │ │ ├── pdas.html
│ │ │ │ │ ├── programs.html
│ │ │ │ │ └── transactions.html
│ │ │ │ ├── getting-started/
│ │ │ │ │ └── installation.html
│ │ │ │ ├── guides/
│ │ │ │ │ ├── account-maps.html
│ │ │ │ │ ├── data-migration.html
│ │ │ │ │ ├── debugging-solana-programs.html
│ │ │ │ │ ├── feature-parity-testing.html
│ │ │ │ │ ├── get-program-accounts.html
│ │ │ │ │ ├── retrying-transactions.html
│ │ │ │ │ └── serialization.html
│ │ │ │ ├── index.html
│ │ │ │ └── references/
│ │ │ │ ├── accounts.html
│ │ │ │ ├── basic-transactions.html
│ │ │ │ ├── keypairs-and-wallets.html
│ │ │ │ ├── local-development.html
│ │ │ │ ├── name-service.html
│ │ │ │ ├── nfts.html
│ │ │ │ ├── offline-transactions.html
│ │ │ │ ├── programs.html
│ │ │ │ ├── staking.html
│ │ │ │ └── token.html
│ │ │ ├── es/
│ │ │ │ ├── core-concepts/
│ │ │ │ │ ├── accounts.html
│ │ │ │ │ ├── pdas.html
│ │ │ │ │ ├── programs.html
│ │ │ │ │ └── transactions.html
│ │ │ │ ├── getting-started/
│ │ │ │ │ └── installation.html
│ │ │ │ ├── guides/
│ │ │ │ │ ├── account-maps.html
│ │ │ │ │ ├── data-migration.html
│ │ │ │ │ ├── debugging-solana-programs.html
│ │ │ │ │ ├── feature-parity-testing.html
│ │ │ │ │ ├── get-program-accounts.html
│ │ │ │ │ └── serialization.html
│ │ │ │ ├── index.html
│ │ │ │ └── references/
│ │ │ │ ├── accounts.html
│ │ │ │ ├── basic-transactions.html
│ │ │ │ ├── keypairs-and-wallets.html
│ │ │ │ ├── local-development.html
│ │ │ │ ├── name-service.html
│ │ │ │ ├── nfts.html
│ │ │ │ ├── offline-transactions.html
│ │ │ │ ├── programs.html
│ │ │ │ ├── staking.html
│ │ │ │ └── token.html
│ │ │ ├── fil/
│ │ │ │ ├── core-concepts/
│ │ │ │ │ ├── accounts.html
│ │ │ │ │ ├── cpi.html
│ │ │ │ │ ├── pdas.html
│ │ │ │ │ ├── programs.html
│ │ │ │ │ └── transactions.html
│ │ │ │ ├── gaming/
│ │ │ │ │ ├── auto-approve.html
│ │ │ │ │ ├── distribution.html
│ │ │ │ │ ├── energy-system.html
│ │ │ │ │ ├── game-examples.html
│ │ │ │ │ ├── game-sdks.html
│ │ │ │ │ ├── hello-world.html
│ │ │ │ │ ├── interact-with-tokens.html
│ │ │ │ │ ├── intro.html
│ │ │ │ │ ├── nfts-in-games.html
│ │ │ │ │ ├── porting-anchor-to-unity.html
│ │ │ │ │ ├── saving-game-state.html
│ │ │ │ │ └── store-sol-in-pda.html
│ │ │ │ ├── getting-started/
│ │ │ │ │ └── installation.html
│ │ │ │ ├── guides/
│ │ │ │ │ ├── account-maps.html
│ │ │ │ │ ├── data-migration.html
│ │ │ │ │ ├── debugging-solana-programs.html
│ │ │ │ │ ├── feature-parity-testing.html
│ │ │ │ │ ├── get-program-accounts.html
│ │ │ │ │ ├── serialization.html
│ │ │ │ │ └── versioned-transactions.html
│ │ │ │ ├── index.html
│ │ │ │ └── references/
│ │ │ │ ├── accounts.html
│ │ │ │ ├── basic-transactions.html
│ │ │ │ ├── keypairs-and-wallets.html
│ │ │ │ ├── local-development.html
│ │ │ │ ├── name-service.html
│ │ │ │ ├── nfts.html
│ │ │ │ ├── offline-transactions.html
│ │ │ │ ├── programs.html
│ │ │ │ ├── staking.html
│ │ │ │ └── token.html
│ │ │ ├── fr/
│ │ │ │ ├── core-concepts/
│ │ │ │ │ ├── accounts.html
│ │ │ │ │ ├── cpi.html
│ │ │ │ │ ├── pdas.html
│ │ │ │ │ ├── programs.html
│ │ │ │ │ └── transactions.html
│ │ │ │ ├── gaming/
│ │ │ │ │ ├── auto-approve.html
│ │ │ │ │ ├── distribution.html
│ │ │ │ │ ├── energy-system.html
│ │ │ │ │ ├── game-examples.html
│ │ │ │ │ ├── game-sdks.html
│ │ │ │ │ ├── hello-world.html
│ │ │ │ │ ├── interact-with-tokens.html
│ │ │ │ │ ├── intro.html
│ │ │ │ │ ├── nfts-in-games.html
│ │ │ │ │ ├── porting-anchor-to-unity.html
│ │ │ │ │ ├── saving-game-state.html
│ │ │ │ │ └── store-sol-in-pda.html
│ │ │ │ ├── getting-started/
│ │ │ │ │ └── installation.html
│ │ │ │ ├── guides/
│ │ │ │ │ ├── account-maps.html
│ │ │ │ │ ├── data-migration.html
│ │ │ │ │ ├── debugging-solana-programs.html
│ │ │ │ │ ├── feature-parity-testing.html
│ │ │ │ │ ├── get-program-accounts.html
│ │ │ │ │ ├── serialization.html
│ │ │ │ │ └── versioned-transactions.html
│ │ │ │ ├── index.html
│ │ │ │ └── references/
│ │ │ │ ├── accounts.html
│ │ │ │ ├── basic-transactions.html
│ │ │ │ ├── keypairs-and-wallets.html
│ │ │ │ ├── local-development.html
│ │ │ │ ├── name-service.html
│ │ │ │ ├── nfts.html
│ │ │ │ ├── offline-transactions.html
│ │ │ │ ├── programs.html
│ │ │ │ ├── staking.html
│ │ │ │ └── token.html
│ │ │ ├── gaming/
│ │ │ │ ├── auto-approve.html
│ │ │ │ ├── distribution.html
│ │ │ │ ├── energy-system.html
│ │ │ │ ├── game-examples.html
│ │ │ │ ├── game-sdks.html
│ │ │ │ ├── hello-world.html
│ │ │ │ ├── interact-with-tokens.html
│ │ │ │ ├── intro.html
│ │ │ │ ├── nfts-in-games.html
│ │ │ │ ├── porting-anchor-to-unity.html
│ │ │ │ ├── saving-game-state.html
│ │ │ │ └── store-sol-in-pda.html
│ │ │ ├── getting-started/
│ │ │ │ └── installation.html
│ │ │ ├── guides/
│ │ │ │ ├── account-maps.html
│ │ │ │ ├── data-migration.html
│ │ │ │ ├── debugging-solana-programs.html
│ │ │ │ ├── feature-parity-testing.html
│ │ │ │ ├── get-program-accounts.html
│ │ │ │ ├── serialization.html
│ │ │ │ └── versioned-transactions.html
│ │ │ ├── id/
│ │ │ │ ├── core-concepts/
│ │ │ │ │ ├── accounts.html
│ │ │ │ │ ├── pdas.html
│ │ │ │ │ ├── programs.html
│ │ │ │ │ └── transactions.html
│ │ │ │ ├── getting-started/
│ │ │ │ │ └── installation.html
│ │ │ │ ├── guides/
│ │ │ │ │ ├── account-maps.html
│ │ │ │ │ ├── data-migration.html
│ │ │ │ │ ├── debugging-solana-programs.html
│ │ │ │ │ ├── feature-parity-testing.html
│ │ │ │ │ ├── get-program-accounts.html
│ │ │ │ │ └── serialization.html
│ │ │ │ ├── index.html
│ │ │ │ └── references/
│ │ │ │ ├── accounts.html
│ │ │ │ ├── basic-transactions.html
│ │ │ │ ├── keypairs-and-wallets.html
│ │ │ │ ├── local-development.html
│ │ │ │ ├── name-service.html
│ │ │ │ ├── nfts.html
│ │ │ │ ├── offline-transactions.html
│ │ │ │ ├── programs.html
│ │ │ │ ├── staking.html
│ │ │ │ └── token.html
│ │ │ ├── index.html
│ │ │ ├── ja/
│ │ │ │ ├── core-concepts/
│ │ │ │ │ ├── accounts.html
│ │ │ │ │ ├── cpi.html
│ │ │ │ │ ├── pdas.html
│ │ │ │ │ ├── programs.html
│ │ │ │ │ └── transactions.html
│ │ │ │ ├── getting-started/
│ │ │ │ │ └── installation.html
│ │ │ │ ├── guides/
│ │ │ │ │ ├── account-maps.html
│ │ │ │ │ ├── data-migration.html
│ │ │ │ │ ├── debugging-solana-programs.html
│ │ │ │ │ ├── feature-parity-testing.html
│ │ │ │ │ ├── get-program-accounts.html
│ │ │ │ │ ├── serialization.html
│ │ │ │ │ └── versioned-transactions.html
│ │ │ │ ├── index.html
│ │ │ │ └── references/
│ │ │ │ ├── accounts.html
│ │ │ │ ├── basic-transactions.html
│ │ │ │ ├── keypairs-and-wallets.html
│ │ │ │ ├── local-development.html
│ │ │ │ ├── name-service.html
│ │ │ │ ├── nfts.html
│ │ │ │ ├── offline-transactions.html
│ │ │ │ ├── programs.html
│ │ │ │ ├── staking.html
│ │ │ │ └── token.html
│ │ │ ├── kr/
│ │ │ │ ├── core-concepts/
│ │ │ │ │ ├── accounts.html
│ │ │ │ │ ├── pdas.html
│ │ │ │ │ ├── programs.html
│ │ │ │ │ └── transactions.html
│ │ │ │ ├── getting-started/
│ │ │ │ │ └── installation.html
│ │ │ │ ├── guides/
│ │ │ │ │ ├── account-maps.html
│ │ │ │ │ ├── data-migration.html
│ │ │ │ │ ├── debugging-solana-programs.html
│ │ │ │ │ ├── feature-parity-testing.html
│ │ │ │ │ ├── get-program-accounts.html
│ │ │ │ │ └── serialization.html
│ │ │ │ ├── index.html
│ │ │ │ └── references/
│ │ │ │ ├── accounts.html
│ │ │ │ ├── basic-transactions.html
│ │ │ │ ├── keypairs-and-wallets.html
│ │ │ │ ├── local-development.html
│ │ │ │ ├── name-service.html
│ │ │ │ ├── nfts.html
│ │ │ │ ├── offline-transactions.html
│ │ │ │ ├── programs.html
│ │ │ │ ├── staking.html
│ │ │ │ └── token.html
│ │ │ ├── pt/
│ │ │ │ ├── core-concepts/
│ │ │ │ │ ├── accounts.html
│ │ │ │ │ ├── cpi.html
│ │ │ │ │ ├── pdas.html
│ │ │ │ │ ├── programs.html
│ │ │ │ │ └── transactions.html
│ │ │ │ ├── getting-started/
│ │ │ │ │ └── installation.html
│ │ │ │ ├── guides/
│ │ │ │ │ ├── account-maps.html
│ │ │ │ │ ├── data-migration.html
│ │ │ │ │ ├── debugging-solana-programs.html
│ │ │ │ │ ├── feature-parity-testing.html
│ │ │ │ │ ├── get-program-accounts.html
│ │ │ │ │ ├── serialization.html
│ │ │ │ │ └── versioned-transactions.html
│ │ │ │ ├── index.html
│ │ │ │ └── references/
│ │ │ │ ├── accounts.html
│ │ │ │ ├── basic-transactions.html
│ │ │ │ ├── keypairs-and-wallets.html
│ │ │ │ ├── local-development.html
│ │ │ │ ├── name-service.html
│ │ │ │ ├── nfts.html
│ │ │ │ ├── offline-transactions.html
│ │ │ │ ├── programs.html
│ │ │ │ ├── staking.html
│ │ │ │ └── token.html
│ │ │ ├── references/
│ │ │ │ ├── accounts.html
│ │ │ │ ├── basic-transactions.html
│ │ │ │ ├── keypairs-and-wallets.html
│ │ │ │ ├── local-development.html
│ │ │ │ ├── name-service.html
│ │ │ │ ├── nfts.html
│ │ │ │ ├── offline-transactions.html
│ │ │ │ ├── programs.html
│ │ │ │ ├── staking.html
│ │ │ │ └── token.html
│ │ │ ├── th/
│ │ │ │ ├── core-concepts/
│ │ │ │ │ ├── accounts.html
│ │ │ │ │ ├── pdas.html
│ │ │ │ │ ├── programs.html
│ │ │ │ │ └── transactions.html
│ │ │ │ ├── getting-started/
│ │ │ │ │ └── installation.html
│ │ │ │ ├── guides/
│ │ │ │ │ ├── account-maps.html
│ │ │ │ │ ├── data-migration.html
│ │ │ │ │ ├── debugging-solana-programs.html
│ │ │ │ │ ├── feature-parity-testing.html
│ │ │ │ │ ├── get-program-accounts.html
│ │ │ │ │ ├── serialization.html
│ │ │ │ │ └── versioned-transactions.html
│ │ │ │ ├── index.html
│ │ │ │ └── references/
│ │ │ │ ├── accounts.html
│ │ │ │ ├── basic-transactions.html
│ │ │ │ ├── keypairs-and-wallets.html
│ │ │ │ ├── local-development.html
│ │ │ │ ├── name-service.html
│ │ │ │ ├── nfts.html
│ │ │ │ ├── offline-transactions.html
│ │ │ │ ├── programs.html
│ │ │ │ ├── staking.html
│ │ │ │ └── token.html
│ │ │ ├── tr/
│ │ │ │ ├── core-concepts/
│ │ │ │ │ ├── accounts.html
│ │ │ │ │ ├── pdas.html
│ │ │ │ │ ├── programs.html
│ │ │ │ │ └── transactions.html
│ │ │ │ ├── getting-started/
│ │ │ │ │ └── installation.html
│ │ │ │ ├── guides/
│ │ │ │ │ ├── account-maps.html
│ │ │ │ │ ├── data-migration.html
│ │ │ │ │ ├── debugging-solana-programs.html
│ │ │ │ │ ├── feature-parity-testing.html
│ │ │ │ │ ├── get-program-accounts.html
│ │ │ │ │ └── serialization.html
│ │ │ │ ├── index.html
│ │ │ │ └── references/
│ │ │ │ ├── accounts.html
│ │ │ │ ├── basic-transactions.html
│ │ │ │ ├── keypairs-and-wallets.html
│ │ │ │ ├── local-development.html
│ │ │ │ ├── name-service.html
│ │ │ │ ├── nfts.html
│ │ │ │ ├── offline-transactions.html
│ │ │ │ ├── programs.html
│ │ │ │ ├── staking.html
│ │ │ │ └── token.html
│ │ │ ├── vi/
│ │ │ │ ├── core-concepts/
│ │ │ │ │ ├── accounts.html
│ │ │ │ │ ├── pdas.html
│ │ │ │ │ ├── programs.html
│ │ │ │ │ └── transactions.html
│ │ │ │ ├── getting-started/
│ │ │ │ │ └── installation.html
│ │ │ │ ├── guides/
│ │ │ │ │ ├── account-maps.html
│ │ │ │ │ ├── data-migration.html
│ │ │ │ │ ├── debugging-solana-programs.html
│ │ │ │ │ ├── feature-parity-testing.html
│ │ │ │ │ ├── get-program-accounts.html
│ │ │ │ │ └── serialization.html
│ │ │ │ ├── index.html
│ │ │ │ └── references/
│ │ │ │ ├── accounts.html
│ │ │ │ ├── basic-transactions.html
│ │ │ │ ├── keypairs-and-wallets.html
│ │ │ │ ├── local-development.html
│ │ │ │ ├── name-service.html
│ │ │ │ ├── nfts.html
│ │ │ │ ├── offline-transactions.html
│ │ │ │ ├── programs.html
│ │ │ │ ├── staking.html
│ │ │ │ └── token.html
│ │ │ ├── zh/
│ │ │ │ ├── core-concepts/
│ │ │ │ │ ├── accounts.html
│ │ │ │ │ ├── pdas.html
│ │ │ │ │ ├── programs.html
│ │ │ │ │ └── transactions.html
│ │ │ │ ├── getting-started/
│ │ │ │ │ └── installation.html
│ │ │ │ ├── guides/
│ │ │ │ │ ├── account-maps.html
│ │ │ │ │ ├── data-migration.html
│ │ │ │ │ ├── debugging-solana-programs.html
│ │ │ │ │ ├── feature-parity-testing.html
│ │ │ │ │ ├── get-program-accounts.html
│ │ │ │ │ ├── serialization.html
│ │ │ │ │ └── versioned-transactions.html
│ │ │ │ ├── index.html
│ │ │ │ └── references/
│ │ │ │ ├── accounts.html
│ │ │ │ ├── basic-transactions.html
│ │ │ │ ├── keypairs-and-wallets.html
│ │ │ │ ├── local-development.html
│ │ │ │ ├── name-service.html
│ │ │ │ ├── nfts.html
│ │ │ │ ├── offline-transactions.html
│ │ │ │ ├── programs.html
│ │ │ │ ├── staking.html
│ │ │ │ └── token.html
│ │ │ └── zh_t/
│ │ │ ├── core-concepts/
│ │ │ │ ├── accounts.html
│ │ │ │ ├── pdas.html
│ │ │ │ ├── programs.html
│ │ │ │ └── transactions.html
│ │ │ ├── getting-started/
│ │ │ │ └── installation.html
│ │ │ ├── guides/
│ │ │ │ ├── account-maps.html
│ │ │ │ ├── data-migration.html
│ │ │ │ ├── debugging-solana-programs.html
│ │ │ │ ├── feature-parity-testing.html
│ │ │ │ ├── get-program-accounts.html
│ │ │ │ ├── serialization.html
│ │ │ │ └── versioned-transactions.html
│ │ │ ├── index.html
│ │ │ └── references/
│ │ │ ├── accounts.html
│ │ │ ├── basic-transactions.html
│ │ │ ├── keypairs-and-wallets.html
│ │ │ ├── local-development.html
│ │ │ ├── name-service.html
│ │ │ ├── nfts.html
│ │ │ ├── offline-transactions.html
│ │ │ ├── programs.html
│ │ │ ├── staking.html
│ │ │ └── token.html
│ │ └── styles/
│ │ └── index.scss
│ ├── README.md
│ ├── core-concepts/
│ │ ├── accounts.md
│ │ ├── cpi.md
│ │ ├── pdas.md
│ │ ├── programs.md
│ │ └── transactions.md
│ ├── de/
│ │ ├── README.md
│ │ ├── core-concepts/
│ │ │ ├── accounts.md
│ │ │ ├── pdas.md
│ │ │ ├── programs.md
│ │ │ └── transactions.md
│ │ ├── getting-started/
│ │ │ └── installation.md
│ │ ├── guides/
│ │ │ ├── account-maps.md
│ │ │ ├── data-migration.md
│ │ │ ├── debugging-solana-programs.md
│ │ │ ├── feature-parity-testing.md
│ │ │ ├── get-program-accounts.md
│ │ │ ├── retrying-transactions.md
│ │ │ └── serialization.md
│ │ └── references/
│ │ ├── accounts.md
│ │ ├── basic-transactions.md
│ │ ├── keypairs-and-wallets.md
│ │ ├── local-development.md
│ │ ├── name-service.md
│ │ ├── nfts.md
│ │ ├── offline-transactions.md
│ │ ├── programs.md
│ │ ├── staking.md
│ │ └── token.md
│ ├── es/
│ │ ├── README.md
│ │ ├── core-concepts/
│ │ │ ├── accounts.md
│ │ │ ├── pdas.md
│ │ │ ├── programs.md
│ │ │ └── transactions.md
│ │ ├── getting-started/
│ │ │ └── installation.md
│ │ ├── guides/
│ │ │ ├── account-maps.md
│ │ │ ├── data-migration.md
│ │ │ ├── debugging-solana-programs.md
│ │ │ ├── feature-parity-testing.md
│ │ │ ├── get-program-accounts.md
│ │ │ └── serialization.md
│ │ └── references/
│ │ ├── accounts.md
│ │ ├── basic-transactions.md
│ │ ├── keypairs-and-wallets.md
│ │ ├── local-development.md
│ │ ├── name-service.md
│ │ ├── nfts.md
│ │ ├── offline-transactions.md
│ │ ├── programs.md
│ │ ├── staking.md
│ │ └── token.md
│ ├── fil/
│ │ ├── README.md
│ │ ├── core-concepts/
│ │ │ ├── accounts.md
│ │ │ ├── cpi.md
│ │ │ ├── pdas.md
│ │ │ ├── programs.md
│ │ │ └── transactions.md
│ │ ├── gaming/
│ │ │ ├── auto-approve.md
│ │ │ ├── distribution.md
│ │ │ ├── energy-system.md
│ │ │ ├── game-examples.md
│ │ │ ├── game-sdks.md
│ │ │ ├── hello-world.md
│ │ │ ├── interact-with-tokens.md
│ │ │ ├── intro.md
│ │ │ ├── nfts-in-games.md
│ │ │ ├── porting-anchor-to-unity.md
│ │ │ ├── saving-game-state.md
│ │ │ └── store-sol-in-pda.md
│ │ ├── getting-started/
│ │ │ └── installation.md
│ │ ├── guides/
│ │ │ ├── account-maps.md
│ │ │ ├── data-migration.md
│ │ │ ├── debugging-solana-programs.md
│ │ │ ├── feature-parity-testing.md
│ │ │ ├── get-program-accounts.md
│ │ │ ├── serialization.md
│ │ │ └── versioned-transactions.md
│ │ └── references/
│ │ ├── accounts.md
│ │ ├── basic-transactions.md
│ │ ├── keypairs-and-wallets.md
│ │ ├── local-development.md
│ │ ├── name-service.md
│ │ ├── nfts.md
│ │ ├── offline-transactions.md
│ │ ├── programs.md
│ │ ├── staking.md
│ │ └── token.md
│ ├── fr/
│ │ ├── README.md
│ │ ├── core-concepts/
│ │ │ ├── accounts.md
│ │ │ ├── cpi.md
│ │ │ ├── pdas.md
│ │ │ ├── programs.md
│ │ │ └── transactions.md
│ │ ├── gaming/
│ │ │ ├── auto-approve.md
│ │ │ ├── distribution.md
│ │ │ ├── energy-system.md
│ │ │ ├── game-examples.md
│ │ │ ├── game-sdks.md
│ │ │ ├── hello-world.md
│ │ │ ├── interact-with-tokens.md
│ │ │ ├── intro.md
│ │ │ ├── nfts-in-games.md
│ │ │ ├── porting-anchor-to-unity.md
│ │ │ ├── saving-game-state.md
│ │ │ └── store-sol-in-pda.md
│ │ ├── getting-started/
│ │ │ └── installation.md
│ │ ├── guides/
│ │ │ ├── account-maps.md
│ │ │ ├── data-migration.md
│ │ │ ├── debugging-solana-programs.md
│ │ │ ├── feature-parity-testing.md
│ │ │ ├── get-program-accounts.md
│ │ │ ├── serialization.md
│ │ │ └── versioned-transactions.md
│ │ └── references/
│ │ ├── accounts.md
│ │ ├── basic-transactions.md
│ │ ├── keypairs-and-wallets.md
│ │ ├── local-development.md
│ │ ├── name-service.md
│ │ ├── nfts.md
│ │ ├── offline-transactions.md
│ │ ├── programs.md
│ │ ├── staking.md
│ │ └── token.md
│ ├── gaming/
│ │ ├── auto-approve.md
│ │ ├── distribution.md
│ │ ├── energy-system.md
│ │ ├── game-examples.md
│ │ ├── game-sdks.md
│ │ ├── hello-world.md
│ │ ├── interact-with-tokens.md
│ │ ├── intro.md
│ │ ├── nfts-in-games.md
│ │ ├── porting-anchor-to-unity.md
│ │ ├── saving-game-state.md
│ │ └── store-sol-in-pda.md
│ ├── getting-started/
│ │ └── installation.md
│ ├── guides/
│ │ ├── account-maps.md
│ │ ├── data-migration.md
│ │ ├── debugging-solana-programs.md
│ │ ├── feature-parity-testing.md
│ │ ├── get-program-accounts.md
│ │ ├── serialization.md
│ │ └── versioned-transactions.md
│ ├── id/
│ │ ├── README.md
│ │ ├── core-concepts/
│ │ │ ├── accounts.md
│ │ │ ├── pdas.md
│ │ │ ├── programs.md
│ │ │ └── transactions.md
│ │ ├── getting-started/
│ │ │ └── installation.md
│ │ ├── guides/
│ │ │ ├── account-maps.md
│ │ │ ├── data-migration.md
│ │ │ ├── debugging-solana-programs.md
│ │ │ ├── feature-parity-testing.md
│ │ │ ├── get-program-accounts.md
│ │ │ └── serialization.md
│ │ └── references/
│ │ ├── accounts.md
│ │ ├── basic-transactions.md
│ │ ├── keypairs-and-wallets.md
│ │ ├── local-development.md
│ │ ├── name-service.md
│ │ ├── nfts.md
│ │ ├── offline-transactions.md
│ │ ├── programs.md
│ │ ├── staking.md
│ │ └── token.md
│ ├── ja/
│ │ ├── README.md
│ │ ├── core-concepts/
│ │ │ ├── accounts.md
│ │ │ ├── cpi.md
│ │ │ ├── pdas.md
│ │ │ ├── programs.md
│ │ │ └── transactions.md
│ │ ├── getting-started/
│ │ │ └── installation.md
│ │ ├── guides/
│ │ │ ├── account-maps.md
│ │ │ ├── data-migration.md
│ │ │ ├── debugging-solana-programs.md
│ │ │ ├── feature-parity-testing.md
│ │ │ ├── get-program-accounts.md
│ │ │ ├── serialization.md
│ │ │ └── versioned-transactions.md
│ │ └── references/
│ │ ├── accounts.md
│ │ ├── basic-transactions.md
│ │ ├── keypairs-and-wallets.md
│ │ ├── local-development.md
│ │ ├── name-service.md
│ │ ├── nfts.md
│ │ ├── offline-transactions.md
│ │ ├── programs.md
│ │ ├── staking.md
│ │ └── token.md
│ ├── kr/
│ │ ├── README.md
│ │ ├── core-concepts/
│ │ │ ├── accounts.md
│ │ │ ├── pdas.md
│ │ │ ├── programs.md
│ │ │ └── transactions.md
│ │ ├── getting-started/
│ │ │ └── installation.md
│ │ ├── guides/
│ │ │ ├── account-maps.md
│ │ │ ├── data-migration.md
│ │ │ ├── debugging-solana-programs.md
│ │ │ ├── feature-parity-testing.md
│ │ │ ├── get-program-accounts.md
│ │ │ └── serialization.md
│ │ └── references/
│ │ ├── accounts.md
│ │ ├── basic-transactions.md
│ │ ├── keypairs-and-wallets.md
│ │ ├── local-development.md
│ │ ├── name-service.md
│ │ ├── nfts.md
│ │ ├── offline-transactions.md
│ │ ├── programs.md
│ │ ├── staking.md
│ │ └── token.md
│ ├── pt/
│ │ ├── README.md
│ │ ├── core-concepts/
│ │ │ ├── accounts.md
│ │ │ ├── cpi.md
│ │ │ ├── pdas.md
│ │ │ ├── programs.md
│ │ │ └── transactions.md
│ │ ├── getting-started/
│ │ │ └── installation.md
│ │ ├── guides/
│ │ │ ├── account-maps.md
│ │ │ ├── data-migration.md
│ │ │ ├── debugging-solana-programs.md
│ │ │ ├── feature-parity-testing.md
│ │ │ ├── get-program-accounts.md
│ │ │ ├── serialization.md
│ │ │ └── versioned-transactions.md
│ │ └── references/
│ │ ├── accounts.md
│ │ ├── basic-transactions.md
│ │ ├── keypairs-and-wallets.md
│ │ ├── local-development.md
│ │ ├── name-service.md
│ │ ├── nfts.md
│ │ ├── offline-transactions.md
│ │ ├── programs.md
│ │ ├── staking.md
│ │ └── token.md
│ ├── references/
│ │ ├── accounts.md
│ │ ├── basic-transactions.md
│ │ ├── keypairs-and-wallets.md
│ │ ├── local-development.md
│ │ ├── name-service.md
│ │ ├── nfts.md
│ │ ├── offline-transactions.md
│ │ ├── programs.md
│ │ ├── staking.md
│ │ └── token.md
│ ├── th/
│ │ ├── README.md
│ │ ├── core-concepts/
│ │ │ ├── accounts.md
│ │ │ ├── pdas.md
│ │ │ ├── programs.md
│ │ │ └── transactions.md
│ │ ├── getting-started/
│ │ │ └── installation.md
│ │ ├── guides/
│ │ │ ├── account-maps.md
│ │ │ ├── data-migration.md
│ │ │ ├── debugging-solana-programs.md
│ │ │ ├── feature-parity-testing.md
│ │ │ ├── get-program-accounts.md
│ │ │ ├── serialization.md
│ │ │ └── versioned-transactions.md
│ │ └── references/
│ │ ├── accounts.md
│ │ ├── basic-transactions.md
│ │ ├── keypairs-and-wallets.md
│ │ ├── local-development.md
│ │ ├── name-service.md
│ │ ├── nfts.md
│ │ ├── offline-transactions.md
│ │ ├── programs.md
│ │ ├── staking.md
│ │ └── token.md
│ ├── tr/
│ │ ├── README.md
│ │ ├── core-concepts/
│ │ │ ├── accounts.md
│ │ │ ├── pdas.md
│ │ │ ├── programs.md
│ │ │ └── transactions.md
│ │ ├── getting-started/
│ │ │ └── installation.md
│ │ ├── guides/
│ │ │ ├── account-maps.md
│ │ │ ├── data-migration.md
│ │ │ ├── debugging-solana-programs.md
│ │ │ ├── feature-parity-testing.md
│ │ │ ├── get-program-accounts.md
│ │ │ └── serialization.md
│ │ └── references/
│ │ ├── accounts.md
│ │ ├── basic-transactions.md
│ │ ├── keypairs-and-wallets.md
│ │ ├── local-development.md
│ │ ├── name-service.md
│ │ ├── nfts.md
│ │ ├── offline-transactions.md
│ │ ├── programs.md
│ │ ├── staking.md
│ │ └── token.md
│ ├── vi/
│ │ ├── README.md
│ │ ├── core-concepts/
│ │ │ ├── accounts.md
│ │ │ ├── pdas.md
│ │ │ ├── programs.md
│ │ │ └── transactions.md
│ │ ├── getting-started/
│ │ │ └── installation.md
│ │ ├── guides/
│ │ │ ├── account-maps.md
│ │ │ ├── data-migration.md
│ │ │ ├── debugging-solana-programs.md
│ │ │ ├── feature-parity-testing.md
│ │ │ ├── get-program-accounts.md
│ │ │ └── serialization.md
│ │ └── references/
│ │ ├── accounts.md
│ │ ├── basic-transactions.md
│ │ ├── keypairs-and-wallets.md
│ │ ├── local-development.md
│ │ ├── name-service.md
│ │ ├── nfts.md
│ │ ├── offline-transactions.md
│ │ ├── programs.md
│ │ ├── staking.md
│ │ └── token.md
│ ├── zh/
│ │ ├── README.md
│ │ ├── core-concepts/
│ │ │ ├── accounts.md
│ │ │ ├── pdas.md
│ │ │ ├── programs.md
│ │ │ └── transactions.md
│ │ ├── getting-started/
│ │ │ └── installation.md
│ │ ├── guides/
│ │ │ ├── account-maps.md
│ │ │ ├── data-migration.md
│ │ │ ├── debugging-solana-programs.md
│ │ │ ├── feature-parity-testing.md
│ │ │ ├── get-program-accounts.md
│ │ │ ├── serialization.md
│ │ │ └── versioned-transactions.md
│ │ └── references/
│ │ ├── accounts.md
│ │ ├── basic-transactions.md
│ │ ├── keypairs-and-wallets.md
│ │ ├── local-development.md
│ │ ├── name-service.md
│ │ ├── nfts.md
│ │ ├── offline-transactions.md
│ │ ├── programs.md
│ │ ├── staking.md
│ │ └── token.md
│ └── zh_t/
│ ├── README.md
│ ├── core-concepts/
│ │ ├── accounts.md
│ │ ├── pdas.md
│ │ ├── programs.md
│ │ └── transactions.md
│ ├── getting-started/
│ │ └── installation.md
│ ├── guides/
│ │ ├── account-maps.md
│ │ ├── data-migration.md
│ │ ├── debugging-solana-programs.md
│ │ ├── feature-parity-testing.md
│ │ ├── get-program-accounts.md
│ │ ├── serialization.md
│ │ └── versioned-transactions.md
│ └── references/
│ ├── accounts.md
│ ├── basic-transactions.md
│ ├── keypairs-and-wallets.md
│ ├── local-development.md
│ ├── name-service.md
│ ├── nfts.md
│ ├── offline-transactions.md
│ ├── programs.md
│ ├── staking.md
│ └── token.md
├── package.json
├── requirements.txt
└── vercel.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .ci/.exclude_files
================================================
.venv/*
hello.py
.ci/scripts.py
code/nfts/upload-arweave/upload-arweave.en.py
code/local-development/airdropping-sol/airdropping-sol.en.py
code/basic-transactions/sending-sol/sending-sol.en.py
code/local-development/connecting-websocket/connecting-websocket.en.py
code/anchor/testing-with-anchor/client/testing_with_anchor.py
code/keypairs-and-wallets/vanity-publickeys/vanity-publickeys.en.py
code/serialization/clientdata/python.client.data.py
code/serialization/primitives/python.demo_primitives.py
code/serialization/instruction/python.client.py
code/local-development/connecting-cluster/connecting-cluster.en.py
code/local-development/connecting-private-cluster/connecting-private-cluster.en.py
================================================
FILE: .ci/scripts.py
================================================
import os
import re
import subprocess
from concurrent.futures import ThreadPoolExecutor
exclude_file = '.ci/.exclude_files'
root_dir = os.path.curdir
with open(exclude_file, 'r') as f:
exclude_patterns = [re.compile(line.strip()) for line in f.readlines()]
def find_py_files(root_dir, exclude_patterns):
py_files = []
for root, dirs, files in os.walk(root_dir):
for file in files:
file_path = os.path.join(root, file)
relative_path = os.path.relpath(file_path, root_dir)
if file.endswith('.py') and ".preview." not in file:
ignore_file = any(pattern.search(relative_path) for pattern in exclude_patterns)
if not ignore_file:
py_files.append(relative_path)
return py_files
def execute_file(file_path):
result = subprocess.run(['python', file_path], capture_output=True, text=True)
return result.stdout, result.stderr, file_path
def main():
files_to_execute = find_py_files(root_dir, exclude_patterns)
print("Executing these python files:")
print("\n".join(files_to_execute))
with ThreadPoolExecutor() as executor:
futures = [executor.submit(execute_file, file) for file in files_to_execute]
for future in futures:
stdout, stderr, file_path = future.result()
print(f'\nExecuting {file_path}:\n\n Output: \n\r {stdout}')
if stderr:
print(f'\nError from {file_path}:\n\n Error: {stderr}')
if __name__ == "__main__":
main()
================================================
FILE: .devcontainer/Dockerfile
================================================
# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.209.3/containers/typescript-node/.devcontainer/base.Dockerfile
# [Choice] Node.js version (use -bullseye variants on local arm64/Apple Silicon): 16, 14, 12, 16-bullseye, 14-bullseye, 12-bullseye, 16-buster, 14-buster, 12-buster
ARG VARIANT="16-buster"
FROM mcr.microsoft.com/vscode/devcontainers/typescript-node:0-${VARIANT}
# [Optional] Uncomment this section to install additional OS packages.
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
# && apt-get -y install --no-install-recommends <your-package-list-here>
# [Optional] Uncomment if you want to install an additional version of node using nvm
# ARG EXTRA_NODE_VERSION=10
# RUN su node -c "source /usr/local/share/nvm/nvm.sh && nvm install ${EXTRA_NODE_VERSION}"
# [Optional] Uncomment if you want to install more global node packages
# RUN su node -c "npm install -g <your-package-list -here>"
================================================
FILE: .devcontainer/devcontainer.json
================================================
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.209.3/containers/typescript-node
{
"name": "Node.js & TypeScript",
"build": {
"dockerfile": "Dockerfile",
// Update 'VARIANT' to pick a Node version: 16, 14, 12.
// Append -bullseye or -buster to pin to an OS version.
// Use -bullseye variants on local on arm64/Apple Silicon.
"args": {
"VARIANT": "16-buster"
}
},
// Set *default* container specific settings.json values on container create.
"settings": {},
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"dbaeumer.vscode-eslint"
],
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "yarn install",
// Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "node"
}
================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: npm
directory: "/"
schedule:
interval: daily
time: "01:00"
timezone: America/Los_Angeles
labels:
- "automerge"
commit-message:
prefix: "chore:"
include: "scope"
open-pull-requests-limit: 3
================================================
FILE: .github/workflows/python.yml
================================================
name: Test Python Files
on:
schedule:
- cron: "0 0 * * *"
push:
branches:
- master
pull_request:
types: [opened, synchronize, reopened]
branches:
- master
jobs:
run-py:
strategy:
matrix:
py-version: [3.9]
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: ${{matrix.py-version}}
cache: pip
- name: Create, activate virtual environment and Install dependencies
run: |
python -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt --upgrade pip
echo "$VIRTUAL_ENV/bin" >> $GITHUB_PATH
echo "VIRTUAL_ENV=$VIRTUAL_ENV" >> $GITHUB_ENV
- name: Run python files
run: |
source .venv/bin/activate
python .ci/scripts.py
================================================
FILE: .gitignore
================================================
node_modules
.temp
.cache
.idea
.DS_Store
**/*/target
.vscode
.history
.venv
================================================
FILE: .husky/.gitignore
================================================
_
================================================
FILE: .husky/pre-commit
================================================
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx lint-staged
================================================
FILE: .prettierignore
================================================
docs
node_modules
.github
.devcontainer
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to the Cookbook
👍🎉First off, thanks for taking the time to contribute🎉👍
The following is a set of guidelines on how to contribute
## What should I know before I get started?
### Solana Cookbook Layout
The cookbook is layed out in 4 different sections.
| Section | Description |
| --------------- | --------------------------------------------------------------- |
| Getting Started | Resources for starting development on Solana |
| Core Concepts | Building blocks of Solana that are good to know for development |
| Guides | Snack-sized guides about different tools for development |
| References | References to commonly needed code snippets |
Depending on what you are writing, it will live in one of these sections
#### References
References are an overarching topic with a list of references of how to do
things under that topic. The general structure is the following:
```
Code Reference Title
Short Summary
Code Snippet
```
#### Guides
Guides are longer form informational documentation on various topics.
The general structure for writing a guide is the following:
```
Brief Summary/TLDR
Fact Sheet
Deep Dive
Other Resources
```
### Building
We recommend building and running the documentation in a development container
(requires Docker to be installed).
A `Dockerfile` is included in the `.devcontainer` directory which can be built
and run manually using docker or automatically by VS Code
([Instructions here](https://code.visualstudio.com/docs/remote/containers)).
To build and run perform the following commands in the terminal
(within the container if using the dev container)
```
yarn install
yarn start
```
It will take some time to start, the documentation can then be viewed
at (http://localhost:8080/)
### Code Previews
The Solana Cookbook utilizes code previews to articulate exactly what code is needed
for a reference, as well as the full source so that developers can reference any variables
needed.
While the preview highlights the needed code, it does not have to run alone.
We use the preview component `<SolanaCodeGroup>` with each language's snippet with
`<SolanaCodeGroupItem>`.
#### Example Preview
Let's take the following code for getting a `Keypair` from a `secret`:
```javascript
import { Keypair } from "@solana/web3.js";
const secret = Uint8Array.from([
174, 47, 154, 16, 202, 193, 206, 113, 199, 190, 53, 133, 169, 175, 31, 56,
222, 53, 138, 189, 224, 216, 117, 173, 10, 149, 53, 45, 73, 251, 237, 246, 15,
185, 186, 82, 177, 240, 148, 69, 241, 227, 167, 80, 141, 89, 240, 121, 121,
35, 172, 247, 68, 251, 226, 218, 48, 63, 176, 109, 168, 89, 238, 135,
]);
(async () => {
const keypair = Keypair.fromSecretKey(secret);
})();
```
The preview for the above code could be:
```javascript
const keypair = Keypair.fromSecretKey(secret);
```
The developer can see exactly the method required to get a Keypair from a secret key
in the preview, but can view the full source on the component to understand the example
further.
## How Can I Contribute?
### Adding Content
There's a list of needed content tracked on the [project board](https://github.com/solana-developers/solana-cookbook/projects/1) of this repository.
The board is kept up to date with all work being worked on.
To start work, do the following:
1. Create an issue and/or comment on an existing issue to state you've started working
2. Create a PR during or when complete
### Request Missing Content
Missing something on the cookbook? Please create an issue and we'll try to get it added!
## Committing
We are using [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/)
for this repository.
General flow for making a contribution:
1. Fork the repo on GitHub
2. Clone the project to your own machine
3. Commit changes to your own branch
4. Push your work back up to your fork
5. Submit a Pull request so that we can review your changes
**NOTE**: Be sure to merge the latest from "upstream" before making a
pull request!
================================================
FILE: README.md
================================================
# Solana Cookbook
The Solana Cookbook is meant to house small digestible code snippets
for someone that has no experience with blockchain or Solana to be able
to grab and go.
## Contributing
The Cookbook is welcome to any and all contributions. Please refer to
the project's style when contributing new snippets of code.
### Structure
Currently we have "topics" under `/docs` and the code for those topics
lives under `/code/<topic>`.
### References
References are an overarching topic with a list of references of how to do
things under that topic. The general structure is the following:
```
Code Reference Title
Short Summary
Code Snippet
```
### Guides
Guides are longer form informational documentation on various topics.
The general structure for writing a guide is the following:
```
Brief Summary/TLDR
Fact Sheet
Deep Dive
Other Resources
```
### Building
We recommend building and running the documentation in a development container
(requires Docker to be installed).
A `Dockerfile` is included in the `.devcontainer` directory which can be built
and run manually using docker or automatically by VS Code
([Instructions here](https://code.visualstudio.com/docs/remote/containers)).
To build and run perform the following commands in the terminal
(within the container if using the dev container)
```
yarn install
yarn start
```
It will take some time to start, the documentation can then be viewed
at (http://localhost:8080/)
### Committing
We are using [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/)
for this repository.
To choose a task or make your own, do the following:
1. [Add an issue](https://github.com/solana-developers/solana-cookbook/issues/new) for the task and assign it to yourself or comment on the issue
2. Make a draft PR referencing the issue.
The general flow for making a contribution:
1. Fork the repo on GitHub
2. Clone the project to your own machine
3. Commit changes to your own branch
4. Push your work back up to your fork
5. Submit a Pull request so that we can review your changes
**NOTE**: Be sure to merge the latest from "upstream" before making a
pull request!
You can find tasks on the [project board](https://github.com/solana-developers/solana-cookbook/projects/1)
or create an issue and assign it to yourself.
Happy Cooking!
================================================
FILE: code/account-maps/deriving-pda/anchor-pda-map.preview.rs
================================================
#[derive(Accounts)]
#[instruction(blog_account_bump: u8)]
pub struct InitializeBlog<'info> {
#[account(
init,
seeds = [
b"blog".as_ref(),
authority.key().as_ref()
],
bump = blog_account_bump,
payer = authority,
space = Blog::LEN
)]
pub blog_account: Account<'info, Blog>,
#[account(mut)]
pub authority: Signer<'info>,
pub system_program: Program<'info, System>
}
#[derive(Accounts)]
#[instruction(post_account_bump: u8, post: Post)]
pub struct CreatePost<'info> {
#[account(mut, has_one = authority)]
pub blog_account: Account<'info, Blog>,
#[account(
init,
seeds = [
b"post".as_ref(),
blog_account.key().as_ref(),
post.slug.as_ref(),
],
bump = post_account_bump,
payer = authority,
space = Post::LEN
)]
pub post_account: Account<'info, Post>,
#[account(mut)]
pub authority: Signer<'info>,
pub system_program: Program<'info, System>
}
================================================
FILE: code/account-maps/deriving-pda/anchor-pda-map.rs
================================================
use anchor_lang::prelude::*;
declare_id!("2vD2HBhLnkcYcKxnxLjFYXokHdcsgJnyEXGnSpAX376e");
#[program]
pub mod mapping_pda {
use super::*;
pub fn initialize_blog(ctx: Context<InitializeBlog>, _blog_account_bump: u8, blog: Blog) -> ProgramResult {
ctx.accounts.blog_account.set_inner(blog);
Ok(())
}
pub fn create_post(ctx: Context<CreatePost>, _post_account_bump: u8, post: Post) -> ProgramResult {
if (post.title.len() > 20) || (post.content.len() > 50) {
return Err(ErrorCode::InvalidContentOrTitle.into());
}
ctx.accounts.post_account.set_inner(post);
ctx.accounts.blog_account.post_count += 1;
Ok(())
}
}
#[derive(Accounts)]
#[instruction(blog_account_bump: u8)]
pub struct InitializeBlog<'info> {
#[account(
init,
seeds = [
b"blog".as_ref(),
authority.key().as_ref()
],
bump = blog_account_bump,
payer = authority,
space = Blog::LEN
)]
pub blog_account: Account<'info, Blog>,
#[account(mut)]
pub authority: Signer<'info>,
pub system_program: Program<'info, System>
}
#[derive(Accounts)]
#[instruction(post_account_bump: u8, post: Post)]
pub struct CreatePost<'info> {
#[account(mut, has_one = authority)]
pub blog_account: Account<'info, Blog>,
#[account(
init,
seeds = [
b"post".as_ref(),
blog_account.key().as_ref(),
post.slug.as_ref(),
],
bump = post_account_bump,
payer = authority,
space = Post::LEN
)]
pub post_account: Account<'info, Post>,
#[account(mut)]
pub authority: Signer<'info>,
pub system_program: Program<'info, System>
}
#[account]
pub struct Blog {
pub authority: Pubkey,
pub bump: u8,
pub post_count: u8,
}
#[account]
pub struct Post {
pub author: Pubkey,
pub slug: String, // 10 characters max
pub title: String, // 20 characters max
pub content: String // 50 characters max
}
impl Blog {
const LEN: usize = 8 + 32 + 1 + (4 + (10 * 32));
}
impl Post {
const LEN: usize = 8 + 32 + 32 + (4 + 10) + (4 + 20) + (4 + 50);
}
#[error]
pub enum ErrorCode {
#[msg("Invalid Content or Title.")]
InvalidContentOrTitle,
}
================================================
FILE: code/account-maps/deriving-pda/client.preview.ts
================================================
async () => {
const connection = new Connection("http://localhost:8899", "confirmed");
const [blogAccount] = await PublicKey.findProgramAddress(
[Buffer.from("blog"), user.publicKey.toBuffer()],
MY_PROGRAM_ID
);
const [postAccount] = await PublicKey.findProgramAddress(
[Buffer.from("post"), Buffer.from("slug-1"), user.publicKey.toBuffer()],
MY_PROGRAM_ID
);
const blogAccountInfo = await connection.getAccountInfo(blogAccount);
const blogAccountState = BLOG_ACCOUNT_DATA_LAYOUT.decode(
blogAccountInfo.data
);
console.log("Blog account state: ", blogAccountState);
const postAccountInfo = await connection.getAccountInfo(postAccount);
const postAccountState = POST_ACCOUNT_DATA_LAYOUT.decode(
postAccountInfo.data
);
console.log("Post account state: ", postAccountState);
};
================================================
FILE: code/account-maps/deriving-pda/client.ts
================================================
import * as borsh from "@project-serum/borsh";
import { PublicKey } from "@solana/web3.js";
export const BLOG_ACCOUNT_DATA_LAYOUT = borsh.struct([
borsh.publicKey("authorityPubkey"),
borsh.u8("bump"),
borsh.u8("postCount"),
]);
export const POST_ACCOUNT_DATA_LAYOUT = borsh.struct([
borsh.publicKey("author"),
borsh.publicKey("blog"),
borsh.u8("bump"),
borsh.str("slug"),
borsh.str("title"),
borsh.str("content"),
]);
async () => {
const connection = new Connection("http://localhost:8899", "confirmed");
const [blogAccount] = await PublicKey.findProgramAddress(
[Buffer.from("blog"), user.publicKey.toBuffer()],
MY_PROGRAM_ID
);
const [postAccount] = await PublicKey.findProgramAddress(
[Buffer.from("post"), Buffer.from("slug-1"), user.publicKey.toBuffer()],
MY_PROGRAM_ID
);
const blogAccountInfo = await connection.getAccountInfo(blogAccount);
const blogAccountState = BLOG_ACCOUNT_DATA_LAYOUT.decode(
blogAccountInfo.data
);
console.log("Blog account state: ", blogAccountState);
const postAccountInfo = await connection.getAccountInfo(postAccount);
const postAccountState = POST_ACCOUNT_DATA_LAYOUT.decode(
postAccountInfo.data
);
console.log("Post account state: ", postAccountState);
};
================================================
FILE: code/account-maps/deriving-pda/vanilla-pda-map.preview.rs
================================================
fn process_create_post(
accounts: &[AccountInfo],
slug: String,
title: String,
content: String,
program_id: &Pubkey
) -> ProgramResult {
if slug.len() > 10 || content.len() > 20 || title.len() > 50 {
return Err(BlogError::InvalidPostData.into())
}
let account_info_iter = &mut accounts.iter();
let authority_account = next_account_info(account_info_iter)?;
let blog_account = next_account_info(account_info_iter)?;
let post_account = next_account_info(account_info_iter)?;
let system_program = next_account_info(account_info_iter)?;
if !authority_account.is_signer {
return Err(ProgramError::MissingRequiredSignature);
}
let (blog_pda, _blog_bump) = Pubkey::find_program_address(
&[b"blog".as_ref(), authority_account.key.as_ref()],
program_id
);
if blog_pda != *blog_account.key || !blog_account.is_writable || blog_account.data_is_empty() {
return Err(BlogError::InvalidBlogAccount.into())
}
let (post_pda, post_bump) = Pubkey::find_program_address(
&[b"post".as_ref(), slug.as_ref(), authority_account.key.as_ref()],
program_id
);
if post_pda != *post_account.key {
return Err(BlogError::InvalidPostAccount.into())
}
let post_len: usize = 32 + 32 + 1 + (4 + slug.len()) + (4 + title.len()) + (4 + content.len());
let rent = Rent::get()?;
let rent_lamports = rent.minimum_balance(post_len);
let create_post_pda_ix = &system_instruction::create_account(
authority_account.key,
post_account.key,
rent_lamports,
post_len.try_into().unwrap(),
program_id
);
msg!("Creating post account!");
invoke_signed(
create_post_pda_ix,
&[
authority_account.clone(),
post_account.clone(),
system_program.clone()
],
&[&[
b"post".as_ref(),
slug.as_ref(),
authority_account.key.as_ref(),
&[post_bump]
]]
)?;
let mut post_account_state = try_from_slice_unchecked::<Post>(&post_account.data.borrow()).unwrap();
post_account_state.author = *authority_account.key;
post_account_state.blog = *blog_account.key;
post_account_state.bump = post_bump;
post_account_state.slug = slug;
post_account_state.title = title;
post_account_state.content = content;
msg!("Serializing Post data");
post_account_state.serialize(&mut &mut post_account.data.borrow_mut()[..])?;
let mut blog_account_state = Blog::try_from_slice(&blog_account.data.borrow())?;
blog_account_state.post_count += 1;
msg!("Serializing Blog data");
blog_account_state.serialize(&mut &mut blog_account.data.borrow_mut()[..])?;
Ok(())
}
fn process_init_blog(
accounts: &[AccountInfo],
program_id: &Pubkey
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let authority_account = next_account_info(account_info_iter)?;
let blog_account = next_account_info(account_info_iter)?;
let system_program = next_account_info(account_info_iter)?;
if !authority_account.is_signer {
return Err(ProgramError::MissingRequiredSignature);
}
let (blog_pda, blog_bump) = Pubkey::find_program_address(
&[b"blog".as_ref(), authority_account.key.as_ref()],
program_id
);
if blog_pda != *blog_account.key {
return Err(BlogError::InvalidBlogAccount.into())
}
let rent = Rent::get()?;
let rent_lamports = rent.minimum_balance(Blog::LEN);
let create_blog_pda_ix = &system_instruction::create_account(
authority_account.key,
blog_account.key,
rent_lamports,
Blog::LEN.try_into().unwrap(),
program_id
);
msg!("Creating blog account!");
invoke_signed(
create_blog_pda_ix,
&[
authority_account.clone(),
blog_account.clone(),
system_program.clone()
],
&[&[
b"blog".as_ref(),
authority_account.key.as_ref(),
&[blog_bump]
]]
)?;
let mut blog_account_state = Blog::try_from_slice(&blog_account.data.borrow())?;
blog_account_state.authority = *authority_account.key;
blog_account_state.bump = blog_bump;
blog_account_state.post_count = 0;
blog_account_state.serialize(&mut &mut blog_account.data.borrow_mut()[..])?;
Ok(())
}
================================================
FILE: code/account-maps/deriving-pda/vanilla-pda-map.rs
================================================
use std::convert::TryInto;
use borsh::{BorshDeserialize, BorshSerialize};
use solana_program::{
sysvar::{rent::Rent, Sysvar},
borsh::try_from_slice_unchecked,
account_info::{AccountInfo, next_account_info},
entrypoint,
entrypoint::ProgramResult,
pubkey::Pubkey,
msg,
program_error::ProgramError, system_instruction, program::invoke_signed,
};
use thiserror::Error;
entrypoint!(process_instruction);
fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8],
) -> ProgramResult {
Processor::process(program_id, accounts, instruction_data)
}
pub enum BlogInstruction {
/// Accounts expected:
///
/// 0. `[signer]` User account who is creating the blog
/// 1. `[writable]` Blog account derived from PDA
/// 2. `[]` The System Program
InitBlog {},
/// Accounts expected:
///
/// 0. `[signer]` User account who is creating the post
/// 1. `[writable]` Blog account for which post is being created
/// 2. `[writable]` Post account derived from PDA
/// 3. `[]` System Program
CreatePost {
slug: String,
title: String,
content: String,
}
}
pub struct Processor;
impl Processor {
pub fn process(program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8]) -> ProgramResult {
let instruction = BlogInstruction::unpack(instruction_data)?;
match instruction {
BlogInstruction::InitBlog {} => {
msg!("Instruction: InitBlog");
Self::process_init_blog(accounts, program_id)
},
BlogInstruction::CreatePost { slug, title, content} => {
msg!("Instruction: CreatePost");
Self::process_create_post(accounts, slug, title, content, program_id)
}
}
}
fn process_create_post(
accounts: &[AccountInfo],
slug: String,
title: String,
content: String,
program_id: &Pubkey
) -> ProgramResult {
if slug.len() > 10 || content.len() > 20 || title.len() > 50 {
return Err(BlogError::InvalidPostData.into())
}
let account_info_iter = &mut accounts.iter();
let authority_account = next_account_info(account_info_iter)?;
let blog_account = next_account_info(account_info_iter)?;
let post_account = next_account_info(account_info_iter)?;
let system_program = next_account_info(account_info_iter)?;
if !authority_account.is_signer {
return Err(ProgramError::MissingRequiredSignature);
}
let (blog_pda, _blog_bump) = Pubkey::find_program_address(
&[b"blog".as_ref(), authority_account.key.as_ref()],
program_id
);
if blog_pda != *blog_account.key || !blog_account.is_writable || blog_account.data_is_empty() {
return Err(BlogError::InvalidBlogAccount.into())
}
let (post_pda, post_bump) = Pubkey::find_program_address(
&[b"post".as_ref(), slug.as_ref(), authority_account.key.as_ref()],
program_id
);
if post_pda != *post_account.key {
return Err(BlogError::InvalidPostAccount.into())
}
let post_len: usize = 32 + 32 + 1 + (4 + slug.len()) + (4 + title.len()) + (4 + content.len());
let rent = Rent::get()?;
let rent_lamports = rent.minimum_balance(post_len);
let create_post_pda_ix = &system_instruction::create_account(
authority_account.key,
post_account.key,
rent_lamports,
post_len.try_into().unwrap(),
program_id
);
msg!("Creating post account!");
invoke_signed(
create_post_pda_ix,
&[
authority_account.clone(),
post_account.clone(),
system_program.clone()
],
&[&[
b"post".as_ref(),
slug.as_ref(),
authority_account.key.as_ref(),
&[post_bump]
]]
)?;
let mut post_account_state = try_from_slice_unchecked::<Post>(&post_account.data.borrow()).unwrap();
post_account_state.author = *authority_account.key;
post_account_state.blog = *blog_account.key;
post_account_state.bump = post_bump;
post_account_state.slug = slug;
post_account_state.title = title;
post_account_state.content = content;
msg!("Serializing Post data");
post_account_state.serialize(&mut &mut post_account.data.borrow_mut()[..])?;
let mut blog_account_state = Blog::try_from_slice(&blog_account.data.borrow())?;
blog_account_state.post_count += 1;
msg!("Serializing Blog data");
blog_account_state.serialize(&mut &mut blog_account.data.borrow_mut()[..])?;
Ok(())
}
fn process_init_blog(
accounts: &[AccountInfo],
program_id: &Pubkey
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let authority_account = next_account_info(account_info_iter)?;
let blog_account = next_account_info(account_info_iter)?;
let system_program = next_account_info(account_info_iter)?;
if !authority_account.is_signer {
return Err(ProgramError::MissingRequiredSignature);
}
let (blog_pda, blog_bump) = Pubkey::find_program_address(
&[b"blog".as_ref(), authority_account.key.as_ref()],
program_id
);
if blog_pda != *blog_account.key {
return Err(BlogError::InvalidBlogAccount.into())
}
let rent = Rent::get()?;
let rent_lamports = rent.minimum_balance(Blog::LEN);
let create_blog_pda_ix = &system_instruction::create_account(
authority_account.key,
blog_account.key,
rent_lamports,
Blog::LEN.try_into().unwrap(),
program_id
);
msg!("Creating blog account!");
invoke_signed(
create_blog_pda_ix,
&[
authority_account.clone(),
blog_account.clone(),
system_program.clone()
],
&[&[
b"blog".as_ref(),
authority_account.key.as_ref(),
&[blog_bump]
]]
)?;
let mut blog_account_state = Blog::try_from_slice(&blog_account.data.borrow())?;
blog_account_state.authority = *authority_account.key;
blog_account_state.bump = blog_bump;
blog_account_state.post_count = 0;
blog_account_state.serialize(&mut &mut blog_account.data.borrow_mut()[..])?;
Ok(())
}
}
#[derive(BorshDeserialize, Debug)]
struct PostIxPayload {
slug: String,
title: String,
content: String
}
impl BlogInstruction {
pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
let (variant, rest) = input.split_first().ok_or(BlogError::InvalidInstruction)?;
let payload = PostIxPayload::try_from_slice(rest).unwrap();
Ok(match variant {
0 => Self::InitBlog {},
1 => Self::CreatePost {
slug: payload.slug,
title: payload.title,
content: payload.content
},
_ => return Err(BlogError::InvalidInstruction.into()),
})
}
}
#[derive(BorshSerialize, BorshDeserialize, Debug, Clone)]
pub struct Blog {
pub authority: Pubkey,
pub bump: u8,
pub post_count: u8 // 10 posts max
}
#[derive(BorshSerialize, BorshDeserialize, Debug, Clone)]
pub struct Post {
pub author: Pubkey,
pub blog: Pubkey,
pub bump: u8,
pub slug: String, // 10 chars max
pub title: String, // 20 chars max
pub content: String, // 50 chars max
}
impl Blog {
pub const LEN: usize = 32 + 1 + 1;
}
#[derive(Error, Debug, Copy, Clone)]
pub enum BlogError {
#[error("Invalid Instruction")]
InvalidInstruction,
#[error("Invalid Blog Account")]
InvalidBlogAccount,
#[error("Invalid Post Account")]
InvalidPostAccount,
#[error("Invalid Post Data")]
InvalidPostData,
#[error("Account not Writable")]
AccountNotWritable,
}
impl From<BlogError> for ProgramError {
fn from(e: BlogError) -> Self {
return ProgramError::Custom(e as u32);
}
}
================================================
FILE: code/account-maps/trivial/client.preview.ts
================================================
const insertABIx = new TransactionInstruction({
programId: MY_PROGRAM_ID,
keys: [
{
pubkey: userA.publicKey,
isSigner: true,
isWritable: true,
},
{
pubkey: userB.publicKey,
isSigner: false,
isWritable: false,
},
{
pubkey: mapKey,
isSigner: false,
isWritable: true,
},
],
data: Buffer.from(Uint8Array.of(1)),
});
const insertBCIx = new TransactionInstruction({
programId: MY_PROGRAM_ID,
keys: [
{
pubkey: userB.publicKey,
isSigner: true,
isWritable: true,
},
{
pubkey: userC.publicKey,
isSigner: false,
isWritable: false,
},
{
pubkey: mapKey,
isSigner: false,
isWritable: true,
},
],
data: Buffer.from(Uint8Array.of(1)),
});
const insertCAIx = new TransactionInstruction({
programId: MY_PROGRAM_ID,
keys: [
{
pubkey: userC.publicKey,
isSigner: true,
isWritable: true,
},
{
pubkey: userA.publicKey,
isSigner: false,
isWritable: false,
},
{
pubkey: mapKey,
isSigner: false,
isWritable: true,
},
],
data: Buffer.from(Uint8Array.of(1)),
});
const tx = new Transaction();
tx.add(initMapIx);
tx.add(insertABIx);
tx.add(insertBCIx);
tx.add(insertCAIx);
================================================
FILE: code/account-maps/trivial/client.ts
================================================
import {
Connection,
Keypair,
LAMPORTS_PER_SOL,
PublicKey,
SystemProgram,
Transaction,
TransactionInstruction,
} from "@solana/web3.js";
import * as borsh from "@project-serum/borsh";
const MY_PROGRAM_ID = new PublicKey(
"FwcG3yKuAkCfX68q9GPykNWDaaPjdZFaR1Tgr8qSxaEa"
);
const MAP_DATA_LAYOUT = borsh.struct([
borsh.u8("is_initialized"),
borsh.map(borsh.publicKey("user_a"), borsh.publicKey("user_b"), "blogs"),
]);
async () => {
const connection = new Connection("http://localhost:8899", "confirmed");
const userA = Keypair.generate();
const userB = Keypair.generate();
const userC = Keypair.generate();
const [mapKey] = await PublicKey.findProgramAddress(
[Buffer.from("map")],
MY_PROGRAM_ID
);
const airdropASig = await connection.requestAirdrop(
userA.publicKey,
5 * LAMPORTS_PER_SOL
);
const airdropBSig = await connection.requestAirdrop(
userB.publicKey,
5 * LAMPORTS_PER_SOL
);
const airdropCSig = await connection.requestAirdrop(
userC.publicKey,
5 * LAMPORTS_PER_SOL
);
const promiseA = connection.confirmTransaction(airdropASig);
const promiseB = connection.confirmTransaction(airdropBSig);
const promiseC = connection.confirmTransaction(airdropCSig);
await Promise.all([promiseA, promiseB, promiseC]);
const initMapIx = new TransactionInstruction({
programId: MY_PROGRAM_ID,
keys: [
{
pubkey: userA.publicKey,
isSigner: true,
isWritable: true,
},
{
pubkey: mapKey,
isSigner: false,
isWritable: true,
},
{
pubkey: SystemProgram.programId,
isSigner: false,
isWritable: false,
},
],
data: Buffer.from(Uint8Array.of(0)),
});
const insertABIx = new TransactionInstruction({
programId: MY_PROGRAM_ID,
keys: [
{
pubkey: userA.publicKey,
isSigner: true,
isWritable: true,
},
{
pubkey: userB.publicKey,
isSigner: false,
isWritable: false,
},
{
pubkey: mapKey,
isSigner: false,
isWritable: true,
},
],
data: Buffer.from(Uint8Array.of(1)),
});
const insertBCIx = new TransactionInstruction({
programId: MY_PROGRAM_ID,
keys: [
{
pubkey: userB.publicKey,
isSigner: true,
isWritable: true,
},
{
pubkey: userC.publicKey,
isSigner: false,
isWritable: false,
},
{
pubkey: mapKey,
isSigner: false,
isWritable: true,
},
],
data: Buffer.from(Uint8Array.of(1)),
});
const insertCAIx = new TransactionInstruction({
programId: MY_PROGRAM_ID,
keys: [
{
pubkey: userC.publicKey,
isSigner: true,
isWritable: true,
},
{
pubkey: userA.publicKey,
isSigner: false,
isWritable: false,
},
{
pubkey: mapKey,
isSigner: false,
isWritable: true,
},
],
data: Buffer.from(Uint8Array.of(1)),
});
const tx = new Transaction();
tx.add(initMapIx);
tx.add(insertABIx);
tx.add(insertBCIx);
tx.add(insertCAIx);
const sig = await connection.sendTransaction(tx, [userA, userB, userC], {
skipPreflight: false,
preflightCommitment: "confirmed",
});
await connection.confirmTransaction(sig);
const mapAccount = await connection.getAccountInfo(mapKey);
const mapData = MAP_DATA_LAYOUT.decode(mapAccount.data);
console.log("MapData: ", mapData);
};
================================================
FILE: code/account-maps/trivial/vanilla-trivial-map.preview.rs
================================================
fn process_init_map(accounts: &[AccountInfo], program_id: &Pubkey) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let authority_account = next_account_info(account_info_iter)?;
let map_account = next_account_info(account_info_iter)?;
let system_program = next_account_info(account_info_iter)?;
if !authority_account.is_signer {
return Err(ProgramError::MissingRequiredSignature)
}
let (map_pda, map_bump) = Pubkey::find_program_address(
&[b"map".as_ref()],
program_id
);
if map_pda != *map_account.key || !map_account.is_writable || !map_account.data_is_empty() {
return Err(BlogError::InvalidMapAccount.into())
}
let rent = Rent::get()?;
let rent_lamports = rent.minimum_balance(MapAccount::LEN);
let create_map_ix = &system_instruction::create_account(
authority_account.key,
map_account.key,
rent_lamports,
MapAccount::LEN.try_into().unwrap(),
program_id
);
msg!("Creating MapAccount account");
invoke_signed(
create_map_ix,
&[
authority_account.clone(),
map_account.clone(),
system_program.clone()
],
&[&[
b"map".as_ref(),
&[map_bump]
]]
)?;
msg!("Deserializing MapAccount account");
let mut map_state = try_from_slice_unchecked::<MapAccount>(&map_account.data.borrow()).unwrap();
let empty_map: BTreeMap<Pubkey, Pubkey> = BTreeMap::new();
map_state.is_initialized = 1;
map_state.map = empty_map;
msg!("Serializing MapAccount account");
map_state.serialize(&mut &mut map_account.data.borrow_mut()[..])?;
Ok(())
}
fn process_insert_entry(accounts: &[AccountInfo], program_id: &Pubkey) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let a_account = next_account_info(account_info_iter)?;
let b_account = next_account_info(account_info_iter)?;
let map_account = next_account_info(account_info_iter)?;
if !a_account.is_signer {
return Err(ProgramError::MissingRequiredSignature)
}
if map_account.data.borrow()[0] == 0 || *map_account.owner != *program_id {
return Err(BlogError::InvalidMapAccount.into())
}
msg!("Deserializing MapAccount account");
let mut map_state = try_from_slice_unchecked::<MapAccount>(&map_account.data.borrow())?;
if map_state.map.contains_key(a_account.key) {
return Err(BlogError::AccountAlreadyHasEntry.into())
}
map_state.map.insert(*a_account.key, *b_account.key);
msg!("Serializing MapAccount account");
map_state.serialize(&mut &mut map_account.data.borrow_mut()[..])?;
Ok(())
}
================================================
FILE: code/account-maps/trivial/vanilla-trivial-map.rs
================================================
use std::{collections::BTreeMap};
use thiserror::Error;
use borsh::{BorshSerialize, BorshDeserialize};
use num_traits::FromPrimitive;
use solana_program::{sysvar::{rent::Rent, Sysvar}, entrypoint, entrypoint::ProgramResult, pubkey::Pubkey, account_info::{AccountInfo, next_account_info}, program_error::ProgramError, system_instruction, msg, program::{invoke_signed}, borsh::try_from_slice_unchecked};
entrypoint!(process_instruction);
fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8],
) -> ProgramResult {
msg!("instruction_data: {:?}", instruction_data);
Processor::process(program_id, accounts, instruction_data)
}
pub struct Processor;
impl Processor {
pub fn process(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult {
let instruction = FromPrimitive::from_u8(instruction_data[0]).ok_or(ProgramError::InvalidInstructionData)?;
match instruction {
0 => {
msg!("Initializing map!");
Self::process_init_map(accounts, program_id)?;
},
1 => {
msg!("Inserting entry!");
Self::process_insert_entry(accounts, program_id)?;
},
_ => {
return Err(ProgramError::InvalidInstructionData)
}
}
Ok(())
}
fn process_init_map(accounts: &[AccountInfo], program_id: &Pubkey) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let authority_account = next_account_info(account_info_iter)?;
let map_account = next_account_info(account_info_iter)?;
let system_program = next_account_info(account_info_iter)?;
if !authority_account.is_signer {
return Err(ProgramError::MissingRequiredSignature)
}
let (map_pda, map_bump) = Pubkey::find_program_address(
&[b"map".as_ref()],
program_id
);
if map_pda != *map_account.key || !map_account.is_writable || !map_account.data_is_empty() {
return Err(BlogError::InvalidMapAccount.into())
}
let rent = Rent::get()?;
let rent_lamports = rent.minimum_balance(MapAccount::LEN);
let create_map_ix = &system_instruction::create_account(
authority_account.key,
map_account.key,
rent_lamports,
MapAccount::LEN.try_into().unwrap(),
program_id
);
msg!("Creating MapAccount account");
invoke_signed(
create_map_ix,
&[
authority_account.clone(),
map_account.clone(),
system_program.clone()
],
&[&[
b"map".as_ref(),
&[map_bump]
]]
)?;
msg!("Deserializing MapAccount account");
let mut map_state = try_from_slice_unchecked::<MapAccount>(&map_account.data.borrow()).unwrap();
let empty_map: BTreeMap<Pubkey, Pubkey> = BTreeMap::new();
map_state.is_initialized = 1;
map_state.map = empty_map;
msg!("Serializing MapAccount account");
map_state.serialize(&mut &mut map_account.data.borrow_mut()[..])?;
Ok(())
}
fn process_insert_entry(accounts: &[AccountInfo], program_id: &Pubkey) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let a_account = next_account_info(account_info_iter)?;
let b_account = next_account_info(account_info_iter)?;
let map_account = next_account_info(account_info_iter)?;
if !a_account.is_signer {
return Err(ProgramError::MissingRequiredSignature)
}
if map_account.data.borrow()[0] == 0 || *map_account.owner != *program_id {
return Err(BlogError::InvalidMapAccount.into())
}
msg!("Deserializing MapAccount account");
let mut map_state = try_from_slice_unchecked::<MapAccount>(&map_account.data.borrow())?;
if map_state.map.contains_key(a_account.key) {
return Err(BlogError::AccountAlreadyHasEntry.into())
}
map_state.map.insert(*a_account.key, *b_account.key);
msg!("Serializing MapAccount account");
map_state.serialize(&mut &mut map_account.data.borrow_mut()[..])?;
Ok(())
}
}
#[derive(BorshSerialize, BorshDeserialize, Clone, Debug)]
pub struct MapAccount {
pub is_initialized: u8,
pub map: BTreeMap<Pubkey, Pubkey> // 100
}
impl MapAccount {
const LEN: usize = 1 + (4 + (10 * 64)); // 10 user -> blog
}
#[derive(Error, Debug, Copy, Clone)]
pub enum BlogError {
#[error("Invalid MapAccount account")]
InvalidMapAccount,
#[error("Invalid Blog account")]
InvalidBlogAccount,
#[error("Account already has entry in Map")]
AccountAlreadyHasEntry,
}
impl From<BlogError> for ProgramError {
fn from(e: BlogError) -> Self {
return ProgramError::Custom(e as u32);
}
}
================================================
FILE: code/accounts/close-account/client/close-account.adapter.en.tsx
================================================
import {
createCloseAccountInstruction,
TOKEN_PROGRAM_ID,
} from "@solana/spl-token";
import { PublicKey, Transaction } from "@solana/web3.js";
import { useConnection, useWallet } from "@solana/wallet-adapter-react";
import { WalletNotConnectedError } from "@solana/wallet-adapter-base";
import React from "react";
// Utility function to find the associated token address
function findAssociatedTokenAddress(
walletAddress: PublicKey,
tokenMintAddress: PublicKey
): PublicKey {
return PublicKey.findProgramAddressSync(
[
walletAddress.toBuffer(),
TOKEN_PROGRAM_ID.toBuffer(),
tokenMintAddress.toBuffer(),
],
new PublicKey("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL")
)[0];
}
// Main functional component
export default function CloseTokenAccount() {
const { publicKey, sendTransaction } = useWallet();
const { connection } = useConnection();
// Function to close the account
async function closeAcc() {
if (!publicKey) throw new WalletNotConnectedError();
try {
// Define the token address and associated token program id
const tokenAddress = new PublicKey(
"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263" // -> BONK
);
// Get the associated token address
const ATA = findAssociatedTokenAddress(
publicKey!,
tokenAddress
).toBase58();
// Create a transaction to close the account
const transaction = new Transaction(
await connection.getLatestBlockhash()
).add(
createCloseAccountInstruction(
new PublicKey(ATA),
publicKey!,
publicKey!
)
);
// Send and confirm the transaction
const signature = await sendTransaction(transaction, connection);
await connection.confirmTransaction({
...(await connection.getLatestBlockhash()),
signature,
});
} catch (error) {
console.error("Error closing account:", error);
// Handle error appropriately, e.g., show a user-friendly error message
}
}
// Render the main component
return (
<button onClick={closeAcc} disabled={!publicKey}>
Close Account
</button>
);
}
================================================
FILE: code/accounts/close-account/client/close-account.adapter.preview.en.tsx
================================================
async function closeAcc() {
if (!publicKey) throw new WalletNotConnectedError();
try {
// Define the token address and associated token program id
const tokenAddress = new PublicKey(
"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263" // -> BONK
);
// Get the associated token address
const ATA = findAssociatedTokenAddress(publicKey!, tokenAddress).toBase58();
// Create a transaction to close the account
const transaction = new Transaction(
await connection.getLatestBlockhash()
).add(
createCloseAccountInstruction(new PublicKey(ATA), publicKey!, publicKey!)
);
// Send and confirm the transaction
const signature = await sendTransaction(transaction, connection);
await connection.confirmTransaction({
...(await connection.getLatestBlockhash()),
signature,
});
} catch (error) {
console.error("Error closing account:", error);
// Handle error appropriately, e.g., show a user-friendly error message
}
}
================================================
FILE: code/accounts/close-account/client/main.en.ts
================================================
import {
Keypair,
Connection,
Transaction,
SystemProgram,
TransactionInstruction,
PublicKey,
clusterApiUrl,
LAMPORTS_PER_SOL,
} from "@solana/web3.js";
(async function () {
// connection
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
// setup fee payer
const feePayer = Keypair.generate();
const feePayerAirdropSignature = await connection.requestAirdrop(
feePayer.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(feePayerAirdropSignature);
// remember to deploy your program first
const programId = new PublicKey(
"An47uBJ8kY7hzKPzDyRoFSsDHkZFY9vkfUGpTViWqLFz"
);
// 1. create an account to your program
let newAccountKeypair = Keypair.generate();
console.log(`new account: ${newAccountKeypair.publicKey.toBase58()}`);
let createNewAccountTx = new Transaction().add(
SystemProgram.createAccount({
fromPubkey: feePayer.publicKey,
newAccountPubkey: newAccountKeypair.publicKey,
lamports: 1e8, // 0.1 SOL
space: 10, // a random value
programId: programId,
})
);
console.log(
`create account txhash: ${await connection.sendTransaction(
createNewAccountTx,
[feePayer, newAccountKeypair]
)}`
);
// 2. close your account
let closeAccountTx = new Transaction().add(
new TransactionInstruction({
keys: [
{
pubkey: newAccountKeypair.publicKey,
isSigner: false,
isWritable: true,
},
{
pubkey: feePayer.publicKey,
isSigner: false,
isWritable: true,
},
],
programId: programId,
})
);
console.log(
`close account txhash: ${await connection.sendTransaction(closeAccountTx, [
feePayer,
])}`
);
})();
================================================
FILE: code/accounts/close-account/client/main.preview.en.ts
================================================
// 1. create an account to your program
let createNewAccountTx = new Transaction().add(
SystemProgram.createAccount({
fromPubkey: feePayer.publicKey,
newAccountPubkey: newAccountKeypair.publicKey,
lamports: 1e8, // 0.1 SOL
space: 10, // a random value
programId: programId,
})
);
// 2. close your account
let closeAccountTx = new Transaction().add(
new TransactionInstruction({
keys: [
{
pubkey: newAccountKeypair.publicKey,
isSigner: false,
isWritable: true,
},
{
pubkey: feePayer.publicKey,
isSigner: false,
isWritable: true,
},
],
programId: programId,
})
);
================================================
FILE: code/accounts/close-account/program/Cargo.toml
================================================
[package]
edition = "2018"
name = "close-account"
version = "0.1.0"
[dependencies]
solana-program = "=1.8.5"
[lib]
crate-type = ["cdylib", "lib"]
================================================
FILE: code/accounts/close-account/program/Xargo.toml
================================================
[target.bpfel-unknown-unknown.dependencies.std]
features = []
================================================
FILE: code/accounts/close-account/program/src/lib.preview.rs
================================================
let dest_starting_lamports = dest_account_info.lamports();
**dest_account_info.lamports.borrow_mut() = dest_starting_lamports
.checked_add(source_account_info.lamports())
.unwrap();
**source_account_info.lamports.borrow_mut() = 0;
let mut source_data = source_account_info.data.borrow_mut();
source_data.fill(0);
================================================
FILE: code/accounts/close-account/program/src/lib.rs
================================================
use solana_program::{
account_info::next_account_info, account_info::AccountInfo, entrypoint,
entrypoint::ProgramResult, pubkey::Pubkey,
};
entrypoint!(process_instruction);
fn process_instruction(
_program_id: &Pubkey,
accounts: &[AccountInfo],
_instruction_data: &[u8],
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let source_account_info = next_account_info(account_info_iter)?;
let dest_account_info = next_account_info(account_info_iter)?;
let dest_starting_lamports = dest_account_info.lamports();
**dest_account_info.lamports.borrow_mut() = dest_starting_lamports
.checked_add(source_account_info.lamports())
.unwrap();
**source_account_info.lamports.borrow_mut() = 0;
let mut source_data = source_account_info.data.borrow_mut();
source_data.fill(0);
Ok(())
}
================================================
FILE: code/accounts/create-account-with-seed/creation/main.en.rs
================================================
use solana_client::rpc_client::RpcClient;
use solana_program::pubkey::Pubkey;
use solana_program::system_instruction;
use solana_sdk::commitment_config::CommitmentConfig;
use solana_sdk::native_token::LAMPORTS_PER_SOL;
use solana_sdk::signature::{Keypair, Signer};
fn main() {
let rpc_url = String::from("https://api.devnet.solana.com");
let connection = RpcClient::new_with_commitment(rpc_url, CommitmentConfig::confirmed());
let fee_payer_keypair = Keypair::new();
let fee_payer_pubkey = Signer::pubkey(&fee_payer_keypair);
let base_keypair = Keypair::new();
let base_pubkey = Signer::pubkey(&base_keypair);
let seed = "robot001";
let program_id = solana_program::system_program::id();
let derived_pubkey = Pubkey::create_with_seed(&base_pubkey, seed, &program_id).unwrap();
match connection.request_airdrop(&fee_payer_pubkey, LAMPORTS_PER_SOL) {
Ok(sig) => loop {
if let Ok(confirmed) = connection.confirm_transaction(&sig) {
if confirmed {
println!("Transaction: {} Status: {}", sig, confirmed);
break;
}
}
},
Err(_) => println!("Error requesting airdrop"),
};
let ix = system_instruction::create_account_with_seed(
&fee_payer_pubkey,
&derived_pubkey,
&base_pubkey,
seed,
LAMPORTS_PER_SOL / 10,
0,
&program_id,
);
let (recent_blockhash, _) = connection.get_recent_blockhash().unwrap();
let tx = solana_sdk::transaction::Transaction::new_signed_with_payer(
&[ix],
Some(&fee_payer_pubkey),
&[&fee_payer_keypair, &base_keypair],
recent_blockhash,
);
match connection.send_and_confirm_transaction(&tx) {
Ok(sig) => loop {
if let Ok(confirmed) = connection.confirm_transaction(&sig) {
if confirmed {
println!("Transaction: {} Status: {}", sig, confirmed);
break;
}
}
},
Err(_) => println!("Error creating account with seed"),
};
}
================================================
FILE: code/accounts/create-account-with-seed/creation/main.en.ts
================================================
import {
PublicKey,
SystemProgram,
Connection,
clusterApiUrl,
Transaction,
Keypair,
sendAndConfirmTransaction,
LAMPORTS_PER_SOL,
} from "@solana/web3.js";
import * as bs58 from "bs58";
(async () => {
// connection
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
// 5YNmS1R9nNSCDzb5a7mMJ1dwK9uHeAAF4CmPEwKgVWr8
const feePayer = Keypair.fromSecretKey(
bs58.decode(
"588FU4PktJWfGfxtzpAAXywSNt74AvtroVzGfKkVN1LwRuvHwKGr851uH8czM5qm4iqLbs1kKoMKtMJG4ATR7Ld2"
)
);
// G2FAbFQPFa5qKXCetoFZQEvF9BVvCKbvUZvodpVidnoY
const base = Keypair.fromSecretKey(
bs58.decode(
"4NMwxzmYj2uvHuq8xoqhY8RXg63KSVJM1DXkpbmkUY7YQWuoyQgFnnzn6yo3CMnqZasnNPNuAT2TLwQsCaKkUddp"
)
);
let basePubkey = base.publicKey;
let seed = "robot001";
let programId = SystemProgram.programId;
let derived = await PublicKey.createWithSeed(basePubkey, seed, programId);
const tx = new Transaction().add(
SystemProgram.createAccountWithSeed({
fromPubkey: feePayer.publicKey, // funder
newAccountPubkey: derived,
basePubkey: basePubkey,
seed: seed,
lamports: 1e8, // 0.1 SOL
space: 0,
programId: programId,
})
);
console.log(
`txhash: ${await sendAndConfirmTransaction(connection, tx, [
feePayer,
base,
])}`
);
})();
================================================
FILE: code/accounts/create-account-with-seed/creation/main.preview.en.rs
================================================
let derived_pubkey = Pubkey::create_with_seed(&base_pubkey, seed, &program_id).unwrap();
let ix = system_instruction::create_account_with_seed(
&fee_payer_pubkey,
&derived_pubkey,
&base_pubkey,
seed,
LAMPORTS_PER_SOL / 10,
0,
&program_id,
);
let tx = solana_sdk::transaction::Transaction::new_signed_with_payer(
&[ix],
Some(&fee_payer_pubkey),
&[&fee_payer_keypair, &base_keypair],
recent_blockhash,
);
================================================
FILE: code/accounts/create-account-with-seed/creation/main.preview.en.ts
================================================
const tx = new Transaction().add(
SystemProgram.createAccountWithSeed({
fromPubkey: feePayer.publicKey, // funder
newAccountPubkey: derived,
basePubkey: basePubkey,
seed: seed,
lamports: 1e8, // 0.1 SOL
space: 0,
programId: owner,
})
);
console.log(
`txhash: ${await sendAndConfirmTransaction(connection, tx, [feePayer, base])}`
);
================================================
FILE: code/accounts/create-account-with-seed/generate/main.en.rs
================================================
use solana_program::pubkey::Pubkey;
use solana_sdk::signature::{Keypair, Signer};
fn main() {
let base_pubkey = Keypair::new().pubkey();
let seed = "robot001";
let program_id = solana_program::system_program::id();
let derived_pubkey = Pubkey::create_with_seed(&base_pubkey, seed, &program_id).unwrap();
println!("account pubkey: {:?}", derived_pubkey);
}
================================================
FILE: code/accounts/create-account-with-seed/generate/main.en.ts
================================================
import { PublicKey, SystemProgram } from "@solana/web3.js";
(async () => {
let basePubkey = new PublicKey(
"G2FAbFQPFa5qKXCetoFZQEvF9BVvCKbvUZvodpVidnoY"
);
let seed = "robot001";
let programId = SystemProgram.programId;
console.log(
`${(
await PublicKey.createWithSeed(basePubkey, seed, programId)
).toBase58()}`
);
})();
================================================
FILE: code/accounts/create-account-with-seed/generate/main.preview.en.rs
================================================
use solana_program::pubkey::Pubkey;
use solana_sdk::signature::{Keypair, Signer};
fn main() {
let base_pubkey = Keypair::new().pubkey();
let seed = "robot001";
let program_id = solana_program::system_program::id();
let derived_pubkey = Pubkey::create_with_seed(&base_pubkey, seed, &program_id).unwrap();
println!("account pubkey: {:?}", derived_pubkey);
}
================================================
FILE: code/accounts/create-account-with-seed/generate/main.preview.en.ts
================================================
PublicKey.createWithSeed(basePubkey, seed, programId);
================================================
FILE: code/accounts/create-account-with-seed/transfer/main.en.ts
================================================
import {
PublicKey,
SystemProgram,
Connection,
clusterApiUrl,
Transaction,
Keypair,
sendAndConfirmTransaction,
LAMPORTS_PER_SOL,
} from "@solana/web3.js";
import * as bs58 from "bs58";
(async () => {
// connection
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
// 5YNmS1R9nNSCDzb5a7mMJ1dwK9uHeAAF4CmPEwKgVWr8
const feePayer = Keypair.fromSecretKey(
bs58.decode(
"588FU4PktJWfGfxtzpAAXywSNt74AvtroVzGfKkVN1LwRuvHwKGr851uH8czM5qm4iqLbs1kKoMKtMJG4ATR7Ld2"
)
);
// G2FAbFQPFa5qKXCetoFZQEvF9BVvCKbvUZvodpVidnoY
const base = Keypair.fromSecretKey(
bs58.decode(
"4NMwxzmYj2uvHuq8xoqhY8RXg63KSVJM1DXkpbmkUY7YQWuoyQgFnnzn6yo3CMnqZasnNPNuAT2TLwQsCaKkUddp"
)
);
let basePubkey = base.publicKey;
let seed = "robot001";
let programId = SystemProgram.programId;
let derived = await PublicKey.createWithSeed(basePubkey, seed, programId);
const tx = new Transaction().add(
SystemProgram.transfer({
fromPubkey: derived,
basePubkey: basePubkey,
toPubkey: Keypair.generate().publicKey, // create a random receiver
lamports: 0.01 * LAMPORTS_PER_SOL,
seed: seed,
programId: programId,
})
);
console.log(
`txhash: ${await sendAndConfirmTransaction(connection, tx, [
feePayer,
base,
])}`
);
})();
================================================
FILE: code/accounts/create-account-with-seed/transfer/main.preview.en.ts
================================================
const tx = new Transaction().add(
SystemProgram.transfer({
fromPubkey: derived,
basePubkey: basePubkey,
toPubkey: Keypair.generate().publicKey, // create a random receiver
lamports: 0.01 * LAMPORTS_PER_SOL,
seed: seed,
programId: programId,
})
);
console.log(
`txhash: ${await sendAndConfirmTransaction(connection, tx, [feePayer, base])}`
);
================================================
FILE: code/accounts/create-system-account/create-system-account.en.rs
================================================
use solana_client::rpc_client::RpcClient;
use solana_program::system_instruction;
use solana_sdk::commitment_config::CommitmentConfig;
use solana_sdk::native_token::LAMPORTS_PER_SOL;
use solana_sdk::signature::{Keypair, Signer};
fn main() {
let rpc_url = String::from("https://api.devnet.solana.com");
let connection = RpcClient::new_with_commitment(rpc_url, CommitmentConfig::confirmed());
let from_keypair = Keypair::new();
let from_pubkey = Signer::pubkey(&from_keypair);
match connection.request_airdrop(&from_pubkey, LAMPORTS_PER_SOL) {
Ok(sig) => loop {
if let Ok(confirmed) = connection.confirm_transaction(&sig) {
if confirmed {
println!("Transaction: {} Status: {}", sig, confirmed);
break;
}
}
},
Err(_) => println!("Error requesting airdrop"),
};
let space = 0;
let rent_exemption_amount = connection
.get_minimum_balance_for_rent_exemption(space)
.unwrap();
let new_account_keypair = Keypair::new();
let new_account_pubkey = Signer::pubkey(&new_account_keypair);
let create_account_ix = system_instruction::create_account(
&from_pubkey,
&new_account_pubkey,
rent_exemption_amount,
space as u64,
&from_pubkey,
);
let (recent_blockhash, _) = connection.get_recent_blockhash().unwrap();
let create_account_tx = solana_sdk::transaction::Transaction::new_signed_with_payer(
&[create_account_ix],
Some(&from_pubkey),
&[&from_keypair, &new_account_keypair],
recent_blockhash,
);
match connection.send_and_confirm_transaction(&create_account_tx) {
Ok(sig) => loop {
if let Ok(confirmed) = connection.confirm_transaction(&sig) {
if confirmed {
println!("Transaction: {} Status: {}", sig, confirmed);
break;
}
}
},
Err(_) => println!("Error creating system account"),
};
}
================================================
FILE: code/accounts/create-system-account/create-system-account.en.ts
================================================
import {
SystemProgram,
Keypair,
Transaction,
sendAndConfirmTransaction,
Connection,
clusterApiUrl,
LAMPORTS_PER_SOL,
} from "@solana/web3.js";
(async () => {
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
const fromPubkey = Keypair.generate();
// Airdrop SOL for transferring lamports to the created account
const airdropSignature = await connection.requestAirdrop(
fromPubkey.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(airdropSignature);
// amount of space to reserve for the account
const space = 0;
// Seed the created account with lamports for rent exemption
const rentExemptionAmount =
await connection.getMinimumBalanceForRentExemption(space);
const newAccountPubkey = Keypair.generate();
const createAccountParams = {
fromPubkey: fromPubkey.publicKey,
newAccountPubkey: newAccountPubkey.publicKey,
lamports: rentExemptionAmount,
space,
programId: SystemProgram.programId,
};
const createAccountTransaction = new Transaction().add(
SystemProgram.createAccount(createAccountParams)
);
await sendAndConfirmTransaction(connection, createAccountTransaction, [
fromPubkey,
newAccountPubkey,
]);
})();
================================================
FILE: code/accounts/create-system-account/create-system-account.preview.en.rs
================================================
let create_account_ix = system_instruction::create_account(
&from_pubkey,
&new_account_pubkey,
rent_exemption_amount,
space as u64,
&from_pubkey,
);
let (recent_blockhash, _) = connection.get_recent_blockhash().unwrap();
let create_account_tx = solana_sdk::transaction::Transaction::new_signed_with_payer(
&[create_account_ix],
Some(&from_pubkey),
&[&from_keypair, &new_account_keypair],
recent_blockhash,
);
match connection.send_and_confirm_transaction(&create_account_tx) {
Ok(sig) => loop {
if let Ok(confirmed) = connection.confirm_transaction(&sig) {
if confirmed {
println!("Transaction: {} Status: {}", sig, confirmed);
break;
}
}
},
Err(_) => println!("Error creating system account"),
};
================================================
FILE: code/accounts/create-system-account/create-system-account.preview.en.ts
================================================
const createAccountParams = {
fromPubkey: fromKeypair.publicKey,
newAccountPubkey: newAccountKeypair.publicKey,
lamports: rentExemptionAmount,
space,
programId: SystemProgram.programId,
};
const createAccountTransaction = new Transaction().add(
SystemProgram.createAccount(createAccountParams)
);
await sendAndConfirmTransaction(connection, createAccountTransaction, [
fromKeypair,
newAccountKeypair,
]);
================================================
FILE: code/accounts/get-balance/main.en.cpp
================================================
// clang++ get_balance.cpp -o get_balance -std=c++17 -lssl -lcrypto -lsodium
#include "solana.hpp"
using namespace many::solana;
int main() {
Connection connection("https://api.devnet.solana.com");
auto key_pair = Keypair::generate();
auto public_key = key_pair.public_key;
std::cout << "public_key = " << public_key.to_base58() << std::endl;
uint64_t balance = connection.get_balance(public_key).unwrap();
std::cout << "balance = " << balance << std::endl;
return 0;
}
================================================
FILE: code/accounts/get-balance/main.en.py
================================================
from solders.keypair import Keypair
from solana.rpc.api import Client
client = Client("https://api.devnet.solana.com")
key_pair = Keypair()
public_key = key_pair.pubkey()
print(client.get_balance(public_key))
================================================
FILE: code/accounts/get-balance/main.en.rs
================================================
use solana_client::rpc_client::RpcClient;
use solana_program::native_token::LAMPORTS_PER_SOL;
use solana_program::pubkey::Pubkey;
use solana_sdk::commitment_config::CommitmentConfig;
use std::str::FromStr;
fn main() {
let rpc_url = String::from("https://api.devnet.solana.com");
let connection = RpcClient::new_with_commitment(rpc_url, CommitmentConfig::confirmed());
let wallet = Pubkey::from_str("G2FAbFQPFa5qKXCetoFZQEvF9BVvCKbvUZvodpVidnoY").unwrap();
let balance = connection.get_balance(&wallet).unwrap();
println!(
"The account {}, has {} SOL ",
wallet,
balance / LAMPORTS_PER_SOL
);
}
================================================
FILE: code/accounts/get-balance/main.en.ts
================================================
import {
clusterApiUrl,
Connection,
PublicKey,
LAMPORTS_PER_SOL,
} from "@solana/web3.js";
(async () => {
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
let wallet = new PublicKey("G2FAbFQPFa5qKXCetoFZQEvF9BVvCKbvUZvodpVidnoY");
console.log(
`${(await connection.getBalance(wallet)) / LAMPORTS_PER_SOL} SOL`
);
})();
================================================
FILE: code/accounts/get-balance/main.preview.en.cpp
================================================
Connection connection("https://api.devnet.solana.com");
auto key_pair = Keypair::generate();
auto public_key = key_pair.public_key;
uint64_t balance = connection.get_balance(public_key).unwrap();
================================================
FILE: code/accounts/get-balance/main.preview.en.py
================================================
client = Client("https://api.devnet.solana.com")
key_pair = Keypair()
public_key = key_pair.pubkey()
client.get_balance(public_key)
================================================
FILE: code/accounts/get-balance/main.preview.en.rs
================================================
connection.get_balance(&wallet).unwrap();
================================================
FILE: code/accounts/get-balance/main.preview.en.ts
================================================
console.log(`${(await connection.getBalance(wallet)) / LAMPORTS_PER_SOL} SOL`);
================================================
FILE: code/accounts/program-derived-address/create-a-pda/client/main.en.ts
================================================
import {
clusterApiUrl,
Connection,
Keypair,
Transaction,
SystemProgram,
PublicKey,
TransactionInstruction,
LAMPORTS_PER_SOL,
SYSVAR_RENT_PUBKEY,
} from "@solana/web3.js";
(async () => {
// program id
const programId = new PublicKey(
"7ZP42kRwUQ2zgbqXoaXzAFaiQnDyp6swNktTSv8mNQGN"
);
// connection
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
// setup fee payer
const feePayer = Keypair.generate();
const feePayerAirdropSignature = await connection.requestAirdrop(
feePayer.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(feePayerAirdropSignature);
// setup pda
let [pda, bump] = await PublicKey.findProgramAddress(
[feePayer.publicKey.toBuffer()],
programId
);
console.log(`bump: ${bump}, pubkey: ${pda.toBase58()}`);
const data_size = 0;
let tx = new Transaction().add(
new TransactionInstruction({
keys: [
{
pubkey: feePayer.publicKey,
isSigner: true,
isWritable: true,
},
{
pubkey: pda,
isSigner: false,
isWritable: true,
},
{
pubkey: SYSVAR_RENT_PUBKEY,
isSigner: false,
isWritable: false,
},
{
pubkey: SystemProgram.programId,
isSigner: false,
isWritable: false,
},
],
data: Buffer.from(new Uint8Array([data_size, bump])),
programId: programId,
})
);
console.log(`txhash: ${await connection.sendTransaction(tx, [feePayer])}`);
})();
================================================
FILE: code/accounts/program-derived-address/create-a-pda/client/main.preview.en.ts
================================================
let tx = new Transaction().add(
new TransactionInstruction({
keys: [
{
pubkey: feePayer.publicKey,
isSigner: true,
isWritable: true,
},
{
pubkey: pda,
isSigner: false,
isWritable: true,
},
{
pubkey: SYSVAR_RENT_PUBKEY,
isSigner: false,
isWritable: false,
},
{
pubkey: SystemProgram.programId,
isSigner: false,
isWritable: false,
},
],
data: Buffer.from(new Uint8Array([data_size, bump])),
programId: programId,
})
);
console.log(`txhash: ${await connection.sendTransaction(tx, [feePayer])}`);
================================================
FILE: code/accounts/program-derived-address/create-a-pda/program/Cargo.toml
================================================
[package]
edition = "2018"
name = "creation-of-pda"
version = "0.1.0"
[dependencies]
solana-program = "=1.8.5"
[lib]
crate-type = ["cdylib", "lib"]
================================================
FILE: code/accounts/program-derived-address/create-a-pda/program/Xargo.toml
================================================
[target.bpfel-unknown-unknown.dependencies.std]
features = []
================================================
FILE: code/accounts/program-derived-address/create-a-pda/program/src/lib.preview.rs
================================================
invoke_signed(
&system_instruction::create_account(
&payer_account_info.key,
&pda_account_info.key,
rent_lamports,
space.into(),
program_id
),
&[
payer_account_info.clone(),
pda_account_info.clone()
],
&[&[&payer_account_info.key.as_ref(), &[bump]]]
)?;
================================================
FILE: code/accounts/program-derived-address/create-a-pda/program/src/lib.rs
================================================
use solana_program::{
account_info::next_account_info, account_info::AccountInfo, entrypoint,
entrypoint::ProgramResult, program::invoke_signed, pubkey::Pubkey, system_instruction, sysvar::{rent::Rent, Sysvar}
};
entrypoint!(process_instruction);
fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8],
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let payer_account_info = next_account_info(account_info_iter)?;
let pda_account_info = next_account_info(account_info_iter)?;
let rent_sysvar_account_info = &Rent::from_account_info(next_account_info(account_info_iter)?)?;
// find space and minimum rent required for account
let space = instruction_data[0];
let bump = instruction_data[1];
let rent_lamports = rent_sysvar_account_info.minimum_balance(space.into());
invoke_signed(
&system_instruction::create_account(
&payer_account_info.key,
&pda_account_info.key,
rent_lamports,
space.into(),
program_id
),
&[
payer_account_info.clone(),
pda_account_info.clone()
],
&[&[&payer_account_info.key.as_ref(), &[bump]]]
)?;
Ok(())
}
================================================
FILE: code/accounts/program-derived-address/derived-a-pda/find-program-address.en.rs
================================================
use solana_program::pubkey::Pubkey;
use std::str::FromStr;
fn main() {
let program_id = Pubkey::from_str("G1DCNUQTSGHehwdLCAmRyAG8hf51eCHrLNUqkgGKYASj").unwrap();
let (pda, bump_seed) = Pubkey::find_program_address(&[b"test"], &program_id);
println!("pda: {}, bump: {}", pda, bump_seed);
}
================================================
FILE: code/accounts/program-derived-address/derived-a-pda/find-program-address.en.ts
================================================
import { PublicKey } from "@solana/web3.js";
(async () => {
const programId = new PublicKey(
"G1DCNUQTSGHehwdLCAmRyAG8hf51eCHrLNUqkgGKYASj"
);
let [pda, bump] = await PublicKey.findProgramAddress(
[Buffer.from("test")],
programId
);
console.log(`bump: ${bump}, pubkey: ${pda.toBase58()}`);
// you will find the result is different from `createProgramAddress`.
// It is expected because the real seed we used to calculate is ["test" + bump]
})();
================================================
FILE: code/accounts/program-derived-address/sign-a-pda/client/main.en.ts
================================================
import {
clusterApiUrl,
Connection,
Keypair,
Transaction,
SystemProgram,
PublicKey,
TransactionInstruction,
LAMPORTS_PER_SOL,
} from "@solana/web3.js";
import * as bs58 from "bs58";
(async () => {
// program id
const programId = new PublicKey(
"4wQC2yuVt4rbcPeYLK8WngqbYLg7UAahVjRFrK3NBjP6"
);
// connection
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
// setup fee payer
const feePayer = Keypair.generate();
const feePayerAirdropSignature = await connection.requestAirdrop(
feePayer.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(feePayerAirdropSignature);
// setup pda
let [pda, bump] = await PublicKey.findProgramAddress(
[Buffer.from("escrow")],
programId
);
console.log(`bump: ${bump}, pubkey: ${pda.toBase58()}`);
// require 1 SOL for the transfering in the program
const pdaAirdropSignature = await connection.requestAirdrop(
pda,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(pdaAirdropSignature);
// create a random `to`
const to = Keypair.generate();
console.log(`receiver: ${to.publicKey.toBase58()}`);
let tx = new Transaction().add(
new TransactionInstruction({
keys: [
{
pubkey: pda,
// Leave `false` here although we need a pda as a signer.
// It will be escalated on program if we use invoke_signed.
isSigner: false,
isWritable: true,
},
{
pubkey: to.publicKey,
isSigner: false,
isWritable: true,
},
{
pubkey: SystemProgram.programId,
isSigner: false,
isWritable: false,
},
],
data: Buffer.from(new Uint8Array([bump])),
programId: programId,
})
);
console.log(`txhash: ${await connection.sendTransaction(tx, [feePayer])}`);
})();
================================================
FILE: code/accounts/program-derived-address/sign-a-pda/client/main.preview.en.ts
================================================
let tx = new Transaction().add(
new TransactionInstruction({
keys: [
{
pubkey: pda,
// Leave `false` here although we need a pda as a signer.
// It will be escalated on program if we use invoke_signed.
isSigner: false,
isWritable: true,
},
{
pubkey: to.publicKey,
isSigner: false,
isWritable: true,
},
{
pubkey: SystemProgram.programId,
isSigner: false,
isWritable: false,
},
],
data: Buffer.from(new Uint8Array([bump])),
programId: programId,
})
);
console.log(`txhash: ${await connection.sendTransaction(tx, [feePayer])}`);
================================================
FILE: code/accounts/program-derived-address/sign-a-pda/program/.gitignore
================================================
/target
================================================
FILE: code/accounts/program-derived-address/sign-a-pda/program/Cargo.toml
================================================
[package]
edition = "2018"
name = "creation-of-pda"
version = "0.1.0"
[dependencies]
solana-program = "=1.8.5"
[lib]
crate-type = ["cdylib", "lib"]
================================================
FILE: code/accounts/program-derived-address/sign-a-pda/program/Xargo.toml
================================================
[target.bpfel-unknown-unknown.dependencies.std]
features = []
================================================
FILE: code/accounts/program-derived-address/sign-a-pda/program/src/lib.preview.rs
================================================
invoke_signed(
&system_instruction::transfer(
&pda_account_info.key,
&to_account_info.key,
100_000_000, // 0.1 SOL
),
&[
pda_account_info.clone(),
to_account_info.clone(),
system_program_account_info.clone(),
],
&[&[b"escrow", &[bump_seed]]],
)?;
================================================
FILE: code/accounts/program-derived-address/sign-a-pda/program/src/lib.rs
================================================
use solana_program::{
account_info::next_account_info, account_info::AccountInfo, entrypoint,
entrypoint::ProgramResult, program::invoke_signed, pubkey::Pubkey, system_instruction,
};
entrypoint!(process_instruction);
fn process_instruction(
_program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8],
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let pda_account_info = next_account_info(account_info_iter)?;
let to_account_info = next_account_info(account_info_iter)?;
let system_program_account_info = next_account_info(account_info_iter)?;
// pass bump seed for saving compute budget
let bump_seed = instruction_data[0];
invoke_signed(
&system_instruction::transfer(
&pda_account_info.key,
&to_account_info.key,
100_000_000, // 0.1 SOL
),
&[
pda_account_info.clone(),
to_account_info.clone(),
system_program_account_info.clone(),
],
&[&[b"escrow", &[bump_seed]]],
)?;
Ok(())
}
================================================
FILE: code/accounts/rent-exemption/rent-exemption.en.rs
================================================
use solana_client::rpc_client::RpcClient;
use solana_sdk::commitment_config::CommitmentConfig;
fn main() {
let rpc_url = String::from("https://api.devnet.solana.com");
let connection = RpcClient::new_with_commitment(rpc_url, CommitmentConfig::confirmed());
let data_length = 1500;
let rent_exemption_amount = connection
.get_minimum_balance_for_rent_exemption(data_length)
.unwrap();
println!("rent exemption amount: {}", rent_exemption_amount);
}
================================================
FILE: code/accounts/rent-exemption/rent-exemption.en.sh
================================================
solana rent 1500
================================================
FILE: code/accounts/rent-exemption/rent-exemption.en.ts
================================================
import { Connection, clusterApiUrl } from "@solana/web3.js";
(async () => {
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
// length of data in the account to calculate rent for
const dataLength = 1500;
const rentExemptionAmount =
await connection.getMinimumBalanceForRentExemption(dataLength);
console.log({
rentExemptionAmount,
});
})();
================================================
FILE: code/anchor/calculating-account-space-size/Cargo.toml
================================================
[package]
name = "calculating-account-space-size"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib", "lib"]
[features]
no-entrypoint = []
no-idl = []
cpi = ["no-entrypoint"]
default = []
[dependencies]
anchor-lang = "0.18.0"
================================================
FILE: code/anchor/calculating-account-space-size/Xargo.toml
================================================
[target.bpfel-unknown-unknown.dependencies.std]
features = []
================================================
FILE: code/anchor/calculating-account-space-size/src/account.preview.lib.rs
================================================
#[account]
pub struct Account {
pub unsigned8bit: u8,
pub unsigned16bit: u16,
pub unsigned32bit: u32,
pub unsigned64bit: u64,
pub unsigned128bit: u128,
pub signed8bit: i8,
pub signed16bit: i16,
pub signed32bit: i32,
pub signed64bit: i64,
pub signed128bit: i128,
pub boolean: bool,
pub character: char,
pub pubkey: Pubkey,
pub text: String, // dynamically-sized
pub vector_capacity: u16,
pub vector: vec<Pubkey>, // dynamically-sized
}
================================================
FILE: code/anchor/calculating-account-space-size/src/deserializer.preview.lib.rs
================================================
#[derive(Accounts)]
#[instruction(text: String, vector_capacity: u16)]
pub struct InitializeAccount<'info> {
#[account(init, payer=user, space=Account::space(&text, vector_capacity))]
pub account: Account<'info, Account>,
#[account(mut)]
pub user: Signer<'info>,
pub system_program: Program<'info, System>,
}
================================================
FILE: code/anchor/calculating-account-space-size/src/implementation-space.preview.lib.rs
================================================
impl Account {
fn space(text: &str, vector_capacity: u16) -> usize {
// discriminator
8 +
// u8 + u16 + u32 + u64 + u128
1 + 2 + 4 + 8 + 16 +
// i8 + i16 + i32 + i64 + i128
1 + 2 + 4 + 8 + 16 +
// bool + char
1 + 4 +
// String
4 + text.len() +
// vec of pubkeys
4 + (vector_capacity as usize) * std::mem::size_of::<Pubkey>()
}
}
================================================
FILE: code/anchor/calculating-account-space-size/src/lib.rs
================================================
use anchor_lang::prelude::*;
#[program]
pub mod program {
use super::*;
pub fn instruction(ctx: Context<InitializeAccount>, text: String, vector_capacity: u16)
-> Result<()> {
let account = &mut ctx.accounts.account;
account.text = text;
account.vector_capacity = vector_capacity;
Ok(())
}
}
#[derive(Accounts)]
#[instruction(text: String, vector_capacity: u16)]
pub struct NewAccount<'info> {
#[account(init, payer=user, space=Account::space(&text, vector_capacity))]
pub account: Account<'info, Account>,
#[account(mut)]
pub user: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[account]
pub struct Account {
pub unsigned8bit: u8,
pub unsigned16bit: u16,
pub unsigned32bit: u32,
pub unsigned64bit: u64,
pub unsigned128bit: u128,
pub signed8bit: i8,
pub signed16bit: i16,
pub signed32bit: i32,
pub signed64bit: i64,
pub signed128bit: i128,
pub boolean: bool,
pub character: char,
pub pubkey: Pubkey,
pub text: String, // dynamically-sized
pub vector_capacity: u16,
pub vector: vec<Pubkey> // dynamically-sized
}
impl Account {
fn space(text: &str, vector_capacity: u16) -> usize {
// discriminator
8 +
// u8 + u16 + u32 + u64 + u128
1 + 2 + 4 + 8 + 16 +
// i8 + i16 + i32 + i64 + i128
1 + 2 + 4 + 8 + 16 +
// bool + char
1 + 4 +
// String (discriminator + content)
4 + text.len() +
// vec of pubkeys (discriminator + content)
4 + (vector_capacity as usize) * std::mem::size_of::<Pubkey>()
}
}
================================================
FILE: code/anchor/define-program/Cargo.toml
================================================
[package]
name = "define-program"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib", "lib"]
[features]
no-entrypoint = []
no-idl = []
cpi = ["no-entrypoint"]
default = []
[dependencies]
anchor-lang = "0.18.0"
================================================
FILE: code/anchor/define-program/Xargo.toml
================================================
[target.bpfel-unknown-unknown.dependencies.std]
features = []
================================================
FILE: code/anchor/define-program/src/define-account.preview.lib.rs
================================================
#[account]
pub struct Account {
pub data: bool,
}
================================================
FILE: code/anchor/define-program/src/define-deserializer.preview.lib.rs
================================================
#[derive(Accounts)]
pub struct AccountsDeserializer<'info> {
// account used by the instruction
#[account(init, payer=user, space=8+1)]
pub account: Account<'info, Account>,
// transaction signer
#[account(mut)]
pub user: Signer<'info>,
pub system_program: Program<'info, System>,
}
================================================
FILE: code/anchor/define-program/src/define-program-and-instructions.preview.lib.rs
================================================
#[program]
pub mod program {
use super::*;
// example instruction that receives
// an account and a boolean value as input
pub fn instruction(ctx: Context<AccountsDeserializer>, data: bool)
-> Result<()> {
// get the deserialized account with permission to modify it
let account = &mut ctx.accounts.account;
// assign the input to a selected account's field (data)
account.data = data;
// declare an Ok(()) at the end to indicates no error
Ok(())
}
}
================================================
FILE: code/anchor/define-program/src/lib.rs
================================================
use anchor_lang::prelude::*;
#[program]
pub mod program {
use super::*;
// example instruction that receives
// an account and a boolean value as input
pub fn instruction(ctx: Context<AccountsDeserializer>, data: bool)
-> Result<()> {
// get the deserialized account with permission to modify it
let account = &mut ctx.accounts.account;
// assign the input to a selected account's field (data)
account.data = data;
// declare an Ok(()) at the end to indicates no error
Ok(())
}
pub fn initialize(ctx: Context<InitializeAccount>, data: bool)
-> Result<()> {
let account = &mut ctx.accounts.account;
account.data = data;
Ok(())
}
pub fn update(ctx: Context<UpdateAccount>, data: bool)
-> Result<()> {
let account = &mut ctx.accounts.account;
account.data = data;
Ok(())
}
}
#[derive(Accounts)]
pub struct AccountsDeserializer<'info> {
// account used by the instruction
#[account(init, payer=user, space=8+1)]
pub account: Account<'info, Account>,
// transaction signer
#[account(mut)]
pub user: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[derive(Accounts)]
pub struct InitializeAccount<'info> {
// account used by the instruction
#[account(init, payer=user, space=8+1)]
pub account: Account<'info, Account>,
// transaction signer
#[account(mut)]
pub user: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[derive(Accounts)]
pub struct UpdateAccount<'info> {
// account used by the instruction
#[account(mut, has_one=authority)]
pub account: Account<'info, Account>,
// transaction signer
pub user: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[account]
pub struct Account {
pub data: bool,
}
================================================
FILE: code/anchor/testing-with-anchor/client/testing-with-anchor.js
================================================
const anchor = require("@project-serum/anchor");
const { SystemProgram } = anchor.web3;
describe("testing-with-anchor", () => {
const provider = anchor.Provider.env();
anchor.setProvider(provider);
const program = anchor.workspace.TestingWithAnchor;
const baseAccount = anchor.web3.Keypair.generate();
it("Is initialized!", async () => {
// call initialize!
let tx = await program.rpc.initialize(provider.wallet.publicKey, {
accounts: {
baseAccount: baseAccount.publicKey,
user: provider.wallet.publicKey,
systemProgram: SystemProgram.programId,
},
signers: [baseAccount],
});
console.log("Your transaction signature", tx);
});
it("Is incrementing!", async () => {
let account = await program.account.baseAccount.fetch(
baseAccount.publicKey
);
console.log("Count is", account.count.toString());
// Call increment!
await program.rpc.increment({
accounts: {
baseAccount: baseAccount.publicKey,
authority: provider.wallet.publicKey,
},
});
let accountAfterIncrement = await program.account.baseAccount.fetch(
baseAccount.publicKey
);
console.log("Count is", accountAfterIncrement.count.toString());
});
});
================================================
FILE: code/anchor/testing-with-anchor/client/testing_with_anchor.py
================================================
from solders.keypair import Keypair
from solders.system_program import ID as SYS_PROGRAM_ID
from pytest import fixture, mark
from pytest_asyncio import fixture as async_fixture
from anchorpy import Program, Provider, Context
from anchorpy.pytest_plugin import workspace_fixture
from anchorpy.workspace import WorkspaceType
workspace = workspace_fixture(".")
@fixture(scope="module")
def program(workspace: WorkspaceType) -> Program:
"""Create a Program instance."""
return workspace["testing_with_anchor"]
@fixture(scope="module")
def provider(program: Program) -> Provider:
"""Get a Provider instance."""
return program.provider
@async_fixture(scope="module")
async def initialized_base_account(program: Program, provider: Provider) -> Keypair:
"""Call initialize()."""
base_account = Keypair()
tx_sig = await program.rpc["initialize"](
provider.wallet.public_key,
ctx=Context(
accounts={
"base_account": base_account.pubkey(),
"user": provider.wallet.public_key,
"system_program": SYS_PROGRAM_ID,
},
signers=[base_account],
),
)
print(f"Your transaction signature {tx_sig}")
return base_account
@mark.asyncio
async def test_initialized_base_account(
initialized_base_account: Keypair,
program: Program,
provider: Provider,
) -> None:
base_account = await program.account["BaseAccount"].fetch(initialized_base_account.pubkey())
assert base_account.authority == provider.wallet.public_key
count = base_account.count
assert count == 0
print(f"Count is {count}")
@mark.asyncio
async def test_increment(
initialized_base_account: Keypair,
program: Program,
provider: Provider,
) -> None:
await program.rpc["increment"](
ctx=Context(
accounts={
"base_account": initialized_base_account.pubkey(),
"authority": provider.wallet.public_key,
},
),
)
base_account = await program.account["BaseAccount"].fetch(initialized_base_account.pubkey())
assert base_account.authority == provider.wallet.public_key
count = base_account.count
assert count == 1
print(f"Count is {count}")
================================================
FILE: code/anchor/testing-with-anchor/program/Cargo.toml
================================================
[package]
name = "testing-with-anchor"
version = "0.1.0"
description = "Created with Anchor"
edition = "2018"
[lib]
crate-type = ["cdylib", "lib"]
name = "testing_with_anchor"
[features]
no-entrypoint = []
no-idl = []
no-log-ix-name = []
cpi = ["no-entrypoint"]
default = []
[dependencies]
anchor-lang = "0.19.0"
================================================
FILE: code/anchor/testing-with-anchor/program/Xargo.toml
================================================
[target.bpfel-unknown-unknown.dependencies.std]
features = []
================================================
FILE: code/anchor/testing-with-anchor/program/src/define-increment.preview.lib.rs
================================================
#[program]
pub mod testing_with_anchor {
use super::*;
pub fn initialize(ctx: Context<Initialize>, authority: Pubkey) -> ProgramResult {
let base_account = &mut ctx.accounts.base_account;
base_account.authority = authority;
base_account.count = 0;
Ok(())
}
pub fn increment(ctx: Context<Increment>) -> ProgramResult {
let base_account = &mut ctx.accounts.base_account;
base_account.count+=1;
Ok(())
}
}
================================================
FILE: code/anchor/testing-with-anchor/program/src/lib.rs
================================================
use anchor_lang::prelude::*;
//use std::collections::HashMap;
declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
#[program]
pub mod testing_with_anchor {
use super::*;
pub fn initialize(ctx: Context<Initialize>, authority: Pubkey) -> ProgramResult {
let base_account = &mut ctx.accounts.base_account;
base_account.authority = authority;
base_account.count = 0;
Ok(())
}
pub fn increment(ctx: Context<Increment>) -> ProgramResult {
let base_account = &mut ctx.accounts.base_account;
base_account.count+=1;
Ok(())
}
}
#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(init, payer = user, space = 9000)]
pub base_account: Account<'info, BaseAccount>,
#[account(mut)]
pub user:Signer<'info>,
pub system_program: Program<'info, System>,
}
#[derive(Accounts)]
pub struct Increment<'info> {
#[account(mut, has_one = authority)]
pub base_account: Account<'info, BaseAccount>,
pub authority: Signer<'info>
}
#[account]
pub struct BaseAccount {
pub count: u64,
pub authority: Pubkey,
}
================================================
FILE: code/basic-transactions/calc-tx-cost/calc-tx-cost.en.ts
================================================
import {
clusterApiUrl,
Connection,
Keypair,
SystemProgram,
Transaction,
} from "@solana/web3.js";
(async () => {
// Connect to cluster
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
const wallet = Keypair.generate();
const recentBlockhash = await connection.getRecentBlockhash();
const transaction = new Transaction({
recentBlockhash: recentBlockhash.blockhash,
}).add(
SystemProgram.transfer({
fromPubkey: wallet.publicKey,
toPubkey: wallet.publicKey,
lamports: 10,
})
);
transaction.sign(wallet);
console.log(
`SOL transfer would cost: ${
transaction.signatures.length *
recentBlockhash.feeCalculator.lamportsPerSignature
} lamports`
);
// SOL transfer would cost: 5000 lamports
})();
================================================
FILE: code/basic-transactions/calc-tx-cost/calc-tx-cost.preview.en.ts
================================================
const recentBlockhash = await connection.getRecentBlockhash();
const transaction = new Transaction({
recentBlockhash: recentBlockhash.blockhash,
}).add(
SystemProgram.transfer({
fromPubkey: wallet.publicKey,
toPubkey: wallet.publicKey,
lamports: 10,
})
);
transaction.sign(wallet);
console.log(
`SOL transfer would cost: ${
transaction.signatures.length *
recentBlockhash.feeCalculator.lamportsPerSignature
} lamports`
);
// SOL transfer would cost: 5000 lamports
================================================
FILE: code/basic-transactions/calc-tx-cost/calc-tx-est-fees-for-message.en.ts
================================================
import {
clusterApiUrl,
Connection,
Keypair,
Message,
SystemProgram,
SYSTEM_INSTRUCTION_LAYOUTS,
Transaction,
} from "@solana/web3.js";
import bs58 from "bs58";
(async () => {
// Connect to cluster
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
const payer = Keypair.generate();
const payee = Keypair.generate();
const type = SYSTEM_INSTRUCTION_LAYOUTS.Transfer;
const data = Buffer.alloc(type.layout.span);
const layoutFields = Object.assign({ instruction: type.index });
type.layout.encode(layoutFields, data);
const recentBlockhash = await connection.getLatestBlockhash();
const messageParams = {
accountKeys: [
payer.publicKey.toString(),
payee.publicKey.toString(),
SystemProgram.programId.toString(),
],
header: {
numReadonlySignedAccounts: 0,
numReadonlyUnsignedAccounts: 1,
numRequiredSignatures: 1,
},
instructions: [
{
accounts: [0, 1],
data: bs58.encode(data),
programIdIndex: 2,
},
],
recentBlockhash: recentBlockhash.blockhash,
};
const message = new Message(messageParams);
const fees = await connection.getFeeForMessage(message);
console.log(`Estimated SOL transfer cost: ${fees.value} lamports`);
// Estimated SOL transfer cost: 5000 lamports
})();
================================================
FILE: code/basic-transactions/calc-tx-cost/calc-tx-est-fees-for-message.preview.en.ts
================================================
const message = new Message(messageParams);
const fees = await connection.getFeeForMessage(message);
console.log(`Estimated SOL transfer cost: ${fees.value} lamports`);
// Estimated SOL transfer cost: 5000 lamports
================================================
FILE: code/basic-transactions/calc-tx-cost/calc-tx-est-fees.en.ts
================================================
import {
clusterApiUrl,
Connection,
Keypair,
SystemProgram,
Transaction,
} from "@solana/web3.js";
(async () => {
// Connect to cluster
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
const payer = Keypair.generate();
const payee = Keypair.generate();
const recentBlockhash = await connection.getLatestBlockhash();
const transaction = new Transaction({
recentBlockhash: recentBlockhash.blockhash,
feePayer: payer.publicKey
}).add(
SystemProgram.transfer({
fromPubkey: payer.publicKey,
toPubkey: payee.publicKey,
lamports: 10,
})
);
const fees = await transaction.getEstimatedFee(connection);
console.log(`Estimated SOL transfer cost: ${fees} lamports`);
// Estimated SOL transfer cost: 5000 lamports
})();
================================================
FILE: code/basic-transactions/calc-tx-cost/calc-tx-est-fees.preview.en.ts
================================================
const recentBlockhash = await connection.getLatestBlockhash();
const transaction = new Transaction({
recentBlockhash: recentBlockhash.blockhash,
}).add(
SystemProgram.transfer({
fromPubkey: payer.publicKey,
toPubkey: payee.publicKey,
lamports: 10,
})
);
const fees = await transaction.getEstimatedFee(connection);
console.log(`Estimated SOL transfer cost: ${fees} lamports`);
// Estimated SOL transfer cost: 5000 lamports
================================================
FILE: code/basic-transactions/compute-budget/computeBudget.en.rs
================================================
//! @brief Example Budget Management
use solana_client::rpc_client::RpcClient;
use solana_program::{instruction::Instruction, message::Message, pubkey::Pubkey};
use solana_sdk::{
compute_budget::ComputeBudgetInstruction,
pubkey,
signature::{Keypair, Signature},
signer::Signer,
transaction::Transaction,
};
/// Submits the program instruction as per the instruction definition
fn submit_transaction(
rpc_client: &RpcClient,
wallet_signer: &dyn Signer,
instructions: Vec<Instruction>,
) -> Result<Signature, Box<dyn std::error::Error>> {
let mut transaction =
Transaction::new_unsigned(Message::new(&instructions, Some(&wallet_signer.pubkey())));
let recent_blockhash = rpc_client
.get_latest_blockhash()
.map_err(|err| format!("error: unable to get recent blockhash: {}", err))?;
transaction
.try_sign(&vec![wallet_signer], recent_blockhash)
.map_err(|err| format!("error: failed to sign transaction: {}", err))?;
let signature = rpc_client
.send_and_confirm_transaction(&transaction)
.map_err(|err| format!("error: send transaction: {}", err))?;
Ok(signature)
}
const PROG_KEY: Pubkey = pubkey!("PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc");
/// Increase the Transaction Budget and call normal instruction(s)
/// Here we send redundant transactions to witness Compute Budget drawdown
fn send_instructions_demo(
rpc_client: &RpcClient,
wallet_signer: &dyn Signer,
) -> Result<(), Box<dyn std::error::Error>> {{
let accounts = &[];
let txn = submit_transaction(
&connection,
&wallet_signer,
// Array of instructions: 0: Set Compute Unit Limt, 1: Set Prioritization Fee,
// 2: Do something, 3: Do something else
[ComputeBudgetInstruction::set_compute_unit_limit(1_000_000u32),
ComputeBudgetInstruction::set_compute_unit_price(1u32),
Instruction::new_with_borsh(PROG_KEY, &0u8, accounts.to_vec()),
Instruction::new_with_borsh(PROG_KEY, &0u8, accounts.to_vec())].to_vec(),
)?;
println!("{:?}", txn);
Ok(())
}
================================================
FILE: code/basic-transactions/compute-budget/computeBudget.en.tsx
================================================
import { BN } from "@project-serum/anchor";
import {
Keypair,
Connection,
LAMPORTS_PER_SOL,
sendAndConfirmTransaction,
ComputeBudgetProgram,
SystemProgram,
Transaction,
} from "@solana/web3.js";
(async () => {
const payer = Keypair.generate();
const toAccount = Keypair.generate().publicKey;
const connection = new Connection("http://127.0.0.1:8899", "confirmed");
const airdropSignature = await connection.requestAirdrop(
payer.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(airdropSignature);
const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({
units: 1000000
});
const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({
microLamports: 1
});
// Total fee will be 5,001 Lamports for 1M CU
const transaction = new Transaction()
.add(modifyComputeUnits)
.add(addPriorityFee)
.add(
SystemProgram.transfer({
fromPubkey: payer.publicKey,
toPubkey: toAccount,
lamports: 10000000,
})
);
const signature = await sendAndConfirmTransaction(connection, transaction, [
payer,
]);
console.log(signature);
const result = await connection.getParsedTransaction(signature);
console.log(result);
})();
================================================
FILE: code/basic-transactions/compute-budget/computeBudget.preview.en.rs
================================================
let txn = submit_transaction(
&connection,
&wallet_signer,
// Array of instructions: 0: Set Compute Unit Limt, 1: Set Prioritization Fee,
// 2: Do something, 3: Do something else
[ComputeBudgetInstruction::set_compute_unit_limit(1_000_000u32),
ComputeBudgetInstruction::set_compute_unit_price(1u32),
Instruction::new_with_borsh(PROG_KEY, &0u8, accounts.to_vec()),
Instruction::new_with_borsh(PROG_KEY, &0u8, accounts.to_vec())].to_vec(),
)?;
================================================
FILE: code/basic-transactions/compute-budget/computeBudget.preview.en.tsx
================================================
const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({
units: 1000000
});
const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({
microLamports: 1
});
const transaction = new Transaction()
.add(modifyComputeUnits)
.add(addPriorityFee)
.add(
SystemProgram.transfer({
fromPubkey: payer.publicKey,
toPubkey: toAccount,
lamports: 10000000,
})
);
================================================
FILE: code/basic-transactions/compute-budget/log_output.txt
================================================
[ 1] Program ComputeBudget111111111111111111111111111111 invoke [1]
[ 2] Program ComputeBudget111111111111111111111111111111 success
[ 3]
[ 4] Program ComputeBudget111111111111111111111111111111 invoke [1]
[ 5] Program ComputeBudget111111111111111111111111111111 success
================================================
FILE: code/basic-transactions/compute-budget/solana_program.rs
================================================
//! entry point for instruction execution
use solana_program::{
account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, msg, pubkey::Pubkey,
};
entrypoint!(process_instruction);
pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8],
) -> ProgramResult {
msg!(
"process_instruction: {}: {} accounts, data={:?}",
program_id,
accounts.len(),
instruction_data
);
Ok(())
}
================================================
FILE: code/basic-transactions/memo/memo.adapter.en.tsx
================================================
import { WalletNotConnectedError } from "@solana/wallet-adapter-base";
import { useConnection, useWallet } from "@solana/wallet-adapter-react";
import {
Keypair,
PublicKey,
SystemProgram,
Transaction,
TransactionInstruction,
} from "@solana/web3.js";
import React, { FC, useCallback } from "react";
export const SendTenLamportToRandomAddress: FC = () => {
const { connection } = useConnection();
const { publicKey, sendTransaction } = useWallet();
const onClick = useCallback(async () => {
if (!publicKey) throw new WalletNotConnectedError();
const transaction = new Transaction().add(
SystemProgram.transfer({
fromPubkey: publicKey,
toPubkey: Keypair.generate().publicKey,
lamports: 10,
})
);
await transaction.add(
new TransactionInstruction({
keys: [{ pubkey: publicKey, isSigner: true, isWritable: true }],
data: Buffer.from("Data to send in transaction", "utf-8"),
programId: new PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),
})
);
const signature = await sendTransaction(transaction, connection);
await connection.confirmTransaction(signature, "processed");
}, [publicKey, sendTransaction, connection]);
return (
<button onClick={onClick} disabled={!publicKey}>
Send 1 lamport to a random address!
</button>
);
};
================================================
FILE: code/basic-transactions/memo/memo.adapter.preview.en.tsx
================================================
const transaction = new Transaction().add(
SystemProgram.transfer({
fromPubkey: publicKey,
toPubkey: Keypair.generate().publicKey,
lamports: 10,
})
);
await transaction.add(
new TransactionInstruction({
keys: [{ pubkey: publicKey, isSigner: true, isWritable: true }],
data: Buffer.from("Data to send in transaction", "utf-8"),
programId: new PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),
})
);
const signature = await sendTransaction(transaction, connection);
await connection.confirmTransaction(signature, "processed");
================================================
FILE: code/basic-transactions/memo/memo.en.sh
================================================
solana transfer --from <KEYPAIR> <RECIPIENT_ACCOUNT_ADDRESS> 0.5 --allow-unfunded-recipient --url https://api.devnet.solana.com --fee-payer <KEYPAIR> --with-memo <MEMO>
================================================
FILE: code/basic-transactions/memo/memo.en.ts
================================================
import {
Connection,
Keypair,
SystemProgram,
LAMPORTS_PER_SOL,
PublicKey,
Transaction,
TransactionInstruction,
sendAndConfirmTransaction,
} from "@solana/web3.js";
(async () => {
const fromKeypair = Keypair.generate();
const toKeypair = Keypair.generate();
const connection = new Connection(
"https://api.devnet.solana.com",
"confirmed"
);
const airdropSignature = await connection.requestAirdrop(
fromKeypair.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(airdropSignature);
const lamportsToSend = 10;
const transferTransaction = new Transaction().add(
SystemProgram.transfer({
fromPubkey: fromKeypair.publicKey,
toPubkey: toKeypair.publicKey,
lamports: lamportsToSend,
})
);
await transferTransaction.add(
new TransactionInstruction({
keys: [
{ pubkey: fromKeypair.publicKey, isSigner: true, isWritable: true },
],
data: Buffer.from("Data to send in transaction", "utf-8"),
programId: new PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),
})
);
await sendAndConfirmTransaction(connection, transferTransaction, [
fromKeypair,
]);
})();
================================================
FILE: code/basic-transactions/memo/memo.preview.en.ts
================================================
const transferTransaction = new Transaction().add(
SystemProgram.transfer({
fromPubkey: fromKeypair.publicKey,
toPubkey: toKeypair.publicKey,
lamports: lamportsToSend,
})
);
await transferTransaction.add(
new TransactionInstruction({
keys: [{ pubkey: fromKeypair.publicKey, isSigner: true, isWritable: true }],
data: Buffer.from("Data to send in transaction", "utf-8"),
programId: new PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),
})
);
await sendAndConfirmTransaction(connection, transferTransaction, [fromKeypair]);
================================================
FILE: code/basic-transactions/sending-sol/sending-sol.adapter.en.tsx
================================================
import { WalletNotConnectedError } from "@solana/wallet-adapter-base";
import { useConnection, useWallet } from "@solana/wallet-adapter-react";
import { Keypair, SystemProgram, Transaction } from "@solana/web3.js";
import React, { FC, useCallback } from "react";
export const SendTenLamportToRandomAddress: FC = () => {
const { connection } = useConnection();
const { publicKey, sendTransaction } = useWallet();
const onClick = useCallback(async () => {
if (!publicKey) throw new WalletNotConnectedError();
const transaction = new Transaction().add(
SystemProgram.transfer({
fromPubkey: publicKey,
toPubkey: Keypair.generate().publicKey,
lamports: 1_000_000,
})
);
const signature = await sendTransaction(transaction, connection);
await connection.confirmTransaction(signature, "processed");
}, [publicKey, sendTransaction, connection]);
return (
<button onClick={onClick} disabled={!publicKey}>
Send 1 lamport to a random address!
</button>
);
};
================================================
FILE: code/basic-transactions/sending-sol/sending-sol.adapter.preview.en.tsx
================================================
const transaction = new Transaction().add(
SystemProgram.transfer({
fromPubkey: publicKey,
toPubkey: Keypair.generate().publicKey,
lamports: 1_000_000,
})
);
const signature = await sendTransaction(transaction, connection);
await connection.confirmTransaction(signature, "processed");
================================================
FILE: code/basic-transactions/sending-sol/sending-sol.en.py
================================================
from solana.rpc.api import Client
from solders.keypair import Keypair
from solana.transaction import Transaction
from solders.system_program import TransferParams, transfer
LAMPORT_PER_SOL = 1000000000
client: Client = Client("https://api.devnet.solana.com")
sender = Keypair()
receiver = Keypair()
airdrop = client.request_airdrop(sender.pubkey(), 1 * LAMPORT_PER_SOL)
airdrop_signature = airdrop.value
client.confirm_transaction(airdrop_signature)
transaction = Transaction().add(transfer(TransferParams(
from_pubkey=sender.pubkey(),
to_pubkey=receiver.pubkey(),
lamports=1_000_000)
))
result = client.send_transaction(transaction, sender)
print(result)
================================================
FILE: code/basic-transactions/sending-sol/sending-sol.en.rs
================================================
use solana_client::rpc_client::RpcClient;
use solana_program::system_instruction;
use solana_sdk::commitment_config::CommitmentConfig;
use solana_sdk::native_token::LAMPORTS_PER_SOL;
use solana_sdk::signature::{Keypair, Signer};
use solana_sdk::transaction::Transaction;
fn main() {
let from = Keypair::new();
let frompubkey = Signer::pubkey(&from);
let to = Keypair::new();
let topubkey = Signer::pubkey(&to);
let lamports_to_send = 1_000_000;
let rpc_url = String::from("https://api.devnet.solana.com");
let connection = RpcClient::new_with_commitment(rpc_url, CommitmentConfig::confirmed());
///Airdropping some Sol to the 'from' account
match connection.request_airdrop(&frompubkey, LAMPORTS_PER_SOL) {
Ok(sig) => loop {
if let Ok(confirmed) = connection.confirm_transaction(&sig) {
if confirmed {
println!("Transaction: {} Status: {}", sig, confirmed);
break;
}
}
},
Err(_) => println!("Error requesting airdrop"),
};
///Creating the transfer sol instruction
let ix = system_instruction::transfer(&frompubkey, &topubkey, lamports_to_send);
///Putting the transfer sol instruction into a transaction
let recent_blockhash = connection.get_latest_blockhash().expect("Failed to get latest blockhash.");
let txn = Transaction::new_signed_with_payer(&[ix], Some(&frompubkey), &[&from], recent_blockhash);
///Sending the transfer sol transaction
match connection.send_and_confirm_transaction(&txn){
Ok(sig) => loop {
if let Ok(confirmed) = connection.confirm_transaction(&sig) {
if confirmed {
println!("Transaction: {} Status: {}", sig, confirmed);
break;
}
}
},
Err(e) => println!("Error transferring Sol:, {}", e),
}
}
================================================
FILE: code/basic-transactions/sending-sol/sending-sol.en.sh
================================================
solana transfer --from <KEYPAIR> <RECIPIENT_ACCOUNT_ADDRESS> 0.001 --allow-unfunded-recipient --url https://api.devnet.solana.com --fee-payer <KEYPAIR>
================================================
FILE: code/basic-transactions/sending-sol/sending-sol.en.ts
================================================
import {
Connection,
Keypair,
SystemProgram,
LAMPORTS_PER_SOL,
Transaction,
sendAndConfirmTransaction,
} from "@solana/web3.js";
(async () => {
const fromKeypair = Keypair.generate();
const toKeypair = Keypair.generate();
const connection = new Connection(
"https://api.devnet.solana.com",
"confirmed"
);
const airdropSignature = await connection.requestAirdrop(
fromKeypair.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(airdropSignature);
const lamportsToSend = 1_000_000;
const transferTransaction = new Transaction().add(
SystemProgram.transfer({
fromPubkey: fromKeypair.publicKey,
toPubkey: toKeypair.publicKey,
lamports: lamportsToSend,
})
);
await sendAndConfirmTransaction(connection, transferTransaction, [
fromKeypair,
]);
})();
================================================
FILE: code/basic-transactions/sending-sol/sending-sol.preview.en.py
================================================
transaction = Transaction().add(transfer(TransferParams(
from_pubkey=sender.pubkey(),
to_pubkey=receiver.pubkey(),
lamports=1_000_000)
))
client.send_transaction(transaction, sender)
================================================
FILE: code/basic-transactions/sending-sol/sending-sol.preview.en.ts
================================================
const transferTransaction = new Transaction().add(
SystemProgram.transfer({
fromPubkey: fromKeypair.publicKey,
toPubkey: toKeypair.publicKey,
lamports: lamportsToSend,
})
);
await sendAndConfirmTransaction(connection, transferTransaction, [fromKeypair]);
================================================
FILE: code/basic-transactions/sending-sol/sending-sol.preview.rs
================================================
system_instruction::transfer(&from, &to, lamports_to_send);
================================================
FILE: code/basic-transactions/sending-spl-token/sending-spl-token.adapter.en.tsx
================================================
import { WalletNotConnectedError } from "@solana/wallet-adapter-base";
import { useConnection, useWallet } from "@solana/wallet-adapter-react";
import { Keypair, SystemProgram, Transaction } from "@solana/web3.js";
import { TOKEN_PROGRAM_ID, createTransferInstruction } from "@solana/spl-token";
import React, { FC, useCallback } from "react";
export const SendSPLTokenToAddress: FC = (
fromTokenAccount,
toTokenAccount,
fromWallet
) => {
const { connection } = useConnection();
const { publicKey, sendTransaction } = useWallet();
const onClick = useCallback(async () => {
if (!publicKey) throw new WalletNotConnectedError();
const transaction = new Transaction().add(
createTransferInstruction(
fromTokenAccount.address,
toTokenAccount.address,
fromWallet.publicKey,
1,
[],
TOKEN_PROGRAM_ID
)
);
const signature = await sendTransaction(transaction, connection);
await connection.confirmTransaction(signature, "processed");
}, [publicKey, sendTransaction, connection]);
return (
<button onClick={onClick} disabled={!publicKey}>
Send 1 lamport to a random address!
</button>
);
};
================================================
FILE: code/basic-transactions/sending-spl-token/sending-spl-token.adapter.preview.en.tsx
================================================
const transaction = new Transaction().add(
Token.createTransferInstruction(
TOKEN_PROGRAM_ID,
fromTokenAccount.address,
toTokenAccount.address,
fromWallet.publicKey,
[],
1
)
);
const signature = await sendTransaction(transaction, connection);
await connection.confirmTransaction(signature, "processed");
================================================
FILE: code/basic-transactions/sending-spl-token/sending-spl-token.en.sh
================================================
$ spl-token transfer AQoKYV7tYpTrFZN6P5oUufbQKAUr9mNYGe1TTJC9wajM 50 vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg
Transfer 50 tokens
Sender: 7UX2i7SucgLMQcfZ75s3VXmZZY4YRUyJN9X1RgfMoDUi
Recipient: vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg
Recipient associated token account: F59618aQB8r6asXeMcB9jWuY6NEx1VduT9yFo1GTi1ks
Signature: 5a3qbvoJQnTAxGPHCugibZTbSu7xuTgkxvF4EJupRjRXGgZZrnWFmKzfEzcqKF2ogCaF4QKVbAtuFx7xGwrDUcGd
================================================
FILE: code/basic-transactions/sending-spl-token/sending-spl-token.en.ts
================================================
import {
Connection,
clusterApiUrl,
Keypair,
LAMPORTS_PER_SOL,
Transaction,
sendAndConfirmTransaction,
} from "@solana/web3.js";
import {
createMint,
getOrCreateAssociatedTokenAccount,
mintTo,
createTransferInstruction,
} from "@solana/spl-token";
(async () => {
// Connect to cluster
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
// Generate a new wallet keypair and airdrop SOL
const fromWallet = Keypair.generate();
const fromAirdropSignature = await connection.requestAirdrop(
fromWallet.publicKey,
LAMPORTS_PER_SOL
);
// Wait for airdrop confirmation
await connection.confirmTransaction(fromAirdropSignature);
// Generate a new wallet to receive newly minted token
const toWallet = Keypair.generate();
// Create new token mint
const mint = await createMint(
connection,
fromWallet,
fromWallet.publicKey,
null,
9
);
// Get the token account of the fromWallet Solana address, if it does not exist, create it
const fromTokenAccount = await getOrCreateAssociatedTokenAccount(
connection,
fromWallet,
mint,
fromWallet.publicKey
);
//get the token account of the toWallet Solana address, if it does not exist, create it
const toTokenAccount = await getOrCreateAssociatedTokenAccount(
connection,
fromWallet,
mint,
toWallet.publicKey
);
// Minting 1 new token to the "fromTokenAccount" account we just returned/created
await mintTo(
connection,
fromWallet,
mint,
fromTokenAccount.address,
fromWallet.publicKey,
1000000000, // it's 1 token, but in lamports
[]
);
// Add token transfer instructions to transaction
const transaction = new Transaction().add(
createTransferInstruction(
fromTokenAccount.address,
toTokenAccount.address,
fromWallet.publicKey,
1
)
);
// Sign transaction, broadcast, and confirm
await sendAndConfirmTransaction(connection, transaction, [fromWallet]);
})();
================================================
FILE: code/basic-transactions/sending-spl-token/sending-spl-token.preview.en.ts
================================================
// Add token transfer instructions to transaction
const transaction = new web3.Transaction().add(
splToken.Token.createTransferInstruction(
splToken.TOKEN_PROGRAM_ID,
fromTokenAccount.address,
toTokenAccount.address,
fromWallet.publicKey,
[],
1
)
);
// Sign transaction, broadcast, and confirm
await web3.sendAndConfirmTransaction(connection, transaction, [fromWallet]);
================================================
FILE: code/data-migration/account-v0.en.rs
================================================
//! @brief account_state manages account data
use arrayref::{array_ref, array_refs};
use borsh::{BorshDeserialize, BorshSerialize};
use solana_program::{
msg,
program_error::ProgramError,
program_pack::{IsInitialized, Pack, Sealed},
};
use std::{io::BufWriter, mem};
/// Currently using state. If version changes occur, this
/// should be copied to another serializable backlevel one
/// before adding new fields here
#[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
pub struct AccountContentCurrent {
pub somevalue: u64,
}
/// Maintains account data
#[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
pub struct ProgramAccountState {
is_initialized: bool,
data_version: u8,
account_data: AccountContentCurrent,
}
impl ProgramAccountState {
/// Signal initialized
pub fn set_initialized(&mut self) {
self.is_initialized = true;
}
/// Get the initialized flag
pub fn initialized(&self) -> bool {
self.is_initialized
}
/// Gets the current data version
pub fn version(&self) -> u8 {
self.data_version
}
/// Get the reference to content structure
pub fn content(&self) -> &AccountContentCurrent {
&self.account_data
}
/// Get the mutable reference to content structure
pub fn content_mut(&mut self) -> &mut AccountContentCurrent {
&mut self.account_data
}
}
/// Declaration of the current data version.
pub const DATA_VERSION: u8 = 0;
/// Account allocated size
pub const ACCOUNT_ALLOCATION_SIZE: usize = 1024;
/// Initialized flag is 1st byte of data block
const IS_INITIALIZED: usize = 1;
/// Data version (current) is 2nd byte of data block
const DATA_VERSION_ID: usize = 1;
/// Previous content data size (before changing this is equal to current)
pub const PREVIOUS_VERSION_DATA_SIZE: usize = mem::size_of::<AccountContentCurrent>();
/// Total space occupied by previous account data
pub const PREVIOUS_ACCOUNT_SPACE: usize =
IS_INITIALIZED + DATA_VERSION_ID + PREVIOUS_VERSION_DATA_SIZE;
/// Current content data size
pub const CURRENT_VERSION_DATA_SIZE: usize = mem::size_of::<AccountContentCurrent>();
/// Total usage for data only
pub const CURRENT_USED_SIZE: usize = IS_INITIALIZED + DATA_VERSION_ID + CURRENT_VERSION_DATA_SIZE;
/// How much of 1024 is used
pub const CURRENT_UNUSED_SIZE: usize = ACCOUNT_ALLOCATION_SIZE - CURRENT_USED_SIZE;
/// Current space used by header (initialized, data version and Content)
pub const ACCOUNT_STATE_SPACE: usize = CURRENT_USED_SIZE + CURRENT_UNUSED_SIZE;
/// Future data migration logic that converts prior state of data
/// to current state of data
fn conversion_logic(src: &[u8]) -> Result<ProgramAccountState, ProgramError> {
let past = array_ref![src, 0, PREVIOUS_ACCOUNT_SPACE];
let (initialized, _, _account_space) = array_refs![
past,
IS_INITIALIZED,
DATA_VERSION_ID,
PREVIOUS_VERSION_DATA_SIZE
];
// Logic to uplift from previous version
// GOES HERE
// Give back
Ok(ProgramAccountState {
is_initialized: initialized[0] != 0u8,
data_version: DATA_VERSION,
account_data: AccountContentCurrent::default(),
})
}
impl Sealed for ProgramAccountState {}
impl IsInitialized for ProgramAccountState {
fn is_initialized(&self) -> bool {
self.is_initialized
}
}
impl Pack for ProgramAccountState {
const LEN: usize = ACCOUNT_STATE_SPACE;
/// Store 'state' of account to its data area
fn pack_into_slice(&self, dst: &mut [u8]) {
let mut bw = BufWriter::new(dst);
self.serialize(&mut bw).unwrap();
}
/// Retrieve 'state' of account from account data area
fn unpack_from_slice(src: &[u8]) -> Result<Self, ProgramError> {
let initialized = src[0] != 0;
// Check initialized
if initialized {
// Version check
if src[1] == DATA_VERSION {
msg!("Processing consistent data");
Ok(
ProgramAccountState::try_from_slice(array_ref![src, 0, CURRENT_USED_SIZE])
.unwrap(),
)
} else {
msg!("Processing backlevel data");
conversion_logic(src)
}
} else {
msg!("Processing pre-initialized data");
Ok(ProgramAccountState {
is_initialized: false,
data_version: DATA_VERSION,
account_data: AccountContentCurrent::default(),
})
}
}
}
================================================
FILE: code/data-migration/account-v0.preview.en.rs
================================================
#[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
pub struct AccountContentCurrent {
pub somevalue: u64,
}
#[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
pub struct ProgramAccountState {
is_initialized: bool,
data_version: u8,
account_data: AccountContentCurrent,
}
================================================
FILE: code/data-migration/account-v1.en.rs
================================================
//! @brief account_state manages account data
use arrayref::{array_ref, array_refs};
use borsh::{BorshDeserialize, BorshSerialize};
use solana_program::{
borsh::try_from_slice_unchecked,
msg,
program_error::ProgramError,
program_pack::{IsInitialized, Pack, Sealed},
};
use std::{io::BufWriter, mem};
/// Current state (DATA_VERSION 1). If version changes occur, this
/// should be copied to another (see AccountContentOld below)
/// We've added a new field: 'somestring'
#[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
pub struct AccountContentCurrent {
pub somevalue: u64,
pub somestring: String,
}
/// Old content state (DATA_VERSION 0).
#[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
pub struct AccountContentOld {
pub somevalue: u64,
}
/// Maintains account data
#[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
pub struct ProgramAccountState {
is_initialized: bool,
data_version: u8,
account_data: AccountContentCurrent,
}
impl ProgramAccountState {
/// Signal initialized
pub fn set_initialized(&mut self) {
self.is_initialized = true;
}
/// Get the initialized flag
pub fn initialized(&self) -> bool {
self.is_initialized
}
/// Gets the current data version
pub fn version(&self) -> u8 {
self.data_version
}
/// Get the reference to content structure
pub fn content(&self) -> &AccountContentCurrent {
&self.account_data
}
/// Get the mutable reference to content structure
pub fn content_mut(&mut self) -> &mut AccountContentCurrent {
&mut self.account_data
}
}
/// Declaration of the current data version.
const DATA_VERSION: u8 = 1; // Adding string to content
// Previous const DATA_VERSION: u8 = 0;
/// Account allocated size
const ACCOUNT_ALLOCATION_SIZE: usize = 1024;
/// Initialized flag is 1st byte of data block
const IS_INITIALIZED: usize = 1;
/// Data version (current) is 2nd byte of data block
const DATA_VERSION_ID: usize = 1;
/// Previous content data size (before changing this is equal to current)
const PREVIOUS_VERSION_DATA_SIZE: usize = mem::size_of::<AccountContentOld>();
/// Total space occupied by previous account data
const PREVIOUS_ACCOUNT_SPACE: usize = IS_INITIALIZED + DATA_VERSION_ID + PREVIOUS_VERSION_DATA_SIZE;
/// Current content data size
const CURRENT_VERSION_DATA_SIZE: usize = mem::size_of::<AccountContentCurrent>();
/// Total usage for data only
const CURRENT_USED_SIZE: usize = IS_INITIALIZED + DATA_VERSION_ID + CURRENT_VERSION_DATA_SIZE;
/// How much of 1024 is used
const CURRENT_UNUSED_SIZE: usize = ACCOUNT_ALLOCATION_SIZE - CURRENT_USED_SIZE;
/// Current space used by header (initialized, data version and Content)
pub const ACCOUNT_STATE_SPACE: usize = CURRENT_USED_SIZE + CURRENT_UNUSED_SIZE;
/// Future data migration logic that converts prior state of data
/// to current state of data
fn conversion_logic(src: &[u8]) -> Result<ProgramAccountState, ProgramError> {
let past = array_ref![src, 0, PREVIOUS_ACCOUNT_SPACE];
let (initialized, _, account_space) = array_refs![
past,
IS_INITIALIZED,
DATA_VERSION_ID,
PREVIOUS_VERSION_DATA_SIZE
];
// Logic to upgrade from previous version
// GOES HERE
let old = try_from_slice_unchecked::<AccountContentOld>(account_space).unwrap();
// Default sets 'somevalue' to 0 and somestring to default ""
let mut new_content = AccountContentCurrent::default();
// We copy the existing 'somevalue', the program instructions will read/update 'somestring' without fail
new_content.somevalue = old.somevalue;
// Give back
Ok(ProgramAccountState {
is_initialized: initialized[0] != 0u8,
data_version: DATA_VERSION,
account_data: new_content,
})
}
impl Sealed for ProgramAccountState {}
impl IsInitialized for ProgramAccountState {
fn is_initialized(&self) -> bool {
self.is_initialized
}
}
impl Pack for ProgramAccountState {
const LEN: usize = ACCOUNT_STATE_SPACE;
/// Store 'state' of account to its data area
fn pack_into_slice(&self, dst: &mut [u8]) {
let mut bw = BufWriter::new(dst);
self.serialize(&mut bw).unwrap();
}
/// Retrieve 'state' of account from account data area
fn unpack_from_slice(src: &[u8]) -> Result<Self, ProgramError> {
let initialized = src[0] != 0;
// Check initialized
if initialized {
// Version check
if src[1] == DATA_VERSION {
msg!("Processing consistent version data");
Ok(try_from_slice_unchecked::<ProgramAccountState>(src).unwrap())
} else {
msg!("Processing backlevel data");
conversion_logic(src)
}
} else {
msg!("Processing pre-initialized data");
Ok(ProgramAccountState {
is_initialized: false,
data_version: DATA_VERSION,
account_data: AccountContentCurrent::default(),
})
}
}
}
================================================
FILE: code/data-migration/account-v1.preview.en.rs
================================================
/// Current state (DATA_VERSION 1). If version changes occur, this
/// should be copied to another (see AccountContentOld below)
/// We've added a new field: 'somestring'
#[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
pub struct AccountContentCurrent {
pub somevalue: u64,
pub somestring: String,
}
/// Old content state (DATA_VERSION 0).
#[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
pub struct AccountContentOld {
pub somevalue: u64,
}
/// Maintains account data
#[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
pub struct ProgramAccountState {
is_initialized: bool,
data_version: u8,
account_data: AccountContentCurrent,
}
================================================
FILE: code/data-migration/rust.instruction.en.rs
================================================
//! instruction Contains the main ProgramInstruction enum
use {
crate::error::DataVersionError,
borsh::{BorshDeserialize, BorshSerialize},
solana_program::program_error::ProgramError,
};
#[derive(BorshDeserialize, BorshSerialize, Debug, PartialEq)]
/// All custom program instructions
pub enum ProgramInstruction {
InitializeAccount,
SetU64Value(u64),
FailInstruction,
}
impl ProgramInstruction {
/// Unpack inbound buffer to associated Instruction
/// The expected format for input is a Borsh serialized vector
pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
let payload = ProgramInstruction::try_from_slice(input).unwrap();
match payload {
ProgramInstruction::InitializeAccount => Ok(payload),
ProgramInstruction::SetU64Value(_) => Ok(payload),
_ => Err(DataVersionError::InvalidInstruction.into()),
}
}
}
================================================
FILE: code/data-migration/rust.instruction.preview.en.rs
================================================
impl ProgramInstruction {
/// Unpack inbound buffer to associated Instruction
/// The expected format for input is a Borsh serialized vector
pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
let payload = ProgramInstruction::try_from_slice(input).unwrap();
match payload {
ProgramInstruction::InitializeAccount => Ok(payload),
ProgramInstruction::SetU64Value(_) => Ok(payload),
_ => Err(DataVersionError::InvalidInstruction.into()),
}
}
}
================================================
FILE: code/data-migration/rust.instruction1.en.rs
================================================
//! instruction Contains the main VersionProgramInstruction enum
use {
crate::error::DataVersionError,
borsh::{BorshDeserialize, BorshSerialize},
solana_program::{borsh::try_from_slice_unchecked, msg, program_error::ProgramError},
};
#[derive(BorshDeserialize, BorshSerialize, Debug, PartialEq)]
/// All custom program instructions
pub enum VersionProgramInstruction {
InitializeAccount,
SetU64Value(u64),
SetString(String), // Added with data version change
FailInstruction,
}
impl VersionProgramInstruction {
/// Unpack inbound buffer to associated Instruction
/// The expected format for input is a Borsh serialized vector
pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
let payload = try_from_slice_unchecked::<VersionProgramInstruction>(input).unwrap();
// let payload = VersionProgramInstruction::try_from_slice(input).unwrap();
match payload {
VersionProgramInstruction::InitializeAccount => Ok(payload),
VersionProgramInstruction::SetU64Value(_) => Ok(payload),
VersionProgramInstruction::SetString(_) => Ok(payload), // Added with data version change
_ => Err(DataVersionError::InvalidInstruction.into()),
}
}
}
================================================
FILE: code/data-migration/rust.processor.en.rs
================================================
//! Resolve instruction and execute
use crate::{
account_state::ProgramAccountState, error::DataVersionError, instruction::ProgramInstruction,
};
use solana_program::{
account_info::{next_account_info, AccountInfo},
entrypoint::ProgramResult,
msg,
program_error::ProgramError,
program_pack::{IsInitialized, Pack},
pubkey::Pubkey,
};
/// Checks each tracking account to confirm it is owned by our program
/// This function assumes that the program account is always the last
/// in the array
fn check_account_ownership(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult {
// Accounts must be owned by the program.
for account in accounts.iter().take(accounts.len() - 1) {
if account.owner != program_id {
msg!(
"Fail: The tracking account owner is {} and it should be {}.",
account.owner,
program_id
);
return Err(ProgramError::IncorrectProgramId);
}
}
Ok(())
}
/// Initialize the programs account, which is the first in accounts
fn initialize_account(accounts: &[AccountInfo]) -> ProgramResult {
msg!("Initialize account");
let account_info_iter = &mut accounts.iter();
let program_account = next_account_info(account_info_iter)?;
let mut account_data = program_account.data.borrow_mut();
// Just using unpack will check to see if initialized and will
// fail if not
let mut account_state = ProgramAccountState::unpack_unchecked(&account_data)?;
// Where this is a logic error in trying to initialize the same account more than once
if account_state.is_initialized() {
return Err(DataVersionError::AlreadyInitializedState.into());
} else {
account_state.set_initialized();
account_state.content_mut().somevalue = 1;
}
msg!("Account Initialized");
// Serialize
ProgramAccountState::pack(account_state, &mut account_data)
}
/// Sets the u64 in the content structure
fn set_u64_value(accounts: &[AccountInfo], value: u64) -> ProgramResult {
msg!("Set new value {}", value);
let account_info_iter = &mut accounts.iter();
let program_account = next_account_info(account_info_iter)?;
let mut account_data = program_account.data.borrow_mut();
let mut account_state = ProgramAccountState::unpack(&account_data)?;
account_state.content_mut().somevalue = value;
// Serialize
ProgramAccountState::pack(account_state, &mut account_data)
}
/// Main processing entry point dispatches to specific
/// instruction handlers
pub fn process(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8],
) -> ProgramResult {
msg!("Received process request");
// Check the account for program relationship
if let Err(error) = check_account_ownership(program_id, accounts) {
return Err(error);
};
// Unpack the inbound data, mapping instruction to appropriate structure
let instruction = ProgramInstruction::unpack(instruction_data)?;
match instruction {
ProgramInstruction::InitializeAccount => initialize_account(accounts),
ProgramInstruction::SetU64Value(value) => set_u64_value(accounts, value),
_ => {
msg!("Received unknown instruction");
Err(DataVersionError::InvalidInstruction.into())
}
}
}
================================================
FILE: code/data-migration/rust.processor.preview.en.rs
================================================
fn check_account_ownership(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult {
// Accounts must be owned by the program.
for account in accounts.iter().take(accounts.len() - 1) {
if account.owner != program_id {
msg!(
"Fail: The tracking account owner is {} and it should be {}.",
account.owner,
program_id
);
return Err(ProgramError::IncorrectProgramId);
}
}
Ok(())
}
/// Initialize the programs account, which is the first in accounts
fn initialize_account(accounts: &[AccountInfo]) -> ProgramResult {
msg!("Initialize account");
let account_info_iter = &mut accounts.iter();
let program_account = next_account_info(account_info_iter)?;
let mut account_data = program_account.data.borrow_mut();
// Just using unpack will check to see if initialized and will
// fail if not
let mut account_state = ProgramAccountState::unpack_unchecked(&account_data)?;
// Where this is a logic error in trying to initialize the same account more than once
if account_state.is_initialized() {
return Err(DataVersionError::AlreadyInitializedState.into());
} else {
account_state.set_initialized();
account_state.content_mut().somevalue = 1;
}
msg!("Account Initialized");
// Serialize
ProgramAccountState::pack(account_state, &mut account_data)
}
/// Sets the u64 in the content structure
fn set_u64_value(accounts: &[AccountInfo], value: u64) -> ProgramResult {
msg!("Set new value {}", value);
let account_info_iter = &mut accounts.iter();
let program_account = next_account_info(account_info_iter)?;
let mut account_data = program_account.data.borrow_mut();
let mut account_state = ProgramAccountState::unpack(&account_data)?;
account_state.content_mut().somevalue = value;
// Serialize
ProgramAccountState::pack(account_state, &mut account_data)
}
/// Main processing entry point dispatches to specific
/// instruction handlers
pub fn process(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8],
) -> ProgramResult {
msg!("Received process request");
// Check the account for program relationship
if let Err(error) = check_account_ownership(program_id, accounts) {
return Err(error);
};
// Unpack the inbound data, mapping instruction to appropriate structure
let instruction = ProgramInstruction::unpack(instruction_data)?;
match instruction {
ProgramInstruction::InitializeAccount => initialize_account(accounts),
ProgramInstruction::SetU64Value(value) => set_u64_value(accounts, value),
_ => {
msg!("Received unknown instruction");
Err(DataVersionError::InvalidInstruction.into())
}
}
}
================================================
FILE: code/data-migration/rust.processor1.en.rs
================================================
//! Resolve instruction and execute
use crate::{
account_state::ProgramAccountState, error::DataVersionError,
instruction::VersionProgramInstruction,
};
use solana_program::{
account_info::{next_account_info, AccountInfo},
entrypoint::ProgramResult,
msg,
program_error::ProgramError,
program_pack::{IsInitialized, Pack},
pubkey::Pubkey,
};
/// Checks each tracking account to confirm it is owned by our program
/// This function assumes that the program account is always the last
/// in the array
fn check_account_ownership(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult {
// Accounts must be owned by the program.
for account in accounts.iter().take(accounts.len() - 1) {
if account.owner != program_id {
msg!(
"Fail: The tracking account owner is {} and it should be {}.",
account.owner,
program_id
);
return Err(ProgramError::IncorrectProgramId);
}
}
Ok(())
}
/// Initialize the programs account, which is the first in accounts
fn initialize_account(accounts: &[AccountInfo]) -> ProgramResult {
msg!("Initialize account");
let account_info_iter = &mut accounts.iter();
let program_account = next_account_info(account_info_iter)?;
let mut account_data = program_account.data.borrow_mut();
// Just using unpack will check to see if initialized and will
// fail if not
let mut account_state = ProgramAccountState::unpack_unchecked(&account_data)?;
// Where this is a logic error in trying to initialize the same account more than once
if account_state.is_initialized() {
return Err(DataVersionError::AlreadyInitializedState.into());
} else {
account_state.set_initialized();
account_state.content_mut().somevalue = 1;
}
msg!("Account Initialized");
// Serialize
ProgramAccountState::pack(account_state, &mut account_data)
}
/// Sets the u64 in the content structure
fn set_u64_value(accounts: &[AccountInfo], value: u64) -> ProgramResult {
msg!("Set new value {}", value);
let account_info_iter = &mut accounts.iter();
let program_account = next_account_info(account_info_iter)?;
let mut account_data = program_account.data.borrow_mut();
let mut account_state = ProgramAccountState::unpack(&account_data)?;
account_state.content_mut().somevalue = value;
// Serialize
ProgramAccountState::pack(account_state, &mut account_data)
}
/// Sets the string in the content structure
fn set_string_value(accounts: &[AccountInfo], value: String) -> ProgramResult {
msg!("Set new string {}", value);
let account_info_iter = &mut accounts.iter();
let program_account = next_account_info(account_info_iter)?;
let mut account_data = program_account.data.borrow_mut();
let mut account_state = ProgramAccountState::unpack(&account_data)?;
account_state.content_mut().somestring = value;
// Serialize
ProgramAccountState::pack(account_state, &mut account_data)
}
/// Main processing entry point dispatches to specific
/// instruction handlers
pub fn process(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8],
) -> ProgramResult {
msg!("Received process request 0.2.0");
// Check the account for program relationship
if let Err(error) = check_account_ownership(program_id, accounts) {
return Err(error);
};
// Unpack the inbound data, mapping instruction to appropriate structure
msg!("Attempting to unpack");
let instruction = VersionProgramInstruction::unpack(instruction_data)?;
match instruction {
VersionProgramInstruction::InitializeAccount => initialize_account(accounts),
VersionProgramInstruction::SetU64Value(value) => set_u64_value(accounts, value),
VersionProgramInstruction::SetString(value) => set_string_value(accounts, value),
_ => {
msg!("Received unknown instruction");
Err(DataVersionError::InvalidInstruction.into())
}
}
}
================================================
FILE: code/feature-parity-testing/deactivate_one.rs
================================================
#[test]
fn test_base_pass() {
// Run with all features activated (default for TestValidatorGenesis)
let inv_feat = vec![];
// Start validator with clean (new) ledger
let (test_validator, main_payer) = clean_ledger_setup_validator(inv_feat).unwrap();
// Get the RpcClient
let connection = test_validator.get_rpc_client();
// Capture our programs log statements
solana_logger::setup_with_default("solana_runtime::message=debug");
// This example doesn't require sending any accounts to program
let accounts = &[];
// Build instruction array and submit transaction
let txn = submit_transaction(
&connection,
&main_payer,
// Add two (2) instructions to transaction to demonstrate
// that each instruction CU draws down from default Transaction CU (200_000)
// Replace with instructions that make sense for your program
[
Instruction::new_with_borsh(PROG_KEY, &0u8, accounts.to_vec()),
Instruction::new_with_borsh(PROG_KEY, &1u8, accounts.to_vec()),
]
.to_vec(),
);
assert!(txn.is_ok());
}
================================================
FILE: code/feature-parity-testing/deactivate_scfs.rs
================================================
#[test]
fn test_devnet_parity_pass() {
// Use gadget-scfs to get all deactivated features from devnet
// must have `gadgets-scfs = "0.2.0" in Cargo.toml to use
// Here we setup for a run that samples features only
// from devnet
let mut my_matrix = ScfsMatrix::new(Some(ScfsCriteria {
clusters: Some(vec![SCFS_DEVNET.to_string()]),
..Default::default()
}))
.unwrap();
// Run the sampler matrix
assert!(my_matrix.run().is_ok());
// Get all deactivated features
let deactivated = my_matrix
.get_features(Some(&ScfsMatrix::any_inactive))
.unwrap();
// Confirm we have them
assert_ne!(deactivated.len(), 0);
// Setup test validator and logging while deactivating all
// features that are deactivated in devnet
let (test_validator, main_payer) = clean_ledger_setup_validator(deactivated).unwrap();
let connection = test_validator.get_rpc_client();
solana_logger::setup_with_default("solana_runtime::message=debug");
let accounts = &[];
let txn = submit_transaction(
&connection,
&main_payer,
[
// Add two (2) instructions to transaction
// Replace with instructions that make sense for your program
Instruction::new_with_borsh(PROG_KEY, &0u8, accounts.to_vec()),
Instruction::new_with_borsh(PROG_KEY, &1u8, accounts.to_vec()),
]
.to_vec(),
);
assert!(txn.is_ok());
}
================================================
FILE: code/feature-parity-testing/deactivate_two.rs
================================================
#[test]
fn test_deactivate_tx_cu_pass() {
// Run with all features activated except 'transaction wide compute cap'
let inv_feat = vec![TXWIDE_LIMITS];
// Start validator with clean (new) ledger
let (test_validator, main_payer) = clean_ledger_setup_validator(inv_feat).unwrap();
// Get the RpcClient
let connection = test_validator.get_rpc_client();
// Capture our programs log statements
solana_logger::setup_with_default("solana_runtime::message=debug");
// This example doesn't require sending any accounts to program
let accounts = &[];
// Build instruction array and submit transaction
let txn = submit_transaction(
&connection,
&main_payer,
[
// This instruction adds CU to transaction budget (1.9.2) but does nothing
// when we deactivate the 'transaction wide compute cap' feature
ComputeBudgetInstruction::request_units(400_000u32),
// Add two (2) instructions to transaction
// Replace with instructions that make sense for your program
// You will see that each instruction has the 1.8.x 200_000 CU per budget
Instruction::new_with_borsh(PROG_KEY, &0u8, accounts.to_vec()),
Instruction::new_with_borsh(PROG_KEY, &1u8, accounts.to_vec()),
]
.to_vec(),
);
assert!(txn.is_ok());
}
================================================
FILE: code/feature-parity-testing/preamble.rs
================================================
#[cfg(test)]
mod tests {
use std::{error, path::PathBuf, str::FromStr};
// Use gadget-scfs to get interegate feature lists from clusters
// must have `gadgets-scfs = "0.2.0" in Cargo.toml [dev-dependencies] to use
use gadgets_scfs::{ScfsCriteria, ScfsMatrix, SCFS_DEVNET};
use solana_client::rpc_client::RpcClient;
use solana_program::{instruction::Instruction, message::Message, pubkey::Pubkey};
use solana_sdk::{
// Added in Solana 1.9.2
compute_budget::ComputeBudgetInstruction,
pubkey,
signature::{Keypair, Signature},
signer::Signer,
transaction::Transaction,
};
// Extended in Solana 1.9.6
use solana_test_validator::{TestValidator, TestValidatorGenesis};
/// Location/Name of ProgramTestGenesis ledger
const LEDGER_PATH: &str = "./.ledger";
/// Path to BPF program (*.so) change if needed
const PROG_PATH: &str = "target/deploy/";
/// Program name from program Cargo.toml
/// FILL IN WITH YOUR PROGRAM_NAME
const PROG_NAME: &str = "PROGRAM_NAME";
/// Program public key
/// FILL IN WITH YOUR PROGRAM'S PUBLIC KEY str
const PROG_KEY: Pubkey = pubkey!("PROGRAMS_PUBLIC_KEY_BASE58_STRING");
/// 'transaction wide compute cap' public key
const TXWIDE_LIMITS: Pubkey = pubkey!("5ekBxc8itEnPv4NzGJtr8BVVQLNMQuLMNQQj7pHoLNZ9");
/// Setup the test validator passing features
/// you want to deactivate before running transactions
pub fn setup_validator(
invalidate_features: Vec<Pubkey>,
) -> Result<(TestValidator, Keypair), Box<dyn error::Error>> {
// Extend environment variable to include our program location
std::env::set_var("BPF_OUT_DIR", PROG_PATH);
// Instantiate the test validator
let mut test_validator = TestValidatorGenesis::default();
// Once instantiated, TestValidatorGenesis configuration functions follow
// a builder pattern enabling chaining of settings function calls
let (test_validator, kp) = test_validator
// Set the ledger path and name
// maps to `solana-test-validator --ledger <DIR>`
.ledger_path(LEDGER_PATH)
// Load our program. Ignored if reusing ledger
// maps to `solana-test-validator --bpf-program <ADDRESS_OR_PATH BPF_PROGRAM.SO>`
.add_program(PROG_NAME, PROG_KEY)
// Identify features to deactivate. Ignored if reusing ledger
// maps to `solana-test-validator --deactivate-feature <FEATURE_PUBKEY>`
.deactivate_features(&invalidate_features)
// Start the test validator
.start();
Ok((test_validator, kp))
}
/// Convenience function to remove existing ledger before TestValidatorGenesis setup
/// maps to `solana-test-validator ... --reset`
pub fn clean_ledger_setup_validator(
invalidate_features: Vec<Pubkey>,
) -> Result<(TestValidator, Keypair), Box<dyn error::Error>> {
if PathBuf::from_str(LEDGER_PATH).unwrap().exists() {
std::fs::remove_dir_all(LEDGER_PATH).unwrap();
}
setup_validator(invalidate_features)
}
/// Submits a transaction with programs instruction
/// Boiler plate
fn submit_transaction(
rpc_client: &RpcClient,
wallet_signer: &dyn Signer,
instructions: Vec<Instruction>,
) -> Result<Signature, Box<dyn std::error::Error>> {
let mut transaction =
Transaction::new_unsigned(Message::new(&instructions, Some(&wallet_signer.pubkey())));
let recent_blockhash = rpc_client
.get_latest_blockhash()
.map_err(|err| format!("error: unable to get recent blockhash: {}", err))?;
transaction
.try_sign(&vec![wallet_signer], recent_blockhash)
.map_err(|err| format!("error: failed to sign transaction: {}", err))?;
let signature = rpc_client
.send_and_confirm_transaction(&transaction)
.map_err(|err| format!("error: send transaction: {}", err))?;
Ok(signature)
}
// UNIT TEST FOLLOWS
}
================================================
FILE: code/feature-parity-testing/preamble_short.rs
================================================
/// Setup the test validator passing features
/// you want to deactivate before running transactions
pub fn setup_validator(
invalidate_features: Vec<Pubkey>,
) -> Result<(TestValidator, Keypair), Box<dyn error::Error>> {
// Extend environment variable to include our program location
std::env::set_var("BPF_OUT_DIR", PROG_PATH);
// Instantiate the test validator
let mut test_validator = TestValidatorGenesis::default();
// Once instantiated, TestValidatorGenesis configuration functions follow
// a builder pattern enabling chaining of settings function calls
let (test_validator, kp) = test_validator
// Set the ledger path and name
// maps to `solana-test-validator --ledger <DIR>`
.ledger_path(LEDGER_PATH)
// Load our program. Ignored if reusing ledger
// maps to `solana-test-validator --bpf-program <ADDRESS_OR_PATH BPF_PROGRAM.SO>`
.add_program(PROG_NAME, PROG_KEY)
// Identify features to deactivate. Ignored if reusing ledger
// maps to `solana-test-validator --deactivate-feature <FEATURE_PUBKEY>`
.deactivate_features(&invalidate_features)
// Start the test validator
.start();
Ok((test_validator, kp))
}
/// Convenience function to remove existing ledger before TestValidatorGenesis setup
/// maps to `solana-test-validator ... --reset`
pub fn clean_ledger_setup_validator(
invalidate_features: Vec<Pubkey>,
) -> Result<(TestValidator, Keypair), Box<dyn error::Error>> {
if PathBuf::from_str(LEDGER_PATH).unwrap().exists() {
std::fs::remove_dir_all(LEDGER_PATH).unwrap();
}
setup_validator(invalidate_features)
}
/// Submits a transaction with programs instruction
/// Boiler plate
fn submit_transaction(
rpc_client: &RpcClient,
wallet_signer: &dyn Signer,
instructions: Vec<Instruction>,
) -> Result<Signature, Box<dyn std::error::Error>> {
let mut transaction =
Transaction::new_unsigned(Message::new(&instructions, Some(&wallet_signer.pubkey())));
let recent_blockhash = rpc_client
.get_latest_blockhash()
.map_err(|err| format!("error: unable to get recent blockhash: {}", err))?;
transaction
.try_sign(&vec![wallet_signer], recent_blockhash)
.map_err(|err| format!("error: failed to sign transaction: {}", err))?;
let signature = rpc_client
.send_and_confirm_transaction(&transaction)
.map_err(|err| format!("error: send transaction: {}", err))?;
Ok(signature)
}
================================================
FILE: code/get-program-accounts/basic/basic.en.rs
================================================
use solana_client::rpc_client::RpcClient;
use solana_program::pubkey::Pubkey;
use solana_sdk::commitment_config::CommitmentConfig;
use std::str::FromStr;
fn main() {
let rpc_url = String::from("https://api.devnet.solana.com");
let connection = RpcClient::new_with_commitment(rpc_url, CommitmentConfig::confirmed());
let program_id = Pubkey::from_str("6a2GdmttJdanBkoHt7f4Kon4hfadx4UTUgJeRkCaiL3U").unwrap();
let accounts = connection.get_program_accounts(&program_id).unwrap();
println!("accounts for {}, {:?}", program_id, accounts);
}
================================================
FILE: code/get-program-accounts/basic/basic.en.sh
================================================
curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
{"jsonrpc":"2.0", "id":1, "method":"getProgramAccounts", "params":["6a2GdmttJdanBkoHt7f4Kon4hfadx4UTUgJeRkCaiL3U"]}
'
# Output
# {"jsonrpc":"2.0","result":[{"account":{"data":"fe2kiXpgfrjWQjCPX3n5MB339Ayqav75ej","executable":false,"lamports":1064880,"owner":"6a2GdmttJdanBkoHt7f4Kon4hfadx4UTUgJeRkCaiL3U","rentEpoch":228},"pubkey":"9pKBrUtJU9GNmct6T2BQtiKqvubtjS9D2if2bm1P8TQd"},{"account":{"data":"fe2kiXpgfrjVs7hiZJNVFsbJUuhXhFx3pQ","executable":false,"lamports":1064880,"owner":"6a2GdmttJdanBkoHt7f4Kon4hfadx4UTUgJeRkCaiL3U","rentEpoch":229},"pubkey":"5L1rztbopmgGMWPKb2efoGyhGnrBJm6K53Hf9S4nxdHr"}],"id":1}
================================================
FILE: code/get-program-accounts/basic/basic.en.ts
================================================
import { clusterApiUrl, Connection, PublicKey } from "@solana/web3.js";
(async () => {
const MY_PROGRAM_ID = new PublicKey(
"6a2GdmttJdanBkoHt7f4Kon4hfadx4UTUgJeRkCaiL3U"
);
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
const accounts = await connection.getProgramAccounts(MY_PROGRAM_ID);
console.log(`Accounts for program ${MY_PROGRAM_ID}: `);
console.log(accounts);
/*
// Output
Accounts for program 6a2GdmttJdanBkoHt7f4Kon4hfadx4UTUgJeRkCaiL3U:
[
{
account: {
data: <Buffer 60 06 66 ca 2c 1d c7 85 04 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 fc>,
executable: false,
lamports: 1064880,
owner: [PublicKey],
rentEpoch: 228
},
pubkey: PublicKey {
_bn: <BN: 82fc5b91154dc5c840cb464ba6a89212d0fd789367c0a1488fb1941d78f9727a>
}
},
{
account: {
data: <Buffer 60 06 66 ca 2c 1d c7 85 03 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 fd>,
executable: false,
lamports: 1064880,
owner: [PublicKey],
rentEpoch: 229
},
pubkey: PublicKey {
_bn: <BN: 404dc1fe368cf194f20cf3c681a071c61893ced98f65cda12ba5a147e984e669>
}
}
]
*/
})();
================================================
FILE: code/get-program-accounts/dataSlice/dataSlice.en.rs
================================================
use solana_client::{
rpc_client::RpcClient,
rpc_filter::{RpcFilterType, Memcmp, MemcmpEncodedBytes, MemcmpEncoding},
rpc_config::{RpcProgramAccountsConfig, RpcAccountInfoConfig},
};
use solana_sdk::{commitment_config::CommitmentConfig};
use solana_account_decoder::{UiAccountEncoding, UiDataSliceConfig};
pub fn main() {
const MY_TOKEN_MINT_ADDRESS: &str = "BUGuuhPsHpk8YZrL2GctsCtXGneL1gmT5zYb7eMHZDWf";
let rpc_url = String::from("http://api.devnet.solana.com");
let connection = RpcClient::new_with_commitment(rpc_url, CommitmentConfig::confirmed());
let filters = Some(vec![
RpcFilterType::Memcmp(Memcmp::new(
0, // number of bytes
MemcmpEncodedBytes::Base58(MY_TOKEN_MINT_ADDRESS.to_string()),
)),
RpcFilterType::DataSize(165), // number of bytes
]);
let accounts = connection.get_program_accounts_with_config(
&spl_token::ID,
RpcProgramAccountsConfig {
filters,
account_config: RpcAccountInfoConfig {
data_slice: Some(UiDataSliceConfig {
offset: 0, // number of bytes
length: 0, // number of bytes
}),
encoding: Some(UiAccountEncoding::Base64),
commitment: Some(connection.commitment()),
..RpcAccountInfoConfig::default()
},
..RpcProgramAccountsConfig::default()
},
).unwrap();
println!("Found {:?} token account(s) for mint {MY_TOKEN_MINT_ADDRESS}: ", accounts.len());
println!("{:#?}", accounts);
}
/*
// Output (notice zero `len` in `data` of `Account`s)
Found 3 token account(s) for mint BUGuuhPsHpk8YZrL2GctsCtXGneL1gmT5zYb7eMHZDWf:
[
(
tofD3NzLfZ5pWG91JcnbfsAbfMcFF2SRRp3ChnjeTcL,
Account {
lamports: 2039280,
data.len: 0,
owner: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA,
executable: false,
rent_epoch: 319,
},
),
(
CMSC2GeWDsTPjfnhzCZHEqGRjKseBhrWaC2zNcfQQuGS,
Account {
lamports: 2039280,
data.len: 0,
owner: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA,
executable: false,
rent_epoch: 318,
},
),
(
Et3bNDxe2wP1yE5ao6mMvUByQUHg8nZTndpJNvfKLdCb,
Account {
lamports: 2039280,
data.len: 0,
owner: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA,
executable: false,
rent_epoch: 318,
},
),
]
*/
================================================
FILE: code/get-program-accounts/dataSlice/dataSlice.en.sh
================================================
# Note: encoding only available for "base58", "base64" or "base64+zstd"
curl http://api.mainnet-beta.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0",
"id": 1,
"method": "getProgramAccounts",
"params": [
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
{
"encoding": "base64",
"dataSlice": {
"offset": 0,
"length": 0
},
"filters": [
{
"dataSize": 165
},
{
"memcmp": {
"offset": 0,
"bytes": "BUGuuhPsHpk8YZrL2GctsCtXGneL1gmT5zYb7eMHZDWf"
}
}
]
}
]
}
'
# Output:
# {
# "jsonrpc": "2.0",
# "result": [
# {
# "account": {
# "data": [
# "",
# "base64"
# ],
# "executable": false,
# "lamports": 2039280,
# "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
# "rentEpoch": 313
# },
# "pubkey": "FqWyVSLQgyRWyG1FuUGtHdTQHrEaBzXh1y9K6uPVTRZ4"
# },
# {
# "account": {
# "data": [
# "",
# "base64"
# ],
# "executable": false,
# "lamports": 2039280,
# "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
# "rentEpoch": 314
# },
# "pubkey": "CMSC2GeWDsTPjfnhzCZHEqGRjKseBhrWaC2zNcfQQuGS"
# },
# {
# "account": {
# "data": [
# "",
# "base64"
# ],
# "executable": false,
# "lamports": 2039280,
# "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
# "rentEpoch": 314
# },
# "pubkey": "61NfACb21WvuEzxyiJoxBrivpiLQ79gLBxzFo85BiJ2U"
# },
# {
# "account": {
# "data": [
# "",
# "base64"
# ],
# "executable": false,
# "lamports": 2039280,
# "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
# "rentEpoch": 313
# },
# "pubkey": "Et3bNDxe2wP1yE5ao6mMvUByQUHg8nZTndpJNvfKLdCb"
# }
# ],
# "id": 1
# }
================================================
FILE: code/get-program-accounts/dataSlice/dataSlice.en.ts
================================================
import { TOKEN_PROGRAM_ID } from "@solana/spl-token";
import { clusterApiUrl, Connection } from "@solana/web3.js";
(async () => {
const MY_TOKEN_MINT_ADDRESS = "BUGuuhPsHpk8YZrL2GctsCtXGneL1gmT5zYb7eMHZDWf";
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
const accounts = await connection.getProgramAccounts(
TOKEN_PROGRAM_ID, // new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA")
{
dataSlice: {
offset: 0, // number of bytes
length: 0, // number of bytes
},
filters: [
{
dataSize: 165, // number of bytes
},
{
memcmp: {
offset: 0, // number of bytes
bytes: MY_TOKEN_MINT_ADDRESS, // base58 encoded string
},
},
],
}
);
console.log(
`Found ${accounts.length} token account(s) for mint ${MY_TOKEN_MINT_ADDRESS}`
);
console.log(accounts);
/*
// Output (notice the empty <Buffer > at acccount.data)
Found 3 token account(s) for mint BUGuuhPsHpk8YZrL2GctsCtXGneL1gmT5zYb7eMHZDWf
[
{
account: {
data: <Buffer >,
executable: false,
lamports: 2039280,
owner: [PublicKey],
rentEpoch: 228
},
pubkey: PublicKey {
_bn: <BN: a8aca7a3132e74db2ca37bfcd66f4450f4631a5464b62fffbd83c48ef814d8d7>
}
},
{
account: {
data: <Buffer >,
executable: false,
lamports: 2039280,
owner: [PublicKey],
rentEpoch: 228
},
pubkey: PublicKey {
_bn: <BN: ce3b7b906c2ff6c6b62dc4798136ec017611078443918b2fad1cadff3c2e0448>
}
},
{
account: {
data: <Buffer >,
executable: false,
lamports: 2039280,
owner: [PublicKey],
rentEpoch: 228
},
pubkey: PublicKey {
_bn: <BN: d4560e42cb24472b0e1203ff4b0079d6452b19367b701643fa4ac33e0501cb1>
}
}
]
*/
})();
================================================
FILE: code/get-program-accounts/memcmp/memcmp.en.rs
================================================
use solana_client::{
rpc_client::RpcClient,
rpc_filter::{RpcFilterType, Memcmp, MemcmpEncodedBytes, MemcmpEncoding},
rpc_config::{RpcProgramAccountsConfig, RpcAccountInfoConfig},
};
use solana_sdk::{commitment_config::CommitmentConfig, program_pack::Pack};
use spl_token::{state::{Mint, Account}};
use solana_account_decoder::{UiAccountEncoding};
fn main() {
const MY_WALLET_ADDRESS: &str = "FriELggez2Dy3phZeHHAdpcoEXkKQVkv6tx3zDtCVP8T";
let rpc_url = String::from("http://api.devnet.solana.com");
let connection = RpcClient::new_with_commitment(rpc_url, CommitmentConfig::confirmed());
let filters = Some(vec![
RpcFilterType::Memcmp(Memcmp::new(
32, // number of bytes
MemcmpEncodedBytes::Base58(MY_WALLET_ADDRESS.to_string()),
)),
RpcFilterType::DataSize(165),
]);
let accounts = connection.get_program_accounts_with_config(
&spl_token::ID,
RpcProgramAccountsConfig {
filters,
account_config: RpcAccountInfoConfig {
encoding: Some(UiAccountEncoding::Base64),
commitment: Some(connection.commitment()),
..RpcAccountInfoConfig::default()
},
..RpcProgramAccountsConfig::default()
},
).unwrap();
println!("Found {:?} token account(s) for wallet {MY_WALLET_ADDRESS}: ", accounts.len());
for (i, account) in accounts.iter().enumerate() {
println!("-- Token Account Address {:?}: {:?} --", i, account.0);
let mint_token_account = Account::unpack_from_slice(account.1.data.as_slice()).unwrap();
println!("Mint: {:?}", mint_token_account.mint);
let mint_account_data = connection.get_account_data(&mint_token_account.mint).unwrap();
let mint = Mint::unpack_from_slice(mint_account_data.as_slice()).unwrap();
println!("Amount: {:?}", mint_token_account.amount as f64 /10usize.pow(mint.decimals as u32) as f64);
}
}
/*
// Output
Found 2 token account(s) for wallet FriELggez2Dy3phZeHHAdpcoEXkKQVkv6tx3zDtCVP8T:
-- Token Account Address 0: H12yCcKLHFJFfohkeKiN8v3zgaLnUMwRcnJTyB4igAsy --
Mint: CKKDsBT6KiT4GDKs3e39Ue9tDkhuGUKM3cC2a7pmV9YK
Amount: 1.0
-- Token Account Address 1: Et3bNDxe2wP1yE5ao6mMvUByQUHg8nZTndpJNvfKLdCb --
Mint: BUGuuhPsHpk8YZrL2GctsCtXGneL1gmT5zYb7eMHZDWf
Amount: 3.0
*/
================================================
FILE: code/get-program-accounts/memcmp/memcmp.en.sh
================================================
curl http://api.mainnet-beta.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0",
"id": 1,
"method": "getProgramAccounts",
"params": [
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
{
"encoding": "jsonParsed",
"filters": [
{
"dataSize": 165
},
{
"memcmp": {
"offset": 32,
"bytes": "FriELggez2Dy3phZeHHAdpcoEXkKQVkv6tx3zDtCVP8T"
}
}
]
}
]
}
'
# Output:
# {
# "jsonrpc": "2.0",
# "result": [
# {
# "account": {
# "data": {
# "parsed": {
# "info": {
# "isNative": false,
# "mint": "BUGuuhPsHpk8YZrL2GctsCtXGneL1gmT5zYb7eMHZDWf",
# "owner": "FriELggez2Dy3phZeHHAdpcoEXkKQVkv6tx3zDtCVP8T",
# "state": "initialized",
# "tokenAmount": {
# "amount": "998999999000000000",
# "decimals": 9,
# "uiAmount": 998999999,
# "uiAmountString": "998999999"
# }
# },
# "type": "account"
# },
# "program": "spl-token",
# "space": 165
# },
# "executable": false,
# "lamports": 2039280,
# "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
# "rentEpoch": 313
# },
# "pubkey": "Et3bNDxe2wP1yE5ao6mMvUByQUHg8nZTndpJNvfKLdCb"
# }
# ],
# "id": 1
# }
================================================
FILE: code/get-program-accounts/memcmp/memcmp.en.ts
================================================
import { TOKEN_PROGRAM_ID } from "@solana/spl-token";
import { clusterApiUrl, Connection } from "@solana/web3.js";
(async () => {
const MY_WALLET_ADDRESS = "FriELggez2Dy3phZeHHAdpcoEXkKQVkv6tx3zDtCVP8T";
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
const accounts = await connection.getParsedProgramAccounts(
TOKEN_PROGRAM_ID, // new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA")
{
filters: [
{
dataSize: 165, // number of bytes
},
{
memcmp: {
offset: 32, // number of bytes
bytes: MY_WALLET_ADDRESS, // base58 encoded string
},
},
],
}
);
console.log(
`Found ${accounts.length} token account(s) for wallet ${MY_WALLET_ADDRESS}: `
);
accounts.forEach((account, i) => {
console.log(
`-- Token Account Address ${i + 1}: ${account.pubkey.toString()} --`
);
console.log(`Mint: ${account.account.data["parsed"]["info"]["mint"]}`);
console.log(
`Amount: ${account.account.data["parsed"]["info"]["tokenAmount"]["uiAmount"]}`
);
});
/*
// Output
Found 2 token account(s) for wallet FriELggez2Dy3phZeHHAdpcoEXkKQVkv6tx3zDtCVP8T:
-- Token Account Address 0: H12yCcKLHFJFfohkeKiN8v3zgaLnUMwRcnJTyB4igAsy --
Mint: CKKDsBT6KiT4GDKs3e39Ue9tDkhuGUKM3cC2a7pmV9YK
Amount: 1
-- Token Account Address 1: Et3bNDxe2wP1yE5ao6mMvUByQUHg8nZTndpJNvfKLdCb --
Mint: BUGuuhPsHpk8YZrL2GctsCtXGneL1gmT5zYb7eMHZDWf
Amount: 3
*/
})();
================================================
FILE: code/jupiter/executeapi/main.en.ts
================================================
(async() => {
for (let serializedTransaction of [
setupTransaction,
swapTransaction,
cleanupTransaction,
].filter(Boolean)) {
const transaction = Transaction.from(
Buffer.from(serializedTransaction, "base64")
);
const txid = await connection.sendTransaction(transaction, [wallet.payer], {
skipPreflight: false,
});
await connection.confirmTransaction(txid);
}
})()
================================================
FILE: code/jupiter/executeapi/main.preview.en.ts
================================================
const transaction = Transaction.from(
Buffer.from(serializedTransaction, "base64")
);
const txid = await connection.sendTransaction(transaction, [wallet.payer], {
skipPreflight: false,
});
================================================
FILE: code/jupiter/getRoutesapi/main.en.ts
================================================
(async() => {
const { data } = await(
await fetch(
"https://quote-api.jup.ag/v1/quote?inputMint=So11111111111111111111111111111111111111112&outputMint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&amount=100000000&slippage=0.5&feeBps=4"
)
).json();
const routes = data;
})()
================================================
FILE: code/jupiter/getRoutesapi/main.preview.en.ts
================================================
await fetch(
'https://quote-api.jup.ag/v1/quote?inputMint=So11111111111111111111111111111111111111112&outputMint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&amount=100000000&slippage=0.5&feeBps=4'
)
).json()
================================================
FILE: code/jupiter/getTxapi/main.en.ts
================================================
(async() => {
const transactions = await(
fetch("https://quote-api.jup.ag/v1/swap", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
route: routes[0],
userPublicKey: wallet.publicKey.toString(),
wrapUnwrapSOL: true,
feeAccount: "xxxx",
}),
})
).json();
const { setupTransaction, swapTransaction, cleanupTransaction } = transactions;
})()
================================================
FILE: code/jupiter/getTxapi/main.preview.en.ts
================================================
await fetch("https://quote-api.jup.ag/v1/swap", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
route: routes[0],
userPublicKey: wallet.publicKey.toString(),
wrapUnwrapSOL: true,
feeAccount: "xxxx",
}),
});
================================================
FILE: code/jupiter/inputSetup/main.en.ts
================================================
import { TOKEN_LIST_URL } from "@jup-ag/core";
const JupiterApp = () => {
const [tokens, setTokens] = useState<Token[]>([]);
const [inputMint] = useState<PublicKey>(
new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v")
);
const [outputMint] = useState<PublicKey>(
new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB")
);
useEffect(() => {
fetch(TOKEN_LIST_URL[ENV])
.then((response) => response.json())
.then((result) => setTokens(result));
}, []);
};
export default JupiterApp;
================================================
FILE: code/jupiter/inputSetup/main.preview.en.ts
================================================
const [inputMint] = useState<PublicKey>(
new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v")
);
const [outputMint] = useState<PublicKey>(
new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB")
);
================================================
FILE: code/jupiter/installationapi/main.en.ts
================================================
import { Connection, Keypair, Transaction } from "@solana/web3.js";
import fetch from "cross-fetch";
import { Wallet } from "@project-serum/anchor";
import bs58 from "bs58";
const connection = new Connection("https://ssc-dao.genesysgo.net");
================================================
FILE: code/jupiter/installationapi/main.preview.en.ts
================================================
const connection = new Connection("https://ssc-dao.genesysgo.net");
================================================
FILE: code/jupiter/loading-instance/main.en.ts
================================================
import { Jupiter, RouteInfo, TOKEN_LIST_URL } from "@jup-ag/core";
import { Connection, PublicKey, Keypair } from "@solana/web3.js";
interface Token {
chainId: number;
address: string;
symbol: string;
name: string;
decimals: number;
logoURI: string;
tags: string[];
}
(async () => {
const ENV = "devnet";
const tokens: Token[] = await (await fetch(TOKEN_LIST_URL[ENV])).json();
const USER_KEYPAIR = Keypair.generate();
const connection = new Connection("https://api.devnet.solana.com");
const jupiter = await Jupiter.load({
connection,
cluster: ENV,
user: USER_KEYPAIR,
});
})();
================================================
FILE: code/jupiter/loading-instance/main.preview.en.ts
================================================
const jupiter = await Jupiter.load({
connection,
cluster: ENV,
user: USER_KEYPAIR,
});
================================================
FILE: code/jupiter/providerSetup/main.en.ts
================================================
import {
ConnectionProvider,
WalletProvider,
useConnection,
useWallet,
} from "@solana/wallet-adapter-react";
import {
getLedgerWallet,
getPhantomWallet,
getSlopeWallet,
getSolflareWallet,
getSolletExtensionWallet,
getSolletWallet,
getTorusWallet,
} from "@solana/wallet-adapter-wallets";
const JupiterApp = ({ children }) => {
const { connection } = useConnection();
const wallet = useWallet();
return (
<JupiterProvider
cluster="mainnet-beta"
connection={connection}
userPublicKey={wallet.publicKey || undefined}
>
{children}
</JupiterProvider>
);
};
const App = ({ children }) => {
const network = WalletAdapterNetwork.Devnet;
const wallets = useMemo(
() => [
getPhantomWallet(),
getSlopeWallet(),
getSolflareWallet(),
getTorusWallet(),
getLedgerWallet(),
getSolletWallet({ network }),
getSolletExtensionWallet({ network }),
],
[network]
);
const endpoint = "https://solana-api.projectserum.com";
return (
<ConnectionProvider endpoint={endpoint}>
<WalletProvider wallets={wallets} autoConnect>
<JupiterApp>{children}</JupiterApp>
</WalletProvider>
</ConnectionProvider>
);
};
export default App;
================================================
FILE: code/jupiter/providerSetup/main.preview.en.ts
================================================
const JupiterApp = ({ children }) => {
const { connection } = useConnection();
const wallet = useWallet();
return (
<JupiterProvider
cluster="mainnet-beta"
connection={connection}
userPublicKey={wallet.publicKey || undefined}
>
{children}
</JupiterProvider>
);
};
================================================
FILE: code/jupiter/react-token-list/main.en.ts
================================================
import { TOKEN_LIST_URL } from "@jup-ag/core";
const JupiterApp = () => {
const [tokens, setTokens] = useState<Token[]>([]);
useEffect(() => {
fetch(TOKEN_LIST_URL[ENV])
.then((response) => response.json())
.then((result) => setTokens(result));
}, []);
};
export default JupiterApp;
================================================
FILE: code/jupiter/react-token-list/main.preview.en.ts
================================================
const [tokens, setTokens] = useState<Token[]>([]);
useEffect(() => {
fetch(TOKEN_LIST_URL[ENV])
.then((response) => response.json())
.then((result) => setTokens(result));
}, []);
================================================
FILE: code/jupiter/reactSwap/main.en.ts
================================================
import { TOKEN_LIST_URL } from "@jup-ag/core";
const JupiterApp = () => {
const [tokens, setTokens] = useState<Token[]>([]);
const [inputMint] = useState<PublicKey>(
new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v")
);
const [outputMint] = useState<PublicKey>(
new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB")
);
useEffect(() => {
fetch(TOKEN_LIST_URL[ENV])
.then((response) => response.json())
.then((result) => setTokens(result));
}, []);
const jupiter = useJupiter({
amount: 1 * 10 ** 6,
inputMint,
outputMint,
slippage: 1,
debounceTime: 250,
});
const {
allTokenMints,
routeMap,
exchange,
refresh,
lastRefreshTimestamp,
loading,
routes,
error,
} = jupiter;
const onClickSwapBestRoute = async () => {
const bestRoute = routes[0];
await exchange({
wallet: {
sendTransaction: wallet.sendTransaction,
publicKey: wallet.publicKey,
signAllTransactions: wallet.signAllTransactions,
signTransaction: wallet.signTransaction,
},
route: bestRoute,
confirmationWaiterFactory: async (txid) => {
console.log("sending transaction");
await connection.confirmTransaction(txid);
console.log("confirmed transaction");
return await connection.getTransaction(txid, {
commitment: "confirmed",
});
},
});
console.log({ swapResult });
if ("error" in swapResult) {
console.log("Error:", swapResult.error);
} else if ("txid" in swapResult) {
console.log("Sucess:", swapResult.txid);
console.log("Input:", swapResult.inputAmount);
console.log("Output:", swapResult.outputAmount);
}
};
return (
<>
<div style={{ fontWeight: "600", fontSize: 16, marginTop: 24 }}>
Hook example
</div>
<div>Number of tokens: {tokens.length}</div>
<div>Number of input tokens {allTokenMints.length}</div>
<div>Possible number of routes: {routes?.length}</div>
<div>Best quote: {routes ? routes[0].outAmount : ""}</div>
<button type="button" onClick={onClickSwapBestRoute}>
Swap best route
</button>
</>
);
};
export default JupiterApp;
================================================
FILE: code/jupiter/reactSwap/main.preview.en.ts
================================================
(async() => {
await exchange({
wallet: {
sendTransaction: wallet.sendTransaction,
publicKey: wallet.publicKey,
signAllTransactions: wallet.signAllTransactions,
signTransaction: wallet.signTransaction,
},
route: bestRoute,
confirmationWaiterFactory: async (txid) => {
console.log("sending transaction");
await connection.confirmTransaction(txid);
console.log("confirmed transaction");
return await connection.getTransaction(txid, {
commitment: "confirmed",
});
},
});
})()
================================================
FILE: code/jupiter/retriveapi/main.en.ts
================================================
const routeMap = await(
await fetch("https://quote-api.jup.ag/v1/route-map")
).json();
const allInputMints = Object.keys(routeMap);
const swappableOutputForSol =
routeMap["So11111111111111111111111111111111111111112"];
================================================
FILE: code/jupiter/retriveapi/main.preview.en.ts
================================================
const routeMap = await(
await fetch("https://quote-api.jup.ag/v1/route-map")
).json();
================================================
FILE: code/jupiter/route-map/main.en.ts
================================================
import { Jupiter, RouteInfo, TOKEN_LIST_URL } from "@jup-ag/core";
import { Connection, PublicKey, Keypair } from "@solana/web3.js";
interface Token {
chainId: number;
address: string;
symbol: string;
name: string;
decimals: number;
logoURI: string;
tags: string[];
}
(async () => {
const ENV = "devnet";
const tokens: Token[] = await (await fetch(TOKEN_LIST_URL[ENV])).json();
const USER_KEYPAIR = Keypair.generate();
const connection = new Connection("https://api.devnet.solana.com");
const jupiter = await Jupiter.load({
connection,
cluster: ENV,
user: USER_KEYPAIR,
});
const routeMap = jupiter.getRouteMap();
})();
================================================
FILE: code/jupiter/route-map/main.preview.en.ts
================================================
const routeMap = jupiter.getRouteMap();
================================================
FILE: code/jupiter/routes/main.en.ts
================================================
import { Jupiter, RouteInfo, TOKEN_LIST_URL } from "@jup-ag/core";
import { Connection, PublicKey, Keypair } from "@solana/web3.js";
interface Token {
chainId: number;
address: string;
symbol: string;
name: string;
decimals: number;
logoURI: string;
tags: string[];
}
(async () => {
const ENV = "devnet";
const tokens: Token[] = await (await fetch(TOKEN_LIST_URL[ENV])).json();
const USER_KEYPAIR = Keypair.generate();
const connection = new Connection("https://api.devnet.solana.com");
const jupiter = await Jupiter.load({
connection,
cluster: ENV,
user: USER_KEYPAIR,
});
const routeMap = jupiter.getRouteMap();
const inputToken = "So11111111111111111111111111111111111111112";
const outputToken = "SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt";
const inputAmount = 1;
const slippage = 1;
const routes = await jupiter.computeRoutes({
inputMint: new PublicKey(inputToken),
outputMint: new PublicKey(outputToken),
inputAmount,
slippage,
forceFetch: false,
});
})();
================================================
FILE: code/jupiter/routes/main.preview.en.ts
================================================
const routes = await jupiter.computeRoutes({
inputMint: new PublicKey(inputToken),
outputMint: new PublicKey(outputToken),
inputAmount,
slippage,
forceFetch: false,
});
================================================
FILE: code/jupiter/swap/main.en.ts
================================================
import { Jupiter, RouteInfo, TOKEN_LIST_URL } from "@jup-ag/core";
import { Connection, PublicKey, Keypair } from "@solana/web3.js";
interface Token {
chainId: number;
address: string;
symbol: string;
name: string;
decimals: number;
logoURI: string;
tags: string[];
}
(async () => {
const ENV = "devnet";
const tokens: Token[] = await (await fetch(TOKEN_LIST_URL[ENV])).json();
const USER_KEYPAIR = Keypair.generate();
const connection = new Connection("https://api.devnet.solana.com");
const jupiter = await Jupiter.load({
connection,
cluster: ENV,
user: USER_KEYPAIR,
});
const routeMap = jupiter.getRouteMap();
const inputToken = "So11111111111111111111111111111111111111112";
const outputToken = "SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt";
const inputAmount = 1;
const slippage = 1;
const routes = await jupiter.computeRoutes({
inputMint: new PublicKey(inputToken),
outputMint: new PublicKey(outputToken),
inputAmount,
slippage,
forceFetch: false,
});
const { execute } = await jupiter.exchange({
routeInfo: routes.routesInfos[0],
});
const swapResult: any = await execute();
})();
================================================
FILE: code/jupiter/swap/main.preview.en.ts
================================================
bestRoute = routes.routesInfos[0];
const { execute } = await jupiter.exchange({
bestRoute,
});
const swapResult = await execute();
================================================
FILE: code/jupiter/token-list/main.en.ts
================================================
import { Jupiter, RouteInfo, TOKEN_LIST_URL } from "@jup-ag/core";
import { Connection, PublicKey } from "@solana/web3.js";
interface Token {
chainId: number;
address: string;
symbol: string;
name: string;
decimals: number;
logoURI: string;
tags: string[];
}
(async () => {
const ENV = "mainnet-beta";
const tokens: Token[] = await (await fetch(TOKEN_LIST_URL[ENV])).json();
})();
================================================
FILE: code/jupiter/token-list/main.preview.en.ts
================================================
const ENV = "mainnet-beta";
const tokens: Token[] = await(await fetch(TOKEN_LIST_URL[ENV])).json();
================================================
FILE: code/jupiter/useJupiter/main.en.ts
================================================
import { TOKEN_LIST_URL } from "@jup-ag/core";
const JupiterApp = () => {
const [tokens, setTokens] = useState<Token[]>([]);
const [inputMint] = useState<PublicKey>(
new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v")
);
const [outputMint] = useState<PublicKey>(
new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB")
);
useEffect(() => {
fetch(TOKEN_LIST_URL[ENV])
.then((response) => response.json())
.then((result) => setTokens(result));
}, []);
const jupiter = useJupiter({
amount: 1 * 10 ** 6,
inputMint,
outputMint,
slippage: 1,
debounceTime: 250,
});
const {
allTokenMints,
routeMap,
exchange,
refresh,
lastRefreshTimestamp,
loading,
routes,
error,
} = jupiter;
return (
<>
<div style={{ fontWeight: "600", fontSize: 16, marginTop: 24 }}>
Hook example
</div>
<div>Number of tokens: {tokens.length}</div>
<div>Number of input tokens {allTokenMints.length}</div>
<div>Possible number of routes: {routes?.length}</div>
<div>Best quote: {routes ? routes[0].outAmount : ""}</div>
</>
);
};
export default JupiterApp;
================================================
FILE: code/jupiter/useJupiter/main.preview.en.ts
================================================
const jupiter = useJupiter({
amount: 1 * 10 ** 6,
inputMint,
outputMint,
slippage: 1,
debounceTime: 250,
});
const {
allTokenMints,
routeMap,
exchange,
refresh,
lastRefreshTimestamp,
loading,
routes,
error,
} = jupiter;
================================================
FILE: code/keypairs-and-wallets/check-valid-publickey/check-valid-publickey.cpp
================================================
#include <iostream>
#include <solana_sdk.h>
int main()
{
auto public_key = PublicKey("5oNDL3swdJJF1g9DzJiZ4ynHXgszjAEpUkxVYejchzrY");
std::cout << public_key.is_on_curve() << std::endl;
return 0;
}
================================================
FILE: code/keypairs-and-wallets/check-valid-publickey/check-valid-publickey.preview.cpp
================================================
auto public_key = PublicKey("5oNDL3swdJJF1g9DzJiZ4ynHXgszjAEpUkxVYejchzrY");
std::cout << public_key.is_on_curve() << std::endl;
=====================================
gitextract_wogrekbi/ ├── .ci/ │ ├── .exclude_files │ └── scripts.py ├── .devcontainer/ │ ├── Dockerfile │ └── devcontainer.json ├── .github/ │ ├── dependabot.yml │ └── workflows/ │ └── python.yml ├── .gitignore ├── .husky/ │ ├── .gitignore │ └── pre-commit ├── .prettierignore ├── CONTRIBUTING.md ├── README.md ├── code/ │ ├── account-maps/ │ │ ├── deriving-pda/ │ │ │ ├── anchor-pda-map.preview.rs │ │ │ ├── anchor-pda-map.rs │ │ │ ├── client.preview.ts │ │ │ ├── client.ts │ │ │ ├── vanilla-pda-map.preview.rs │ │ │ └── vanilla-pda-map.rs │ │ └── trivial/ │ │ ├── client.preview.ts │ │ ├── client.ts │ │ ├── vanilla-trivial-map.preview.rs │ │ └── vanilla-trivial-map.rs │ ├── accounts/ │ │ ├── close-account/ │ │ │ ├── client/ │ │ │ │ ├── close-account.adapter.en.tsx │ │ │ │ ├── close-account.adapter.preview.en.tsx │ │ │ │ ├── main.en.ts │ │ │ │ └── main.preview.en.ts │ │ │ └── program/ │ │ │ ├── Cargo.toml │ │ │ ├── Xargo.toml │ │ │ └── src/ │ │ │ ├── lib.preview.rs │ │ │ └── lib.rs │ │ ├── create-account-with-seed/ │ │ │ ├── creation/ │ │ │ │ ├── main.en.rs │ │ │ │ ├── main.en.ts │ │ │ │ ├── main.preview.en.rs │ │ │ │ └── main.preview.en.ts │ │ │ ├── generate/ │ │ │ │ ├── main.en.rs │ │ │ │ ├── main.en.ts │ │ │ │ ├── main.preview.en.rs │ │ │ │ └── main.preview.en.ts │ │ │ └── transfer/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── create-system-account/ │ │ │ ├── create-system-account.en.rs │ │ │ ├── create-system-account.en.ts │ │ │ ├── create-system-account.preview.en.rs │ │ │ └── create-system-account.preview.en.ts │ │ ├── get-balance/ │ │ │ ├── main.en.cpp │ │ │ ├── main.en.py │ │ │ ├── main.en.rs │ │ │ ├── main.en.ts │ │ │ ├── main.preview.en.cpp │ │ │ ├── main.preview.en.py │ │ │ ├── main.preview.en.rs │ │ │ └── main.preview.en.ts │ │ ├── program-derived-address/ │ │ │ ├── create-a-pda/ │ │ │ │ ├── client/ │ │ │ │ │ ├── main.en.ts │ │ │ │ │ └── main.preview.en.ts │ │ │ │ └── program/ │ │ │ │ ├── Cargo.toml │ │ │ │ ├── Xargo.toml │ │ │ │ └── src/ │ │ │ │ ├── lib.preview.rs │ │ │ │ └── lib.rs │ │ │ ├── derived-a-pda/ │ │ │ │ ├── find-program-address.en.rs │ │ │ │ └── find-program-address.en.ts │ │ │ └── sign-a-pda/ │ │ │ ├── client/ │ │ │ │ ├── main.en.ts │ │ │ │ └── main.preview.en.ts │ │ │ └── program/ │ │ │ ├── .gitignore │ │ │ ├── Cargo.toml │ │ │ ├── Xargo.toml │ │ │ └── src/ │ │ │ ├── lib.preview.rs │ │ │ └── lib.rs │ │ └── rent-exemption/ │ │ ├── rent-exemption.en.rs │ │ ├── rent-exemption.en.sh │ │ └── rent-exemption.en.ts │ ├── anchor/ │ │ ├── calculating-account-space-size/ │ │ │ ├── Cargo.toml │ │ │ ├── Xargo.toml │ │ │ └── src/ │ │ │ ├── account.preview.lib.rs │ │ │ ├── deserializer.preview.lib.rs │ │ │ ├── implementation-space.preview.lib.rs │ │ │ └── lib.rs │ │ ├── define-program/ │ │ │ ├── Cargo.toml │ │ │ ├── Xargo.toml │ │ │ └── src/ │ │ │ ├── define-account.preview.lib.rs │ │ │ ├── define-deserializer.preview.lib.rs │ │ │ ├── define-program-and-instructions.preview.lib.rs │ │ │ └── lib.rs │ │ └── testing-with-anchor/ │ │ ├── client/ │ │ │ ├── testing-with-anchor.js │ │ │ └── testing_with_anchor.py │ │ └── program/ │ │ ├── Cargo.toml │ │ ├── Xargo.toml │ │ └── src/ │ │ ├── define-increment.preview.lib.rs │ │ └── lib.rs │ ├── basic-transactions/ │ │ ├── calc-tx-cost/ │ │ │ ├── calc-tx-cost.en.ts │ │ │ ├── calc-tx-cost.preview.en.ts │ │ │ ├── calc-tx-est-fees-for-message.en.ts │ │ │ ├── calc-tx-est-fees-for-message.preview.en.ts │ │ │ ├── calc-tx-est-fees.en.ts │ │ │ └── calc-tx-est-fees.preview.en.ts │ │ ├── compute-budget/ │ │ │ ├── computeBudget.en.rs │ │ │ ├── computeBudget.en.tsx │ │ │ ├── computeBudget.preview.en.rs │ │ │ ├── computeBudget.preview.en.tsx │ │ │ ├── log_output.txt │ │ │ └── solana_program.rs │ │ ├── memo/ │ │ │ ├── memo.adapter.en.tsx │ │ │ ├── memo.adapter.preview.en.tsx │ │ │ ├── memo.en.sh │ │ │ ├── memo.en.ts │ │ │ └── memo.preview.en.ts │ │ ├── sending-sol/ │ │ │ ├── sending-sol.adapter.en.tsx │ │ │ ├── sending-sol.adapter.preview.en.tsx │ │ │ ├── sending-sol.en.py │ │ │ ├── sending-sol.en.rs │ │ │ ├── sending-sol.en.sh │ │ │ ├── sending-sol.en.ts │ │ │ ├── sending-sol.preview.en.py │ │ │ ├── sending-sol.preview.en.ts │ │ │ └── sending-sol.preview.rs │ │ └── sending-spl-token/ │ │ ├── sending-spl-token.adapter.en.tsx │ │ ├── sending-spl-token.adapter.preview.en.tsx │ │ ├── sending-spl-token.en.sh │ │ ├── sending-spl-token.en.ts │ │ └── sending-spl-token.preview.en.ts │ ├── data-migration/ │ │ ├── account-v0.en.rs │ │ ├── account-v0.preview.en.rs │ │ ├── account-v1.en.rs │ │ ├── account-v1.preview.en.rs │ │ ├── rust.instruction.en.rs │ │ ├── rust.instruction.preview.en.rs │ │ ├── rust.instruction1.en.rs │ │ ├── rust.processor.en.rs │ │ ├── rust.processor.preview.en.rs │ │ └── rust.processor1.en.rs │ ├── feature-parity-testing/ │ │ ├── deactivate_one.rs │ │ ├── deactivate_scfs.rs │ │ ├── deactivate_two.rs │ │ ├── preamble.rs │ │ └── preamble_short.rs │ ├── get-program-accounts/ │ │ ├── basic/ │ │ │ ├── basic.en.rs │ │ │ ├── basic.en.sh │ │ │ └── basic.en.ts │ │ ├── dataSlice/ │ │ │ ├── dataSlice.en.rs │ │ │ ├── dataSlice.en.sh │ │ │ └── dataSlice.en.ts │ │ └── memcmp/ │ │ ├── memcmp.en.rs │ │ ├── memcmp.en.sh │ │ └── memcmp.en.ts │ ├── jupiter/ │ │ ├── executeapi/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── getRoutesapi/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── getTxapi/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── inputSetup/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── installationapi/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── loading-instance/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── providerSetup/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── react-token-list/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── reactSwap/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── retriveapi/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── route-map/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── routes/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── swap/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── token-list/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ └── useJupiter/ │ │ ├── main.en.ts │ │ └── main.preview.en.ts │ ├── keypairs-and-wallets/ │ │ ├── check-valid-publickey/ │ │ │ ├── check-valid-publickey.cpp │ │ │ ├── check-valid-publickey.preview.cpp │ │ │ ├── check-valid-publickey.preview.py │ │ │ ├── check-valid-publickey.preview.rs │ │ │ ├── check-valid-publickey.preview.ts │ │ │ ├── check-valid-publickey.py │ │ │ ├── check-valid-publickey.rs │ │ │ └── check-valid-publickey.ts │ │ ├── connect-to-wallet/ │ │ │ ├── connect-to-wallet-react.en.tsx │ │ │ ├── connect-to-wallet-react.preview.en.tsx │ │ │ ├── connect-to-wallet-svelte.en.html │ │ │ ├── connect-to-wallet-svelte.preview.en.html │ │ │ ├── connect-to-wallet-vue.en.vue │ │ │ └── connect-to-wallet-vue.preview.en.vue │ │ ├── generate-keypair/ │ │ │ ├── generate-keypair.en.cpp │ │ │ ├── generate-keypair.en.py │ │ │ ├── generate-keypair.en.rs │ │ │ ├── generate-keypair.en.sh │ │ │ ├── generate-keypair.en.ts │ │ │ ├── generate-keypair.preview.en.cpp │ │ │ ├── generate-keypair.preview.en.py │ │ │ ├── generate-keypair.preview.en.rs │ │ │ ├── generate-keypair.preview.en.sh │ │ │ └── generate-keypair.preview.en.ts │ │ ├── generate-mnemonic/ │ │ │ ├── from-bip39.preview.py │ │ │ ├── from-bip39.preview.ts │ │ │ ├── from-bip39.py │ │ │ ├── from-bip39.sh │ │ │ └── from-bip39.ts │ │ ├── keypair-from-secret/ │ │ │ ├── from-bs58.en.py │ │ │ ├── from-bs58.en.rs │ │ │ ├── from-bs58.en.ts │ │ │ ├── from-bs58.preview.en.py │ │ │ ├── from-bs58.preview.en.rs │ │ │ ├── from-bs58.preview.en.ts │ │ │ ├── keypair-from-secret.en.cpp │ │ │ ├── keypair-from-secret.en.py │ │ │ ├── keypair-from-secret.en.rs │ │ │ ├── keypair-from-secret.en.sh │ │ │ ├── keypair-from-secret.en.ts │ │ │ ├── keypair-from-secret.preview.en.cpp │ │ │ ├── keypair-from-secret.preview.en.py │ │ │ ├── keypair-from-secret.preview.en.rs │ │ │ └── keypair-from-secret.preview.en.ts │ │ ├── mnemonic-to-keypair/ │ │ │ ├── from-bip39.preview.py │ │ │ ├── from-bip39.preview.ts │ │ │ ├── from-bip39.py │ │ │ ├── from-bip39.sh │ │ │ ├── from-bip39.ts │ │ │ ├── from-bip44.preview.py │ │ │ ├── from-bip44.preview.ts │ │ │ ├── from-bip44.py │ │ │ ├── from-bip44.sh │ │ │ └── from-bip44.ts │ │ ├── sign-verify-message/ │ │ │ ├── sign-verify-message.en.py │ │ │ ├── sign-verify-message.en.ts │ │ │ ├── sign-verify-message.preview.en.py │ │ │ └── sign-verify-message.preview.en.ts │ │ ├── vanity-publickeys/ │ │ │ ├── vanity-publickeys.en.cpp │ │ │ ├── vanity-publickeys.en.py │ │ │ ├── vanity-publickeys.en.sh │ │ │ ├── vanity-publickeys.en.ts │ │ │ ├── vanity-publickeys.preview.en.cpp │ │ │ ├── vanity-publickeys.preview.en.py │ │ │ └── vanity-publickeys.preview.en.ts │ │ └── verify-keypair/ │ │ ├── verify-keypair.en.cpp │ │ ├── verify-keypair.en.py │ │ ├── verify-keypair.en.sh │ │ ├── verify-keypair.en.ts │ │ ├── verify-keypair.preview.en.cpp │ │ ├── verify-keypair.preview.en.py │ │ └── verify-keypair.preview.en.ts │ ├── local-development/ │ │ ├── airdropping-sol/ │ │ │ ├── airdropping-sol.en.cpp │ │ │ ├── airdropping-sol.en.py │ │ │ ├── airdropping-sol.en.rs │ │ │ ├── airdropping-sol.en.sh │ │ │ ├── airdropping-sol.en.ts │ │ │ ├── airdropping-sol.preview.en.cpp │ │ │ ├── airdropping-sol.preview.en.py │ │ │ ├── airdropping-sol.preview.en.rs │ │ │ ├── airdropping-sol.preview.en.sh │ │ │ └── airdropping-sol.preview.en.ts │ │ ├── connecting-cluster/ │ │ │ ├── connecting-cluster.en.cpp │ │ │ ├── connecting-cluster.en.py │ │ │ ├── connecting-cluster.en.rs │ │ │ ├── connecting-cluster.en.sh │ │ │ ├── connecting-cluster.en.ts │ │ │ ├── connecting-cluster.preview.en.cpp │ │ │ ├── connecting-cluster.preview.en.py │ │ │ ├── connecting-cluster.preview.en.rs │ │ │ └── connecting-cluster.preview.en.ts │ │ ├── connecting-private-cluster/ │ │ │ ├── connecting-private-cluster.en.cpp │ │ │ ├── connecting-private-cluster.en.py │ │ │ ├── connecting-private-cluster.en.rs │ │ │ ├── connecting-private-cluster.en.sh │ │ │ ├── connecting-private-cluster.en.ts │ │ │ ├── connecting-private-cluster.preview.en.cpp │ │ │ ├── connecting-private-cluster.preview.en.py │ │ │ ├── connecting-private-cluster.preview.en.rs │ │ │ └── connecting-private-cluster.preview.en.ts │ │ ├── connecting-websocket/ │ │ │ ├── connecting-websocket.en.cpp │ │ │ ├── connecting-websocket.en.py │ │ │ ├── connecting-websocket.en.rs │ │ │ ├── connecting-websocket.en.ts │ │ │ ├── connecting-websocket.preview.en.cpp │ │ │ ├── connecting-websocket.preview.en.py │ │ │ ├── connecting-websocket.preview.en.rs │ │ │ └── connecting-websocket.preview.en.ts │ │ └── using-mainnet-accounts/ │ │ ├── dump-accounts.en.sh │ │ ├── dump-accounts.preview.en.sh │ │ ├── dump-programs.en.sh │ │ ├── dump-programs.preview.en.sh │ │ ├── load-accounts.en.sh │ │ ├── load-accounts.preview.en.sh │ │ ├── load-programs.en.sh │ │ └── load-programs.preview.en.sh │ ├── mango/ │ │ ├── create-account/ │ │ │ ├── create-account.en.rs │ │ │ ├── create-account.en.ts │ │ │ ├── create-account.preview.en.rs │ │ │ └── create-account.preview.en.ts │ │ ├── deposit/ │ │ │ ├── deposit.en.ts │ │ │ └── deposit.preview.en.ts │ │ ├── load-asks/ │ │ │ ├── load-asks.en.ts │ │ │ └── load-asks.preview.en.ts │ │ ├── load-bids/ │ │ │ ├── load-bids.en.ts │ │ │ └── load-bids.preview.en.ts │ │ ├── load-group/ │ │ │ ├── load-group.en.ts │ │ │ └── load-group.preview.en.ts │ │ └── place-spot-order/ │ │ ├── place-spot-order.en.ts │ │ └── place-spot-order.preview.en.ts │ ├── name-service/ │ │ ├── find-for-owner/ │ │ │ ├── find-for-owner.en.ts │ │ │ └── find-for-owner.preview.en.ts │ │ ├── resolve-sol-domain/ │ │ │ ├── resolve-sol-domain.en.ts │ │ │ └── resolve-sol-domain.preview.en.ts │ │ ├── resolve-sub-domain/ │ │ │ ├── resolve-sub-domain.en.ts │ │ │ └── resolve-sub-domain.preview.en.ts │ │ ├── resolve-twitter/ │ │ │ ├── resolve-twitter.en.ts │ │ │ └── resolve-twitter.preview.en.ts │ │ ├── reverse-look-up-domain/ │ │ │ ├── reverse-look-up-domain.en.ts │ │ │ └── reverse-look-up-domain.preview.en.ts │ │ ├── reverse-look-up-twitter/ │ │ │ ├── reverse-look-up-twitter.en.ts │ │ │ └── reverse-look-up-twitter.preview.en.ts │ │ └── schema/ │ │ ├── schema.en.ts │ │ └── schema.preview.en.ts │ ├── nfts/ │ │ ├── candy-machine/ │ │ │ ├── create-candy-machine.en.ts │ │ │ ├── create-candy-machine.preview.en.ts │ │ │ ├── delete-candy-machine.en.ts │ │ │ ├── delete-candy-machine.preview.en.ts │ │ │ ├── find-minted-nfts.en.ts │ │ │ ├── find-minted-nfts.preview.en.ts │ │ │ ├── find-via-address.en.ts │ │ │ ├── find-via-address.preview.en.ts │ │ │ ├── find-via-authority.en.ts │ │ │ ├── find-via-authority.preview.en.ts │ │ │ ├── find-via-wallet.en.ts │ │ │ ├── find-via-wallet.preview.en.ts │ │ │ ├── insert-items.en.ts │ │ │ ├── insert-items.preview.en.ts │ │ │ ├── mint-nft.en.ts │ │ │ └── mint-nft.preview.en.ts │ │ ├── create-nft-token/ │ │ │ ├── create-nft-token.en.ts │ │ │ └── create-nft-token.preview.en.ts │ │ ├── get-all-nfts/ │ │ │ ├── get-all-nfts.en.ts │ │ │ └── get-all-nfts.preview.en.ts │ │ ├── get-metadata/ │ │ │ ├── get-metadata.en.ts │ │ │ └── get-metadata.preview.en.ts │ │ ├── get-owner/ │ │ │ ├── get-owner.en.ts │ │ │ └── get-owner.preview.en.ts │ │ ├── mint-nft/ │ │ │ ├── mint-nft.en.ts │ │ │ └── mint-nft.preview.en.ts │ │ ├── nfts-mint-addresses/ │ │ │ ├── mint-addresses-preview-v2.en.ts │ │ │ ├── mint-addresses-preview.en.ts │ │ │ ├── mint-addresses-v2.en.ts │ │ │ └── mint-addresses.en.ts │ │ └── upload-arweave/ │ │ ├── upload-arweave.en.py │ │ ├── upload-arweave.en.ts │ │ ├── upload-arweave.preview.en.py │ │ └── upload-arweave.preview.en.ts │ ├── offline-transactions/ │ │ ├── durable-nonce/ │ │ │ ├── create-nonce-account/ │ │ │ │ ├── main.en.ts │ │ │ │ └── main.preview.en.ts │ │ │ ├── get-nonce-account/ │ │ │ │ ├── main.en.ts │ │ │ │ └── main.preview.en.ts │ │ │ └── use-nonce-account/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── partial-sign/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ └── sign-transaction/ │ │ ├── main.en.ts │ │ └── main.preview.en.ts │ ├── programs/ │ │ ├── cpi-transfer/ │ │ │ ├── client/ │ │ │ │ ├── main.en.ts │ │ │ │ └── main.preview.en.ts │ │ │ ├── client-system/ │ │ │ │ ├── main.en.ts │ │ │ │ └── main.preview.en.ts │ │ │ ├── program/ │ │ │ │ ├── Cargo.toml │ │ │ │ └── src/ │ │ │ │ ├── lib.preview.rs │ │ │ │ └── lib.rs │ │ │ └── program-system/ │ │ │ ├── Cargo.toml │ │ │ └── src/ │ │ │ ├── lib.preview.rs │ │ │ └── lib.rs │ │ ├── create-pda/ │ │ │ ├── client/ │ │ │ │ ├── main.en.ts │ │ │ │ └── main.preview.en.ts │ │ │ └── program/ │ │ │ ├── Cargo.toml │ │ │ └── src/ │ │ │ ├── lib.preview.rs │ │ │ └── lib.rs │ │ ├── get-clock/ │ │ │ ├── method-one/ │ │ │ │ ├── client/ │ │ │ │ │ ├── main.en.ts │ │ │ │ │ └── main.preview.en.ts │ │ │ │ └── program/ │ │ │ │ ├── Cargo.toml │ │ │ │ └── src/ │ │ │ │ ├── lib.preview.rs │ │ │ │ └── lib.rs │ │ │ └── method-two/ │ │ │ ├── client/ │ │ │ │ ├── main.en.ts │ │ │ │ └── main.preview.en.ts │ │ │ └── program/ │ │ │ ├── Cargo.toml │ │ │ └── src/ │ │ │ ├── lib.preview.rs │ │ │ └── lib.rs │ │ ├── read-account/ │ │ │ └── program/ │ │ │ ├── Cargo.toml │ │ │ └── src/ │ │ │ ├── lib.preview.rs │ │ │ └── lib.rs │ │ ├── read-multiple-instructions/ │ │ │ └── program/ │ │ │ ├── lib.preview.rs │ │ │ └── lib.rs │ │ ├── realloc/ │ │ │ ├── realloc.en.rs │ │ │ └── realloc.preview.en.rs │ │ ├── transferring-lamports/ │ │ │ └── transferring-lamports.rs │ │ └── verify-account/ │ │ └── program/ │ │ ├── Cargo.toml │ │ └── src/ │ │ ├── lib.preview.rs │ │ └── lib.rs │ ├── pyth/ │ │ ├── client/ │ │ │ ├── client.en.ts │ │ │ └── client.preview.en.ts │ │ └── on-chain/ │ │ ├── on-chain.en.rs │ │ └── on-chain.preview.en.rs │ ├── retrying-transactions/ │ │ ├── retry.en.ts │ │ └── retry.preview.en.ts │ ├── serialization/ │ │ ├── clientdata/ │ │ │ ├── python.client.data.py │ │ │ ├── rust.client.data.en.rs │ │ │ └── ts.client.data.en.ts │ │ ├── coption/ │ │ │ ├── demo_coption.en.ts │ │ │ └── src/ │ │ │ └── main.rs │ │ ├── instruction/ │ │ │ ├── python.client.py │ │ │ ├── rust.client.mint.en.rs │ │ │ ├── rust.program.instruction.en.rs │ │ │ └── ts.client.mint.en.ts │ │ ├── primitives/ │ │ │ ├── demo_primitives.en.ts │ │ │ ├── python.demo_primitives.py │ │ │ └── src/ │ │ │ └── main.rs │ │ ├── program/ │ │ │ ├── rust.program.initialize.en.rs │ │ │ ├── rust.program.mint.en.rs │ │ │ ├── rust.program.packimpl.en.rs │ │ │ └── rust.program.serdeser.en.rs │ │ └── setup/ │ │ ├── Cargo.cli.en.toml │ │ ├── Cargo.program.en.toml │ │ ├── Node.package.en.json │ │ └── requirements.txt │ ├── serum/ │ │ ├── get-books/ │ │ │ ├── get-books.en.ts │ │ │ └── get-books.preview.en.ts │ │ ├── get-orders/ │ │ │ ├── get-orders.en.ts │ │ │ └── get-orders.preview.en.ts │ │ └── load-market/ │ │ ├── load-market.en.ts │ │ └── load-market.preview.en.ts │ ├── staking/ │ │ ├── create-stake-account/ │ │ │ ├── create-stake-account.en.ts │ │ │ └── create-stake-account.preview.en.ts │ │ ├── deactivate-stake/ │ │ │ ├── deactivate-stake.en.ts │ │ │ └── deactivate-stake.preview.en.ts │ │ ├── delegate-stake/ │ │ │ ├── delegate-stake.en.ts │ │ │ └── delegate-stake.preview.en.ts │ │ ├── get-current-validators/ │ │ │ ├── get-current-validators.en.sh │ │ │ └── get-current-validators.en.ts │ │ ├── get-delegators-by-validators/ │ │ │ ├── get-delegators-by-validators.en.ts │ │ │ └── get-delegators-by-validators.preview.en.ts │ │ ├── get-stake-amount/ │ │ │ ├── get-stake-amount.en.ts │ │ │ └── get-stake-amount.preview.en.ts │ │ └── withdraw-stake/ │ │ ├── withdraw-stake.en.ts │ │ └── withdraw-stake.preview.en.ts │ ├── strata/ │ │ ├── fully-managed/ │ │ │ ├── buy-token.en.ts │ │ │ ├── buy-token.preview.en.ts │ │ │ ├── create-token.en.ts │ │ │ ├── create-token.preview.en.ts │ │ │ ├── sell-token.en.ts │ │ │ └── sell-token.preview.en.ts │ │ └── lbc/ │ │ ├── create.en.ts │ │ └── create.preview.en.ts │ ├── switchboard/ │ │ ├── client/ │ │ │ ├── create.client.en.ts │ │ │ ├── create.client.preview.en.ts │ │ │ ├── create.oracle.client.en.ts │ │ │ ├── create.oracle.client.preview.en.ts │ │ │ ├── create.vrf.client.en.ts │ │ │ ├── create.vrf.client.preview.en.ts │ │ │ ├── read.client.en.ts │ │ │ ├── read.client.preview.en.ts │ │ │ ├── read.vrf.client.en.ts │ │ │ ├── read.vrf.client.preview.en.ts │ │ │ ├── request.vrf.client.en.ts │ │ │ └── request.vrf.client.preview.en.ts │ │ ├── local/ │ │ │ └── docker-compose.oracle.local.en.yml │ │ └── on-chain/ │ │ ├── read.on-chain.en.rs │ │ ├── read.on-chain.preview.en.rs │ │ ├── read.vrf.on-chain.en.rs │ │ ├── read.vrf.on-chain.preview.en.rs │ │ ├── request.vrf.on-chain.en.rs │ │ └── request.vrf.on-chain.preview.en.rs │ ├── token/ │ │ ├── approve/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── burn-token/ │ │ │ ├── burn-token.en.ts │ │ │ └── burn-token.preview.en.ts │ │ ├── close-token-account/ │ │ │ ├── close-token-account.en.ts │ │ │ └── close-token-account.preview.en.ts │ │ ├── create-mint-account/ │ │ │ ├── create-mint-account.en.ts │ │ │ ├── create-mint-account.preview.en.ts │ │ │ └── create-mint-account.sh │ │ ├── create-token-account/ │ │ │ ├── ata.en.ts │ │ │ ├── ata.preview.en.ts │ │ │ ├── random.en.ts │ │ │ └── random.preview.en.ts │ │ ├── get-mint-account/ │ │ │ ├── get-mint-account.en.ts │ │ │ └── get-mint-account.preview.en.ts │ │ ├── get-token-account/ │ │ │ ├── get-token-account.en.ts │ │ │ └── get-token-account.preview.en.ts │ │ ├── get-token-account-by-owner/ │ │ │ ├── all.en.ts │ │ │ ├── all.preview.en.ts │ │ │ ├── by-mint.en.ts │ │ │ └── by-mint.preview.en.ts │ │ ├── get-token-balance/ │ │ │ ├── get-token-balance.en.rs │ │ │ ├── get-token-balance.en.ts │ │ │ ├── get-token-balance.preview.en.rs │ │ │ └── get-token-balance.preview.en.ts │ │ ├── mint-token/ │ │ │ ├── mint-token.en.ts │ │ │ └── mint-token.preview.en.ts │ │ ├── revoke/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── set-authority/ │ │ │ ├── main.en.ts │ │ │ └── main.preview.en.ts │ │ ├── transfer-token/ │ │ │ ├── transfer-token.en.ts │ │ │ └── transfer-token.preview.en.ts │ │ └── wrapped-sol/ │ │ ├── add-balance-by-sol.en.ts │ │ ├── add-balance-by-sol.preview.en.ts │ │ ├── add-balance-by-token.en.ts │ │ └── add-balance-by-token.preview.en.ts │ └── wallet/ │ └── Web3Auth/ │ ├── initialize-instance.en.ts │ ├── initialize-instance.preview.en.ts │ ├── login.en.ts │ ├── login.preview.en.ts │ ├── logout.en.ts │ ├── logout.preview.en.ts │ ├── send-transaction.en.ts │ ├── send-transaction.preview.en.ts │ ├── sign-message.en.ts │ ├── sign-message.preview.en.ts │ ├── topup.en.ts │ ├── topup.preview.en.ts │ ├── user-info.en.ts │ └── user-info.preview.en.ts ├── docs/ │ ├── .vuepress/ │ │ ├── clientAppEnhance.js │ │ ├── components/ │ │ │ ├── SolanaCodeGroup.vue │ │ │ └── SolanaCodeGroupItem.vue │ │ ├── config.ts │ │ ├── dist/ │ │ │ ├── 404.html │ │ │ ├── assets/ │ │ │ │ ├── 404.e671120d.js │ │ │ │ ├── 404.html.1873b0e7.js │ │ │ │ ├── 404.html.f166316b.js │ │ │ │ ├── Layout.4ba2f342.js │ │ │ │ ├── account-maps.html.17bd8d7d.js │ │ │ │ ├── account-maps.html.2bc51567.js │ │ │ │ ├── account-maps.html.2bcb32db.js │ │ │ │ ├── account-maps.html.2fa44b58.js │ │ │ │ ├── account-maps.html.47c84b4e.js │ │ │ │ ├── account-maps.html.54fde3f5.js │ │ │ │ ├── account-maps.html.5696ae7f.js │ │ │ │ ├── account-maps.html.573ed2b1.js │ │ │ │ ├── account-maps.html.6070c007.js │ │ │ │ ├── account-maps.html.61224aa4.js │ │ │ │ ├── account-maps.html.62c5a232.js │ │ │ │ ├── account-maps.html.6ef9e96e.js │ │ │ │ ├── account-maps.html.84532932.js │ │ │ │ ├── account-maps.html.84595114.js │ │ │ │ ├── account-maps.html.84c98fd3.js │ │ │ │ ├── account-maps.html.8c6e008e.js │ │ │ │ ├── account-maps.html.938d8c12.js │ │ │ │ ├── account-maps.html.a6d163f8.js │ │ │ │ ├── account-maps.html.a75e89c2.js │ │ │ │ ├── account-maps.html.bdfb893c.js │ │ │ │ ├── account-maps.html.c1ccf667.js │ │ │ │ ├── account-maps.html.c84ca06e.js │ │ │ │ ├── account-maps.html.c9249bbc.js │ │ │ │ ├── account-maps.html.cd84fe7b.js │ │ │ │ ├── account-maps.html.d79562dd.js │ │ │ │ ├── account-maps.html.ec99597b.js │ │ │ │ ├── account-maps.html.f32682b9.js │ │ │ │ ├── account-maps.html.f4daf1b2.js │ │ │ │ ├── accounts.html.05949c32.js │ │ │ │ ├── accounts.html.0636922d.js │ │ │ │ ├── accounts.html.0cab14f0.js │ │ │ │ ├── accounts.html.149df989.js │ │ │ │ ├── accounts.html.17535e68.js │ │ │ │ ├── accounts.html.1c2ce3f3.js │ │ │ │ ├── accounts.html.25738f4e.js │ │ │ │ ├── accounts.html.27fae06b.js │ │ │ │ ├── accounts.html.339a7b82.js │ │ │ │ ├── accounts.html.34134782.js │ │ │ │ ├── accounts.html.369da584.js │ │ │ │ ├── accounts.html.3d33092a.js │ │ │ │ ├── accounts.html.4965c1bb.js │ │ │ │ ├── accounts.html.527d0e94.js │ │ │ │ ├── accounts.html.5a2213a5.js │ │ │ │ ├── accounts.html.5a5d0844.js │ │ │ │ ├── accounts.html.5ae3ae45.js │ │ │ │ ├── accounts.html.5affc5f4.js │ │ │ │ ├── accounts.html.629a8060.js │ │ │ │ ├── accounts.html.62c56dc7.js │ │ │ │ ├── accounts.html.6a7a3655.js │ │ │ │ ├── accounts.html.705daa54.js │ │ │ │ ├── accounts.html.70ea6ada.js │ │ │ │ ├── accounts.html.79c0ca0e.js │ │ │ │ ├── accounts.html.7d878d86.js │ │ │ │ ├── accounts.html.85e3e0a4.js │ │ │ │ ├── accounts.html.8879a9c1.js │ │ │ │ ├── accounts.html.89eb8977.js │ │ │ │ ├── accounts.html.8c2c7d40.js │ │ │ │ ├── accounts.html.8e89eb52.js │ │ │ │ ├── accounts.html.8f47d5db.js │ │ │ │ ├── accounts.html.91bec01d.js │ │ │ │ ├── accounts.html.928ccf41.js │ │ │ │ ├── accounts.html.9a24f48b.js │ │ │ │ ├── accounts.html.9bb37cd5.js │ │ │ │ ├── accounts.html.9e729942.js │ │ │ │ ├── accounts.html.b3e83490.js │ │ │ │ ├── accounts.html.b91c3a6f.js │ │ │ │ ├── accounts.html.bcf82d40.js │ │ │ │ ├── accounts.html.c4066a49.js │ │ │ │ ├── accounts.html.c9e84ab5.js │ │ │ │ ├── accounts.html.cf985a2a.js │ │ │ │ ├── accounts.html.d07565e6.js │ │ │ │ ├── accounts.html.d0cb3dfd.js │ │ │ │ ├── accounts.html.d16b618e.js │ │ │ │ ├── accounts.html.d5fa2c98.js │ │ │ │ ├── accounts.html.d65e9141.js │ │ │ │ ├── accounts.html.d72d5885.js │ │ │ │ ├── accounts.html.dde6cff9.js │ │ │ │ ├── accounts.html.e2d2d050.js │ │ │ │ ├── accounts.html.e2d854ed.js │ │ │ │ ├── accounts.html.ef2241b1.js │ │ │ │ ├── accounts.html.f6ab334e.js │ │ │ │ ├── accounts.html.fab56f07.js │ │ │ │ ├── accounts.html.fedf3c54.js │ │ │ │ ├── accounts.html.ff5e6a4d.js │ │ │ │ ├── app.07ce7a66.js │ │ │ │ ├── auto-approve.html.00c95edb.js │ │ │ │ ├── auto-approve.html.1e147577.js │ │ │ │ ├── auto-approve.html.4e3677ac.js │ │ │ │ ├── auto-approve.html.78a21927.js │ │ │ │ ├── auto-approve.html.e352de0c.js │ │ │ │ ├── auto-approve.html.f8eb4c51.js │ │ │ │ ├── basic-transactions.html.13d601ed.js │ │ │ │ ├── basic-transactions.html.145d9f79.js │ │ │ │ ├── basic-transactions.html.18d8290f.js │ │ │ │ ├── basic-transactions.html.1913df43.js │ │ │ │ ├── basic-transactions.html.1abb92a6.js │ │ │ │ ├── basic-transactions.html.22d5c3fa.js │ │ │ │ ├── basic-transactions.html.351c7904.js │ │ │ │ ├── basic-transactions.html.3e9e6a63.js │ │ │ │ ├── basic-transactions.html.508e4c5e.js │ │ │ │ ├── basic-transactions.html.598e40ad.js │ │ │ │ ├── basic-transactions.html.710d7d5d.js │ │ │ │ ├── basic-transactions.html.75aca1d6.js │ │ │ │ ├── basic-transactions.html.8104955c.js │ │ │ │ ├── basic-transactions.html.81d4c6bc.js │ │ │ │ ├── basic-transactions.html.85ad631b.js │ │ │ │ ├── basic-transactions.html.8d04a74c.js │ │ │ │ ├── basic-transactions.html.9492ba81.js │ │ │ │ ├── basic-transactions.html.a069dbca.js │ │ │ │ ├── basic-transactions.html.ab11cb9f.js │ │ │ │ ├── basic-transactions.html.ae0f79a3.js │ │ │ │ ├── basic-transactions.html.b8e697ee.js │ │ │ │ ├── basic-transactions.html.c93eecf9.js │ │ │ │ ├── basic-transactions.html.dfe4490b.js │ │ │ │ ├── basic-transactions.html.e416b8f1.js │ │ │ │ ├── basic-transactions.html.e4233694.js │ │ │ │ ├── basic-transactions.html.e7edd2e8.js │ │ │ │ ├── basic-transactions.html.f38dcb54.js │ │ │ │ ├── basic-transactions.html.f7122c53.js │ │ │ │ ├── cpi.html.1a2d6d74.js │ │ │ │ ├── cpi.html.25f2d5bd.js │ │ │ │ ├── cpi.html.667a7166.js │ │ │ │ ├── cpi.html.68e45f97.js │ │ │ │ ├── cpi.html.7575fce3.js │ │ │ │ ├── cpi.html.9d257983.js │ │ │ │ ├── cpi.html.a071110c.js │ │ │ │ ├── cpi.html.a340693f.js │ │ │ │ ├── cpi.html.dc41f18c.js │ │ │ │ ├── cpi.html.fc0ddd7a.js │ │ │ │ ├── data-migration.html.06870b65.js │ │ │ │ ├── data-migration.html.07b84548.js │ │ │ │ ├── data-migration.html.084ac250.js │ │ │ │ ├── data-migration.html.159d137d.js │ │ │ │ ├── data-migration.html.352a418b.js │ │ │ │ ├── data-migration.html.42889ad1.js │ │ │ │ ├── data-migration.html.50964a4b.js │ │ │ │ ├── data-migration.html.51e5d8f8.js │ │ │ │ ├── data-migration.html.611a3316.js │ │ │ │ ├── data-migration.html.6e4730c8.js │ │ │ │ ├── data-migration.html.6ed17ef4.js │ │ │ │ ├── data-migration.html.81a46ce7.js │ │ │ │ ├── data-migration.html.8520d86d.js │ │ │ │ ├── data-migration.html.86082ff9.js │ │ │ │ ├── data-migration.html.95cc310f.js │ │ │ │ ├── data-migration.html.9963dda2.js │ │ │ │ ├── data-migration.html.a0b30eb8.js │ │ │ │ ├── data-migration.html.aa7491d7.js │ │ │ │ ├── data-migration.html.ac61c119.js │ │ │ │ ├── data-migration.html.c9b6d0c5.js │ │ │ │ ├── data-migration.html.cd8a5967.js │ │ │ │ ├── data-migration.html.ce4aed9f.js │ │ │ │ ├── data-migration.html.d0acee8e.js │ │ │ │ ├── data-migration.html.d5010d02.js │ │ │ │ ├── data-migration.html.db91eb39.js │ │ │ │ ├── data-migration.html.e0a081db.js │ │ │ │ ├── data-migration.html.ec2afdd1.js │ │ │ │ ├── data-migration.html.f3e868ea.js │ │ │ │ ├── debugging-solana-programs.html.02363b40.js │ │ │ │ ├── debugging-solana-programs.html.125832d7.js │ │ │ │ ├── debugging-solana-programs.html.1d099feb.js │ │ │ │ ├── debugging-solana-programs.html.24149e6d.js │ │ │ │ ├── debugging-solana-programs.html.29a6acd8.js │ │ │ │ ├── debugging-solana-programs.html.2a0d6ae2.js │ │ │ │ ├── debugging-solana-programs.html.2f9160d7.js │ │ │ │ ├── debugging-solana-programs.html.30d528f0.js │ │ │ │ ├── debugging-solana-programs.html.3408b860.js │ │ │ │ ├── debugging-solana-programs.html.3aacc1a8.js │ │ │ │ ├── debugging-solana-programs.html.3eeeb833.js │ │ │ │ ├── debugging-solana-programs.html.43aa08db.js │ │ │ │ ├── debugging-solana-programs.html.56d02641.js │ │ │ │ ├── debugging-solana-programs.html.696e8511.js │ │ │ │ ├── debugging-solana-programs.html.6d280979.js │ │ │ │ ├── debugging-solana-programs.html.73a43e11.js │ │ │ │ ├── debugging-solana-programs.html.a0e3b858.js │ │ │ │ ├── debugging-solana-programs.html.a9ad9801.js │ │ │ │ ├── debugging-solana-programs.html.afe6a517.js │ │ │ │ ├── debugging-solana-programs.html.b7fb9288.js │ │ │ │ ├── debugging-solana-programs.html.be9db9a6.js │ │ │ │ ├── debugging-solana-programs.html.c57d7b64.js │ │ │ │ ├── debugging-solana-programs.html.c5eb5f04.js │ │ │ │ ├── debugging-solana-programs.html.d0ab2086.js │ │ │ │ ├── debugging-solana-programs.html.d82f151d.js │ │ │ │ ├── debugging-solana-programs.html.ede954b0.js │ │ │ │ ├── debugging-solana-programs.html.f0229576.js │ │ │ │ ├── debugging-solana-programs.html.ff3a8325.js │ │ │ │ ├── distribution.html.1a2e0c57.js │ │ │ │ ├── distribution.html.1e4a8b99.js │ │ │ │ ├── distribution.html.5054629b.js │ │ │ │ ├── distribution.html.566e7a4c.js │ │ │ │ ├── distribution.html.e6e2641f.js │ │ │ │ ├── distribution.html.ebcec652.js │ │ │ │ ├── energy-system.html.1af785c7.js │ │ │ │ ├── energy-system.html.247dc971.js │ │ │ │ ├── energy-system.html.36ae62eb.js │ │ │ │ ├── energy-system.html.446d0efc.js │ │ │ │ ├── energy-system.html.71e02b64.js │ │ │ │ ├── energy-system.html.c939c46f.js │ │ │ │ ├── feature-parity-testing.html.0478ce69.js │ │ │ │ ├── feature-parity-testing.html.110a0e04.js │ │ │ │ ├── feature-parity-testing.html.1da58904.js │ │ │ │ ├── feature-parity-testing.html.270f9679.js │ │ │ │ ├── feature-parity-testing.html.2d03e4b5.js │ │ │ │ ├── feature-parity-testing.html.441250fa.js │ │ │ │ ├── feature-parity-testing.html.5be01a44.js │ │ │ │ ├── feature-parity-testing.html.60d0cda5.js │ │ │ │ ├── feature-parity-testing.html.61551d89.js │ │ │ │ ├── feature-parity-testing.html.61786585.js │ │ │ │ ├── feature-parity-testing.html.64de3bfa.js │ │ │ │ ├── feature-parity-testing.html.6b5afb2f.js │ │ │ │ ├── feature-parity-testing.html.7eebcb7c.js │ │ │ │ ├── feature-parity-testing.html.8332b8fc.js │ │ │ │ ├── feature-parity-testing.html.90d3050b.js │ │ │ │ ├── feature-parity-testing.html.93063fd3.js │ │ │ │ ├── feature-parity-testing.html.94cf4ee3.js │ │ │ │ ├── feature-parity-testing.html.9895d411.js │ │ │ │ ├── feature-parity-testing.html.9edac1d3.js │ │ │ │ ├── feature-parity-testing.html.a793ec94.js │ │ │ │ ├── feature-parity-testing.html.a8a66110.js │ │ │ │ ├── feature-parity-testing.html.abd7566e.js │ │ │ │ ├── feature-parity-testing.html.b2696a90.js │ │ │ │ ├── feature-parity-testing.html.c3ce27d5.js │ │ │ │ ├── feature-parity-testing.html.c4705572.js │ │ │ │ ├── feature-parity-testing.html.d784a27d.js │ │ │ │ ├── feature-parity-testing.html.e7b6289c.js │ │ │ │ ├── feature-parity-testing.html.e87e0e6e.js │ │ │ │ ├── game-examples.html.2dcfe766.js │ │ │ │ ├── game-examples.html.40ac5dd2.js │ │ │ │ ├── game-examples.html.4c517700.js │ │ │ │ ├── game-examples.html.4e1c4e80.js │ │ │ │ ├── game-examples.html.8ba930cd.js │ │ │ │ ├── game-examples.html.e048eba1.js │ │ │ │ ├── game-sdks.html.3a17cfa1.js │ │ │ │ ├── game-sdks.html.75e8b177.js │ │ │ │ ├── game-sdks.html.92d7e729.js │ │ │ │ ├── game-sdks.html.b7b1489e.js │ │ │ │ ├── game-sdks.html.c0176ba6.js │ │ │ │ ├── game-sdks.html.d18bd9d2.js │ │ │ │ ├── get-program-accounts.html.01717eeb.js │ │ │ │ ├── get-program-accounts.html.05c9c5aa.js │ │ │ │ ├── get-program-accounts.html.1208b27a.js │ │ │ │ ├── get-program-accounts.html.18585c23.js │ │ │ │ ├── get-program-accounts.html.19ef2dee.js │ │ │ │ ├── get-program-accounts.html.2b6451b4.js │ │ │ │ ├── get-program-accounts.html.2d157240.js │ │ │ │ ├── get-program-accounts.html.34a6b3c3.js │ │ │ │ ├── get-program-accounts.html.382d13c1.js │ │ │ │ ├── get-program-accounts.html.43b20beb.js │ │ │ │ ├── get-program-accounts.html.4f4498ed.js │ │ │ │ ├── get-program-accounts.html.58aa1eba.js │ │ │ │ ├── get-program-accounts.html.5f716fa3.js │ │ │ │ ├── get-program-accounts.html.703fb6bd.js │ │ │ │ ├── get-program-accounts.html.7e74d8ff.js │ │ │ │ ├── get-program-accounts.html.88cda781.js │ │ │ │ ├── get-program-accounts.html.94ffca18.js │ │ │ │ ├── get-program-accounts.html.a9d0e53c.js │ │ │ │ ├── get-program-accounts.html.b068cc8a.js │ │ │ │ ├── get-program-accounts.html.bc5b3f33.js │ │ │ │ ├── get-program-accounts.html.bcc96381.js │ │ │ │ ├── get-program-accounts.html.beec38ff.js │ │ │ │ ├── get-program-accounts.html.c29868e4.js │ │ │ │ ├── get-program-accounts.html.d60be8fc.js │ │ │ │ ├── get-program-accounts.html.d8ef5734.js │ │ │ │ ├── get-program-accounts.html.dfc1f9ed.js │ │ │ │ ├── get-program-accounts.html.f1b24dac.js │ │ │ │ ├── get-program-accounts.html.f563091d.js │ │ │ │ ├── hello-world.html.46100458.js │ │ │ │ ├── hello-world.html.7962bd1c.js │ │ │ │ ├── hello-world.html.97d1eb37.js │ │ │ │ ├── hello-world.html.dbee0508.js │ │ │ │ ├── hello-world.html.e42a81e2.js │ │ │ │ ├── hello-world.html.e99409d5.js │ │ │ │ ├── index.html.10c6341f.js │ │ │ │ ├── index.html.2017fef1.js │ │ │ │ ├── index.html.25f20e37.js │ │ │ │ ├── index.html.4943c0a7.js │ │ │ │ ├── index.html.4eb1f1ba.js │ │ │ │ ├── index.html.550d93c2.js │ │ │ │ ├── index.html.5b3f2ada.js │ │ │ │ ├── index.html.60dd15bd.js │ │ │ │ ├── index.html.618f6255.js │ │ │ │ ├── index.html.7ae71288.js │ │ │ │ ├── index.html.7d9ea062.js │ │ │ │ ├── index.html.8977d14d.js │ │ │ │ ├── index.html.92035043.js │ │ │ │ ├── index.html.9bb2504f.js │ │ │ │ ├── index.html.9bb5a8db.js │ │ │ │ ├── index.html.abf8251d.js │ │ │ │ ├── index.html.b4991d27.js │ │ │ │ ├── index.html.b594f3cc.js │ │ │ │ ├── index.html.b6c39787.js │ │ │ │ ├── index.html.c5a39464.js │ │ │ │ ├── index.html.c8f43f44.js │ │ │ │ ├── index.html.ca0d0ddc.js │ │ │ │ ├── index.html.caa2e1b4.js │ │ │ │ ├── index.html.d04c9063.js │ │ │ │ ├── index.html.dd541d3c.js │ │ │ │ ├── index.html.e7deec39.js │ │ │ │ ├── index.html.ed59c6f5.js │ │ │ │ ├── index.html.f4a1e63e.js │ │ │ │ ├── installation.html.04bddf91.js │ │ │ │ ├── installation.html.0539cd42.js │ │ │ │ ├── installation.html.0fd43b03.js │ │ │ │ ├── installation.html.1f30223e.js │ │ │ │ ├── installation.html.2e4550cf.js │ │ │ │ ├── installation.html.33a0283b.js │ │ │ │ ├── installation.html.3865f03a.js │ │ │ │ ├── installation.html.3b279ba8.js │ │ │ │ ├── installation.html.3ee204bb.js │ │ │ │ ├── installation.html.447c9172.js │ │ │ │ ├── installation.html.4e98836a.js │ │ │ │ ├── installation.html.5338573c.js │ │ │ │ ├── installation.html.5e200cbd.js │ │ │ │ ├── installation.html.75866756.js │ │ │ │ ├── installation.html.7b74d3ce.js │ │ │ │ ├── installation.html.81cc1ff4.js │ │ │ │ ├── installation.html.91886c17.js │ │ │ │ ├── installation.html.98badae7.js │ │ │ │ ├── installation.html.9dc89678.js │ │ │ │ ├── installation.html.a516e599.js │ │ │ │ ├── installation.html.aa25ac0f.js │ │ │ │ ├── installation.html.aa3edf44.js │ │ │ │ ├── installation.html.cff7de51.js │ │ │ │ ├── installation.html.dad10efa.js │ │ │ │ ├── installation.html.eeb039ec.js │ │ │ │ ├── installation.html.ef551b6c.js │ │ │ │ ├── installation.html.f389c1e2.js │ │ │ │ ├── installation.html.fd583852.js │ │ │ │ ├── interact-with-tokens.html.2bce6086.js │ │ │ │ ├── interact-with-tokens.html.3c85d257.js │ │ │ │ ├── interact-with-tokens.html.4c6e3333.js │ │ │ │ ├── interact-with-tokens.html.64318398.js │ │ │ │ ├── interact-with-tokens.html.98196941.js │ │ │ │ ├── interact-with-tokens.html.f2419630.js │ │ │ │ ├── intro.html.48bcd940.js │ │ │ │ ├── intro.html.51f00446.js │ │ │ │ ├── intro.html.5c2ad8c4.js │ │ │ │ ├── intro.html.afd41fab.js │ │ │ │ ├── intro.html.cccca287.js │ │ │ │ ├── intro.html.e782eb8d.js │ │ │ │ ├── keypairs-and-wallets.html.06b48140.js │ │ │ │ ├── keypairs-and-wallets.html.06ba1dde.js │ │ │ │ ├── keypairs-and-wallets.html.35579864.js │ │ │ │ ├── keypairs-and-wallets.html.41fab86d.js │ │ │ │ ├── keypairs-and-wallets.html.4fa11b3e.js │ │ │ │ ├── keypairs-and-wallets.html.51f378e3.js │ │ │ │ ├── keypairs-and-wallets.html.52178133.js │ │ │ │ ├── keypairs-and-wallets.html.5d3230ee.js │ │ │ │ ├── keypairs-and-wallets.html.61911f3c.js │ │ │ │ ├── keypairs-and-wallets.html.67ed01d6.js │ │ │ │ ├── keypairs-and-wallets.html.68a4f8a1.js │ │ │ │ ├── keypairs-and-wallets.html.7c422ff4.js │ │ │ │ ├── keypairs-and-wallets.html.7c453b59.js │ │ │ │ ├── keypairs-and-wallets.html.7c474929.js │ │ │ │ ├── keypairs-and-wallets.html.87a50ba3.js │ │ │ │ ├── keypairs-and-wallets.html.8a36f79a.js │ │ │ │ ├── keypairs-and-wallets.html.8d42bf89.js │ │ │ │ ├── keypairs-and-wallets.html.96505086.js │ │ │ │ ├── keypairs-and-wallets.html.9ba5746a.js │ │ │ │ ├── keypairs-and-wallets.html.af37857f.js │ │ │ │ ├── keypairs-and-wallets.html.c98a65c6.js │ │ │ │ ├── keypairs-and-wallets.html.caac507d.js │ │ │ │ ├── keypairs-and-wallets.html.cc8fbf04.js │ │ │ │ ├── keypairs-and-wallets.html.cc9959ad.js │ │ │ │ ├── keypairs-and-wallets.html.de41b5c5.js │ │ │ │ ├── keypairs-and-wallets.html.e67c0c51.js │ │ │ │ ├── keypairs-and-wallets.html.f22c3901.js │ │ │ │ ├── keypairs-and-wallets.html.f62ce6aa.js │ │ │ │ ├── local-development.html.04b39972.js │ │ │ │ ├── local-development.html.0592ee0b.js │ │ │ │ ├── local-development.html.0eff045a.js │ │ │ │ ├── local-development.html.2a116d81.js │ │ │ │ ├── local-development.html.2abc6315.js │ │ │ │ ├── local-development.html.3d4bf8da.js │ │ │ │ ├── local-development.html.46e27ce6.js │ │ │ │ ├── local-development.html.56a49f49.js │ │ │ │ ├── local-development.html.57651167.js │ │ │ │ ├── local-development.html.5b9c11f5.js │ │ │ │ ├── local-development.html.61336a2a.js │ │ │ │ ├── local-development.html.6fe99a83.js │ │ │ │ ├── local-development.html.720fba0c.js │ │ │ │ ├── local-development.html.7e1bd7bf.js │ │ │ │ ├── local-development.html.83d30cd3.js │ │ │ │ ├── local-development.html.87708b9b.js │ │ │ │ ├── local-development.html.8d6577e9.js │ │ │ │ ├── local-development.html.94d5f03d.js │ │ │ │ ├── local-development.html.987c051d.js │ │ │ │ ├── local-development.html.a46df64b.js │ │ │ │ ├── local-development.html.b97186da.js │ │ │ │ ├── local-development.html.c30f3958.js │ │ │ │ ├── local-development.html.c3972821.js │ │ │ │ ├── local-development.html.c5836b09.js │ │ │ │ ├── local-development.html.d92b65d2.js │ │ │ │ ├── local-development.html.edd1e5da.js │ │ │ │ ├── local-development.html.f5643536.js │ │ │ │ ├── local-development.html.fd41bc0d.js │ │ │ │ ├── name-service.html.1a8fc34e.js │ │ │ │ ├── name-service.html.2a6127d5.js │ │ │ │ ├── name-service.html.2caf8c15.js │ │ │ │ ├── name-service.html.31d70b32.js │ │ │ │ ├── name-service.html.326a6c13.js │ │ │ │ ├── name-service.html.34b8f57a.js │ │ │ │ ├── name-service.html.38938728.js │ │ │ │ ├── name-service.html.40d37cf7.js │ │ │ │ ├── name-service.html.5051d1dd.js │ │ │ │ ├── name-service.html.569777a7.js │ │ │ │ ├── name-service.html.625e197d.js │ │ │ │ ├── name-service.html.65503a5f.js │ │ │ │ ├── name-service.html.73354d4f.js │ │ │ │ ├── name-service.html.7f713da1.js │ │ │ │ ├── name-service.html.84a68d08.js │ │ │ │ ├── name-service.html.87ead710.js │ │ │ │ ├── name-service.html.8945e238.js │ │ │ │ ├── name-service.html.8fa8af28.js │ │ │ │ ├── name-service.html.9126ccbb.js │ │ │ │ ├── name-service.html.92fe381f.js │ │ │ │ ├── name-service.html.b1fdc398.js │ │ │ │ ├── name-service.html.c487eb0f.js │ │ │ │ ├── name-service.html.c5f60f0b.js │ │ │ │ ├── name-service.html.d6069fdf.js │ │ │ │ ├── name-service.html.e0d6e448.js │ │ │ │ ├── name-service.html.e670bb57.js │ │ │ │ ├── name-service.html.ea9b0216.js │ │ │ │ ├── name-service.html.f9dd90b0.js │ │ │ │ ├── nfts-in-games.html.2b65cbf5.js │ │ │ │ ├── nfts-in-games.html.31ac6411.js │ │ │ │ ├── nfts-in-games.html.46772392.js │ │ │ │ ├── nfts-in-games.html.5898ff02.js │ │ │ │ ├── nfts-in-games.html.cbea4492.js │ │ │ │ ├── nfts-in-games.html.e1b77b87.js │ │ │ │ ├── nfts.html.06449cbe.js │ │ │ │ ├── nfts.html.0870f8d4.js │ │ │ │ ├── nfts.html.1e42ca51.js │ │ │ │ ├── nfts.html.2c1ad270.js │ │ │ │ ├── nfts.html.39ed8786.js │ │ │ │ ├── nfts.html.3a4dc806.js │ │ │ │ ├── nfts.html.4488b5bf.js │ │ │ │ ├── nfts.html.522cff97.js │ │ │ │ ├── nfts.html.595f8f64.js │ │ │ │ ├── nfts.html.61f329ef.js │ │ │ │ ├── nfts.html.6cf05cb7.js │ │ │ │ ├── nfts.html.73b95415.js │ │ │ │ ├── nfts.html.75a819e1.js │ │ │ │ ├── nfts.html.8062119a.js │ │ │ │ ├── nfts.html.88b22980.js │ │ │ │ ├── nfts.html.8ab155e7.js │ │ │ │ ├── nfts.html.8f57b7b1.js │ │ │ │ ├── nfts.html.93f43d02.js │ │ │ │ ├── nfts.html.965a9b0c.js │ │ │ │ ├── nfts.html.b43c7325.js │ │ │ │ ├── nfts.html.cb306959.js │ │ │ │ ├── nfts.html.cf97bb6d.js │ │ │ │ ├── nfts.html.d0725425.js │ │ │ │ ├── nfts.html.d679a608.js │ │ │ │ ├── nfts.html.d9599439.js │ │ │ │ ├── nfts.html.f28f6d5c.js │ │ │ │ ├── nfts.html.f3815a10.js │ │ │ │ ├── nfts.html.fdb7230c.js │ │ │ │ ├── offline-transactions.html.0ba69adc.js │ │ │ │ ├── offline-transactions.html.0bf4dc0d.js │ │ │ │ ├── offline-transactions.html.1cebdb75.js │ │ │ │ ├── offline-transactions.html.1d7f75c0.js │ │ │ │ ├── offline-transactions.html.269432a1.js │ │ │ │ ├── offline-transactions.html.26de122f.js │ │ │ │ ├── offline-transactions.html.328bb708.js │ │ │ │ ├── offline-transactions.html.411f2083.js │ │ │ │ ├── offline-transactions.html.5d4f9b52.js │ │ │ │ ├── offline-transactions.html.62c2bb84.js │ │ │ │ ├── offline-transactions.html.694e5a9c.js │ │ │ │ ├── offline-transactions.html.6bb56d3c.js │ │ │ │ ├── offline-transactions.html.7dc3f34e.js │ │ │ │ ├── offline-transactions.html.805d36b8.js │ │ │ │ ├── offline-transactions.html.81a50c51.js │ │ │ │ ├── offline-transactions.html.8d1d2de8.js │ │ │ │ ├── offline-transactions.html.93364c85.js │ │ │ │ ├── offline-transactions.html.9b30c0d6.js │ │ │ │ ├── offline-transactions.html.9e334e4b.js │ │ │ │ ├── offline-transactions.html.a7cb4369.js │ │ │ │ ├── offline-transactions.html.afa81fed.js │ │ │ │ ├── offline-transactions.html.c95a953c.js │ │ │ │ ├── offline-transactions.html.cd22f1cb.js │ │ │ │ ├── offline-transactions.html.cff454eb.js │ │ │ │ ├── offline-transactions.html.d0d3f6bf.js │ │ │ │ ├── offline-transactions.html.d4e0be3d.js │ │ │ │ ├── offline-transactions.html.dad115e4.js │ │ │ │ ├── offline-transactions.html.ef38def6.js │ │ │ │ ├── pdas.html.02bdc9f3.js │ │ │ │ ├── pdas.html.08e26e07.js │ │ │ │ ├── pdas.html.19706e9c.js │ │ │ │ ├── pdas.html.1bf322c2.js │ │ │ │ ├── pdas.html.27a51730.js │ │ │ │ ├── pdas.html.2b207b9f.js │ │ │ │ ├── pdas.html.35c6152a.js │ │ │ │ ├── pdas.html.360db77f.js │ │ │ │ ├── pdas.html.3b9289a8.js │ │ │ │ ├── pdas.html.4a946dac.js │ │ │ │ ├── pdas.html.56ea1967.js │ │ │ │ ├── pdas.html.580eb019.js │ │ │ │ ├── pdas.html.6cdffc98.js │ │ │ │ ├── pdas.html.6d743213.js │ │ │ │ ├── pdas.html.6fd7b3e7.js │ │ │ │ ├── pdas.html.77efba8f.js │ │ │ │ ├── pdas.html.8ac3fb57.js │ │ │ │ ├── pdas.html.9841e8a1.js │ │ │ │ ├── pdas.html.a117908d.js │ │ │ │ ├── pdas.html.a4275910.js │ │ │ │ ├── pdas.html.b3879735.js │ │ │ │ ├── pdas.html.cf2a36cd.js │ │ │ │ ├── pdas.html.da9ce228.js │ │ │ │ ├── pdas.html.dd1806d8.js │ │ │ │ ├── pdas.html.e5cff056.js │ │ │ │ ├── pdas.html.ea02eb75.js │ │ │ │ ├── pdas.html.eaddc26f.js │ │ │ │ ├── pdas.html.eca9a894.js │ │ │ │ ├── porting-anchor-to-unity.html.29a097d5.js │ │ │ │ ├── porting-anchor-to-unity.html.2d7da15e.js │ │ │ │ ├── porting-anchor-to-unity.html.8ad16b00.js │ │ │ │ ├── porting-anchor-to-unity.html.a3b74cb4.js │ │ │ │ ├── porting-anchor-to-unity.html.a9555d2b.js │ │ │ │ ├── porting-anchor-to-unity.html.d93d3149.js │ │ │ │ ├── programs.html.01e229c2.js │ │ │ │ ├── programs.html.072a911a.js │ │ │ │ ├── programs.html.09c93a73.js │ │ │ │ ├── programs.html.11032af6.js │ │ │ │ ├── programs.html.12722776.js │ │ │ │ ├── programs.html.135d8a1e.js │ │ │ │ ├── programs.html.23836cb0.js │ │ │ │ ├── programs.html.23a73b36.js │ │ │ │ ├── programs.html.2a06f575.js │ │ │ │ ├── programs.html.2d618e60.js │ │ │ │ ├── programs.html.340e959e.js │ │ │ │ ├── programs.html.34dde9fb.js │ │ │ │ ├── programs.html.39ac6b79.js │ │ │ │ ├── programs.html.3c48317e.js │ │ │ │ ├── programs.html.3d46bb1d.js │ │ │ │ ├── programs.html.3f12c384.js │ │ │ │ ├── programs.html.48b1db94.js │ │ │ │ ├── programs.html.4d7d8768.js │ │ │ │ ├── programs.html.55412d52.js │ │ │ │ ├── programs.html.555fde3c.js │ │ │ │ ├── programs.html.5860dd01.js │ │ │ │ ├── programs.html.602c11ba.js │ │ │ │ ├── programs.html.6801ed73.js │ │ │ │ ├── programs.html.6895a158.js │ │ │ │ ├── programs.html.6d41107a.js │ │ │ │ ├── programs.html.6e6eaba0.js │ │ │ │ ├── programs.html.740744ad.js │ │ │ │ ├── programs.html.7c34ad36.js │ │ │ │ ├── programs.html.7db6ff71.js │ │ │ │ ├── programs.html.90aa36af.js │ │ │ │ ├── programs.html.96701793.js │ │ │ │ ├── programs.html.96b262ce.js │ │ │ │ ├── programs.html.98e92214.js │ │ │ │ ├── programs.html.98fb8b49.js │ │ │ │ ├── programs.html.9cdb4de3.js │ │ │ │ ├── programs.html.a2b54a7a.js │ │ │ │ ├── programs.html.a673792c.js │ │ │ │ ├── programs.html.b67b45cc.js │ │ │ │ ├── programs.html.bc91a8b3.js │ │ │ │ ├── programs.html.c4b45e07.js │ │ │ │ ├── programs.html.d01e378b.js │ │ │ │ ├── programs.html.d0219ea7.js │ │ │ │ ├── programs.html.d21ae222.js │ │ │ │ ├── programs.html.d77781f0.js │ │ │ │ ├── programs.html.d7e559f7.js │ │ │ │ ├── programs.html.db98f647.js │ │ │ │ ├── programs.html.dd60d7aa.js │ │ │ │ ├── programs.html.dec531fb.js │ │ │ │ ├── programs.html.e8e9b38e.js │ │ │ │ ├── programs.html.ea9dd7e3.js │ │ │ │ ├── programs.html.ebf949b0.js │ │ │ │ ├── programs.html.ee69815a.js │ │ │ │ ├── programs.html.f54b94ed.js │ │ │ │ ├── programs.html.f73d3347.js │ │ │ │ ├── programs.html.fb2104eb.js │ │ │ │ ├── programs.html.fcfb4c07.js │ │ │ │ ├── retrying-transactions.html.63745293.js │ │ │ │ ├── retrying-transactions.html.8880b234.js │ │ │ │ ├── saving-game-state.html.0656b997.js │ │ │ │ ├── saving-game-state.html.2ee97311.js │ │ │ │ ├── saving-game-state.html.40bb41f5.js │ │ │ │ ├── saving-game-state.html.9d6e5e66.js │ │ │ │ ├── saving-game-state.html.aa5750ab.js │ │ │ │ ├── saving-game-state.html.e30bfd02.js │ │ │ │ ├── serialization.html.0d68a263.js │ │ │ │ ├── serialization.html.0fd086ee.js │ │ │ │ ├── serialization.html.279a312f.js │ │ │ │ ├── serialization.html.32c33a1b.js │ │ │ │ ├── serialization.html.4b397ef0.js │ │ │ │ ├── serialization.html.4cfc0d5a.js │ │ │ │ ├── serialization.html.6a6635c1.js │ │ │ │ ├── serialization.html.7c84274e.js │ │ │ │ ├── serialization.html.7fc385dd.js │ │ │ │ ├── serialization.html.89a2791f.js │ │ │ │ ├── serialization.html.8a29cfeb.js │ │ │ │ ├── serialization.html.932862af.js │ │ │ │ ├── serialization.html.99337bc6.js │ │ │ │ ├── serialization.html.a08f50dc.js │ │ │ │ ├── serialization.html.a34c46cf.js │ │ │ │ ├── serialization.html.a93f580e.js │ │ │ │ ├── serialization.html.aa4dde2f.js │ │ │ │ ├── serialization.html.b36b4ad5.js │ │ │ │ ├── serialization.html.b936ab13.js │ │ │ │ ├── serialization.html.baac0ece.js │ │ │ │ ├── serialization.html.bb0b6d3d.js │ │ │ │ ├── serialization.html.cd6e6685.js │ │ │ │ ├── serialization.html.d1ade7c6.js │ │ │ │ ├── serialization.html.d1b35c96.js │ │ │ │ ├── serialization.html.d3083af5.js │ │ │ │ ├── serialization.html.f6d36f31.js │ │ │ │ ├── serialization.html.fc2b2085.js │ │ │ │ ├── serialization.html.ff6ce54c.js │ │ │ │ ├── staking.html.04e151a8.js │ │ │ │ ├── staking.html.0e9ae4bd.js │ │ │ │ ├── staking.html.0fd3c3b6.js │ │ │ │ ├── staking.html.122e3dd7.js │ │ │ │ ├── staking.html.192ee479.js │ │ │ │ ├── staking.html.420a515f.js │ │ │ │ ├── staking.html.48d1bd77.js │ │ │ │ ├── staking.html.4f958a15.js │ │ │ │ ├── staking.html.59211856.js │ │ │ │ ├── staking.html.5cf7a6ff.js │ │ │ │ ├── staking.html.6485c86f.js │ │ │ │ ├── staking.html.65c2cb9f.js │ │ │ │ ├── staking.html.6dbe22bd.js │ │ │ │ ├── staking.html.76101920.js │ │ │ │ ├── staking.html.79740434.js │ │ │ │ ├── staking.html.7be45709.js │ │ │ │ ├── staking.html.87a92c5a.js │ │ │ │ ├── staking.html.8f95d604.js │ │ │ │ ├── staking.html.8fb2ba56.js │ │ │ │ ├── staking.html.9a3a894a.js │ │ │ │ ├── staking.html.9da955fb.js │ │ │ │ ├── staking.html.a5ae14b2.js │ │ │ │ ├── staking.html.ad2f2638.js │ │ │ │ ├── staking.html.bbc62dff.js │ │ │ │ ├── staking.html.bbf4c1ac.js │ │ │ │ ├── staking.html.cffbd136.js │ │ │ │ ├── staking.html.e8c26eca.js │ │ │ │ ├── staking.html.f374e09a.js │ │ │ │ ├── store-sol-in-pda.html.11610e9c.js │ │ │ │ ├── store-sol-in-pda.html.4ff617de.js │ │ │ │ ├── store-sol-in-pda.html.9ee3497a.js │ │ │ │ ├── store-sol-in-pda.html.c79c00ec.js │ │ │ │ ├── store-sol-in-pda.html.e343d4f5.js │ │ │ │ ├── store-sol-in-pda.html.e4ee6008.js │ │ │ │ ├── style.fecd2c41.css │ │ │ │ ├── token.html.060a50ce.js │ │ │ │ ├── token.html.0e5aea93.js │ │ │ │ ├── token.html.12804e59.js │ │ │ │ ├── token.html.1da2f0eb.js │ │ │ │ ├── token.html.36202d18.js │ │ │ │ ├── token.html.3affc20f.js │ │ │ │ ├── token.html.43db4402.js │ │ │ │ ├── token.html.495dbb1a.js │ │ │ │ ├── token.html.59c78a7f.js │ │ │ │ ├── token.html.5b1ae1a2.js │ │ │ │ ├── token.html.64ba1d3c.js │ │ │ │ ├── token.html.77adbbb4.js │ │ │ │ ├── token.html.7f6e6e11.js │ │ │ │ ├── token.html.858f2429.js │ │ │ │ ├── token.html.87c9f9ba.js │ │ │ │ ├── token.html.997564bc.js │ │ │ │ ├── token.html.a4239a10.js │ │ │ │ ├── token.html.abb20884.js │ │ │ │ ├── token.html.b6c1e5ff.js │ │ │ │ ├── token.html.c555b525.js │ │ │ │ ├── token.html.c6b0e0c2.js │ │ │ │ ├── token.html.cb53fbdc.js │ │ │ │ ├── token.html.de032bea.js │ │ │ │ ├── token.html.e135cbcd.js │ │ │ │ ├── token.html.e2d8e013.js │ │ │ │ ├── token.html.ea1f1398.js │ │ │ │ ├── token.html.edd7bd6b.js │ │ │ │ ├── token.html.edf00ffd.js │ │ │ │ ├── transactions.html.0168eb8a.js │ │ │ │ ├── transactions.html.0b44a37d.js │ │ │ │ ├── transactions.html.188c913a.js │ │ │ │ ├── transactions.html.1cb6f901.js │ │ │ │ ├── transactions.html.263aeafa.js │ │ │ │ ├── transactions.html.46bc8b92.js │ │ │ │ ├── transactions.html.48ea2bf1.js │ │ │ │ ├── transactions.html.4904b5fe.js │ │ │ │ ├── transactions.html.50802ba1.js │ │ │ │ ├── transactions.html.5f4184a8.js │ │ │ │ ├── transactions.html.63c9ce66.js │ │ │ │ ├── transactions.html.73b8d7c4.js │ │ │ │ ├── transactions.html.74d43318.js │ │ │ │ ├── transactions.html.8e008dcb.js │ │ │ │ ├── transactions.html.93abdb49.js │ │ │ │ ├── transactions.html.999eb3d9.js │ │ │ │ ├── transactions.html.a1a988c9.js │ │ │ │ ├── transactions.html.a94c32b0.js │ │ │ │ ├── transactions.html.aceea138.js │ │ │ │ ├── transactions.html.b7388dfe.js │ │ │ │ ├── transactions.html.ba8c17fa.js │ │ │ │ ├── transactions.html.bc7f0379.js │ │ │ │ ├── transactions.html.cfd147cc.js │ │ │ │ ├── transactions.html.e6d9a389.js │ │ │ │ ├── transactions.html.ee5db7dc.js │ │ │ │ ├── transactions.html.f33ee4e9.js │ │ │ │ ├── transactions.html.f505a02d.js │ │ │ │ ├── transactions.html.f5f36a28.js │ │ │ │ ├── versioned-transactions.html.027ceb3d.js │ │ │ │ ├── versioned-transactions.html.1e1e264b.js │ │ │ │ ├── versioned-transactions.html.1e457979.js │ │ │ │ ├── versioned-transactions.html.20e4c983.js │ │ │ │ ├── versioned-transactions.html.5b1ec8d4.js │ │ │ │ ├── versioned-transactions.html.7131c1ef.js │ │ │ │ ├── versioned-transactions.html.7972f188.js │ │ │ │ ├── versioned-transactions.html.82642eca.js │ │ │ │ ├── versioned-transactions.html.8ddb12df.js │ │ │ │ ├── versioned-transactions.html.8ea1a104.js │ │ │ │ ├── versioned-transactions.html.acaac8aa.js │ │ │ │ ├── versioned-transactions.html.cb88ab6b.js │ │ │ │ ├── versioned-transactions.html.dc527468.js │ │ │ │ ├── versioned-transactions.html.dd6b2982.js │ │ │ │ ├── versioned-transactions.html.e1209342.js │ │ │ │ └── versioned-transactions.html.f7668ac4.js │ │ │ ├── core-concepts/ │ │ │ │ ├── accounts.html │ │ │ │ ├── cpi.html │ │ │ │ ├── pdas.html │ │ │ │ ├── programs.html │ │ │ │ └── transactions.html │ │ │ ├── de/ │ │ │ │ ├── core-concepts/ │ │ │ │ │ ├── accounts.html │ │ │ │ │ ├── pdas.html │ │ │ │ │ ├── programs.html │ │ │ │ │ └── transactions.html │ │ │ │ ├── getting-started/ │ │ │ │ │ └── installation.html │ │ │ │ ├── guides/ │ │ │ │ │ ├── account-maps.html │ │ │ │ │ ├── data-migration.html │ │ │ │ │ ├── debugging-solana-programs.html │ │ │ │ │ ├── feature-parity-testing.html │ │ │ │ │ ├── get-program-accounts.html │ │ │ │ │ ├── retrying-transactions.html │ │ │ │ │ └── serialization.html │ │ │ │ ├── index.html │ │ │ │ └── references/ │ │ │ │ ├── accounts.html │ │ │ │ ├── basic-transactions.html │ │ │ │ ├── keypairs-and-wallets.html │ │ │ │ ├── local-development.html │ │ │ │ ├── name-service.html │ │ │ │ ├── nfts.html │ │ │ │ ├── offline-transactions.html │ │ │ │ ├── programs.html │ │ │ │ ├── staking.html │ │ │ │ └── token.html │ │ │ ├── es/ │ │ │ │ ├── core-concepts/ │ │ │ │ │ ├── accounts.html │ │ │ │ │ ├── pdas.html │ │ │ │ │ ├── programs.html │ │ │ │ │ └── transactions.html │ │ │ │ ├── getting-started/ │ │ │ │ │ └── installation.html │ │ │ │ ├── guides/ │ │ │ │ │ ├── account-maps.html │ │ │ │ │ ├── data-migration.html │ │ │ │ │ ├── debugging-solana-programs.html │ │ │ │ │ ├── feature-parity-testing.html │ │ │ │ │ ├── get-program-accounts.html │ │ │ │ │ └── serialization.html │ │ │ │ ├── index.html │ │ │ │ └── references/ │ │ │ │ ├── accounts.html │ │ │ │ ├── basic-transactions.html │ │ │ │ ├── keypairs-and-wallets.html │ │ │ │ ├── local-development.html │ │ │ │ ├── name-service.html │ │ │ │ ├── nfts.html │ │ │ │ ├── offline-transactions.html │ │ │ │ ├── programs.html │ │ │ │ ├── staking.html │ │ │ │ └── token.html │ │ │ ├── fil/ │ │ │ │ ├── core-concepts/ │ │ │ │ │ ├── accounts.html │ │ │ │ │ ├── cpi.html │ │ │ │ │ ├── pdas.html │ │ │ │ │ ├── programs.html │ │ │ │ │ └── transactions.html │ │ │ │ ├── gaming/ │ │ │ │ │ ├── auto-approve.html │ │ │ │ │ ├── distribution.html │ │ │ │ │ ├── energy-system.html │ │ │ │ │ ├── game-examples.html │ │ │ │ │ ├── game-sdks.html │ │ │ │ │ ├── hello-world.html │ │ │ │ │ ├── interact-with-tokens.html │ │ │ │ │ ├── intro.html │ │ │ │ │ ├── nfts-in-games.html │ │ │ │ │ ├── porting-anchor-to-unity.html │ │ │ │ │ ├── saving-game-state.html │ │ │ │ │ └── store-sol-in-pda.html │ │ │ │ ├── getting-started/ │ │ │ │ │ └── installation.html │ │ │ │ ├── guides/ │ │ │ │ │ ├── account-maps.html │ │ │ │ │ ├── data-migration.html │ │ │ │ │ ├── debugging-solana-programs.html │ │ │ │ │ ├── feature-parity-testing.html │ │ │ │ │ ├── get-program-accounts.html │ │ │ │ │ ├── serialization.html │ │ │ │ │ └── versioned-transactions.html │ │ │ │ ├── index.html │ │ │ │ └── references/ │ │ │ │ ├── accounts.html │ │ │ │ ├── basic-transactions.html │ │ │ │ ├── keypairs-and-wallets.html │ │ │ │ ├── local-development.html │ │ │ │ ├── name-service.html │ │ │ │ ├── nfts.html │ │ │ │ ├── offline-transactions.html │ │ │ │ ├── programs.html │ │ │ │ ├── staking.html │ │ │ │ └── token.html │ │ │ ├── fr/ │ │ │ │ ├── core-concepts/ │ │ │ │ │ ├── accounts.html │ │ │ │ │ ├── cpi.html │ │ │ │ │ ├── pdas.html │ │ │ │ │ ├── programs.html │ │ │ │ │ └── transactions.html │ │ │ │ ├── gaming/ │ │ │ │ │ ├── auto-approve.html │ │ │ │ │ ├── distribution.html │ │ │ │ │ ├── energy-system.html │ │ │ │ │ ├── game-examples.html │ │ │ │ │ ├── game-sdks.html │ │ │ │ │ ├── hello-world.html │ │ │ │ │ ├── interact-with-tokens.html │ │ │ │ │ ├── intro.html │ │ │ │ │ ├── nfts-in-games.html │ │ │ │ │ ├── porting-anchor-to-unity.html │ │ │ │ │ ├── saving-game-state.html │ │ │ │ │ └── store-sol-in-pda.html │ │ │ │ ├── getting-started/ │ │ │ │ │ └── installation.html │ │ │ │ ├── guides/ │ │ │ │ │ ├── account-maps.html │ │ │ │ │ ├── data-migration.html │ │ │ │ │ ├── debugging-solana-programs.html │ │ │ │ │ ├── feature-parity-testing.html │ │ │ │ │ ├── get-program-accounts.html │ │ │ │ │ ├── serialization.html │ │ │ │ │ └── versioned-transactions.html │ │ │ │ ├── index.html │ │ │ │ └── references/ │ │ │ │ ├── accounts.html │ │ │ │ ├── basic-transactions.html │ │ │ │ ├── keypairs-and-wallets.html │ │ │ │ ├── local-development.html │ │ │ │ ├── name-service.html │ │ │ │ ├── nfts.html │ │ │ │ ├── offline-transactions.html │ │ │ │ ├── programs.html │ │ │ │ ├── staking.html │ │ │ │ └── token.html │ │ │ ├── gaming/ │ │ │ │ ├── auto-approve.html │ │ │ │ ├── distribution.html │ │ │ │ ├── energy-system.html │ │ │ │ ├── game-examples.html │ │ │ │ ├── game-sdks.html │ │ │ │ ├── hello-world.html │ │ │ │ ├── interact-with-tokens.html │ │ │ │ ├── intro.html │ │ │ │ ├── nfts-in-games.html │ │ │ │ ├── porting-anchor-to-unity.html │ │ │ │ ├── saving-game-state.html │ │ │ │ └── store-sol-in-pda.html │ │ │ ├── getting-started/ │ │ │ │ └── installation.html │ │ │ ├── guides/ │ │ │ │ ├── account-maps.html │ │ │ │ ├── data-migration.html │ │ │ │ ├── debugging-solana-programs.html │ │ │ │ ├── feature-parity-testing.html │ │ │ │ ├── get-program-accounts.html │ │ │ │ ├── serialization.html │ │ │ │ └── versioned-transactions.html │ │ │ ├── id/ │ │ │ │ ├── core-concepts/ │ │ │ │ │ ├── accounts.html │ │ │ │ │ ├── pdas.html │ │ │ │ │ ├── programs.html │ │ │ │ │ └── transactions.html │ │ │ │ ├── getting-started/ │ │ │ │ │ └── installation.html │ │ │ │ ├── guides/ │ │ │ │ │ ├── account-maps.html │ │ │ │ │ ├── data-migration.html │ │ │ │ │ ├── debugging-solana-programs.html │ │ │ │ │ ├── feature-parity-testing.html │ │ │ │ │ ├── get-program-accounts.html │ │ │ │ │ └── serialization.html │ │ │ │ ├── index.html │ │ │ │ └── references/ │ │ │ │ ├── accounts.html │ │ │ │ ├── basic-transactions.html │ │ │ │ ├── keypairs-and-wallets.html │ │ │ │ ├── local-development.html │ │ │ │ ├── name-service.html │ │ │ │ ├── nfts.html │ │ │ │ ├── offline-transactions.html │ │ │ │ ├── programs.html │ │ │ │ ├── staking.html │ │ │ │ └── token.html │ │ │ ├── index.html │ │ │ ├── ja/ │ │ │ │ ├── core-concepts/ │ │ │ │ │ ├── accounts.html │ │ │ │ │ ├── cpi.html │ │ │ │ │ ├── pdas.html │ │ │ │ │ ├── programs.html │ │ │ │ │ └── transactions.html │ │ │ │ ├── getting-started/ │ │ │ │ │ └── installation.html │ │ │ │ ├── guides/ │ │ │ │ │ ├── account-maps.html │ │ │ │ │ ├── data-migration.html │ │ │ │ │ ├── debugging-solana-programs.html │ │ │ │ │ ├── feature-parity-testing.html │ │ │ │ │ ├── get-program-accounts.html │ │ │ │ │ ├── serialization.html │ │ │ │ │ └── versioned-transactions.html │ │ │ │ ├── index.html │ │ │ │ └── references/ │ │ │ │ ├── accounts.html │ │ │ │ ├── basic-transactions.html │ │ │ │ ├── keypairs-and-wallets.html │ │ │ │ ├── local-development.html │ │ │ │ ├── name-service.html │ │ │ │ ├── nfts.html │ │ │ │ ├── offline-transactions.html │ │ │ │ ├── programs.html │ │ │ │ ├── staking.html │ │ │ │ └── token.html │ │ │ ├── kr/ │ │ │ │ ├── core-concepts/ │ │ │ │ │ ├── accounts.html │ │ │ │ │ ├── pdas.html │ │ │ │ │ ├── programs.html │ │ │ │ │ └── transactions.html │ │ │ │ ├── getting-started/ │ │ │ │ │ └── installation.html │ │ │ │ ├── guides/ │ │ │ │ │ ├── account-maps.html │ │ │ │ │ ├── data-migration.html │ │ │ │ │ ├── debugging-solana-programs.html │ │ │ │ │ ├── feature-parity-testing.html │ │ │ │ │ ├── get-program-accounts.html │ │ │ │ │ └── serialization.html │ │ │ │ ├── index.html │ │ │ │ └── references/ │ │ │ │ ├── accounts.html │ │ │ │ ├── basic-transactions.html │ │ │ │ ├── keypairs-and-wallets.html │ │ │ │ ├── local-development.html │ │ │ │ ├── name-service.html │ │ │ │ ├── nfts.html │ │ │ │ ├── offline-transactions.html │ │ │ │ ├── programs.html │ │ │ │ ├── staking.html │ │ │ │ └── token.html │ │ │ ├── pt/ │ │ │ │ ├── core-concepts/ │ │ │ │ │ ├── accounts.html │ │ │ │ │ ├── cpi.html │ │ │ │ │ ├── pdas.html │ │ │ │ │ ├── programs.html │ │ │ │ │ └── transactions.html │ │ │ │ ├── getting-started/ │ │ │ │ │ └── installation.html │ │ │ │ ├── guides/ │ │ │ │ │ ├── account-maps.html │ │ │ │ │ ├── data-migration.html │ │ │ │ │ ├── debugging-solana-programs.html │ │ │ │ │ ├── feature-parity-testing.html │ │ │ │ │ ├── get-program-accounts.html │ │ │ │ │ ├── serialization.html │ │ │ │ │ └── versioned-transactions.html │ │ │ │ ├── index.html │ │ │ │ └── references/ │ │ │ │ ├── accounts.html │ │ │ │ ├── basic-transactions.html │ │ │ │ ├── keypairs-and-wallets.html │ │ │ │ ├── local-development.html │ │ │ │ ├── name-service.html │ │ │ │ ├── nfts.html │ │ │ │ ├── offline-transactions.html │ │ │ │ ├── programs.html │ │ │ │ ├── staking.html │ │ │ │ └── token.html │ │ │ ├── references/ │ │ │ │ ├── accounts.html │ │ │ │ ├── basic-transactions.html │ │ │ │ ├── keypairs-and-wallets.html │ │ │ │ ├── local-development.html │ │ │ │ ├── name-service.html │ │ │ │ ├── nfts.html │ │ │ │ ├── offline-transactions.html │ │ │ │ ├── programs.html │ │ │ │ ├── staking.html │ │ │ │ └── token.html │ │ │ ├── th/ │ │ │ │ ├── core-concepts/ │ │ │ │ │ ├── accounts.html │ │ │ │ │ ├── pdas.html │ │ │ │ │ ├── programs.html │ │ │ │ │ └── transactions.html │ │ │ │ ├── getting-started/ │ │ │ │ │ └── installation.html │ │ │ │ ├── guides/ │ │ │ │ │ ├── account-maps.html │ │ │ │ │ ├── data-migration.html │ │ │ │ │ ├── debugging-solana-programs.html │ │ │ │ │ ├── feature-parity-testing.html │ │ │ │ │ ├── get-program-accounts.html │ │ │ │ │ ├── serialization.html │ │ │ │ │ └── versioned-transactions.html │ │ │ │ ├── index.html │ │ │ │ └── references/ │ │ │ │ ├── accounts.html │ │ │ │ ├── basic-transactions.html │ │ │ │ ├── keypairs-and-wallets.html │ │ │ │ ├── local-development.html │ │ │ │ ├── name-service.html │ │ │ │ ├── nfts.html │ │ │ │ ├── offline-transactions.html │ │ │ │ ├── programs.html │ │ │ │ ├── staking.html │ │ │ │ └── token.html │ │ │ ├── tr/ │ │ │ │ ├── core-concepts/ │ │ │ │ │ ├── accounts.html │ │ │ │ │ ├── pdas.html │ │ │ │ │ ├── programs.html │ │ │ │ │ └── transactions.html │ │ │ │ ├── getting-started/ │ │ │ │ │ └── installation.html │ │ │ │ ├── guides/ │ │ │ │ │ ├── account-maps.html │ │ │ │ │ ├── data-migration.html │ │ │ │ │ ├── debugging-solana-programs.html │ │ │ │ │ ├── feature-parity-testing.html │ │ │ │ │ ├── get-program-accounts.html │ │ │ │ │ └── serialization.html │ │ │ │ ├── index.html │ │ │ │ └── references/ │ │ │ │ ├── accounts.html │ │ │ │ ├── basic-transactions.html │ │ │ │ ├── keypairs-and-wallets.html │ │ │ │ ├── local-development.html │ │ │ │ ├── name-service.html │ │ │ │ ├── nfts.html │ │ │ │ ├── offline-transactions.html │ │ │ │ ├── programs.html │ │ │ │ ├── staking.html │ │ │ │ └── token.html │ │ │ ├── vi/ │ │ │ │ ├── core-concepts/ │ │ │ │ │ ├── accounts.html │ │ │ │ │ ├── pdas.html │ │ │ │ │ ├── programs.html │ │ │ │ │ └── transactions.html │ │ │ │ ├── getting-started/ │ │ │ │ │ └── installation.html │ │ │ │ ├── guides/ │ │ │ │ │ ├── account-maps.html │ │ │ │ │ ├── data-migration.html │ │ │ │ │ ├── debugging-solana-programs.html │ │ │ │ │ ├── feature-parity-testing.html │ │ │ │ │ ├── get-program-accounts.html │ │ │ │ │ └── serialization.html │ │ │ │ ├── index.html │ │ │ │ └── references/ │ │ │ │ ├── accounts.html │ │ │ │ ├── basic-transactions.html │ │ │ │ ├── keypairs-and-wallets.html │ │ │ │ ├── local-development.html │ │ │ │ ├── name-service.html │ │ │ │ ├── nfts.html │ │ │ │ ├── offline-transactions.html │ │ │ │ ├── programs.html │ │ │ │ ├── staking.html │ │ │ │ └── token.html │ │ │ ├── zh/ │ │ │ │ ├── core-concepts/ │ │ │ │ │ ├── accounts.html │ │ │ │ │ ├── pdas.html │ │ │ │ │ ├── programs.html │ │ │ │ │ └── transactions.html │ │ │ │ ├── getting-started/ │ │ │ │ │ └── installation.html │ │ │ │ ├── guides/ │ │ │ │ │ ├── account-maps.html │ │ │ │ │ ├── data-migration.html │ │ │ │ │ ├── debugging-solana-programs.html │ │ │ │ │ ├── feature-parity-testing.html │ │ │ │ │ ├── get-program-accounts.html │ │ │ │ │ ├── serialization.html │ │ │ │ │ └── versioned-transactions.html │ │ │ │ ├── index.html │ │ │ │ └── references/ │ │ │ │ ├── accounts.html │ │ │ │ ├── basic-transactions.html │ │ │ │ ├── keypairs-and-wallets.html │ │ │ │ ├── local-development.html │ │ │ │ ├── name-service.html │ │ │ │ ├── nfts.html │ │ │ │ ├── offline-transactions.html │ │ │ │ ├── programs.html │ │ │ │ ├── staking.html │ │ │ │ └── token.html │ │ │ └── zh_t/ │ │ │ ├── core-concepts/ │ │ │ │ ├── accounts.html │ │ │ │ ├── pdas.html │ │ │ │ ├── programs.html │ │ │ │ └── transactions.html │ │ │ ├── getting-started/ │ │ │ │ └── installation.html │ │ │ ├── guides/ │ │ │ │ ├── account-maps.html │ │ │ │ ├── data-migration.html │ │ │ │ ├── debugging-solana-programs.html │ │ │ │ ├── feature-parity-testing.html │ │ │ │ ├── get-program-accounts.html │ │ │ │ ├── serialization.html │ │ │ │ └── versioned-transactions.html │ │ │ ├── index.html │ │ │ └── references/ │ │ │ ├── accounts.html │ │ │ ├── basic-transactions.html │ │ │ ├── keypairs-and-wallets.html │ │ │ ├── local-development.html │ │ │ ├── name-service.html │ │ │ ├── nfts.html │ │ │ ├── offline-transactions.html │ │ │ ├── programs.html │ │ │ ├── staking.html │ │ │ └── token.html │ │ └── styles/ │ │ └── index.scss │ ├── README.md │ ├── core-concepts/ │ │ ├── accounts.md │ │ ├── cpi.md │ │ ├── pdas.md │ │ ├── programs.md │ │ └── transactions.md │ ├── de/ │ │ ├── README.md │ │ ├── core-concepts/ │ │ │ ├── accounts.md │ │ │ ├── pdas.md │ │ │ ├── programs.md │ │ │ └── transactions.md │ │ ├── getting-started/ │ │ │ └── installation.md │ │ ├── guides/ │ │ │ ├── account-maps.md │ │ │ ├── data-migration.md │ │ │ ├── debugging-solana-programs.md │ │ │ ├── feature-parity-testing.md │ │ │ ├── get-program-accounts.md │ │ │ ├── retrying-transactions.md │ │ │ └── serialization.md │ │ └── references/ │ │ ├── accounts.md │ │ ├── basic-transactions.md │ │ ├── keypairs-and-wallets.md │ │ ├── local-development.md │ │ ├── name-service.md │ │ ├── nfts.md │ │ ├── offline-transactions.md │ │ ├── programs.md │ │ ├── staking.md │ │ └── token.md │ ├── es/ │ │ ├── README.md │ │ ├── core-concepts/ │ │ │ ├── accounts.md │ │ │ ├── pdas.md │ │ │ ├── programs.md │ │ │ └── transactions.md │ │ ├── getting-started/ │ │ │ └── installation.md │ │ ├── guides/ │ │ │ ├── account-maps.md │ │ │ ├── data-migration.md │ │ │ ├── debugging-solana-programs.md │ │ │ ├── feature-parity-testing.md │ │ │ ├── get-program-accounts.md │ │ │ └── serialization.md │ │ └── references/ │ │ ├── accounts.md │ │ ├── basic-transactions.md │ │ ├── keypairs-and-wallets.md │ │ ├── local-development.md │ │ ├── name-service.md │ │ ├── nfts.md │ │ ├── offline-transactions.md │ │ ├── programs.md │ │ ├── staking.md │ │ └── token.md │ ├── fil/ │ │ ├── README.md │ │ ├── core-concepts/ │ │ │ ├── accounts.md │ │ │ ├── cpi.md │ │ │ ├── pdas.md │ │ │ ├── programs.md │ │ │ └── transactions.md │ │ ├── gaming/ │ │ │ ├── auto-approve.md │ │ │ ├── distribution.md │ │ │ ├── energy-system.md │ │ │ ├── game-examples.md │ │ │ ├── game-sdks.md │ │ │ ├── hello-world.md │ │ │ ├── interact-with-tokens.md │ │ │ ├── intro.md │ │ │ ├── nfts-in-games.md │ │ │ ├── porting-anchor-to-unity.md │ │ │ ├── saving-game-state.md │ │ │ └── store-sol-in-pda.md │ │ ├── getting-started/ │ │ │ └── installation.md │ │ ├── guides/ │ │ │ ├── account-maps.md │ │ │ ├── data-migration.md │ │ │ ├── debugging-solana-programs.md │ │ │ ├── feature-parity-testing.md │ │ │ ├── get-program-accounts.md │ │ │ ├── serialization.md │ │ │ └── versioned-transactions.md │ │ └── references/ │ │ ├── accounts.md │ │ ├── basic-transactions.md │ │ ├── keypairs-and-wallets.md │ │ ├── local-development.md │ │ ├── name-service.md │ │ ├── nfts.md │ │ ├── offline-transactions.md │ │ ├── programs.md │ │ ├── staking.md │ │ └── token.md │ ├── fr/ │ │ ├── README.md │ │ ├── core-concepts/ │ │ │ ├── accounts.md │ │ │ ├── cpi.md │ │ │ ├── pdas.md │ │ │ ├── programs.md │ │ │ └── transactions.md │ │ ├── gaming/ │ │ │ ├── auto-approve.md │ │ │ ├── distribution.md │ │ │ ├── energy-system.md │ │ │ ├── game-examples.md │ │ │ ├── game-sdks.md │ │ │ ├── hello-world.md │ │ │ ├── interact-with-tokens.md │ │ │ ├── intro.md │ │ │ ├── nfts-in-games.md │ │ │ ├── porting-anchor-to-unity.md │ │ │ ├── saving-game-state.md │ │ │ └── store-sol-in-pda.md │ │ ├── getting-started/ │ │ │ └── installation.md │ │ ├── guides/ │ │ │ ├── account-maps.md │ │ │ ├── data-migration.md │ │ │ ├── debugging-solana-programs.md │ │ │ ├── feature-parity-testing.md │ │ │ ├── get-program-accounts.md │ │ │ ├── serialization.md │ │ │ └── versioned-transactions.md │ │ └── references/ │ │ ├── accounts.md │ │ ├── basic-transactions.md │ │ ├── keypairs-and-wallets.md │ │ ├── local-development.md │ │ ├── name-service.md │ │ ├── nfts.md │ │ ├── offline-transactions.md │ │ ├── programs.md │ │ ├── staking.md │ │ └── token.md │ ├── gaming/ │ │ ├── auto-approve.md │ │ ├── distribution.md │ │ ├── energy-system.md │ │ ├── game-examples.md │ │ ├── game-sdks.md │ │ ├── hello-world.md │ │ ├── interact-with-tokens.md │ │ ├── intro.md │ │ ├── nfts-in-games.md │ │ ├── porting-anchor-to-unity.md │ │ ├── saving-game-state.md │ │ └── store-sol-in-pda.md │ ├── getting-started/ │ │ └── installation.md │ ├── guides/ │ │ ├── account-maps.md │ │ ├── data-migration.md │ │ ├── debugging-solana-programs.md │ │ ├── feature-parity-testing.md │ │ ├── get-program-accounts.md │ │ ├── serialization.md │ │ └── versioned-transactions.md │ ├── id/ │ │ ├── README.md │ │ ├── core-concepts/ │ │ │ ├── accounts.md │ │ │ ├── pdas.md │ │ │ ├── programs.md │ │ │ └── transactions.md │ │ ├── getting-started/ │ │ │ └── installation.md │ │ ├── guides/ │ │ │ ├── account-maps.md │ │ │ ├── data-migration.md │ │ │ ├── debugging-solana-programs.md │ │ │ ├── feature-parity-testing.md │ │ │ ├── get-program-accounts.md │ │ │ └── serialization.md │ │ └── references/ │ │ ├── accounts.md │ │ ├── basic-transactions.md │ │ ├── keypairs-and-wallets.md │ │ ├── local-development.md │ │ ├── name-service.md │ │ ├── nfts.md │ │ ├── offline-transactions.md │ │ ├── programs.md │ │ ├── staking.md │ │ └── token.md │ ├── ja/ │ │ ├── README.md │ │ ├── core-concepts/ │ │ │ ├── accounts.md │ │ │ ├── cpi.md │ │ │ ├── pdas.md │ │ │ ├── programs.md │ │ │ └── transactions.md │ │ ├── getting-started/ │ │ │ └── installation.md │ │ ├── guides/ │ │ │ ├── account-maps.md │ │ │ ├── data-migration.md │ │ │ ├── debugging-solana-programs.md │ │ │ ├── feature-parity-testing.md │ │ │ ├── get-program-accounts.md │ │ │ ├── serialization.md │ │ │ └── versioned-transactions.md │ │ └── references/ │ │ ├── accounts.md │ │ ├── basic-transactions.md │ │ ├── keypairs-and-wallets.md │ │ ├── local-development.md │ │ ├── name-service.md │ │ ├── nfts.md │ │ ├── offline-transactions.md │ │ ├── programs.md │ │ ├── staking.md │ │ └── token.md │ ├── kr/ │ │ ├── README.md │ │ ├── core-concepts/ │ │ │ ├── accounts.md │ │ │ ├── pdas.md │ │ │ ├── programs.md │ │ │ └── transactions.md │ │ ├── getting-started/ │ │ │ └── installation.md │ │ ├── guides/ │ │ │ ├── account-maps.md │ │ │ ├── data-migration.md │ │ │ ├── debugging-solana-programs.md │ │ │ ├── feature-parity-testing.md │ │ │ ├── get-program-accounts.md │ │ │ └── serialization.md │ │ └── references/ │ │ ├── accounts.md │ │ ├── basic-transactions.md │ │ ├── keypairs-and-wallets.md │ │ ├── local-development.md │ │ ├── name-service.md │ │ ├── nfts.md │ │ ├── offline-transactions.md │ │ ├── programs.md │ │ ├── staking.md │ │ └── token.md │ ├── pt/ │ │ ├── README.md │ │ ├── core-concepts/ │ │ │ ├── accounts.md │ │ │ ├── cpi.md │ │ │ ├── pdas.md │ │ │ ├── programs.md │ │ │ └── transactions.md │ │ ├── getting-started/ │ │ │ └── installation.md │ │ ├── guides/ │ │ │ ├── account-maps.md │ │ │ ├── data-migration.md │ │ │ ├── debugging-solana-programs.md │ │ │ ├── feature-parity-testing.md │ │ │ ├── get-program-accounts.md │ │ │ ├── serialization.md │ │ │ └── versioned-transactions.md │ │ └── references/ │ │ ├── accounts.md │ │ ├── basic-transactions.md │ │ ├── keypairs-and-wallets.md │ │ ├── local-development.md │ │ ├── name-service.md │ │ ├── nfts.md │ │ ├── offline-transactions.md │ │ ├── programs.md │ │ ├── staking.md │ │ └── token.md │ ├── references/ │ │ ├── accounts.md │ │ ├── basic-transactions.md │ │ ├── keypairs-and-wallets.md │ │ ├── local-development.md │ │ ├── name-service.md │ │ ├── nfts.md │ │ ├── offline-transactions.md │ │ ├── programs.md │ │ ├── staking.md │ │ └── token.md │ ├── th/ │ │ ├── README.md │ │ ├── core-concepts/ │ │ │ ├── accounts.md │ │ │ ├── pdas.md │ │ │ ├── programs.md │ │ │ └── transactions.md │ │ ├── getting-started/ │ │ │ └── installation.md │ │ ├── guides/ │ │ │ ├── account-maps.md │ │ │ ├── data-migration.md │ │ │ ├── debugging-solana-programs.md │ │ │ ├── feature-parity-testing.md │ │ │ ├── get-program-accounts.md │ │ │ ├── serialization.md │ │ │ └── versioned-transactions.md │ │ └── references/ │ │ ├── accounts.md │ │ ├── basic-transactions.md │ │ ├── keypairs-and-wallets.md │ │ ├── local-development.md │ │ ├── name-service.md │ │ ├── nfts.md │ │ ├── offline-transactions.md │ │ ├── programs.md │ │ ├── staking.md │ │ └── token.md │ ├── tr/ │ │ ├── README.md │ │ ├── core-concepts/ │ │ │ ├── accounts.md │ │ │ ├── pdas.md │ │ │ ├── programs.md │ │ │ └── transactions.md │ │ ├── getting-started/ │ │ │ └── installation.md │ │ ├── guides/ │ │ │ ├── account-maps.md │ │ │ ├── data-migration.md │ │ │ ├── debugging-solana-programs.md │ │ │ ├── feature-parity-testing.md │ │ │ ├── get-program-accounts.md │ │ │ └── serialization.md │ │ └── references/ │ │ ├── accounts.md │ │ ├── basic-transactions.md │ │ ├── keypairs-and-wallets.md │ │ ├── local-development.md │ │ ├── name-service.md │ │ ├── nfts.md │ │ ├── offline-transactions.md │ │ ├── programs.md │ │ ├── staking.md │ │ └── token.md │ ├── vi/ │ │ ├── README.md │ │ ├── core-concepts/ │ │ │ ├── accounts.md │ │ │ ├── pdas.md │ │ │ ├── programs.md │ │ │ └── transactions.md │ │ ├── getting-started/ │ │ │ └── installation.md │ │ ├── guides/ │ │ │ ├── account-maps.md │ │ │ ├── data-migration.md │ │ │ ├── debugging-solana-programs.md │ │ │ ├── feature-parity-testing.md │ │ │ ├── get-program-accounts.md │ │ │ └── serialization.md │ │ └── references/ │ │ ├── accounts.md │ │ ├── basic-transactions.md │ │ ├── keypairs-and-wallets.md │ │ ├── local-development.md │ │ ├── name-service.md │ │ ├── nfts.md │ │ ├── offline-transactions.md │ │ ├── programs.md │ │ ├── staking.md │ │ └── token.md │ ├── zh/ │ │ ├── README.md │ │ ├── core-concepts/ │ │ │ ├── accounts.md │ │ │ ├── pdas.md │ │ │ ├── programs.md │ │ │ └── transactions.md │ │ ├── getting-started/ │ │ │ └── installation.md │ │ ├── guides/ │ │ │ ├── account-maps.md │ │ │ ├── data-migration.md │ │ │ ├── debugging-solana-programs.md │ │ │ ├── feature-parity-testing.md │ │ │ ├── get-program-accounts.md │ │ │ ├── serialization.md │ │ │ └── versioned-transactions.md │ │ └── references/ │ │ ├── accounts.md │ │ ├── basic-transactions.md │ │ ├── keypairs-and-wallets.md │ │ ├── local-development.md │ │ ├── name-service.md │ │ ├── nfts.md │ │ ├── offline-transactions.md │ │ ├── programs.md │ │ ├── staking.md │ │ └── token.md │ └── zh_t/ │ ├── README.md │ ├── core-concepts/ │ │ ├── accounts.md │ │ ├── pdas.md │ │ ├── programs.md │ │ └── transactions.md │ ├── getting-started/ │ │ └── installation.md │ ├── guides/ │ │ ├── account-maps.md │ │ ├── data-migration.md │ │ ├── debugging-solana-programs.md │ │ ├── feature-parity-testing.md │ │ ├── get-program-accounts.md │ │ ├── serialization.md │ │ └── versioned-transactions.md │ └── references/ │ ├── accounts.md │ ├── basic-transactions.md │ ├── keypairs-and-wallets.md │ ├── local-development.md │ ├── name-service.md │ ├── nfts.md │ ├── offline-transactions.md │ ├── programs.md │ ├── staking.md │ └── token.md ├── package.json ├── requirements.txt └── vercel.json
SYMBOL INDEX (1254 symbols across 484 files)
FILE: .ci/scripts.py
function find_py_files (line 12) | def find_py_files(root_dir, exclude_patterns):
function execute_file (line 24) | def execute_file(file_path):
function main (line 28) | def main():
FILE: code/account-maps/deriving-pda/anchor-pda-map.preview.rs
type InitializeBlog (line 3) | pub struct InitializeBlog<'info> {
type CreatePost (line 24) | pub struct CreatePost<'info> {
FILE: code/account-maps/deriving-pda/anchor-pda-map.rs
function initialize_blog (line 8) | pub fn initialize_blog(ctx: Context<InitializeBlog>, _blog_account_bump:...
function create_post (line 13) | pub fn create_post(ctx: Context<CreatePost>, _post_account_bump: u8, pos...
type InitializeBlog (line 27) | pub struct InitializeBlog<'info> {
type CreatePost (line 48) | pub struct CreatePost<'info> {
type Blog (line 72) | pub struct Blog {
constant LEN (line 87) | const LEN: usize = 8 + 32 + 1 + (4 + (10 * 32));
type Post (line 79) | pub struct Post {
constant LEN (line 91) | const LEN: usize = 8 + 32 + 32 + (4 + 10) + (4 + 20) + (4 + 50);
type ErrorCode (line 95) | pub enum ErrorCode {
FILE: code/account-maps/deriving-pda/client.ts
constant BLOG_ACCOUNT_DATA_LAYOUT (line 4) | const BLOG_ACCOUNT_DATA_LAYOUT = borsh.struct([
constant POST_ACCOUNT_DATA_LAYOUT (line 10) | const POST_ACCOUNT_DATA_LAYOUT = borsh.struct([
FILE: code/account-maps/deriving-pda/vanilla-pda-map.preview.rs
function process_create_post (line 1) | fn process_create_post(
function process_init_blog (line 88) | fn process_init_blog(
FILE: code/account-maps/deriving-pda/vanilla-pda-map.rs
function process_instruction (line 17) | fn process_instruction(
type BlogInstruction (line 25) | pub enum BlogInstruction {
method unpack (line 221) | pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
type Processor (line 47) | pub struct Processor;
method process (line 49) | pub fn process(program_id: &Pubkey, accounts: &[AccountInfo], instruct...
method process_create_post (line 65) | fn process_create_post(
method process_init_blog (line 152) | fn process_init_blog(
type PostIxPayload (line 213) | struct PostIxPayload {
type Blog (line 238) | pub struct Blog {
constant LEN (line 255) | pub const LEN: usize = 32 + 1 + 1;
type Post (line 245) | pub struct Post {
type BlogError (line 259) | pub enum BlogError {
method from (line 277) | fn from(e: BlogError) -> Self {
FILE: code/account-maps/trivial/client.ts
constant MY_PROGRAM_ID (line 13) | const MY_PROGRAM_ID = new PublicKey(
constant MAP_DATA_LAYOUT (line 17) | const MAP_DATA_LAYOUT = borsh.struct([
FILE: code/account-maps/trivial/vanilla-trivial-map.preview.rs
function process_init_map (line 1) | fn process_init_map(accounts: &[AccountInfo], program_id: &Pubkey) -> Pr...
function process_insert_entry (line 59) | fn process_insert_entry(accounts: &[AccountInfo], program_id: &Pubkey) -...
FILE: code/account-maps/trivial/vanilla-trivial-map.rs
function process_instruction (line 9) | fn process_instruction(
type Processor (line 18) | pub struct Processor;
method process (line 21) | pub fn process(
method process_init_map (line 44) | fn process_init_map(accounts: &[AccountInfo], program_id: &Pubkey) -> ...
method process_insert_entry (line 102) | fn process_insert_entry(accounts: &[AccountInfo], program_id: &Pubkey)...
type MapAccount (line 135) | pub struct MapAccount {
constant LEN (line 141) | const LEN: usize = 1 + (4 + (10 * 64));
type BlogError (line 145) | pub enum BlogError {
method from (line 157) | fn from(e: BlogError) -> Self {
FILE: code/accounts/close-account/client/close-account.adapter.en.tsx
function findAssociatedTokenAddress (line 11) | function findAssociatedTokenAddress(
function CloseTokenAccount (line 26) | function CloseTokenAccount() {
FILE: code/accounts/close-account/client/close-account.adapter.preview.en.tsx
function closeAcc (line 1) | async function closeAcc() {
FILE: code/accounts/close-account/program/src/lib.rs
function process_instruction (line 8) | fn process_instruction(
FILE: code/accounts/create-account-with-seed/creation/main.en.rs
function main (line 8) | fn main() {
FILE: code/accounts/create-account-with-seed/generate/main.en.rs
function main (line 4) | fn main() {
FILE: code/accounts/create-account-with-seed/generate/main.preview.en.rs
function main (line 4) | fn main() {
FILE: code/accounts/create-system-account/create-system-account.en.rs
function main (line 7) | fn main() {
FILE: code/accounts/get-balance/main.en.cpp
function main (line 7) | int main() {
FILE: code/accounts/get-balance/main.en.rs
function main (line 7) | fn main() {
FILE: code/accounts/program-derived-address/create-a-pda/program/src/lib.rs
function process_instruction (line 8) | fn process_instruction(
FILE: code/accounts/program-derived-address/derived-a-pda/find-program-address.en.rs
function main (line 4) | fn main() {
FILE: code/accounts/program-derived-address/sign-a-pda/program/src/lib.rs
function process_instruction (line 8) | fn process_instruction(
FILE: code/accounts/rent-exemption/rent-exemption.en.rs
function main (line 4) | fn main() {
FILE: code/anchor/calculating-account-space-size/src/account.preview.lib.rs
type Account (line 2) | pub struct Account {
FILE: code/anchor/calculating-account-space-size/src/deserializer.preview.lib.rs
type InitializeAccount (line 3) | pub struct InitializeAccount<'info> {
FILE: code/anchor/calculating-account-space-size/src/implementation-space.preview.lib.rs
method space (line 2) | fn space(text: &str, vector_capacity: u16) -> usize {
FILE: code/anchor/calculating-account-space-size/src/lib.rs
function instruction (line 6) | pub fn instruction(ctx: Context<InitializeAccount>, text: String, vector...
type NewAccount (line 17) | pub struct NewAccount<'info> {
type Account (line 26) | pub struct Account {
method space (line 46) | fn space(text: &str, vector_capacity: u16) -> usize {
FILE: code/anchor/define-program/src/define-account.preview.lib.rs
type Account (line 2) | pub struct Account {
FILE: code/anchor/define-program/src/define-deserializer.preview.lib.rs
type AccountsDeserializer (line 2) | pub struct AccountsDeserializer<'info> {
FILE: code/anchor/define-program/src/define-program-and-instructions.preview.lib.rs
function instruction (line 6) | pub fn instruction(ctx: Context<AccountsDeserializer>, data: bool)
FILE: code/anchor/define-program/src/lib.rs
function instruction (line 8) | pub fn instruction(ctx: Context<AccountsDeserializer>, data: bool)
function initialize (line 18) | pub fn initialize(ctx: Context<InitializeAccount>, data: bool)
function update (line 25) | pub fn update(ctx: Context<UpdateAccount>, data: bool)
type AccountsDeserializer (line 34) | pub struct AccountsDeserializer<'info> {
type InitializeAccount (line 45) | pub struct InitializeAccount<'info> {
type UpdateAccount (line 56) | pub struct UpdateAccount<'info> {
type Account (line 66) | pub struct Account {
FILE: code/anchor/testing-with-anchor/client/testing_with_anchor.py
function program (line 13) | def program(workspace: WorkspaceType) -> Program:
function provider (line 19) | def provider(program: Program) -> Provider:
function initialized_base_account (line 25) | async def initialized_base_account(program: Program, provider: Provider)...
function test_initialized_base_account (line 44) | async def test_initialized_base_account(
function test_increment (line 57) | async def test_increment(
FILE: code/anchor/testing-with-anchor/program/src/define-increment.preview.lib.rs
function initialize (line 4) | pub fn initialize(ctx: Context<Initialize>, authority: Pubkey) -> Progra...
function increment (line 11) | pub fn increment(ctx: Context<Increment>) -> ProgramResult {
FILE: code/anchor/testing-with-anchor/program/src/lib.rs
function initialize (line 9) | pub fn initialize(ctx: Context<Initialize>, authority: Pubkey) -> Progra...
function increment (line 16) | pub fn increment(ctx: Context<Increment>) -> ProgramResult {
type Initialize (line 24) | pub struct Initialize<'info> {
type Increment (line 33) | pub struct Increment<'info> {
type BaseAccount (line 40) | pub struct BaseAccount {
FILE: code/basic-transactions/compute-budget/computeBudget.en.rs
function submit_transaction (line 14) | fn submit_transaction(
constant PROG_KEY (line 33) | const PROG_KEY: Pubkey = pubkey!("PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9Y...
FILE: code/basic-transactions/compute-budget/solana_program.rs
function process_instruction (line 8) | pub fn process_instruction(
FILE: code/basic-transactions/sending-sol/sending-sol.en.rs
function main (line 8) | fn main() {
FILE: code/data-migration/account-v0.en.rs
type AccountContentCurrent (line 16) | pub struct AccountContentCurrent {
type ProgramAccountState (line 22) | pub struct ProgramAccountState {
method set_initialized (line 30) | pub fn set_initialized(&mut self) {
method initialized (line 34) | pub fn initialized(&self) -> bool {
method version (line 38) | pub fn version(&self) -> u8 {
method content (line 42) | pub fn content(&self) -> &AccountContentCurrent {
method content_mut (line 46) | pub fn content_mut(&mut self) -> &mut AccountContentCurrent {
constant DATA_VERSION (line 52) | pub const DATA_VERSION: u8 = 0;
constant ACCOUNT_ALLOCATION_SIZE (line 54) | pub const ACCOUNT_ALLOCATION_SIZE: usize = 1024;
constant IS_INITIALIZED (line 56) | const IS_INITIALIZED: usize = 1;
constant DATA_VERSION_ID (line 58) | const DATA_VERSION_ID: usize = 1;
constant PREVIOUS_VERSION_DATA_SIZE (line 61) | pub const PREVIOUS_VERSION_DATA_SIZE: usize = mem::size_of::<AccountCont...
constant PREVIOUS_ACCOUNT_SPACE (line 63) | pub const PREVIOUS_ACCOUNT_SPACE: usize =
constant CURRENT_VERSION_DATA_SIZE (line 67) | pub const CURRENT_VERSION_DATA_SIZE: usize = mem::size_of::<AccountConte...
constant CURRENT_USED_SIZE (line 69) | pub const CURRENT_USED_SIZE: usize = IS_INITIALIZED + DATA_VERSION_ID + ...
constant CURRENT_UNUSED_SIZE (line 71) | pub const CURRENT_UNUSED_SIZE: usize = ACCOUNT_ALLOCATION_SIZE - CURRENT...
constant ACCOUNT_STATE_SPACE (line 73) | pub const ACCOUNT_STATE_SPACE: usize = CURRENT_USED_SIZE + CURRENT_UNUSE...
function conversion_logic (line 77) | fn conversion_logic(src: &[u8]) -> Result<ProgramAccountState, ProgramEr...
method is_initialized (line 98) | fn is_initialized(&self) -> bool {
constant LEN (line 104) | const LEN: usize = ACCOUNT_STATE_SPACE;
method pack_into_slice (line 107) | fn pack_into_slice(&self, dst: &mut [u8]) {
method unpack_from_slice (line 113) | fn unpack_from_slice(src: &[u8]) -> Result<Self, ProgramError> {
FILE: code/data-migration/account-v0.preview.en.rs
type AccountContentCurrent (line 2) | pub struct AccountContentCurrent {
type ProgramAccountState (line 7) | pub struct ProgramAccountState {
FILE: code/data-migration/account-v1.en.rs
type AccountContentCurrent (line 17) | pub struct AccountContentCurrent {
type AccountContentOld (line 24) | pub struct AccountContentOld {
type ProgramAccountState (line 30) | pub struct ProgramAccountState {
method set_initialized (line 38) | pub fn set_initialized(&mut self) {
method initialized (line 42) | pub fn initialized(&self) -> bool {
method version (line 46) | pub fn version(&self) -> u8 {
method content (line 50) | pub fn content(&self) -> &AccountContentCurrent {
method content_mut (line 54) | pub fn content_mut(&mut self) -> &mut AccountContentCurrent {
constant DATA_VERSION (line 60) | const DATA_VERSION: u8 = 1;
constant ACCOUNT_ALLOCATION_SIZE (line 64) | const ACCOUNT_ALLOCATION_SIZE: usize = 1024;
constant IS_INITIALIZED (line 66) | const IS_INITIALIZED: usize = 1;
constant DATA_VERSION_ID (line 68) | const DATA_VERSION_ID: usize = 1;
constant PREVIOUS_VERSION_DATA_SIZE (line 71) | const PREVIOUS_VERSION_DATA_SIZE: usize = mem::size_of::<AccountContentO...
constant PREVIOUS_ACCOUNT_SPACE (line 73) | const PREVIOUS_ACCOUNT_SPACE: usize = IS_INITIALIZED + DATA_VERSION_ID +...
constant CURRENT_VERSION_DATA_SIZE (line 76) | const CURRENT_VERSION_DATA_SIZE: usize = mem::size_of::<AccountContentCu...
constant CURRENT_USED_SIZE (line 78) | const CURRENT_USED_SIZE: usize = IS_INITIALIZED + DATA_VERSION_ID + CURR...
constant CURRENT_UNUSED_SIZE (line 80) | const CURRENT_UNUSED_SIZE: usize = ACCOUNT_ALLOCATION_SIZE - CURRENT_USE...
constant ACCOUNT_STATE_SPACE (line 82) | pub const ACCOUNT_STATE_SPACE: usize = CURRENT_USED_SIZE + CURRENT_UNUSE...
function conversion_logic (line 86) | fn conversion_logic(src: &[u8]) -> Result<ProgramAccountState, ProgramEr...
method is_initialized (line 112) | fn is_initialized(&self) -> bool {
constant LEN (line 118) | const LEN: usize = ACCOUNT_STATE_SPACE;
method pack_into_slice (line 121) | fn pack_into_slice(&self, dst: &mut [u8]) {
method unpack_from_slice (line 127) | fn unpack_from_slice(src: &[u8]) -> Result<Self, ProgramError> {
FILE: code/data-migration/account-v1.preview.en.rs
type AccountContentCurrent (line 5) | pub struct AccountContentCurrent {
type AccountContentOld (line 12) | pub struct AccountContentOld {
type ProgramAccountState (line 18) | pub struct ProgramAccountState {
FILE: code/data-migration/rust.instruction.en.rs
type ProgramInstruction (line 11) | pub enum ProgramInstruction {
method unpack (line 20) | pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
FILE: code/data-migration/rust.instruction.preview.en.rs
method unpack (line 4) | pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
FILE: code/data-migration/rust.instruction1.en.rs
type VersionProgramInstruction (line 11) | pub enum VersionProgramInstruction {
method unpack (line 21) | pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
FILE: code/data-migration/rust.processor.en.rs
function check_account_ownership (line 18) | fn check_account_ownership(program_id: &Pubkey, accounts: &[AccountInfo]...
function initialize_account (line 34) | fn initialize_account(accounts: &[AccountInfo]) -> ProgramResult {
function set_u64_value (line 55) | fn set_u64_value(accounts: &[AccountInfo], value: u64) -> ProgramResult {
function process (line 67) | pub fn process(
FILE: code/data-migration/rust.processor.preview.en.rs
function check_account_ownership (line 1) | fn check_account_ownership(program_id: &Pubkey, accounts: &[AccountInfo]...
function initialize_account (line 17) | fn initialize_account(accounts: &[AccountInfo]) -> ProgramResult {
function set_u64_value (line 38) | fn set_u64_value(accounts: &[AccountInfo], value: u64) -> ProgramResult {
function process (line 50) | pub fn process(
FILE: code/data-migration/rust.processor1.en.rs
function check_account_ownership (line 19) | fn check_account_ownership(program_id: &Pubkey, accounts: &[AccountInfo]...
function initialize_account (line 35) | fn initialize_account(accounts: &[AccountInfo]) -> ProgramResult {
function set_u64_value (line 56) | fn set_u64_value(accounts: &[AccountInfo], value: u64) -> ProgramResult {
function set_string_value (line 68) | fn set_string_value(accounts: &[AccountInfo], value: String) -> ProgramR...
function process (line 80) | pub fn process(
FILE: code/feature-parity-testing/deactivate_one.rs
function test_base_pass (line 2) | fn test_base_pass() {
FILE: code/feature-parity-testing/deactivate_scfs.rs
function test_devnet_parity_pass (line 2) | fn test_devnet_parity_pass() {
FILE: code/feature-parity-testing/deactivate_two.rs
function test_deactivate_tx_cu_pass (line 2) | fn test_deactivate_tx_cu_pass() {
FILE: code/feature-parity-testing/preamble.rs
constant LEDGER_PATH (line 22) | const LEDGER_PATH: &str = "./.ledger";
constant PROG_PATH (line 24) | const PROG_PATH: &str = "target/deploy/";
constant PROG_NAME (line 27) | const PROG_NAME: &str = "PROGRAM_NAME";
constant PROG_KEY (line 30) | const PROG_KEY: Pubkey = pubkey!("PROGRAMS_PUBLIC_KEY_BASE58_STRING");
constant TXWIDE_LIMITS (line 32) | const TXWIDE_LIMITS: Pubkey = pubkey!("5ekBxc8itEnPv4NzGJtr8BVVQLNMQuLMN...
function setup_validator (line 36) | pub fn setup_validator(
function clean_ledger_setup_validator (line 62) | pub fn clean_ledger_setup_validator(
function submit_transaction (line 73) | fn submit_transaction(
FILE: code/feature-parity-testing/preamble_short.rs
function setup_validator (line 3) | pub fn setup_validator(
function clean_ledger_setup_validator (line 29) | pub fn clean_ledger_setup_validator(
function submit_transaction (line 40) | fn submit_transaction(
FILE: code/get-program-accounts/basic/basic.en.rs
function main (line 6) | fn main() {
FILE: code/get-program-accounts/dataSlice/dataSlice.en.rs
function main (line 9) | pub fn main() {
FILE: code/get-program-accounts/memcmp/memcmp.en.rs
function main (line 10) | fn main() {
FILE: code/jupiter/loading-instance/main.en.ts
type Token (line 4) | interface Token {
FILE: code/jupiter/route-map/main.en.ts
type Token (line 4) | interface Token {
FILE: code/jupiter/routes/main.en.ts
type Token (line 4) | interface Token {
FILE: code/jupiter/swap/main.en.ts
type Token (line 4) | interface Token {
FILE: code/jupiter/token-list/main.en.ts
type Token (line 4) | interface Token {
FILE: code/jupiter/token-list/main.preview.en.ts
constant ENV (line 1) | const ENV = "mainnet-beta";
FILE: code/keypairs-and-wallets/check-valid-publickey/check-valid-publickey.cpp
function main (line 4) | int main()
FILE: code/keypairs-and-wallets/check-valid-publickey/check-valid-publickey.rs
function main (line 4) | fn main() {
FILE: code/keypairs-and-wallets/generate-keypair/generate-keypair.en.cpp
function main (line 7) | int main() {
FILE: code/keypairs-and-wallets/generate-keypair/generate-keypair.en.rs
function main (line 3) | fn main() {
FILE: code/keypairs-and-wallets/keypair-from-secret/from-bs58.en.rs
function main (line 3) | fn main() {
FILE: code/keypairs-and-wallets/keypair-from-secret/keypair-from-secret.en.cpp
function main (line 7) | int main() {
FILE: code/keypairs-and-wallets/keypair-from-secret/keypair-from-secret.en.rs
function main (line 3) | fn main() {
FILE: code/keypairs-and-wallets/vanity-publickeys/vanity-publickeys.en.cpp
function main (line 7) | int main() {
FILE: code/keypairs-and-wallets/verify-keypair/verify-keypair.en.cpp
function main (line 7) | int main() {
FILE: code/local-development/airdropping-sol/airdropping-sol.en.cpp
function main (line 7) | int main() {
FILE: code/local-development/airdropping-sol/airdropping-sol.en.rs
function main (line 6) | fn main() {
FILE: code/local-development/connecting-cluster/connecting-cluster.en.cpp
function main (line 5) | int main() {
FILE: code/local-development/connecting-cluster/connecting-cluster.en.rs
function main (line 4) | fn main() {
FILE: code/local-development/connecting-private-cluster/connecting-private-cluster.en.cpp
function main (line 5) | int main() {
FILE: code/local-development/connecting-private-cluster/connecting-private-cluster.en.rs
function main (line 4) | fn main() {
FILE: code/local-development/connecting-websocket/connecting-websocket.en.cpp
function main (line 7) | int main() {
FILE: code/local-development/connecting-websocket/connecting-websocket.en.py
function main (line 5) | async def main():
FILE: code/local-development/connecting-websocket/connecting-websocket.en.rs
function main (line 6) | fn main() {
FILE: code/mango/create-account/create-account.en.rs
type Processor (line 19) | pub struct Processor {}
method process_instruction (line 22) | pub fn process_instruction(
FILE: code/name-service/find-for-owner/find-for-owner.en.ts
function findOwnedNameAccountsForUser (line 4) | async function findOwnedNameAccountsForUser(
FILE: code/name-service/find-for-owner/find-for-owner.preview.en.ts
function findOwnedNameAccountsForUser (line 1) | async function findOwnedNameAccountsForUser(
FILE: code/name-service/schema/schema.en.ts
class NameRegistryState (line 4) | class NameRegistryState {
method constructor (line 25) | constructor(obj: {
FILE: code/name-service/schema/schema.preview.en.ts
class NameRegistryState (line 1) | class NameRegistryState {
method constructor (line 22) | constructor(obj: {
FILE: code/nfts/nfts-mint-addresses/mint-addresses-v2.en.ts
constant MAX_NAME_LENGTH (line 5) | const MAX_NAME_LENGTH = 32;
constant MAX_URI_LENGTH (line 6) | const MAX_URI_LENGTH = 200;
constant MAX_SYMBOL_LENGTH (line 7) | const MAX_SYMBOL_LENGTH = 10;
constant MAX_CREATOR_LEN (line 8) | const MAX_CREATOR_LEN = 32 + 1 + 1;
constant MAX_CREATOR_LIMIT (line 9) | const MAX_CREATOR_LIMIT = 5;
constant MAX_DATA_SIZE (line 10) | const MAX_DATA_SIZE =
constant MAX_METADATA_LEN (line 21) | const MAX_METADATA_LEN = 1 + 32 + 32 + MAX_DATA_SIZE + 1 + 1 + 9 + 172;
constant CREATOR_ARRAY_START (line 22) | const CREATOR_ARRAY_START =
constant TOKEN_METADATA_PROGRAM (line 36) | const TOKEN_METADATA_PROGRAM = new PublicKey(
constant CANDY_MACHINE_V2_PROGRAM (line 39) | const CANDY_MACHINE_V2_PROGRAM = new PublicKey(
FILE: code/nfts/nfts-mint-addresses/mint-addresses.en.ts
constant MAX_NAME_LENGTH (line 5) | const MAX_NAME_LENGTH = 32;
constant MAX_URI_LENGTH (line 6) | const MAX_URI_LENGTH = 200;
constant MAX_SYMBOL_LENGTH (line 7) | const MAX_SYMBOL_LENGTH = 10;
constant MAX_CREATOR_LEN (line 8) | const MAX_CREATOR_LEN = 32 + 1 + 1;
constant MAX_CREATOR_LIMIT (line 9) | const MAX_CREATOR_LIMIT = 5;
constant MAX_DATA_SIZE (line 10) | const MAX_DATA_SIZE =
constant MAX_METADATA_LEN (line 21) | const MAX_METADATA_LEN = 1 + 32 + 32 + MAX_DATA_SIZE + 1 + 1 + 9 + 172;
constant CREATOR_ARRAY_START (line 22) | const CREATOR_ARRAY_START =
constant TOKEN_METADATA_PROGRAM (line 36) | const TOKEN_METADATA_PROGRAM = new PublicKey(
FILE: code/programs/cpi-transfer/client-system/main.en.ts
constant PAYER_KEYPAIR (line 12) | const PAYER_KEYPAIR = Keypair.generate();
constant GENERAL_STATE_KEYPAIR (line 13) | const GENERAL_STATE_KEYPAIR = Keypair.generate();
constant ACCOUNT_SPACE_BUFFER (line 15) | const ACCOUNT_SPACE_BUFFER = Buffer.from(
FILE: code/programs/cpi-transfer/client/main.en.ts
constant PAYER_KEYPAIR (line 22) | const PAYER_KEYPAIR = Keypair.generate();
constant RECEIVER_KEYPAIR (line 23) | const RECEIVER_KEYPAIR = Keypair.generate().publicKey;
constant TOKEN_MINT_ACCOUNT (line 26) | const TOKEN_MINT_ACCOUNT = Keypair.generate();
constant SOURCE_TOKEN_ACCOUNT (line 27) | const SOURCE_TOKEN_ACCOUNT = Keypair.generate();
constant DESTINATION_TOKEN_ACCOUNT (line 28) | const DESTINATION_TOKEN_ACCOUNT = Keypair.generate();
constant DEFAULT_DECIMALS_COUNT (line 31) | const DEFAULT_DECIMALS_COUNT = 9;
constant TOKEN_TRANSFER_AMOUNT (line 32) | const TOKEN_TRANSFER_AMOUNT = 50 * 10 ** DEFAULT_DECIMALS_COUNT;
constant TOKEN_TRANSFER_AMOUNT_BUFFER (line 33) | const TOKEN_TRANSFER_AMOUNT_BUFFER = Buffer.from(
FILE: code/programs/cpi-transfer/program-system/src/lib.rs
function process_instruction (line 20) | pub fn process_instruction(
FILE: code/programs/cpi-transfer/program/src/lib.rs
function process_instruction (line 19) | pub fn process_instruction(
FILE: code/programs/create-pda/client/main.en.ts
constant PAYER_KEYPAIR (line 13) | const PAYER_KEYPAIR = Keypair.generate();
FILE: code/programs/create-pda/client/main.preview.en.ts
constant PAYER_KEYPAIR (line 1) | const PAYER_KEYPAIR = Keypair.generate();
FILE: code/programs/create-pda/program/src/lib.rs
type HelloState (line 17) | pub struct HelloState {
function process_instruction (line 25) | pub fn process_instruction(
FILE: code/programs/get-clock/method-one/program/src/lib.rs
type HelloState (line 15) | pub struct HelloState {
function process_instruction (line 23) | pub fn process_instruction(
FILE: code/programs/get-clock/method-two/program/src/lib.rs
type HelloState (line 15) | pub struct HelloState {
function process_instruction (line 22) | pub fn process_instruction(
FILE: code/programs/read-account/program/src/lib.preview.rs
function process_instruction (line 1) | pub fn process_instruction(
FILE: code/programs/read-account/program/src/lib.rs
type HelloState (line 12) | pub struct HelloState {
function process_instruction (line 21) | pub fn process_instruction(
FILE: code/programs/read-multiple-instructions/program/lib.rs
function read_multiple_instruction (line 16) | pub fn read_multiple_instruction<'info>(ctx: Context<ReadMultipleInstruc...
type ReadMultipleInstruction (line 53) | pub struct ReadMultipleInstruction<'info> {
type MyError (line 59) | pub enum MyError {
FILE: code/programs/realloc/realloc.en.rs
function process_instruction (line 22) | pub fn process_instruction(
FILE: code/programs/transferring-lamports/transferring-lamports.rs
function transfer_service_fee_lamports (line 3) | fn transfer_service_fee_lamports(
function instruction_handler (line 20) | fn instruction_handler(accounts: &[AccountInfo]) -> ProgramResult {
FILE: code/programs/verify-account/program/src/lib.preview.rs
function process_instruction (line 1) | pub fn process_instruction(
FILE: code/programs/verify-account/program/src/lib.rs
type HelloState (line 18) | pub struct HelloState {
function process_instruction (line 26) | pub fn process_instruction(
FILE: code/pyth/on-chain/on-chain.en.rs
function get_sol_price (line 10) | pub fn get_sol_price(ctx: Context<SolPrice>) -> Result<()> {
type SolPrice (line 24) | pub struct SolPrice<'info> {
FILE: code/serialization/clientdata/python.client.data.py
function get_account_info (line 15) | def get_account_info(client: Client, account_pk: Pubkey):
FILE: code/serialization/clientdata/rust.client.data.en.rs
function unpack_from_slice (line 8) | pub fn unpack_from_slice(src: &[u8]) -> Result<(bool, BTreeMap<String, S...
FILE: code/serialization/clientdata/ts.client.data.en.ts
class Assignable (line 17) | class Assignable {
method constructor (line 18) | constructor(properties) {
class AccoundData (line 25) | class AccoundData extends Assignable {}
function getAccountData (line 47) | async function getAccountData(
FILE: code/serialization/coption/demo_coption.en.ts
class COption (line 18) | class COption extends Struct {
method constructor (line 19) | constructor(properties) {
method fromPublicKey (line 28) | static fromPublicKey(akey?: PublicKey): COption {
method encode (line 44) | encode(): Buffer {
method decode (line 52) | static decode(data): COption {
method decodeUnchecked (line 61) | static decodeUnchecked(data): COption {
constant COPTIONSCHEMA (line 71) | const COPTIONSCHEMA = new Map([
function entry (line 87) | async function entry(indata?: PublicKey) {
FILE: code/serialization/coption/src/main.rs
function main (line 1) | fn main() {}
function deser_option (line 9) | fn deser_option(data: &[u8]) -> COption<Pubkey> {
function btest (line 24) | fn btest() {
FILE: code/serialization/instruction/python.client.py
class InstructionVariant (line 12) | class InstructionVariant(IntEnum):
function construct_payload (line 23) | def construct_payload(instruction_variant: InstructionVariant, key: str,...
function mint_kv (line 28) | def mint_kv(
FILE: code/serialization/instruction/rust.client.mint.en.rs
type Payload (line 4) | pub struct Payload<'a> {
function mint_transaction (line 12) | pub fn mint_transaction(
function submit_transaction (line 33) | pub fn submit_transaction(
FILE: code/serialization/instruction/rust.program.instruction.en.rs
type ProgramInstruction (line 9) | pub enum ProgramInstruction {
method unpack (line 30) | pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
type Payload (line 21) | struct Payload {
FILE: code/serialization/instruction/ts.client.mint.en.ts
class Assignable (line 18) | class Assignable {
method constructor (line 19) | constructor(properties) {
class Payload (line 27) | class Payload extends Assignable {}
type InstructionVariant (line 45) | enum InstructionVariant {
function mintKV (line 63) | async function mintKV(
FILE: code/serialization/primitives/demo_primitives.en.ts
class Primitive (line 14) | class Primitive extends Struct {
method constructor (line 15) | constructor(properties) {
function entry (line 23) | async function entry() {
FILE: code/serialization/primitives/python.demo_primitives.py
function common (line 14) | def common():
FILE: code/serialization/primitives/src/main.rs
function main (line 1) | fn main() {}
function primitives (line 9) | fn primitives() {
FILE: code/serialization/program/rust.program.initialize.en.rs
function initialize_account (line 2) | fn initialize_account(accounts: &[AccountInfo]) -> ProgramResult {
FILE: code/serialization/program/rust.program.mint.en.rs
function mint_keypair_to_account (line 2) | fn mint_keypair_to_account(accounts: &[AccountInfo], key: String, value:...
FILE: code/serialization/program/rust.program.packimpl.en.rs
type ProgramAccountState (line 14) | pub struct ProgramAccountState {
method set_initialized (line 21) | pub fn set_initialized(&mut self) {
method add (line 25) | pub fn add(&mut self, key: String, value: String) -> ProgramResult {
method remove (line 35) | pub fn remove(&mut self, key: &str) -> Result<String, SampleError> {
method is_initialized (line 48) | fn is_initialized(&self) -> bool {
constant LEN (line 54) | const LEN: usize = ACCOUNT_STATE_SPACE;
method pack_into_slice (line 57) | fn pack_into_slice(&self, dst: &mut [u8]) {
method unpack_from_slice (line 62) | fn unpack_from_slice(src: &[u8]) -> Result<Self, ProgramError> {
FILE: code/serialization/program/rust.program.serdeser.en.rs
constant INITIALIZED_BYTES (line 9) | pub const INITIALIZED_BYTES: usize = 1;
constant BTREE_LENGTH (line 11) | pub const BTREE_LENGTH: usize = 4;
constant BTREE_STORAGE (line 13) | pub const BTREE_STORAGE: usize = 1019;
constant ACCOUNT_STATE_SPACE (line 15) | pub const ACCOUNT_STATE_SPACE: usize = INITIALIZED_BYTES + BTREE_LENGTH ...
function pack_into_slice (line 19) | pub fn pack_into_slice(
function unpack_from_slice (line 43) | pub fn unpack_from_slice(src: &[u8]) -> Result<(bool, BTreeMap<String, S...
FILE: code/staking/get-delegators-by-validators/get-delegators-by-validators.preview.en.ts
constant STAKE_PROGRAM_ID (line 1) | const STAKE_PROGRAM_ID = new PublicKey(
constant VOTE_PUB_KEY (line 4) | const VOTE_PUB_KEY = "27MtjMSAQ2BGkXNuJEJkxFyCJT8dugGAaHJ9T7Gc6x4x";
FILE: code/switchboard/on-chain/read.on-chain.en.rs
function get_result (line 11) | pub fn get_result(ctx: Context<GetResult>) -> Result<()> {
type GetResult (line 24) | pub struct GetResult<'info> {
FILE: code/switchboard/on-chain/request.vrf.on-chain.en.rs
type RequestResult (line 9) | pub struct RequestResult<'info> {
type RequestResultParams (line 50) | pub struct RequestResultParams {
function validate (line 56) | pub fn validate(&self, _ctx: &Context<Self>, _params: &RequestResultPara...
function actuate (line 60) | pub fn actuate(ctx: &Context<Self>, params: &RequestResultParams) -> Res...
FILE: code/token/get-token-balance/get-token-balance.en.rs
function main (line 6) | fn main() {
FILE: docs/.vuepress/dist/assets/404.e671120d.js
method setup (line 1) | setup(b){var a,s,n;const u=_(),e=p(),t=(a=e.value.notFound)!=null?a:["No...
FILE: docs/.vuepress/dist/assets/404.html.1873b0e7.js
function e (line 1) | function e(t,c){return null}
FILE: docs/.vuepress/dist/assets/Layout.4ba2f342.js
function Xe (line 1) | function Xe(l,t){const e=R("Content");return a(),c("div",qe,[$(e)])}
method setup (line 1) | setup(l){const t=I(),e=p(()=>_e(t.value.features)?t.value.features:[]);r...
method setup (line 1) | setup(l){const t=I(),e=p(()=>t.value.footer),i=p(()=>t.value.footerHtml)...
method setup (line 1) | setup(l){const t=l,e=G(),i=Ae(),{item:r}=J(t),_=p(()=>q(r.value.link)),f...
method setup (line 1) | setup(l){const t=I(),e=Q(),i=Z(),r=p(()=>i.value&&t.value.heroImageDark!...
method setup (line 1) | setup(l){return(t,e)=>(a(),c("main",it,[$(ut),$(Qe),$(Ye),$(tt)]))}
method setup (line 1) | setup(l){const t=be(),e=Q(),i=M(),r=Z(),_=p(()=>i.value.home||t.value),f...
method setup (line 1) | setup(l){const t=i=>{i.style.height=i.scrollHeight+"px"},e=i=>{i.style.h...
method setup (line 1) | setup(l){const t=l,{item:e}=J(t),i=p(()=>e.value.ariaLabel||e.value.text...
method setup (line 1) | setup(l){const t=()=>{const o=ee(),u=be(),d=Q(),v=M();return p(()=>{var ...
method setup (line 1) | setup(l){const t=M(),e=Z(),i=()=>{e.value=!e.value};return(r,_)=>(a(),c(...
method setup (line 1) | setup(l){const t=M();return(e,i)=>(a(),c("div",{class:"toggle-sidebar-bu...
method setup (line 1) | setup(l){const t=M(),e=O(null),i=O(null),r=O(0),_=p(()=>r.value?{maxWidt...
method setup (line 1) | setup(l){const t=()=>{const s=M(),o=W(),u=I();return p(()=>{var N,H,z;if...
method setup (line 1) | setup(l){const t=s=>s===!1?null:ke(s)?$e(s):Ue(s)?s:!1,e=(s,o,u)=>{const...
method setup (line 1) | setup(l){return(t,e)=>{const i=R("Content");return a(),c("main",nn,[y(t....
method setup (line 1) | setup(l){const t=l,{item:e,depth:i}=J(t),r=G(),_=ee(),f=p(()=>we(e.value...
method setup (line 1) | setup(l){const t=te();return(e,i)=>n(t).length?(a(),c("ul",ln,[(a(!0),c(...
method setup (line 1) | setup(l){return(t,e)=>(a(),c("aside",cn,[$(Ce),y(t.$slots,"top"),$(un),y...
method setup (line 1) | setup(l){const t=W(),e=I(),i=M(),r=p(()=>e.value.navbar!==!1&&i.value.na...
FILE: docs/.vuepress/dist/assets/account-maps.html.47c84b4e.js
function Y (line 1109) | function Y(q,F){const p=e("ExternalLinkIcon"),o=e("SolanaCodeGroupItem")...
FILE: docs/.vuepress/dist/assets/account-maps.html.573ed2b1.js
function $ (line 1109) | function $(nn,sn){const e=p("ExternalLinkIcon"),o=p("SolanaCodeGroupItem...
FILE: docs/.vuepress/dist/assets/account-maps.html.6070c007.js
function $ (line 1109) | function $(nn,sn){const c=p("ExternalLinkIcon"),o=p("SolanaCodeGroupItem...
FILE: docs/.vuepress/dist/assets/account-maps.html.61224aa4.js
function X (line 1109) | function X(J,Z){const e=p("ExternalLinkIcon"),o=p("SolanaCodeGroupItem")...
FILE: docs/.vuepress/dist/assets/account-maps.html.62c5a232.js
function an (line 1109) | function an(tn,on){const e=p("ExternalLinkIcon"),o=p("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/account-maps.html.6ef9e96e.js
function F (line 1109) | function F(j,H){const e=p("ExternalLinkIcon"),o=p("SolanaCodeGroupItem")...
FILE: docs/.vuepress/dist/assets/account-maps.html.84532932.js
function $ (line 1109) | function $(nn,sn){const e=p("ExternalLinkIcon"),o=p("SolanaCodeGroupItem...
FILE: docs/.vuepress/dist/assets/account-maps.html.84595114.js
function $ (line 1109) | function $(nn,sn){const e=p("ExternalLinkIcon"),o=p("SolanaCodeGroupItem...
FILE: docs/.vuepress/dist/assets/account-maps.html.84c98fd3.js
function $ (line 1109) | function $(nn,sn){const c=p("ExternalLinkIcon"),o=p("SolanaCodeGroupItem...
FILE: docs/.vuepress/dist/assets/account-maps.html.8c6e008e.js
function P (line 233) | function P(M,x){const a=o("ExternalLinkIcon");return c(),l(u,null,[r,k,s...
FILE: docs/.vuepress/dist/assets/account-maps.html.a6d163f8.js
function $ (line 1109) | function $(nn,sn){const e=p("ExternalLinkIcon"),o=p("SolanaCodeGroupItem...
FILE: docs/.vuepress/dist/assets/account-maps.html.a75e89c2.js
function Y (line 1109) | function Y(q,F){const p=e("ExternalLinkIcon"),o=e("SolanaCodeGroupItem")...
FILE: docs/.vuepress/dist/assets/account-maps.html.c84ca06e.js
function $ (line 1109) | function $(nn,sn){const e=p("ExternalLinkIcon"),o=p("SolanaCodeGroupItem...
FILE: docs/.vuepress/dist/assets/account-maps.html.cd84fe7b.js
function Z (line 1109) | function Z(H,V){const l=c("ExternalLinkIcon"),o=c("SolanaCodeGroupItem")...
FILE: docs/.vuepress/dist/assets/accounts.html.0636922d.js
function I (line 1) | function I(M,T){const t=s("ExternalLinkIcon");return r(),d(l,null,[p,m,h...
FILE: docs/.vuepress/dist/assets/accounts.html.0cab14f0.js
function ts (line 1048) | function ts(es,os){const l=p("ExternalLinkIcon"),e=p("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/accounts.html.17535e68.js
function es (line 1048) | function es(os,cs){const l=p("ExternalLinkIcon"),e=p("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/accounts.html.25738f4e.js
function w (line 1) | function w(B,L){const a=o("ExternalLinkIcon");return i(),n(d,null,[p,t("...
FILE: docs/.vuepress/dist/assets/accounts.html.339a7b82.js
function es (line 1048) | function es(os,cs){const l=p("ExternalLinkIcon"),e=p("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/accounts.html.369da584.js
function W (line 1) | function W(I,J){const t=r("ExternalLinkIcon");return o(),a(c,null,[u,m,p...
FILE: docs/.vuepress/dist/assets/accounts.html.4965c1bb.js
function B (line 1) | function B(x,H){const r=t("ExternalLinkIcon");return l(),o(c,null,[m,a("...
FILE: docs/.vuepress/dist/assets/accounts.html.527d0e94.js
function cs (line 1048) | function cs(ps,ls){const l=p("ExternalLinkIcon"),e=p("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/accounts.html.5ae3ae45.js
function os (line 1048) | function os(cs,ps){const l=p("ExternalLinkIcon"),e=p("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/accounts.html.5affc5f4.js
function os (line 1048) | function os(cs,ps){const l=p("ExternalLinkIcon"),e=p("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/accounts.html.629a8060.js
function R (line 1) | function R(W,j){const a=r("ExternalLinkIcon");return c(),s(i,null,[u,p,_...
FILE: docs/.vuepress/dist/assets/accounts.html.62c56dc7.js
function M (line 1) | function M(j,K){const s=n("ExternalLinkIcon");return a(),i(l,null,[u,m,h...
FILE: docs/.vuepress/dist/assets/accounts.html.7d878d86.js
function w (line 1) | function w(B,L){const a=o("ExternalLinkIcon");return i(),n(d,null,[p,t("...
FILE: docs/.vuepress/dist/assets/accounts.html.85e3e0a4.js
function cs (line 1151) | function cs(ps,ls){const l=p("ExternalLinkIcon"),e=p("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/accounts.html.89eb8977.js
function os (line 1048) | function os(cs,ps){const l=p("ExternalLinkIcon"),e=p("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/accounts.html.8c2c7d40.js
function K (line 1) | function K(O,T){const a=n("ExternalLinkIcon");return r(),s(l,null,[h,p,_...
FILE: docs/.vuepress/dist/assets/accounts.html.91bec01d.js
function C (line 1) | function C(I,R){const t=i("ExternalLinkIcon");return g(),r(c,null,[u,m,p...
FILE: docs/.vuepress/dist/assets/accounts.html.9bb37cd5.js
function cs (line 1048) | function cs(ps,ls){const l=p("ExternalLinkIcon"),e=p("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/accounts.html.b3e83490.js
function T (line 1) | function T(C,I){const e=d("ExternalLinkIcon");return r(),s(u,null,[m,p,h...
FILE: docs/.vuepress/dist/assets/accounts.html.bcf82d40.js
function es (line 1048) | function es(os,cs){const l=p("ExternalLinkIcon"),e=p("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/accounts.html.d0cb3dfd.js
function j (line 1) | function j(I,L){const o=s("ExternalLinkIcon");return n(),d(i,null,[u,p,h...
FILE: docs/.vuepress/dist/assets/accounts.html.d16b618e.js
function z (line 1) | function z(j,K){const o=r("ExternalLinkIcon");return a(),s(l,null,[h,_,p...
FILE: docs/.vuepress/dist/assets/accounts.html.d5fa2c98.js
function T (line 1) | function T(j,q){const o=r("ExternalLinkIcon");return l(),s(i,null,[_,p,u...
FILE: docs/.vuepress/dist/assets/accounts.html.d65e9141.js
function F (line 1) | function F(I,O){const n=e("ExternalLinkIcon");return i(),a(r,null,[d,p,m...
FILE: docs/.vuepress/dist/assets/accounts.html.e2d2d050.js
function es (line 1048) | function es(os,cs){const l=p("ExternalLinkIcon"),e=p("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/accounts.html.e2d854ed.js
function Y (line 242) | function Y(j,V){const p=o("ExternalLinkIcon"),e=o("RouterLink");return u...
FILE: docs/.vuepress/dist/assets/accounts.html.ef2241b1.js
function os (line 1048) | function os(cs,ps){const l=p("ExternalLinkIcon"),e=p("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/accounts.html.fedf3c54.js
function es (line 1048) | function es(os,cs){const l=p("ExternalLinkIcon"),e=p("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/app.07ce7a66.js
function si (line 1) | function si(e,t){const l=Object.create(null),n=e.split(",");for(let r=0;...
function is (line 1) | function is(e){return!!e||e===""}
function Qn (line 1) | function Qn(e){if(te(e)){const t={};for(let l=0;l<e.length;l++){const n=...
function Cu (line 1) | function Cu(e){const t={};return e.split(Iu).forEach(l=>{if(l){const n=l...
function Pt (line 1) | function Pt(e){let t="";if(be(e))t=e;else if(te(e))for(let l=0;l<e.lengt...
class Bu (line 1) | class Bu{constructor(t=!1){this.active=!0,this.effects=[],this.cleanups=...
method constructor (line 1) | constructor(t=!1){this.active=!0,this.effects=[],this.cleanups=[],!t&&...
method run (line 1) | run(t){if(this.active)try{return Ge=this,t()}finally{Ge=this.parent}}
method on (line 1) | on(){Ge=this}
method off (line 1) | off(){Ge=this.parent}
method stop (line 1) | stop(t){if(this.active){let l,n;for(l=0,n=this.effects.length;l<n;l++)...
function Ku (line 1) | function Ku(e,t=Ge){t&&t.active&&t.effects.push(e)}
function Uu (line 1) | function Uu(){return Ge}
function Wu (line 1) | function Wu(e){Ge&&Ge.cleanups.push(e)}
class mi (line 1) | class mi{constructor(t,l=null,n){this.fn=t,this.scheduler=l,this.active=...
method constructor (line 1) | constructor(t,l=null,n){this.fn=t,this.scheduler=l,this.active=!0,this...
method run (line 1) | run(){if(!this.active)return this.fn();let t=rt,l=wt;for(;t;){if(t===t...
method stop (line 1) | stop(){this.active&&(Qi(this),this.onStop&&this.onStop(),this.active=!1)}
function Qi (line 1) | function Qi(e){const{deps:t}=e;if(t.length){for(let l=0;l<t.length;l++)t...
function vl (line 1) | function vl(){ms.push(wt),wt=!1}
function pl (line 1) | function pl(){const e=ms.pop();wt=e===void 0?!0:e}
function We (line 1) | function We(e,t,l){if(wt&&rt){let n=Dr.get(e);n||Dr.set(e,n=new Map);let...
function vs (line 1) | function vs(e,t){let l=!1;Ol<=Sr?gs(e)||(e.n|=Lt,l=!hs(e)):l=!e.has(rt),...
function gt (line 1) | function gt(e,t,l,n,r,i){const o=Dr.get(e);if(!o)return;let s=[];if(t===...
function Rr (line 1) | function Rr(e,t){for(const l of te(e)?e:[...e])(l!==rt||l.allowRecurse)&...
function Zu (line 1) | function Zu(){const e={};return["includes","indexOf","lastIndexOf"].forE...
function vi (line 1) | function vi(e=!1,t=!1){return function(n,r,i){if(r==="__v_isReactive")re...
function fs (line 1) | function fs(e=!1){return function(l,n,r,i){let o=l[n];if(Bl(o)&&Se(o)&&!...
function td (line 1) | function td(e,t){const l=de(e,t);e[t];const n=Reflect.deleteProperty(e,t...
function ld (line 1) | function ld(e,t){const l=Reflect.has(e,t);return(!di(t)||!ps.has(t))&&We...
function nd (line 1) | function nd(e){return We(e,"iterate",te(e)?"length":Ht),Reflect.ownKeys(e)}
method set (line 1) | set(e,t){return!0}
method deleteProperty (line 1) | deleteProperty(e,t){return!0}
function an (line 1) | function an(e,t,l=!1,n=!1){e=e.__v_raw;const r=ge(e),i=ge(t);t!==i&&!l&&...
function on (line 1) | function on(e,t=!1){const l=this.__v_raw,n=ge(l),r=ge(e);return e!==r&&!...
function sn (line 1) | function sn(e,t=!1){return e=e.__v_raw,!t&&We(ge(e),"iterate",Ht),Reflec...
function Zi (line 1) | function Zi(e){e=ge(e);const t=ge(this);return er(t).has.call(t,e)||(t.a...
function Xi (line 1) | function Xi(e,t){t=ge(t);const l=ge(this),{has:n,get:r}=er(l);let i=n.ca...
function ea (line 1) | function ea(e){const t=ge(this),{has:l,get:n}=er(t);let r=l.call(t,e);r|...
function ta (line 1) | function ta(){const e=ge(this),t=e.size!==0,l=e.clear();return t&>(e,"...
function cn (line 1) | function cn(e,t){return function(n,r){const i=this,o=i.__v_raw,s=ge(o),c...
function un (line 1) | function un(e,t,l){return function(...n){const r=this.__v_raw,i=ge(r),o=...
function vt (line 1) | function vt(e){return function(...t){return e==="delete"?!1:this}}
function ad (line 1) | function ad(){const e={get(i){return an(this,i)},get size(){return sn(th...
function fi (line 1) | function fi(e,t){const l=t?e?ud:cd:e?sd:od;return(n,r,i)=>r==="__v_isRea...
function vd (line 1) | function vd(e){switch(e){case"Object":case"Array":return 1;case"Map":cas...
function pd (line 1) | function pd(e){return e.__v_skip||!Object.isExtensible(e)?0:vd(zu(e))}
function fl (line 1) | function fl(e){return Bl(e)?e:bi(e,!1,_s,dd,bs)}
function fd (line 1) | function fd(e){return bi(e,!1,id,hd,ys)}
function _i (line 1) | function _i(e){return bi(e,!0,rd,gd,ks)}
function bi (line 1) | function bi(e,t,l,n,r){if(!Oe(e)||e.__v_raw&&!(t&&e.__v_isReactive))retu...
function sl (line 1) | function sl(e){return Bl(e)?sl(e.__v_raw):!!(e&&e.__v_isReactive)}
function Bl (line 1) | function Bl(e){return!!(e&&e.__v_isReadonly)}
function Es (line 1) | function Es(e){return!!(e&&e.__v_isShallow)}
function Ps (line 1) | function Ps(e){return sl(e)||Bl(e)}
function ge (line 1) | function ge(e){const t=e&&e.__v_raw;return t?ge(t):e}
function ws (line 1) | function ws(e){return On(e,"__v_skip",!0),e}
function Ts (line 1) | function Ts(e){wt&&rt&&(e=ge(e),vs(e.dep||(e.dep=gi())))}
function Ls (line 1) | function Ls(e,t){e=ge(e),e.dep&&Rr(e.dep)}
function Se (line 1) | function Se(e){return!!(e&&e.__v_isRef===!0)}
function Ee (line 1) | function Ee(e){return As(e,!1)}
function Os (line 1) | function Os(e){return As(e,!0)}
function As (line 1) | function As(e,t){return Se(e)?e:new _d(e,t)}
class _d (line 1) | class _d{constructor(t,l){this.__v_isShallow=l,this.dep=void 0,this.__v_...
method constructor (line 1) | constructor(t,l){this.__v_isShallow=l,this.dep=void 0,this.__v_isRef=!...
method value (line 1) | get value(){return Ts(this),this._value}
method value (line 1) | set value(t){t=this.__v_isShallow?t:ge(t),Hl(t,this._rawValue)&&(this....
function Bt (line 1) | function Bt(e){return Se(e)?e.value:e}
function Ds (line 1) | function Ds(e){return sl(e)?e:new Proxy(e,bd)}
function yd (line 1) | function yd(e){const t=te(e)?new Array(e.length):{};for(const l in e)t[l...
class kd (line 1) | class kd{constructor(t,l,n){this._object=t,this._key=l,this._defaultValu...
method constructor (line 1) | constructor(t,l,n){this._object=t,this._key=l,this._defaultValue=n,thi...
method value (line 1) | get value(){const t=this._object[this._key];return t===void 0?this._de...
method value (line 1) | set value(t){this._object[this._key]=t}
function Ed (line 1) | function Ed(e,t,l){const n=e[t];return Se(n)?n:new kd(e,t,l)}
class Pd (line 1) | class Pd{constructor(t,l,n,r){this._setter=l,this.dep=void 0,this.__v_is...
method constructor (line 1) | constructor(t,l,n,r){this._setter=l,this.dep=void 0,this.__v_isRef=!0,...
method value (line 1) | get value(){const t=ge(this);return Ts(t),(t._dirty||!t._cacheable)&&(...
method value (line 1) | set value(t){this._setter(t)}
function wd (line 1) | function wd(e,t,l=!1){let n,r;const i=ae(e);return i?(n=e,r=Xe):(n=e.get...
function Tt (line 1) | function Tt(e,t,l,n){let r;try{r=n?e(...n):e()}catch(i){Xl(i,t,l)}return r}
function Je (line 1) | function Je(e,t,l,n){if(ae(e)){const i=Tt(e,t,l,n);return i&&ss(i)&&i.ca...
function Xl (line 1) | function Xl(e,t,l,n=!0){const r=t?t.vnode:null;if(t){let i=t.parent;cons...
function Td (line 1) | function Td(e,t,l,n=!0){console.error(e)}
function Ei (line 1) | function Ei(e){const t=ki||Ss;return e?t.then(this?e.bind(this):e):t}
function Ld (line 1) | function Ld(e){let t=ct+1,l=Ke.length;for(;t<l;){const n=t+l>>>1;Ul(Ke[n...
function Pi (line 1) | function Pi(e){(!Ke.length||!Ke.includes(e,An&&e.allowRecurse?ct+1:ct))&...
function Is (line 1) | function Is(){!An&&!Cr&&(Cr=!0,ki=Ss.then(Cs))}
function Od (line 1) | function Od(e){const t=Ke.indexOf(e);t>ct&&Ke.splice(t,1)}
function Rs (line 1) | function Rs(e,t,l,n){te(e)?l.push(...e):(!t||!t.includes(e,e.allowRecurs...
function Ad (line 1) | function Ad(e){Rs(e,Al,Rl,Xt)}
function Dd (line 1) | function Dd(e){Rs(e,bt,Cl,el)}
function wi (line 1) | function wi(e,t=null){if(Rl.length){for(xr=t,Al=[...new Set(Rl)],Rl.leng...
function Dn (line 1) | function Dn(e){if(Cl.length){const t=[...new Set(Cl)];if(Cl.length=0,bt)...
function Cs (line 1) | function Cs(e){Cr=!1,An=!0,wi(e),Ke.sort((l,n)=>Ul(l)-Ul(n));const t=Xe;...
function Sd (line 1) | function Sd(e,t,...l){const n=e.vnode.props||fe;let r=l;const i=t.starts...
function xs (line 1) | function xs(e,t,l=!1){const n=t.emitsCache,r=n.get(e);if(r!==void 0)retu...
function Ti (line 1) | function Ti(e,t){return!e||!Zl(t)?!1:(t=t.slice(2).replace(/Once$/,""),d...
function Sn (line 1) | function Sn(e){const t=Ue;return Ue=e,Vs=e&&e.type.__scopeId||null,t}
function Id (line 1) | function Id(e,t=Ue,l){if(!t||e._n)return e;const n=(...r)=>{n._d&&ha(-1)...
function dr (line 1) | function dr(e){const{type:t,vnode:l,proxy:n,withProxy:r,props:i,propsOpt...
function xd (line 1) | function xd(e,t,l){const{props:n,children:r,component:i}=e,{props:o,chil...
function la (line 1) | function la(e,t,l){const n=Object.keys(t);if(n.length!==Object.keys(e).l...
function Vd (line 1) | function Vd({vnode:e,parent:t},l){for(;t&&t.subTree===e;)(e=t.vnode).el=...
function Fs (line 1) | function Fs(e,t){t&&t.pendingBranch?te(e)?t.effects.push(...e):t.effects...
function Kt (line 1) | function Kt(e,t){if(De){let l=De.provides;const n=De.parent&&De.parent.p...
function Ie (line 1) | function Ie(e,t,l=!1){const n=De||Ue;if(n){const r=n.parent==null?n.vnod...
function et (line 1) | function et(e,t,l){return js(e,t,l)}
function js (line 1) | function js(e,t,{immediate:l,deep:n,flush:r,onTrack:i,onTrigger:o}=fe){c...
function jd (line 1) | function jd(e,t,l){const n=this.proxy,r=be(e)?e.includes(".")?zs(n,e):()...
function zs (line 1) | function zs(e,t){const l=t.split(".");return()=>{let n=e;for(let r=0;r<l...
function Mt (line 1) | function Mt(e,t){if(!Oe(e)||e.__v_skip||(t=t||new Set,t.has(e)))return e...
function zd (line 1) | function zd(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leaving...
method setup (line 1) | setup(e,{slots:t}){const l=nc(),n=zd();let r;return()=>{const i=t.defaul...
function Ms (line 1) | function Ms(e,t){const{leavingVNodes:l}=e;let n=l.get(t.type);return n||...
function Vr (line 1) | function Vr(e,t,l,n){const{appear:r,mode:i,persisted:o=!1,onBeforeEnter:...
function hr (line 1) | function hr(e){if(en(e))return e=cl(e),e.children=null,e}
function ra (line 1) | function ra(e){return en(e)?e.children?e.children[0]:void 0:e}
function Fr (line 1) | function Fr(e,t){e.shapeFlag&6&&e.component?Fr(e.component.subTree,t):e....
function Hs (line 1) | function Hs(e,t=!1){let l=[],n=0;for(let r=0;r<e.length;r++){const i=e[r...
function Me (line 1) | function Me(e){return ae(e)?{setup:e,name:e.name}:e}
function h (line 1) | function h(e){ae(e)&&(e={loader:e});const{loader:t,loadingComponent:l,er...
function gr (line 1) | function gr(e,{vnode:{ref:t,props:l,children:n}}){const r=Te(e,l,n);retu...
function Md (line 1) | function Md(e,t){Bs(e,"a",t)}
function Hd (line 1) | function Hd(e,t){Bs(e,"da",t)}
function Bs (line 1) | function Bs(e,t,l=De){const n=e.__wdc||(e.__wdc=()=>{let r=l;for(;r;){if...
function Bd (line 1) | function Bd(e,t,l,n){const r=tr(t,e,n,!0);Li(()=>{ui(n[t],r)},l)}
function tr (line 1) | function tr(e,t,l=De,n=!1){if(l){const r=l[e]||(l[e]=[]),i=t.__weh||(t._...
function Jd (line 1) | function Jd(e,t=De){tr("ec",e,t)}
function Qd (line 1) | function Qd(e){const t=Us(e),l=e.proxy,n=e.ctx;jr=!1,t.beforeCreate&&ia(...
function Yd (line 1) | function Yd(e,t,l=Xe,n=!1){te(e)&&(e=zr(e));for(const r in e){const i=e[...
function ia (line 1) | function ia(e,t,l){Je(te(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,l)}
function Ks (line 1) | function Ks(e,t,l,n){const r=n.includes(".")?zs(l,n):()=>l[n];if(be(e)){...
function Us (line 1) | function Us(e){const t=e.type,{mixins:l,extends:n}=t,{mixins:r,optionsCa...
function Rn (line 1) | function Rn(e,t,l,n=!1){const{mixins:r,extends:i}=t;i&&Rn(e,i,l,!0),r&&r...
function aa (line 1) | function aa(e,t){return t?e?function(){return Ce(ae(e)?e.call(this,this)...
function Xd (line 1) | function Xd(e,t){return Vt(zr(e),zr(t))}
function zr (line 1) | function zr(e){if(te(e)){const t={};for(let l=0;l<e.length;l++)t[e[l]]=e...
function Fe (line 1) | function Fe(e,t){return e?[...new Set([].concat(e,t))]:t}
function Vt (line 1) | function Vt(e,t){return e?Ce(Ce(Object.create(null),e),t):t}
function eh (line 1) | function eh(e,t){if(!e)return t;if(!t)return e;const l=Ce(Object.create(...
function th (line 1) | function th(e,t,l,n=!1){const r={},i={};On(i,nr,1),e.propsDefaults=Objec...
function lh (line 1) | function lh(e,t,l,n){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,s=ge(r...
function Ws (line 1) | function Ws(e,t,l,n){const[r,i]=e.propsOptions;let o=!1,s;if(t)for(let c...
function Nr (line 1) | function Nr(e,t,l,n,r,i){const o=e[l];if(o!=null){const s=de(o,"default"...
function qs (line 1) | function qs(e,t,l=!1){const n=t.propsCache,r=n.get(e);if(r)return r;cons...
function oa (line 1) | function oa(e){return e[0]!=="$"}
function sa (line 1) | function sa(e){const t=e&&e.toString().match(/^\s*function (\w+)/);retur...
function ca (line 1) | function ca(e,t){return sa(e)===sa(t)}
function ua (line 1) | function ua(e,t){return te(t)?t.findIndex(l=>ca(l,e)):ae(t)&&ca(t,e)?0:-1}
function M_ (line 1) | function M_(e,t){const l=Ue;if(l===null)return e;const n=l.proxy,r=e.dir...
function nt (line 1) | function nt(e,t,l,n){const r=e.dirs,i=t&&t.dirs;for(let o=0;o<r.length;o...
function Qs (line 1) | function Qs(){return{app:null,config:{isNativeTag:Vu,performance:!1,glob...
function oh (line 1) | function oh(e,t){return function(n,r=null){r!=null&&!Oe(r)&&(r=null);con...
function Cn (line 1) | function Cn(e,t,l,n,r=!1){if(te(e)){e.forEach((g,b)=>Cn(g,t&&(te(t)?t[b]...
function sh (line 1) | function sh(e){const{mt:t,p:l,o:{patchProp:n,nextSibling:r,parentNode:i,...
function ch (line 1) | function ch(e){return uh(e,sh)}
function uh (line 1) | function uh(e,t){const l=Hu();l.__VUE__=!0;const{insert:n,remove:r,patch...
function St (line 1) | function St({effect:e,update:t},l){e.allowRecurse=t.allowRecurse=l}
function Ys (line 1) | function Ys(e,t,l=!1){const n=e.children,r=t.children;if(te(n)&&te(r))fo...
function dh (line 1) | function dh(e){const t=e.slice(),l=[0];let n,r,i,o,s;const c=e.length;fo...
function gh (line 1) | function gh(e,t){return vh(Zs,e,!0,t)||e}
function vh (line 1) | function vh(e,t,l=!0,n=!1){const r=Ue||De;if(r){const i=r.type;if(e===Zs...
function da (line 1) | function da(e,t){return e&&(e[t]||e[ot(t)]||e[Xn(ot(t))])}
function tn (line 1) | function tn(e=!1){Vl.push(Ut=e?null:[])}
function ph (line 1) | function ph(){Vl.pop(),Ut=Vl[Vl.length-1]||null}
function ha (line 1) | function ha(e){xn+=e}
function Xs (line 1) | function Xs(e){return e.dynamicChildren=xn>0?Ut||al:null,ph(),xn>0&&Ut&&...
function Ai (line 1) | function Ai(e,t,l,n,r,i){return Xs(Fn(e,t,l,n,r,i,!0))}
function ec (line 1) | function ec(e,t,l,n,r){return Xs(Te(e,t,l,n,r,!0))}
function Vn (line 1) | function Vn(e){return e?e.__v_isVNode===!0:!1}
function zt (line 1) | function zt(e,t){return e.type===t.type&&e.key===t.key}
function Fn (line 1) | function Fn(e,t=null,l=null,n=0,r=null,i=e===Ne?0:1,o=!1,s=!1){const c={...
function fh (line 1) | function fh(e,t=null,l=null,n=0,r=null,i=!1){if((!e||e===mh)&&(e=Qe),Vn(...
function _h (line 1) | function _h(e){return e?Ps(e)||nr in e?Ce({},e):e:null}
function cl (line 1) | function cl(e,t,l=!1){const{props:n,ref:r,patchFlag:i,children:o}=e,s=t?...
function Di (line 1) | function Di(e=" ",t=0){return Te(Wl,null,e,t)}
function H_ (line 1) | function H_(e,t){const l=Te(xl,null,e);return l.staticCount=t,l}
function B_ (line 1) | function B_(e="",t=!1){return t?(tn(),ec(Qe,null,e)):Te(Qe,null,e)}
function Ze (line 1) | function Ze(e){return e==null||typeof e=="boolean"?Te(Qe):te(e)?Te(Ne,nu...
function yt (line 1) | function yt(e){return e.el===null||e.memo?e:cl(e)}
function Si (line 1) | function Si(e,t){let l=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(...
function bh (line 1) | function bh(...e){const t={};for(let l=0;l<e.length;l++){const n=e[l];fo...
function $e (line 1) | function $e(e,t,l,n=null){Je(e,t,7,[l,n])}
function K_ (line 1) | function K_(e,t,l,n){let r;const i=l&&l[n];if(te(e)||be(e)){r=new Array(...
function jn (line 1) | function jn(e,t,l={},n,r){if(Ue.isCE)return Te("slot",t==="default"?null...
function lc (line 1) | function lc(e){return e.some(t=>Vn(t)?!(t.type===Qe||t.type===Ne&&!lc(t....
method get (line 1) | get({_:e},t){const{ctx:l,setupState:n,data:r,props:i,accessCache:o,type:...
method set (line 1) | set({_:e},t,l){const{data:n,setupState:r,ctx:i}=e;return r!==fe&&de(r,t)...
method has (line 1) | has({_:{data:e,setupState:t,accessCache:l,ctx:n,appContext:r,propsOption...
method defineProperty (line 1) | defineProperty(e,t,l){return l.get!=null?this.set(e,t,l.get(),null):l.va...
function Ph (line 1) | function Ph(e,t,l){const n=e.type,r=(t?t.appContext:e.appContext)||kh,i=...
function rc (line 1) | function rc(e){return e.vnode.shapeFlag&4}
function wh (line 1) | function wh(e,t=!1){dl=t;const{props:l,children:n}=e.vnode,r=rc(e);th(e,...
function Th (line 1) | function Th(e,t){const l=e.type;e.accessCache=Object.create(null),e.prox...
function ga (line 1) | function ga(e,t,l){ae(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render...
function ic (line 1) | function ic(e,t,l){const n=e.type;if(!e.render){if(!t&&ma&&!n.render){co...
function Lh (line 1) | function Lh(e){return new Proxy(e.attrs,{get(t,l){return We(e,"get","$at...
function Oh (line 1) | function Oh(e){const t=n=>{e.exposed=n||{}};let l;return{get attrs(){ret...
function Ii (line 1) | function Ii(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Pro...
function Ah (line 1) | function Ah(e){return ae(e)&&e.displayName||e.name}
function Dh (line 1) | function Dh(e){return ae(e)&&"__vccOpts"in e}
function ee (line 1) | function ee(e,t,l){const n=arguments.length;return n===2?Oe(t)&&!te(t)?V...
method setScopeId (line 1) | setScopeId(e,t){e.setAttribute(t,"")}
method cloneNode (line 1) | cloneNode(e){const t=e.cloneNode(!0);return"_value"in e&&(t._value=e._va...
method insertStaticContent (line 1) | insertStaticContent(e,t,l,n,r,i){const o=l?l.previousSibling:t.lastChild...
function Ch (line 1) | function Ch(e,t,l){const n=e._vtc;n&&(t=(t?[t,...n]:[...n]).join(" ")),t...
function xh (line 1) | function xh(e,t,l){const n=e.style,r=be(l);if(l&&!r){for(const i in l)Hr...
function Hr (line 1) | function Hr(e,t,l){if(te(l))l.forEach(n=>Hr(e,t,n));else if(t.startsWith...
function Vh (line 1) | function Vh(e,t){const l=vr[t];if(l)return l;let n=ot(t);if(n!=="filter"...
function Fh (line 1) | function Fh(e,t,l,n,r){if(n&&t.startsWith("xlink:"))l==null?e.removeAttr...
function jh (line 1) | function jh(e,t,l,n,r,i,o){if(t==="innerHTML"||t==="textContent"){n&&o(n...
function Hh (line 1) | function Hh(e,t,l,n){e.addEventListener(t,l,n)}
function Bh (line 1) | function Bh(e,t,l,n){e.removeEventListener(t,l,n)}
function Kh (line 1) | function Kh(e,t,l,n,r=null){const i=e._vei||(e._vei={}),o=i[t];if(n&&o)o...
function Uh (line 1) | function Uh(e){let t;if(ba.test(e)){t={};let l;for(;l=e.match(ba);)e=e.s...
function Wh (line 1) | function Wh(e,t){const l=n=>{const r=n.timeStamp||Nn();(ac||r>=l.attache...
function qh (line 1) | function qh(e,t){if(te(t)){const l=e.stopImmediatePropagation;return e.s...
function Gh (line 1) | function Gh(e,t,l,n){return n?!!(t==="innerHTML"||t==="textContent"||t i...
function Jh (line 1) | function Jh(e){const t={};for(const A in e)A in oc||(t[A]=e[A]);if(e.css...
function Qh (line 1) | function Qh(e){if(e==null)return null;if(Oe(e))return[pr(e.enter),pr(e.l...
function pr (line 1) | function pr(e){return ds(e)}
function _t (line 1) | function _t(e,t){t.split(/\s+/).forEach(l=>l&&e.classList.add(l)),(e._vt...
function Gt (line 1) | function Gt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.remove(n));con...
function Ea (line 1) | function Ea(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}
function Pa (line 1) | function Pa(e,t,l,n){const r=e._endId=++Yh,i=()=>{r===e._endId&&n()};if(...
function Zh (line 1) | function Zh(e,t){const l=window.getComputedStyle(e),n=m=>(l[m]||"").spli...
function wa (line 1) | function wa(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(....
function Ta (line 1) | function Ta(e){return Number(e.slice(0,-1).replace(",","."))*1e3}
function Xh (line 1) | function Xh(){return document.body.offsetHeight}
method beforeMount (line 1) | beforeMount(e,{value:t},{transition:l}){e._vod=e.style.display==="none"?...
method mounted (line 1) | mounted(e,{value:t},{transition:l}){l&&t&&l.enter(e)}
method updated (line 1) | updated(e,{value:t,oldValue:l},{transition:n}){!t!=!l&&(n?t?(n.beforeEnt...
method beforeUnmount (line 1) | beforeUnmount(e,{value:t}){kl(e,t)}
function kl (line 1) | function kl(e,t){e.style.display=t?e._vod:"none"}
function lg (line 1) | function lg(){return fr=La?fr:ch(tg),La=!0,fr}
function rg (line 1) | function rg(e){return be(e)?document.querySelector(e):e}
function ag (line 5) | function ag(e){return e.__esModule||sc&&e[Symbol.toStringTag]==="Module"}
function _r (line 5) | function _r(e,t){const l={};for(const n in t){const r=t[n];l[n]=Array.is...
function br (line 5) | function br(e,t,l="/"){let n,r={},i="",o="";const s=t.indexOf("?"),c=t.i...
function cg (line 5) | function cg(e,t){const l=t.query?e(t.query):"";return t.path+(l&&"?")+l+...
function Aa (line 5) | function Aa(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?...
function ug (line 5) | function ug(e,t,l){const n=t.matched.length-1,r=l.matched.length-1;retur...
function hl (line 5) | function hl(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}
function cc (line 5) | function cc(e,t){if(Object.keys(e).length!==Object.keys(t).length)return...
function dg (line 5) | function dg(e,t){return Array.isArray(e)?Da(e,t):Array.isArray(t)?Da(t,e...
function Da (line 5) | function Da(e,t){return Array.isArray(t)?e.length===t.length&&e.every((l...
function hg (line 5) | function hg(e,t){if(e.startsWith("/"))return e;if(!e)return t;const l=t....
function gg (line 5) | function gg(e){if(!e)if(tl){const t=document.querySelector("base");e=t&&...
function vg (line 5) | function vg(e,t){return e.replace(mg,"#")+t}
function pg (line 5) | function pg(e,t){const l=document.documentElement.getBoundingClientRect(...
function fg (line 5) | function fg(e){let t;if("el"in e){const l=e.el,n=typeof l=="string"&&l.s...
function Sa (line 5) | function Sa(e,t){return(history.state?history.state.position-t:-1)+e}
function _g (line 5) | function _g(e,t){Ur.set(e,t)}
function bg (line 5) | function bg(e){const t=Ur.get(e);return Ur.delete(e),t}
function uc (line 5) | function uc(e,t){const{pathname:l,search:n,hash:r}=t,i=e.indexOf("#");if...
function kg (line 5) | function kg(e,t,l,n){let r=[],i=[],o=null;const s=({state:g})=>{const b=...
function Ia (line 5) | function Ia(e,t,l,n=!1,r=!1){return{back:e,current:t,forward:l,replaced:...
function Eg (line 5) | function Eg(e){const{history:t,location:l}=window,n={value:uc(e,l)},r={v...
function Pg (line 5) | function Pg(e){e=gg(e);const t=Eg(e),l=kg(e,t.state,t.location,t.replace...
function wg (line 5) | function wg(e){return typeof e=="string"||e&&typeof e=="object"}
function dc (line 5) | function dc(e){return typeof e=="string"||typeof e=="symbol"}
function gl (line 5) | function gl(e,t){return pe(new Error,{type:e,[hc]:!0},t)}
function Rt (line 5) | function Rt(e,t){return e instanceof Error&&hc in e&&(t==null||!!(e.type...
function Og (line 5) | function Og(e,t){const l=pe({},Tg,t),n=[];let r=l.start?"^":"";const i=[...
function Ag (line 5) | function Ag(e,t){let l=0;for(;l<e.length&&l<t.length;){const n=t[l]-e[l]...
function Dg (line 5) | function Dg(e,t){let l=0;const n=e.score,r=t.score;for(;l<n.length&&l<r....
function Rg (line 5) | function Rg(e){if(!e)return[[]];if(e==="/")return[[Sg]];if(!e.startsWith...
function Cg (line 5) | function Cg(e,t,l){const n=Og(Rg(e.path),l),r=pe(n,{record:e,parent:t,ch...
function xg (line 5) | function xg(e,t){const l=[],n=new Map;t=Va({strict:!1,end:!0,sensitive:!...
function Vg (line 5) | function Vg(e,t){const l={};for(const n of t)n in e&&(l[n]=e[n]);return l}
function Fg (line 5) | function Fg(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e...
function jg (line 5) | function jg(e){const t={},l=e.props||!1;if("component"in e)t.default=l;e...
function xa (line 5) | function xa(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}
function zg (line 5) | function zg(e){return e.reduce((t,l)=>pe(t,l.meta),{})}
function Va (line 5) | function Va(e,t){const l={};for(const n in e)l[n]=n in t?t[n]:e[n];retur...
function xi (line 5) | function xi(e){return encodeURI(""+e).replace(qg,"|").replace(Kg,"[").re...
function Gg (line 5) | function Gg(e){return xi(e).replace(pc,"{").replace(fc,"}").replace(vc,"...
function Wr (line 5) | function Wr(e){return xi(e).replace(mc,"%2B").replace($g,"+").replace(gc...
function Jg (line 5) | function Jg(e){return Wr(e).replace(Hg,"%3D")}
function Qg (line 5) | function Qg(e){return xi(e).replace(gc,"%23").replace(Bg,"%3F")}
function Yg (line 5) | function Yg(e){return e==null?"":Qg(e).replace(Mg,"%2F")}
function Mn (line 5) | function Mn(e){try{return decodeURIComponent(""+e)}catch{}return""+e}
function Zg (line 5) | function Zg(e){const t={};if(e===""||e==="?")return t;const n=(e[0]==="?...
function Fa (line 5) | function Fa(e){let t="";for(let l in e){const n=e[l];if(l=Jg(l),n==null)...
function Xg (line 5) | function Xg(e){const t={};for(const l in e){const n=e[l];n!==void 0&&(t[...
function El (line 5) | function El(){let e=[];function t(n){return e.push(n),()=>{const r=e.ind...
function kt (line 5) | function kt(e,t,l,n,r){const i=n&&(n.enterCallbacks[r]=n.enterCallbacks[...
function yr (line 5) | function yr(e,t,l,n){const r=[];for(const i of e)for(const o in i.compon...
function em (line 5) | function em(e){return typeof e=="object"||"displayName"in e||"props"in e...
function ja (line 5) | function ja(e){const t=Ie(rr),l=Ie(Ci),n=_e(()=>t.resolve(Bt(e.to))),r=_...
method setup (line 5) | setup(e,{slots:t}){const l=fl(ja(e)),{options:n}=Ie(rr),r=_e(()=>({[Na(e...
function nm (line 5) | function nm(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defa...
function rm (line 5) | function rm(e,t){for(const l in t){const n=t[l],r=e[l];if(typeof n=="str...
function za (line 5) | function za(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}
method setup (line 5) | setup(e,{attrs:t,slots:l}){const n=Ie(Kr),r=_e(()=>e.route||n.value),i=I...
function Ma (line 5) | function Ma(e,t){if(!e)return null;const l=e(t);return l.length===1?l[0]:l}
function am (line 5) | function am(e){const t=xg(e.routes,e),l=e.parseQuery||Zg,n=e.stringifyQu...
function Jt (line 5) | function Jt(e){return e.reduce((t,l)=>t.then(()=>l()),Promise.resolve())}
function om (line 5) | function om(e,t){const l=[],n=[],r=[],i=Math.max(t.matched.length,e.matc...
function ln (line 5) | function ln(){return Ie(rr)}
function Vi (line 5) | function Vi(){return Ie(Ci)}
method setup (line 5) | setup(e,t){const l=Ee(!1);return tt(()=>{l.value=!0}),()=>{var n,r;retur...
method setup (line 5) | setup(){const e=nn(),t=_e(()=>{let l;if(e.value.path){const n=e.value.fr...
method setup (line 5) | setup(e){const t=ji(),l=_e(()=>{var n;return(n=e.locales[t.value])!==nul...
function H (line 7) | function H(){}
function Cm (line 7) | function Cm(e,t){t===void 0&&(t={});var l=t.insertAt;if(!(!e||typeof doc...
method get (line 7) | get(){return t.value}
method get (line 7) | get(){return n.value}
method setup (line 7) | setup(e){return(t,l)=>(tn(),Ai("span",{class:Pt(["badge",e.type]),style:...
method setup (line 7) | setup(e,{slots:t}){const l=Ee(-1),n=Ee([]),r=(s=l.value)=>{s<n.value.len...
method setup (line 7) | setup(e){return(t,l)=>(tn(),Ai("div",{class:Pt(["code-group-item",{"code...
function Rc (line 7) | function Rc(e){return Uu()?(Wu(e),!0):!1}
function Zm (line 7) | function Zm(e,t){function l(...n){e(()=>t.apply(this,n),{fn:t,thisArg:th...
function nv (line 7) | function nv(e,t,l={}){const n=l,{eventFilter:r=Xm}=n,i=lv(n,["eventFilte...
function rv (line 7) | function rv(e,t=!0){nc()?tt(e):t?e():Ei(e)}
function iv (line 7) | function iv(...e){let t,l,n,r;if(Ym(e[0])?([l,n,r]=e,t=Hn):[t,l,n,r]=e,!...
function av (line 7) | function av(e,t={}){const{window:l=Hn}=t;let n;const r=Ee(!1),i=()=>{!l|...
function sv (line 7) | function sv(e,t){return ov[e]||t}
function cv (line 7) | function cv(e){return e==null?"any":e instanceof Set?"set":e instanceof ...
function dv (line 7) | function dv(e,t,l,n={}){var r;const{flush:i="pre",deep:o=!0,listenToStor...
function hv (line 7) | function hv(e){return av("(prefers-color-scheme: dark)",e)}
method get (line 7) | get(){return e.value.darkMode?l.value==="auto"?t.value:l.value==="dark":!1}
method set (line 7) | set(r){r===t.value?l.value="auto":l.value=r?"dark":"light"}
method setup (line 7) | setup(e){const{locales:t,hotKeys:l,maxSuggestions:n}=yd(e),r=ln(),i=ji()...
function $l (line 7) | function $l(e){return $l=typeof Symbol=="function"&&typeof Symbol.iterat...
function Wv (line 7) | function Wv(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enum...
function Gr (line 7) | function Gr(){return Gr=Object.assign||function(e){for(var t=1;t<argumen...
function Za (line 7) | function Za(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function he (line 7) | function he(e){for(var t=1;t<arguments.length;t++){var l=arguments[t]!=n...
function qv (line 7) | function qv(e,t){if(e==null)return{};var l,n,r=function(o,s){if(o==null)...
function Bn (line 7) | function Bn(e,t){return function(l){if(Array.isArray(l))return l}(e)||fu...
function Kn (line 8) | function Kn(e){return function(t){if(Array.isArray(t))return Jr(t)}(e)||...
function Nc (line 9) | function Nc(e,t){if(e){if(typeof e=="string")return Jr(e,t);var l=Object...
function Jr (line 9) | function Jr(e,t){(t==null||t>e.length)&&(t=e.length);for(var l=0,n=new A...
function dt (line 9) | function dt(e,t){for(var l in t)e[l]=t[l];return e}
function Bc (line 9) | function Bc(e){var t=e.parentNode;t&&t.removeChild(e)}
function it (line 9) | function it(e,t,l){var n,r,i,o=arguments,s={};for(i in t)i=="key"?n=t[i]...
function Nl (line 9) | function Nl(e,t,l,n,r){var i={type:e,props:t,key:l,ref:n,__k:null,__:nul...
function Ot (line 9) | function Ot(e){return e.children}
function at (line 9) | function at(e,t){this.props=e,this.context=t}
function Gl (line 9) | function Gl(e,t){if(t==null)return e.__?Gl(e.__,e.__.__k.indexOf(e)+1):n...
function Kc (line 9) | function Kc(e){var t,l;if((e=e.__)!=null&&e.__c!=null){for(e.__e=e.__c.b...
function Qr (line 9) | function Qr(e){(!e.__d&&(e.__d=!0)&&zl.push(e)&&!Wn.__r++||Xa!==Z.deboun...
function Wn (line 9) | function Wn(){for(var e;Wn.__r=zl.length;)e=zl.sort(function(t,l){return...
function Uc (line 9) | function Uc(e,t,l,n,r,i,o,s,c,u){var d,v,g,b,m,_,f,y=n&&n.__k||Hi,P=y.le...
function Wc (line 9) | function Wc(e,t,l){var n,r;for(n=0;n<e.__k.length;n++)(r=e.__k[n])&&(r._...
function ht (line 9) | function ht(e,t){return t=t||[],e==null||typeof e=="boolean"||(Array.isA...
function qc (line 9) | function qc(e,t,l,n,r,i){var o,s,c;if(t.__d!==void 0)o=t.__d,t.__d=void ...
function eo (line 9) | function eo(e,t,l){t[0]==="-"?e.setProperty(t,l):e[t]=l==null?"":typeof ...
function gn (line 9) | function gn(e,t,l,n,r){var i;e:if(t==="style")if(typeof l=="string")e.st...
function to (line 9) | function to(e){this.l[e.type+!1](Z.event?Z.event(e):e)}
function lo (line 9) | function lo(e){this.l[e.type+!0](Z.event?Z.event(e):e)}
function Bi (line 9) | function Bi(e,t,l,n,r,i,o,s,c){var u,d,v,g,b,m,_,f,y,P,w,L=t.type;if(t.c...
function $c (line 9) | function $c(e,t){Z.__c&&Z.__c(t,e),e.some(function(l){try{e=l.__h,l.__h=...
function Gv (line 9) | function Gv(e,t,l,n,r,i,o,s){var c,u,d,v,g=l.props,b=t.props,m=t.type,_=...
function Gc (line 9) | function Gc(e,t,l){try{typeof e=="function"?e(t):e.current=t}catch(n){Z....
function Jc (line 9) | function Jc(e,t,l){var n,r,i;if(Z.unmount&&Z.unmount(e),(n=e.ref)&&(n.cu...
function Jv (line 9) | function Jv(e,t,l){return this.constructor(e,l)}
function Jl (line 9) | function Jl(e,t,l){var n,r,i;Z.__&&Z.__(e,t),r=(n=typeof l=="function")?...
function Qc (line 9) | function Qc(e,t){Jl(e,t,Qc)}
function Qv (line 9) | function Qv(e,t,l){var n,r,i,o=arguments,s=dt({},e.props);for(i in t)i==...
function Ql (line 9) | function Ql(e,t){Z.__h&&Z.__h(je,e,nl||t),nl=0;var l=je.__H||(je.__H={__...
function co (line 9) | function co(e,t,l){var n=Ql(ml++,2);return n.t=e,n.__c||(n.__=[l?l(t):Yc...
function uo (line 9) | function uo(e,t){var l=Ql(ml++,4);!Z.__s&&Ki(l.__H,t)&&(l.__=e,l.__H=t,j...
function En (line 9) | function En(e,t){var l=Ql(ml++,7);return Ki(l.__H,t)&&(l.__=e(),l.__H=t,...
function Yv (line 9) | function Yv(){Yr.forEach(function(e){if(e.__P)try{e.__H.__h.forEach(Pn),...
function Pn (line 9) | function Pn(e){var t=je;typeof e.__c=="function"&&e.__c(),je=t}
function Zr (line 9) | function Zr(e){var t=je;e.__c=e.__(),je=t}
function Ki (line 9) | function Ki(e,t){return!e||e.length!==t.length||t.some(function(l,n){ret...
function Yc (line 9) | function Yc(e,t){return typeof t=="function"?t(e):t}
function Zc (line 9) | function Zc(e,t){for(var l in t)e[l]=t[l];return e}
function Xr (line 9) | function Xr(e,t){for(var l in e)if(l!=="__source"&&!(l in t))return!0;fo...
function ei (line 9) | function ei(e){this.props=e}
function wn (line 9) | function wn(){this.__u=0,this.t=null,this.__b=null}
function Xc (line 9) | function Xc(e){var t=e.__.__c;return t&&t.__e&&t.__e(e)}
function Dl (line 9) | function Dl(){this.u=null,this.o=null}
function tp (line 9) | function tp(e){return this.getChildContext=function(){return e.context},...
function lp (line 9) | function lp(e){var t=this,l=e.i;t.componentWillUnmount=function(){Jl(nul...
function eu (line 9) | function eu(e,t){return it(lp,{__v:e,i:t})}
function lu (line 9) | function lu(e,t,l){return t.__k==null&&(t.textContent=""),Jl(e,t),typeof...
function ip (line 9) | function ip(){}
function ap (line 9) | function ap(){return this.cancelBubble}
function op (line 9) | function op(){return this.defaultPrevented}
function yo (line 9) | function yo(e){return!!e&&e.$$typeof===tu}
function l (line 9) | function l(r){var i=this.props.ref,o=i==r.ref;return!o&&i&&(i.call?i(nul...
function n (line 9) | function n(r){return this.shouldComponentUpdate=l,it(e,r)}
function t (line 9) | function t(l,n){var r=Zc({},l);return delete r.ref,e(r,(n=l.ref||n)&&($l...
function r (line 9) | function r(i){if(t||(t=e()).then(function(o){l=o.default||o},function(o)...
function cp (line 9) | function cp(){return E.createElement("svg",{width:"15",height:"15",class...
function ru (line 9) | function ru(){return E.createElement("svg",{width:"20",height:"20",class...
function ti (line 9) | function ti(){return ti=Object.assign||function(e){for(var t=1;t<argumen...
function dp (line 9) | function dp(e,t){if(e==null)return{};var l,n,r=function(o,s){if(o==null)...
function Yl (line 9) | function Yl(e){return e.reduce(function(t,l){return t.concat(l)},[])}
function li (line 9) | function li(e){return e.collections.length===0?0:e.collections.reduce(fu...
function ko (line 9) | function ko(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function pp (line 9) | function pp(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enum...
function fp (line 9) | function fp(e,t,l){var n=t.initialState;return{getState:function(){retur...
function Eo (line 9) | function Eo(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function mn (line 9) | function mn(e){for(var t=1;t<arguments.length;t++){var l=arguments[t]!=n...
function _p (line 9) | function _p(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enum...
function Po (line 9) | function Po(e,t,l,n){if(!l)return null;if(e<0&&(t===null||n!==null&&t===...
function wo (line 9) | function wo(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function bp (line 9) | function bp(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enum...
function yp (line 9) | function yp(e,t){var l=[];return Promise.resolve(e(t)).then(function(n){...
function rl (line 9) | function rl(e){var t=function(r){var i=r.collections.map(function(o){ret...
function To (line 9) | function To(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function vn (line 9) | function vn(e){for(var t=1;t<arguments.length;t++){var l=arguments[t]!=n...
function kp (line 9) | function kp(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enum...
function Ep (line 9) | function Ep(e){return function(t){if(Array.isArray(t))return Pr(t)}(e)||...
function Pr (line 10) | function Pr(e,t){(t==null||t>e.length)&&(t=e.length);for(var l=0,n=new A...
function Lo (line 10) | function Lo(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function Yt (line 10) | function Yt(e){for(var t=1;t<arguments.length;t++){var l=arguments[t]!=n...
function Pp (line 10) | function Pp(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enum...
function Oo (line 10) | function Oo(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function pn (line 10) | function pn(e){for(var t=1;t<arguments.length;t++){var l=arguments[t]!=n...
function iu (line 10) | function iu(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enum...
function wp (line 10) | function wp(e){return function(t){if(Array.isArray(t))return wr(t)}(e)||...
function wr (line 11) | function wr(e,t){(t==null||t>e.length)&&(t=e.length);for(var l=0,n=new A...
function Ao (line 11) | function Ao(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function Do (line 11) | function Do(e){for(var t=1;t<arguments.length;t++){var l=arguments[t]!=n...
function Tp (line 11) | function Tp(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enum...
function fn (line 11) | function fn(e){return Boolean(e.execute)}
function Lp (line 11) | function Lp(e,t){return l=e,Boolean(l==null?void 0:l.execute)?Do(Do({},e...
function Op (line 11) | function Op(e){var t=e.reduce(function(l,n){if(!fn(n))return l.push(n),l...
function Ap (line 11) | function Ap(e,t){return t.map(function(l){var n=e.filter(function(s){ret...
function So (line 15) | function So(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function wl (line 15) | function wl(e){for(var t=1;t<arguments.length;t++){var l=arguments[t]!=n...
function Sp (line 15) | function Sp(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enum...
function Ip (line 15) | function Ip(e,t){if(e==null)return{};var l,n,r=function(o,s){if(o==null)...
function ll (line 15) | function ll(e){var t=e.event,l=e.nextState,n=l===void 0?{}:l,r=e.props,i...
function Co (line 15) | function Co(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function Ct (line 15) | function Ct(e){for(var t=1;t<arguments.length;t++){var l=arguments[t]!=n...
function Cp (line 15) | function Cp(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enum...
function xp (line 15) | function xp(e,t){if(e==null)return{};var l,n,r=function(o,s){if(o==null)...
function xo (line 15) | function xo(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function Ve (line 15) | function Ve(e){for(var t=1;t<arguments.length;t++){var l=arguments[t]!=n...
function Mp (line 15) | function Mp(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enum...
function Ll (line 15) | function Ll(e,t){if(e==null)return{};var l,n,r=function(o,s){if(o==null)...
function Hp (line 15) | function Hp(e){var t=e.props,l=e.refresh,n=e.store,r=Ll(e,Vp);return{get...
function Vo (line 15) | function Vo(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function Bp (line 15) | function Bp(e){for(var t=1;t<arguments.length;t++){var l=arguments[t]!=n...
function au (line 15) | function au(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enum...
function Kp (line 15) | function Kp(e){var t,l,n,r,i=e.plugins,o=e.options,s=(t=(((l=o.__autocom...
function Fo (line 15) | function Fo(e){var t,l=e.state;return l.isOpen===!1||l.activeItemId===nu...
function jo (line 15) | function jo(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function ce (line 15) | function ce(e){for(var t=1;t<arguments.length;t++){var l=arguments[t]!=n...
function Up (line 15) | function Up(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enum...
function zo (line 15) | function zo(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function xt (line 15) | function xt(e){for(var t=1;t<arguments.length;t++){var l=arguments[t]!=n...
function qp (line 15) | function qp(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enum...
function $p (line 15) | function $p(e){var t=[],l=function(s,c){var u,d=typeof window!="undefine...
function Gp (line 15) | function Gp(e){var t=e.translations,l=(t===void 0?{}:t).searchByText,n=l...
function bn (line 15) | function bn(e){return E.createElement("svg",{width:"15",height:"15"},E.c...
function Jp (line 15) | function Jp(e){var t=e.translations,l=t===void 0?{}:t,n=l.selectText,r=n...
function Qp (line 15) | function Qp(e){var t=e.hit,l=e.children;return E.createElement("a",{href...
function Yp (line 15) | function Yp(){return E.createElement("svg",{viewBox:"0 0 38 38",stroke:"...
function Zp (line 15) | function Zp(){return E.createElement("svg",{width:"20",height:"20",viewB...
function ni (line 15) | function ni(){return E.createElement("svg",{width:"20",height:"20",viewB...
function Xp (line 15) | function Xp(){return E.createElement("svg",{className:"DocSearch-Hit-Sel...
function tf (line 15) | function tf(e){switch(e.type){case"lvl1":return E.createElement(ef,null)...
function lf (line 15) | function lf(){return E.createElement("svg",{width:"20",height:"20",viewB...
function nf (line 15) | function nf(){return E.createElement("svg",{width:"20",height:"20",viewB...
function No (line 15) | function No(){return E.createElement("svg",{width:"20",height:"20",viewB...
function rf (line 15) | function rf(){return E.createElement("svg",{width:"40",height:"40",viewB...
function af (line 15) | function af(){return E.createElement("svg",{width:"40",height:"40",viewB...
function of (line 15) | function of(e){var t=e.translations,l=t===void 0?{}:t,n=l.titleText,r=n=...
function cf (line 15) | function cf(e){return function(t){if(Array.isArray(t))return Lr(t)}(e)||...
function Lr (line 16) | function Lr(e,t){(t==null||t>e.length)&&(t=e.length);for(var l=0,n=new A...
function uf (line 16) | function uf(e,t){if(e==null)return{};var l,n,r=function(o,s){if(o==null)...
function df (line 16) | function df(e){var t=e.translations,l=t===void 0?{}:t,n=uf(e,sf),r=l.noR...
function Mo (line 16) | function Mo(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function Ho (line 16) | function Ho(e){for(var t=1;t<arguments.length;t++){var l=arguments[t]!=n...
function gf (line 16) | function gf(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enum...
function mf (line 16) | function mf(e,t){if(e==null)return{};var l,n,r=function(o,s){if(o==null)...
function Bo (line 16) | function Bo(e,t){return t.split(".").reduce(function(l,n){return l!=null...
function Zt (line 16) | function Zt(e){var t=e.hit,l=e.attribute,n=e.tagName;return it(n===void ...
function Ko (line 16) | function Ko(e,t){return function(l){if(Array.isArray(l))return l}(e)||fu...
function Uo (line 17) | function Uo(e,t){(t==null||t>e.length)&&(t=e.length);for(var l=0,n=new A...
function qn (line 17) | function qn(){return qn=Object.assign||function(e){for(var t=1;t<argumen...
function ri (line 17) | function ri(e){return e.collection&&e.collection.items.length!==0?E.crea...
function vf (line 17) | function vf(e){var t=e.item,l=e.index,n=e.renderIcon,r=e.renderAction,i=...
function Wo (line 17) | function Wo(e,t){return e.reduce(function(l,n){var r=t(n);return l.hasOw...
function qo (line 17) | function qo(e){return e}
function pf (line 17) | function pf(){}
function su (line 17) | function su(e){var t,l,n,r,i,o=e;if(!o.__docsearch_parent&&!e._highlight...
function ii (line 17) | function ii(){return ii=Object.assign||function(e){for(var t=1;t<argumen...
function _f (line 17) | function _f(e){return E.createElement("div",{className:"DocSearch-Dropdo...
function $n (line 17) | function $n(){return $n=Object.assign||function(e){for(var t=1;t<argumen...
function yf (line 17) | function yf(e,t){if(e==null)return{};var l,n,r=function(o,s){if(o==null)...
function kf (line 17) | function kf(e){var t=e.translations,l=t===void 0?{}:t,n=yf(e,bf),r=l.rec...
function Gn (line 17) | function Gn(){return Gn=Object.assign||function(e){for(var t=1;t<argumen...
function Pf (line 17) | function Pf(e,t){if(e==null)return{};var l,n,r=function(o,s){if(o==null)...
function Jn (line 17) | function Jn(){return Jn=Object.assign||function(e){for(var t=1;t<argumen...
function Lf (line 17) | function Lf(e,t){if(e==null)return{};var l,n,r=function(o,s){if(o==null)...
function Of (line 17) | function Of(e){var t=e.translations,l=t===void 0?{}:t,n=Lf(e,Tf),r=l.res...
function Df (line 17) | function Df(e,t){if(e==null)return{};var l,n,r=function(o,s){if(o==null)...
function Sf (line 17) | function Sf(e){return function(){var t="__TEST_KEY__";try{return localSt...
function $o (line 17) | function $o(e){var t=e.key,l=e.limit,n=l===void 0?5:l,r=Sf(t),i=r.getIte...
function Rf (line 17) | function Rf(e){var t,l="algoliasearch-client-js-".concat(e.key),n=functi...
function Sl (line 17) | function Sl(e){var t=Kn(e.caches),l=t.shift();return l===void 0?{get:fun...
function Or (line 17) | function Or(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[...
function Cf (line 17) | function Cf(e){for(var t=e.length-1;t>0;t--){var l=Math.floor(Math.rando...
function cu (line 17) | function cu(e,t){return t&&Object.keys(t).forEach(function(l){e[l]=t[l](...
function ar (line 17) | function ar(e){for(var t=arguments.length,l=new Array(t>1?t-1:0),n=1;n<t...
function Go (line 17) | function Go(e,t){var l=e||{},n=l.data||{};return Object.keys(l).forEach(...
function hu (line 17) | function hu(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments...
function gu (line 17) | function gu(e){return typeof e=="string"?{protocol:"https",url:e,accept:...
function Vf (line 17) | function Vf(e,t){return Promise.all(t.map(function(l){return e.get(l,fun...
function Qo (line 17) | function Qo(e,t,l,n){var r=[],i=function(g,b){if(!(g.method===Jo||g.data...
function Ff (line 17) | function Ff(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add...
function jf (line 17) | function jf(e,t,l){var n=mu(l),r="".concat(e.protocol,"://").concat(e.ur...
function mu (line 17) | function mu(e){return Object.keys(e).map(function(t){return ar("%s=%s",t...
function Yo (line 17) | function Yo(e){return e.map(function(t){return vu(t)})}
function vu (line 17) | function vu(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-...
function _u (line 17) | function _u(e,t,l){var n,r={appId:e,apiKey:t,timeouts:{connect:1,read:2,...
function Ml (line 17) | function Ml(){return Ml=Object.assign||function(e){for(var t=1;t<argumen...
function es (line 17) | function es(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){v...
function Ar (line 17) | function Ar(e){for(var t=1;t<arguments.length;t++){var l=arguments[t]!=n...
function Wf (line 17) | function Wf(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enum...
function qf (line 17) | function qf(e,t){return function(l){if(Array.isArray(l))return l}(e)||fu...
function ts (line 18) | function ts(e,t){(t==null||t>e.length)&&(t=e.length);for(var l=0,n=new A...
function $f (line 18) | function $f(e,t){if(e==null)return{};var l,n,r=function(o,s){if(o==null)...
function Gf (line 18) | function Gf(e){var t=e.appId,l=t===void 0?"BH4D9OD16A":t,n=e.apiKey,r=e....
function ai (line 18) | function ai(){return ai=Object.assign||function(e){for(var t=1;t<argumen...
function ls (line 18) | function ls(e,t){return function(l){if(Array.isArray(l))return l}(e)||fu...
function ns (line 19) | function ns(e,t){(t==null||t>e.length)&&(t=e.length);for(var l=0,n=new A...
function Jf (line 19) | function Jf(e){var t,l,n=E.useRef(null),r=ls(E.useState(!1),2),i=r[0],o=...
function Qf (line 19) | function Qf(e){lu(E.createElement(Jf,Gr({},e,{transformSearchClient:func...
function Zf (line 19) | function Zf(e,t,l){var n,r,i,o={};for(i in t)i=="key"?n=t[i]:i=="ref"?r=...
function Xf (line 19) | function Xf(e,t,l,n,r){var i={type:e,props:t,key:l,ref:n,__k:null,__:nul...
method setup (line 19) | setup(e){const t=ji(),l=Tc(),n=t_(),r=_e(()=>{var s;return xe(xe({},e.op...
method setup (line 19) | setup(e,{slots:t}){var b;const l=Ee(-1),n=Ee([]),r=(m=l.value)=>{m<n.val...
function c_ (line 19) | function c_(e,t,l,n,r,i){return tn(),Ai("div",{class:Pt(["code-group-ite...
function Pu (line 19) | function Pu(e,t,l){var n,r,i;t===void 0&&(t=50),l===void 0&&(l={});var o...
method setup (line 19) | setup(){const e=Ee(0),t=_e(()=>e.value>300),l=Pu(()=>{e.value=rs()},100)...
function r (line 20) | function r(m,_,f){return m<_?_:m>f?f:m}
function i (line 20) | function i(m){return(-1+m)*100}
function o (line 20) | function o(m,_,f){var y;return n.positionUsing==="translate3d"?y={transf...
function _ (line 20) | function _(){var f=m.shift();f&&f(_)}
function f (line 20) | function f(L){return L.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,fun...
function y (line 20) | function y(L){var S=document.body.style;if(L in S)return L;for(var j=m.l...
function P (line 20) | function P(L){return L=f(L),_[L]||(_[L]=y(L))}
function w (line 20) | function w(L,S,j){S=P(S),L.style[S]=j}
function u (line 20) | function u(m,_){var f=typeof m=="string"?m:g(m);return f.indexOf(" "+_+"...
function d (line 20) | function d(m,_){var f=g(m),y=f+_;u(f,_)||(m.className=y.substring(1))}
function v (line 20) | function v(m,_){var f=g(m),y;!u(m,_)||(y=f.replace(" "+_+" "," "),m.clas...
function g (line 20) | function g(m){return(" "+(m.className||"")+" ").replace(/\s+/gi," ")}
function b (line 20) | function b(m){m&&m.parentNode&&m.parentNode.removeChild(m)}
method setup (line 20) | setup(){x_();for(const l of O_)l();return()=>[ee(_c),...v_.map(l=>ee(l))]}
FILE: docs/.vuepress/dist/assets/auto-approve.html.1e147577.js
function I (line 1) | function I(P,W){const o=r("ExternalLinkIcon");return s(),l(i,null,[h,d,p...
FILE: docs/.vuepress/dist/assets/auto-approve.html.4e3677ac.js
function H (line 1) | function H(I,L){const o=e("ExternalLinkIcon");return l(),r(i,null,[p,m,u...
FILE: docs/.vuepress/dist/assets/auto-approve.html.e352de0c.js
function I (line 1) | function I(P,W){const o=r("ExternalLinkIcon");return s(),l(i,null,[h,d,p...
FILE: docs/.vuepress/dist/assets/basic-transactions.html.18d8290f.js
function xn (line 715) | function xn(Rn,Ln){const p=c("ExternalLinkIcon"),e=c("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/basic-transactions.html.1abb92a6.js
function xn (line 715) | function xn(Rn,Ln){const p=c("ExternalLinkIcon"),e=c("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/basic-transactions.html.351c7904.js
function En (line 715) | function En(On,In){const p=c("ExternalLinkIcon"),e=c("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/basic-transactions.html.75aca1d6.js
function Cn (line 715) | function Cn(vn,An){const p=c("ExternalLinkIcon"),e=c("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/basic-transactions.html.8104955c.js
function W (line 84) | function W(I,D){const t=p("ExternalLinkIcon"),o=p("RouterLink");return i...
FILE: docs/.vuepress/dist/assets/basic-transactions.html.85ad631b.js
function Kn (line 715) | function Kn(Pn,xn){const p=c("ExternalLinkIcon"),e=c("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/basic-transactions.html.8d04a74c.js
function xn (line 715) | function xn(An,Rn){const p=c("ExternalLinkIcon"),e=c("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/basic-transactions.html.9492ba81.js
function Ln (line 715) | function Ln(En,On){const p=c("ExternalLinkIcon"),e=c("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/basic-transactions.html.a069dbca.js
function Pn (line 715) | function Pn(vn,An){const p=c("ExternalLinkIcon"),e=c("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/basic-transactions.html.ab11cb9f.js
function Ln (line 715) | function Ln(En,On){const p=c("ExternalLinkIcon"),e=c("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/basic-transactions.html.ae0f79a3.js
function Rn (line 715) | function Rn(En,On){const p=c("ExternalLinkIcon"),e=c("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/basic-transactions.html.c93eecf9.js
function En (line 715) | function En(Mn,On){const p=c("ExternalLinkIcon"),e=c("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/basic-transactions.html.e416b8f1.js
function Pn (line 715) | function Pn(An,xn){const p=c("ExternalLinkIcon"),e=c("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/basic-transactions.html.f38dcb54.js
function Rn (line 715) | function Rn(Ln,En){const p=c("ExternalLinkIcon"),e=c("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/cpi.html.1a2d6d74.js
function O (line 65) | function O(W,G){const a=p("ExternalLinkIcon");return c(),r(l,null,[u,n("...
FILE: docs/.vuepress/dist/assets/cpi.html.68e45f97.js
function W (line 65) | function W(j,z){const a=p("ExternalLinkIcon");return c(),l(r,null,[u,n("...
FILE: docs/.vuepress/dist/assets/cpi.html.9d257983.js
function T (line 65) | function T(G,H){const s=p("ExternalLinkIcon");return c(),r(l,null,[u,a("...
FILE: docs/.vuepress/dist/assets/cpi.html.a340693f.js
function q (line 65) | function q(O,G){const s=p("ExternalLinkIcon");return c(),i(l,null,[u,a("...
FILE: docs/.vuepress/dist/assets/cpi.html.fc0ddd7a.js
function U (line 65) | function U(H,Y){const a=p("ExternalLinkIcon");return c(),r(l,null,[u,n("...
FILE: docs/.vuepress/dist/assets/data-migration.html.07b84548.js
function L (line 649) | function L(j,G){const o=e("SolanaCodeGroupItem"),l=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/data-migration.html.42889ad1.js
function L (line 649) | function L(G,F){const o=e("SolanaCodeGroupItem"),l=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/data-migration.html.51e5d8f8.js
function G (line 649) | function G(q,M){const o=e("SolanaCodeGroupItem"),l=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/data-migration.html.611a3316.js
function G (line 649) | function G(q,F){const o=e("SolanaCodeGroupItem"),l=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/data-migration.html.8520d86d.js
function G (line 649) | function G(q,M){const o=e("SolanaCodeGroupItem"),l=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/data-migration.html.95cc310f.js
function G (line 649) | function G(q,W){const o=e("SolanaCodeGroupItem"),l=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/data-migration.html.a0b30eb8.js
function G (line 649) | function G(q,F){const o=e("SolanaCodeGroupItem"),l=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/data-migration.html.aa7491d7.js
function G (line 649) | function G(q,F){const o=e("SolanaCodeGroupItem"),l=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/data-migration.html.ac61c119.js
function q (line 649) | function q(G,K){const o=e("SolanaCodeGroupItem"),l=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/data-migration.html.d0acee8e.js
function G (line 649) | function G(q,F){const o=e("SolanaCodeGroupItem"),l=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/data-migration.html.d5010d02.js
function G (line 649) | function G(q,W){const o=e("SolanaCodeGroupItem"),l=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/data-migration.html.e0a081db.js
function L (line 649) | function L(G,F){const o=e("SolanaCodeGroupItem"),l=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/data-migration.html.ec2afdd1.js
function q (line 649) | function q(G,F){const o=e("SolanaCodeGroupItem"),l=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/data-migration.html.f3e868ea.js
function f (line 66) | function f(z,w){const a=p("ExternalLinkIcon");return o(),r(c,null,[m,n("...
FILE: docs/.vuepress/dist/assets/debugging-solana-programs.html.29a6acd8.js
function f (line 21) | function f(_,v){const a=o("ExternalLinkIcon");return p(),c(l,null,[u,s("...
FILE: docs/.vuepress/dist/assets/debugging-solana-programs.html.2a0d6ae2.js
function h (line 21) | function h(v,f){const n=l("ExternalLinkIcon");return r(),i(o,null,[d,a("...
FILE: docs/.vuepress/dist/assets/debugging-solana-programs.html.2f9160d7.js
function f (line 21) | function f(v,_){const n=i("ExternalLinkIcon");return o(),r(l,null,[u,a("...
FILE: docs/.vuepress/dist/assets/debugging-solana-programs.html.3408b860.js
function f (line 21) | function f(v,_){const n=o("ExternalLinkIcon");return l(),r(i,null,[d,a("...
FILE: docs/.vuepress/dist/assets/debugging-solana-programs.html.3aacc1a8.js
function f (line 21) | function f(_,v){const a=o("ExternalLinkIcon");return p(),c(l,null,[u,s("...
FILE: docs/.vuepress/dist/assets/debugging-solana-programs.html.56d02641.js
function f (line 21) | function f(v,_){const n=o("ExternalLinkIcon");return r(),l(p,null,[d,a("...
FILE: docs/.vuepress/dist/assets/debugging-solana-programs.html.696e8511.js
function f (line 21) | function f(v,y){const a=o("ExternalLinkIcon");return r(),i(l,null,[u,e("...
FILE: docs/.vuepress/dist/assets/debugging-solana-programs.html.a0e3b858.js
function y (line 21) | function y(f,v){const n=o("ExternalLinkIcon");return i(),p(l,null,[c,a("...
FILE: docs/.vuepress/dist/assets/debugging-solana-programs.html.a9ad9801.js
function f (line 21) | function f(k,_){const s=o("ExternalLinkIcon");return r(),l(i,null,[u,e("...
FILE: docs/.vuepress/dist/assets/debugging-solana-programs.html.b7fb9288.js
function f (line 21) | function f(v,S){const n=i("ExternalLinkIcon");return r(),o(l,null,[u,e("...
FILE: docs/.vuepress/dist/assets/debugging-solana-programs.html.c5eb5f04.js
function f (line 21) | function f(_,v){const s=o("ExternalLinkIcon");return p(),l(c,null,[d,a("...
FILE: docs/.vuepress/dist/assets/debugging-solana-programs.html.d82f151d.js
function f (line 21) | function f(v,_){const a=r("ExternalLinkIcon");return t(),l(i,null,[d,e("...
FILE: docs/.vuepress/dist/assets/debugging-solana-programs.html.f0229576.js
function v (line 21) | function v(f,y){const a=c("ExternalLinkIcon");return o(),i(r,null,[h,n("...
FILE: docs/.vuepress/dist/assets/debugging-solana-programs.html.ff3a8325.js
function v (line 21) | function v(f,_){const e=t("ExternalLinkIcon");return r(),p(i,null,[d,a("...
FILE: docs/.vuepress/dist/assets/distribution.html.1a2e0c57.js
function J (line 1) | function J(R,X){const o=r("ExternalLinkIcon");return s(),l(i,null,[p,g,c...
FILE: docs/.vuepress/dist/assets/distribution.html.e6e2641f.js
function J (line 1) | function J(R,X){const o=s("ExternalLinkIcon");return n(),l(i,null,[p,c,d...
FILE: docs/.vuepress/dist/assets/distribution.html.ebcec652.js
function W (line 1) | function W(O,R){const o=s("ExternalLinkIcon");return l(),a(i,null,[p,d,c...
FILE: docs/.vuepress/dist/assets/energy-system.html.36ae62eb.js
function v (line 150) | function v(E,q){const a=o("ExternalLinkIcon");return c(),u(l,null,[i,k,m...
FILE: docs/.vuepress/dist/assets/energy-system.html.446d0efc.js
function _ (line 150) | function _(E,x){const s=o("ExternalLinkIcon");return c(),l(u,null,[r,k,g...
FILE: docs/.vuepress/dist/assets/energy-system.html.c939c46f.js
function _ (line 150) | function _(v,x){const a=o("ExternalLinkIcon");return c(),l(u,null,[i,k,b...
FILE: docs/.vuepress/dist/assets/feature-parity-testing.html.110a0e04.js
function T (line 275) | function T(C,D){const p=e("SolanaCodeGroupItem"),u=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/feature-parity-testing.html.2d03e4b5.js
function A (line 275) | function A(L,D){const l=e("SolanaCodeGroupItem"),u=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/feature-parity-testing.html.441250fa.js
function D (line 275) | function D(T,A){const l=e("SolanaCodeGroupItem"),u=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/feature-parity-testing.html.5be01a44.js
function L (line 275) | function L(A,D){const l=e("SolanaCodeGroupItem"),u=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/feature-parity-testing.html.60d0cda5.js
function S (line 275) | function S(T,D){const l=e("SolanaCodeGroupItem"),u=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/feature-parity-testing.html.64de3bfa.js
function A (line 275) | function A(L,D){const l=e("SolanaCodeGroupItem"),u=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/feature-parity-testing.html.6b5afb2f.js
function v (line 155) | function v(f,h){const a=p("ExternalLinkIcon");return o(),c(l,null,[k,n("...
FILE: docs/.vuepress/dist/assets/feature-parity-testing.html.7eebcb7c.js
function j (line 275) | function j(D,L){const i=e("SolanaCodeGroupItem"),r=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/feature-parity-testing.html.8332b8fc.js
function S (line 275) | function S(C,D){const l=e("SolanaCodeGroupItem"),u=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/feature-parity-testing.html.90d3050b.js
function L (line 275) | function L(D,A){const l=e("SolanaCodeGroupItem"),u=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/feature-parity-testing.html.93063fd3.js
function A (line 275) | function A(F,D){const l=e("SolanaCodeGroupItem"),u=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/feature-parity-testing.html.9895d411.js
function L (line 275) | function L(D,A){const l=e("SolanaCodeGroupItem"),u=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/feature-parity-testing.html.9edac1d3.js
function D (line 275) | function D(T,A){const l=e("SolanaCodeGroupItem"),u=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/feature-parity-testing.html.e87e0e6e.js
function D (line 275) | function D(T,A){const l=e("SolanaCodeGroupItem"),u=e("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/game-examples.html.4e1c4e80.js
function Fa (line 1) | function Fa(Ka,Ca){const e=r("ExternalLinkIcon");return s(),i(l,null,[h,...
FILE: docs/.vuepress/dist/assets/game-examples.html.8ba930cd.js
function Fe (line 1) | function Fe(qe,He){const t=a("ExternalLinkIcon");return s(),i(h,null,[c,...
FILE: docs/.vuepress/dist/assets/game-examples.html.e048eba1.js
function De (line 1) | function De(Ne,Je){const n=s("ExternalLinkIcon");return a(),u(i,null,[c,...
FILE: docs/.vuepress/dist/assets/game-sdks.html.92d7e729.js
function te (line 2) | function te(ne,oe){const n=r("ExternalLinkIcon");return a(),l(i,null,[u,...
FILE: docs/.vuepress/dist/assets/game-sdks.html.c0176ba6.js
function oe (line 2) | function oe(ae,se){const n=s("ExternalLinkIcon");return r(),i(l,null,[d,...
FILE: docs/.vuepress/dist/assets/game-sdks.html.d18bd9d2.js
function na (line 2) | function na(ea,ta){const e=s("ExternalLinkIcon");return r(),l(i,null,[d,...
FILE: docs/.vuepress/dist/assets/get-program-accounts.html.01717eeb.js
function Vn (line 415) | function Vn(Yn,Jn){const e=l("ExternalLinkIcon"),u=l("RouterLink"),c=l("...
FILE: docs/.vuepress/dist/assets/get-program-accounts.html.05c9c5aa.js
function Vn (line 415) | function Vn(jn,Yn){const e=l("ExternalLinkIcon"),u=l("RouterLink"),c=l("...
FILE: docs/.vuepress/dist/assets/get-program-accounts.html.19ef2dee.js
function Vn (line 415) | function Vn(Yn,Jn){const e=l("ExternalLinkIcon"),u=l("RouterLink"),c=l("...
FILE: docs/.vuepress/dist/assets/get-program-accounts.html.2b6451b4.js
function Un (line 415) | function Un(Wn,Jn){const e=l("ExternalLinkIcon"),u=l("RouterLink"),o=l("...
FILE: docs/.vuepress/dist/assets/get-program-accounts.html.2d157240.js
function Mn (line 415) | function Mn(Rn,Fn){const t=l("ExternalLinkIcon"),u=l("RouterLink"),c=l("...
FILE: docs/.vuepress/dist/assets/get-program-accounts.html.382d13c1.js
function jn (line 415) | function jn(In,Vn){const t=l("ExternalLinkIcon"),u=l("RouterLink"),c=l("...
FILE: docs/.vuepress/dist/assets/get-program-accounts.html.58aa1eba.js
function jn (line 415) | function jn(Qn,Un){const e=l("ExternalLinkIcon"),u=l("RouterLink"),c=l("...
FILE: docs/.vuepress/dist/assets/get-program-accounts.html.5f716fa3.js
function Zn (line 415) | function Zn(Qn,Un){const e=l("ExternalLinkIcon"),c=l("CodeGroupItem"),p=...
FILE: docs/.vuepress/dist/assets/get-program-accounts.html.703fb6bd.js
function Hn (line 415) | function Hn(Zn,Qn){const e=l("ExternalLinkIcon"),u=l("RouterLink"),o=l("...
FILE: docs/.vuepress/dist/assets/get-program-accounts.html.a9d0e53c.js
function Un (line 415) | function Un(Wn,Vn){const e=l("ExternalLinkIcon"),u=l("RouterLink"),o=l("...
FILE: docs/.vuepress/dist/assets/get-program-accounts.html.b068cc8a.js
function jn (line 415) | function jn(Vn,In){const e=l("ExternalLinkIcon"),u=l("RouterLink"),c=l("...
FILE: docs/.vuepress/dist/assets/get-program-accounts.html.bcc96381.js
function Vn (line 415) | function Vn(Un,Wn){const t=l("ExternalLinkIcon"),u=l("RouterLink"),o=l("...
FILE: docs/.vuepress/dist/assets/get-program-accounts.html.beec38ff.js
function Sn (line 125) | function Sn(qn,Bn){const e=o("ExternalLinkIcon"),p=o("RouterLink");retur...
FILE: docs/.vuepress/dist/assets/get-program-accounts.html.f563091d.js
function Zn (line 415) | function Zn(Qn,Un){const e=l("ExternalLinkIcon"),c=l("CodeGroupItem"),p=...
FILE: docs/.vuepress/dist/assets/hello-world.html.46100458.js
function F (line 276) | function F(J,K){const a=o("ExternalLinkIcon");return c(),l(u,null,[k,m,b...
FILE: docs/.vuepress/dist/assets/hello-world.html.7962bd1c.js
function O (line 276) | function O(H,N){const a=o("ExternalLinkIcon");return c(),l(u,null,[k,m,d...
FILE: docs/.vuepress/dist/assets/hello-world.html.97d1eb37.js
function Y (line 276) | function Y(E,J){const s=o("ExternalLinkIcon");return c(),l(u,null,[k,m,g...
FILE: docs/.vuepress/dist/assets/index.html.2017fef1.js
function m (line 1) | function m(k,N){const t=n("ExternalLinkIcon");return s(),r(l,null,[i,_,p...
FILE: docs/.vuepress/dist/assets/index.html.25f20e37.js
function B (line 1) | function B(j,P){const e=r("ExternalLinkIcon");return o(),d(i,null,[b,c,l...
FILE: docs/.vuepress/dist/assets/index.html.550d93c2.js
function x (line 1) | function x(C,z){const o=t("ExternalLinkIcon");return i(),l(s,null,[c,b,h...
FILE: docs/.vuepress/dist/assets/index.html.8977d14d.js
function v (line 1) | function v(x,E){const n=o("ExternalLinkIcon");return i(),r(c,null,[l,u,_...
FILE: docs/.vuepress/dist/assets/index.html.92035043.js
function N (line 1) | function N(V,B){const o=s("ExternalLinkIcon");return r(),d(c,null,[h,_,p...
FILE: docs/.vuepress/dist/assets/index.html.9bb2504f.js
function E (line 1) | function E(L,M){const h=a("ExternalLinkIcon");return e(),i(r,null,[g,l,p...
FILE: docs/.vuepress/dist/assets/index.html.b594f3cc.js
function C (line 1) | function C(L,q){const a=r("ExternalLinkIcon");return s(),i(c,null,[h,m,u...
FILE: docs/.vuepress/dist/assets/index.html.b6c39787.js
function m (line 1) | function m(k,N){const t=n("ExternalLinkIcon");return s(),r(l,null,[i,_,p...
FILE: docs/.vuepress/dist/assets/index.html.c5a39464.js
function v (line 1) | function v(y,L){const a=s("ExternalLinkIcon");return t(),d(c,null,[u,h,b...
FILE: docs/.vuepress/dist/assets/index.html.caa2e1b4.js
function g (line 1) | function g(q,L){const t=r("ExternalLinkIcon");return a(),i(c,null,[u,p,h...
FILE: docs/.vuepress/dist/assets/index.html.d04c9063.js
function w (line 1) | function w(v,N){const e=r("ExternalLinkIcon");return s(),d(c,null,[l,_,k...
FILE: docs/.vuepress/dist/assets/index.html.dd541d3c.js
function S (line 1) | function S(v,C){const o=g("ExternalLinkIcon");return s(),i(r,null,[h,c,k...
FILE: docs/.vuepress/dist/assets/index.html.e7deec39.js
function v (line 1) | function v(N,V){const e=s("ExternalLinkIcon");return r(),d(c,null,[l,_,k...
FILE: docs/.vuepress/dist/assets/index.html.f4a1e63e.js
function C (line 1) | function C(S,y){const t=s("ExternalLinkIcon");return i(),r(d,null,[l,p,_...
FILE: docs/.vuepress/dist/assets/installation.html.0539cd42.js
function ln (line 44) | function ln(on,rn){const t=r("ExternalLinkIcon"),l=r("CodeGroupItem"),i=...
FILE: docs/.vuepress/dist/assets/installation.html.0fd43b03.js
function sn (line 44) | function sn(nn,an){const t=i("ExternalLinkIcon"),l=i("CodeGroupItem"),c=...
FILE: docs/.vuepress/dist/assets/installation.html.33a0283b.js
function nn (line 44) | function nn(an,en){const t=c("ExternalLinkIcon"),l=c("CodeGroupItem"),i=...
FILE: docs/.vuepress/dist/assets/installation.html.3865f03a.js
function ns (line 44) | function ns(os,ts){const o=r("ExternalLinkIcon"),t=r("CodeGroupItem"),i=...
FILE: docs/.vuepress/dist/assets/installation.html.3ee204bb.js
function Qs (line 44) | function Qs(Zs,sn){const t=c("ExternalLinkIcon"),l=c("CodeGroupItem"),i=...
FILE: docs/.vuepress/dist/assets/installation.html.4e98836a.js
function ts (line 44) | function ts(os,ls){const t=r("ExternalLinkIcon"),o=r("CodeGroupItem"),i=...
FILE: docs/.vuepress/dist/assets/installation.html.5e200cbd.js
function cs (line 44) | function cs(us,ps){const t=r("ExternalLinkIcon"),l=r("CodeGroupItem"),i=...
FILE: docs/.vuepress/dist/assets/installation.html.75866756.js
function on (line 44) | function on(rn,cn){const t=r("ExternalLinkIcon"),l=r("CodeGroupItem"),i=...
FILE: docs/.vuepress/dist/assets/installation.html.7b74d3ce.js
function os (line 44) | function os(is,cs){const t=c("ExternalLinkIcon"),l=c("CodeGroupItem"),i=...
FILE: docs/.vuepress/dist/assets/installation.html.81cc1ff4.js
function ls (line 45) | function ls(is,rs){const t=r("ExternalLinkIcon"),o=r("CodeGroupItem"),i=...
FILE: docs/.vuepress/dist/assets/installation.html.a516e599.js
function sn (line 44) | function sn(nn,an){const t=i("ExternalLinkIcon"),l=i("CodeGroupItem"),c=...
FILE: docs/.vuepress/dist/assets/installation.html.aa25ac0f.js
function Ye (line 44) | function Ye(Xe,Ze){const t=r("ExternalLinkIcon"),l=r("CodeGroupItem"),o=...
FILE: docs/.vuepress/dist/assets/installation.html.aa3edf44.js
function rn (line 44) | function rn(cn,un){const t=r("ExternalLinkIcon"),l=r("CodeGroupItem"),o=...
FILE: docs/.vuepress/dist/assets/installation.html.cff7de51.js
function Va (line 44) | function Va(Ga,Ma){const l=r("ExternalLinkIcon"),t=r("CodeGroupItem"),o=...
FILE: docs/.vuepress/dist/assets/interact-with-tokens.html.2bce6086.js
function A (line 662) | function A(v,P){const a=o("ExternalLinkIcon");return c(),l(u,null,[r,n("...
FILE: docs/.vuepress/dist/assets/interact-with-tokens.html.64318398.js
function y (line 662) | function y(f,_){const p=o("ExternalLinkIcon");return e(),c(u,null,[r,a("...
FILE: docs/.vuepress/dist/assets/interact-with-tokens.html.98196941.js
function x (line 662) | function x(q,P){const a=o("ExternalLinkIcon");return c(),l(u,null,[r,n("...
FILE: docs/.vuepress/dist/assets/intro.html.5c2ad8c4.js
function R (line 1) | function R(V,H){const o=n("ExternalLinkIcon"),s=n("RouterLink");return i...
FILE: docs/.vuepress/dist/assets/intro.html.afd41fab.js
function A (line 1) | function A(C,E){const t=g("ExternalLinkIcon"),s=g("RouterLink");return e...
FILE: docs/.vuepress/dist/assets/intro.html.cccca287.js
function V (line 1) | function V(B,T){const o=n("ExternalLinkIcon"),r=n("RouterLink");return i...
FILE: docs/.vuepress/dist/assets/keypairs-and-wallets.html.41fab86d.js
function Js (line 648) | function Js(Us,Hs){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/keypairs-and-wallets.html.51f378e3.js
function Vs (line 668) | function Vs(qs,Ls){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/keypairs-and-wallets.html.52178133.js
function Vs (line 648) | function Vs(Js,Us){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/keypairs-and-wallets.html.61911f3c.js
function Hs (line 648) | function Hs(Vs,Ys){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/keypairs-and-wallets.html.67ed01d6.js
function Ls (line 620) | function Ls(Us,Vs){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/keypairs-and-wallets.html.68a4f8a1.js
function Us (line 648) | function Us(Hs,Vs){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/keypairs-and-wallets.html.7c453b59.js
function Js (line 648) | function Js(Us,Hs){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/keypairs-and-wallets.html.7c474929.js
function Us (line 648) | function Us(Ls,Vs){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/keypairs-and-wallets.html.9ba5746a.js
function Y (line 93) | function Y(F,J){const s=o("ExternalLinkIcon");return l(),c(u,null,[r,a("...
FILE: docs/.vuepress/dist/assets/keypairs-and-wallets.html.af37857f.js
function Js (line 648) | function Js(Us,Hs){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/keypairs-and-wallets.html.cc8fbf04.js
function Js (line 648) | function Js(Us,Vs){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/keypairs-and-wallets.html.de41b5c5.js
function Us (line 648) | function Us(Vs,Hs){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/keypairs-and-wallets.html.e67c0c51.js
function Hs (line 648) | function Hs(Js,Us){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/keypairs-and-wallets.html.f22c3901.js
function Js (line 648) | function Js(Us,Hs){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/local-development.html.04b39972.js
function V (line 32) | function V(j,H){const l=t("RouterLink"),s=t("ExternalLinkIcon");return i...
FILE: docs/.vuepress/dist/assets/local-development.html.46e27ce6.js
function Hn (line 324) | function Hn(Zn,Bn){const p=l("RouterLink"),e=l("SolanaCodeGroupItem"),o=...
FILE: docs/.vuepress/dist/assets/local-development.html.56a49f49.js
function zn (line 325) | function zn(Qn,Jn){const l=p("RouterLink"),e=p("SolanaCodeGroupItem"),o=...
FILE: docs/.vuepress/dist/assets/local-development.html.57651167.js
function Qn (line 325) | function Qn(Jn,Yn){const p=l("RouterLink"),e=l("SolanaCodeGroupItem"),o=...
FILE: docs/.vuepress/dist/assets/local-development.html.5b9c11f5.js
function Qn (line 325) | function Qn(Jn,Yn){const p=l("RouterLink"),e=l("SolanaCodeGroupItem"),o=...
FILE: docs/.vuepress/dist/assets/local-development.html.6fe99a83.js
function Jn (line 325) | function Jn(Yn,$n){const p=l("RouterLink"),e=l("SolanaCodeGroupItem"),o=...
FILE: docs/.vuepress/dist/assets/local-development.html.83d30cd3.js
function ns (line 325) | function ns(ss,as){const l=p("RouterLink"),e=p("SolanaCodeGroupItem"),o=...
FILE: docs/.vuepress/dist/assets/local-development.html.87708b9b.js
function zn (line 325) | function zn(Qn,Jn){const p=l("RouterLink"),e=l("SolanaCodeGroupItem"),o=...
FILE: docs/.vuepress/dist/assets/local-development.html.94d5f03d.js
function zn (line 325) | function zn(Qn,Jn){const p=l("RouterLink"),e=l("SolanaCodeGroupItem"),o=...
FILE: docs/.vuepress/dist/assets/local-development.html.987c051d.js
function Qn (line 325) | function Qn(Jn,Yn){const l=p("RouterLink"),e=p("SolanaCodeGroupItem"),o=...
FILE: docs/.vuepress/dist/assets/local-development.html.a46df64b.js
function Jn (line 325) | function Jn(Yn,$n){const p=l("RouterLink"),e=l("SolanaCodeGroupItem"),o=...
FILE: docs/.vuepress/dist/assets/local-development.html.c30f3958.js
function Jn (line 325) | function Jn(Yn,$n){const p=l("RouterLink"),e=l("SolanaCodeGroupItem"),o=...
FILE: docs/.vuepress/dist/assets/local-development.html.d92b65d2.js
function Qn (line 325) | function Qn(Jn,Yn){const l=p("RouterLink"),e=p("SolanaCodeGroupItem"),o=...
FILE: docs/.vuepress/dist/assets/local-development.html.edd1e5da.js
function Jn (line 325) | function Jn(Yn,$n){const p=l("RouterLink"),e=l("SolanaCodeGroupItem"),o=...
FILE: docs/.vuepress/dist/assets/name-service.html.2a6127d5.js
function J (line 233) | function J(Z,Q){const t=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/name-service.html.31d70b32.js
function V (line 233) | function V(Y,I){const t=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup");...
FILE: docs/.vuepress/dist/assets/name-service.html.40d37cf7.js
function q (line 233) | function q(z,Q){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/name-service.html.569777a7.js
function q (line 233) | function q(z,Q){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/name-service.html.73354d4f.js
function y (line 93) | function y(h,w){const e=t("ExternalLinkIcon");return o(),c(i,null,[u,n("...
FILE: docs/.vuepress/dist/assets/name-service.html.7f713da1.js
function q (line 233) | function q(z,Q){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/name-service.html.84a68d08.js
function q (line 233) | function q(z,Q){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/name-service.html.87ead710.js
function q (line 233) | function q(z,Q){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/name-service.html.8945e238.js
function q (line 233) | function q(z,Q){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/name-service.html.9126ccbb.js
function q (line 233) | function q(z,Q){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/name-service.html.92fe381f.js
function Y (line 233) | function Y(J,Z){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup");...
FILE: docs/.vuepress/dist/assets/name-service.html.c487eb0f.js
function Y (line 233) | function Y(J,Z){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup");...
FILE: docs/.vuepress/dist/assets/name-service.html.ea9b0216.js
function z (line 233) | function z(q,Q){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/name-service.html.f9dd90b0.js
function Z (line 233) | function Z(z,Q){const t=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/nfts-in-games.html.2b65cbf5.js
function Q (line 63) | function Q(W,X){const a=o("ExternalLinkIcon");return c(),u(l,null,[i,k,d...
FILE: docs/.vuepress/dist/assets/nfts-in-games.html.46772392.js
function W (line 63) | function W(Y,Q){const a=o("ExternalLinkIcon");return c(),l(r,null,[u,k,d...
FILE: docs/.vuepress/dist/assets/nfts-in-games.html.e1b77b87.js
function Q (line 63) | function Q(W,X){const s=o("ExternalLinkIcon");return c(),l(i,null,[u,k,g...
FILE: docs/.vuepress/dist/assets/nfts.html.06449cbe.js
function W (line 532) | function W(J,Z){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/nfts.html.0870f8d4.js
function W (line 532) | function W(Q,Z){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/nfts.html.1e42ca51.js
function Dn (line 811) | function Dn(Vn,Wn){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/nfts.html.3a4dc806.js
function W (line 532) | function W(J,Z){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/nfts.html.4488b5bf.js
function Xn (line 811) | function Xn(Dn,Vn){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/nfts.html.6cf05cb7.js
function V (line 532) | function V(Q,W){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/nfts.html.73b95415.js
function Dn (line 811) | function Dn(Vn,Wn){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/nfts.html.75a819e1.js
function Xn (line 811) | function Xn(Dn,Vn){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/nfts.html.8062119a.js
function Xn (line 811) | function Xn(Vn,qn){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/nfts.html.88b22980.js
function Dn (line 811) | function Dn(Vn,Wn){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/nfts.html.93f43d02.js
function W (line 532) | function W(J,Z){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/nfts.html.cb306959.js
function W (line 532) | function W(J,Z){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup"),...
FILE: docs/.vuepress/dist/assets/nfts.html.d9599439.js
function Hn (line 811) | function Hn(Un,jn){const e=p("SolanaCodeGroupItem"),o=p("SolanaCodeGroup...
FILE: docs/.vuepress/dist/assets/nfts.html.f3815a10.js
function f (line 108) | function f(h,g){const t=e("ExternalLinkIcon");return o(),c(i,null,[r,n("...
FILE: docs/.vuepress/dist/assets/offline-transactions.html.0bf4dc0d.js
function O (line 430) | function O(M,z){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup");...
FILE: docs/.vuepress/dist/assets/offline-transactions.html.1cebdb75.js
function O (line 430) | function O(z,M){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup");...
FILE: docs/.vuepress/dist/assets/offline-transactions.html.26de122f.js
function O (line 430) | function O(L,M){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup");...
FILE: docs/.vuepress/dist/assets/offline-transactions.html.328bb708.js
function p (line 101) | function p(e,c){return t}
FILE: docs/.vuepress/dist/assets/offline-transactions.html.411f2083.js
function O (line 430) | function O(z,M){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup");...
FILE: docs/.vuepress/dist/assets/offline-transactions.html.5d4f9b52.js
function O (line 430) | function O(z,M){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup");...
FILE: docs/.vuepress/dist/assets/offline-transactions.html.62c2bb84.js
function O (line 430) | function O(z,M){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup");...
FILE: docs/.vuepress/dist/assets/offline-transactions.html.6bb56d3c.js
function O (line 430) | function O(z,M){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup");...
FILE: docs/.vuepress/dist/assets/offline-transactions.html.93364c85.js
function L (line 430) | function L(z,M){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup");...
FILE: docs/.vuepress/dist/assets/offline-transactions.html.a7cb4369.js
function O (line 430) | function O(M,z){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup");...
FILE: docs/.vuepress/dist/assets/offline-transactions.html.afa81fed.js
function O (line 430) | function O(z,M){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup");...
FILE: docs/.vuepress/dist/assets/offline-transactions.html.cd22f1cb.js
function M (line 430) | function M(O,z){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup");...
FILE: docs/.vuepress/dist/assets/offline-transactions.html.d0d3f6bf.js
function O (line 430) | function O(z,M){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup");...
FILE: docs/.vuepress/dist/assets/offline-transactions.html.ef38def6.js
function O (line 430) | function O(z,M){const e=c("SolanaCodeGroupItem"),o=c("SolanaCodeGroup");...
FILE: docs/.vuepress/dist/assets/pdas.html.08e26e07.js
function $ (line 1) | function $(aa,na){const i=s("ExternalLinkIcon"),e=s("RouterLink");return...
FILE: docs/.vuepress/dist/assets/pdas.html.35c6152a.js
function H (line 1) | function H(J,K){const t=n("ExternalLinkIcon"),s=n("RouterLink");return d...
FILE: docs/.vuepress/dist/assets/pdas.html.3b9289a8.js
function Y (line 1) | function Y(Z,$){const r=o("ExternalLinkIcon"),s=o("RouterLink");return d...
FILE: docs/.vuepress/dist/assets/pdas.html.56ea1967.js
function na (line 1) | function na(ia,sa){const i=t("ExternalLinkIcon"),s=t("RouterLink");retur...
FILE: docs/.vuepress/dist/assets/pdas.html.6cdffc98.js
function ee (line 1) | function ee(te,se){const o=n("ExternalLinkIcon"),r=n("RouterLink");retur...
FILE: docs/.vuepress/dist/assets/pdas.html.6d743213.js
function $ (line 1) | function $(ee,oe){const s=a("ExternalLinkIcon"),n=a("RouterLink");return...
FILE: docs/.vuepress/dist/assets/pdas.html.6fd7b3e7.js
function O (line 1) | function O(Q,T){const r=t("ExternalLinkIcon"),i=t("RouterLink");return d...
FILE: docs/.vuepress/dist/assets/pdas.html.9841e8a1.js
function G (line 1) | function G(H,J){const t=a("ExternalLinkIcon"),r=a("RouterLink");return d...
FILE: docs/.vuepress/dist/assets/pdas.html.a4275910.js
function at (line 1) | function at(dt,lt){const o=i("ExternalLinkIcon"),e=i("RouterLink");retur...
FILE: docs/.vuepress/dist/assets/pdas.html.cf2a36cd.js
function Y (line 1) | function Y(Z,$){const a=n("ExternalLinkIcon"),s=n("RouterLink");return d...
FILE: docs/.vuepress/dist/assets/pdas.html.da9ce228.js
function Y (line 1) | function Y(Z,$){const o=a("ExternalLinkIcon"),t=a("RouterLink");return d...
FILE: docs/.vuepress/dist/assets/pdas.html.dd1806d8.js
function Y (line 1) | function Y(Z,$){const s=n("ExternalLinkIcon"),r=n("RouterLink");return i...
FILE: docs/.vuepress/dist/assets/pdas.html.e5cff056.js
function Y (line 1) | function Y(Z,$){const r=o("ExternalLinkIcon"),t=o("RouterLink");return l...
FILE: docs/.vuepress/dist/assets/pdas.html.eaddc26f.js
function O (line 1) | function O(R,q){const i=l("ExternalLinkIcon"),n=l("RouterLink");return o...
FILE: docs/.vuepress/dist/assets/porting-anchor-to-unity.html.2d7da15e.js
function K (line 31) | function K(H,D){const s=e("ExternalLinkIcon");return c(),i(l,null,[r,g,k...
FILE: docs/.vuepress/dist/assets/porting-anchor-to-unity.html.a3b74cb4.js
function F (line 31) | function F(U,D){const s=p("ExternalLinkIcon");return c(),l(i,null,[u,k,h...
FILE: docs/.vuepress/dist/assets/porting-anchor-to-unity.html.d93d3149.js
function P (line 31) | function P(w,I){const a=p("ExternalLinkIcon");return c(),u(r,null,[l,d,k...
FILE: docs/.vuepress/dist/assets/programs.html.01e229c2.js
function wn (line 1469) | function wn(hn,An){const l=c("CodeGroupItem"),u=c("CodeGroup"),e=c("Sola...
FILE: docs/.vuepress/dist/assets/programs.html.072a911a.js
function gn (line 1469) | function gn(hn,An){const l=c("CodeGroupItem"),u=c("CodeGroup"),e=c("Sola...
FILE: docs/.vuepress/dist/assets/programs.html.09c93a73.js
function lt (line 2) | function lt(ht,_t){const s=a("RouterLink"),r=a("ExternalLinkIcon");retur...
FILE: docs/.vuepress/dist/assets/programs.html.135d8a1e.js
function dn (line 1469) | function dn(_n,yn){const l=c("CodeGroupItem"),u=c("CodeGroup"),e=c("Sola...
FILE: docs/.vuepress/dist/assets/programs.html.2a06f575.js
function de (line 2) | function de(ie,le){const a=s("RouterLink"),n=s("ExternalLinkIcon");retur...
FILE: docs/.vuepress/dist/assets/programs.html.3c48317e.js
function wn (line 1469) | function wn(hn,An){const l=c("CodeGroupItem"),u=c("CodeGroup"),o=c("Sola...
FILE: docs/.vuepress/dist/assets/programs.html.3f12c384.js
function ie (line 2) | function ie(ce,de){const s=a("RouterLink"),r=a("ExternalLinkIcon");retur...
FILE: docs/.vuepress/dist/assets/programs.html.48b1db94.js
function sn (line 2) | function sn(ln,dn){const a=c("RouterLink"),r=c("ExternalLinkIcon");retur...
FILE: docs/.vuepress/dist/assets/programs.html.555fde3c.js
function mn (line 1469) | function mn(dn,_n){const l=c("CodeGroupItem"),u=c("CodeGroup"),o=c("Sola...
FILE: docs/.vuepress/dist/assets/programs.html.5860dd01.js
function pe (line 2) | function pe(_e,he){const t=n("RouterLink"),s=n("ExternalLinkIcon");retur...
FILE: docs/.vuepress/dist/assets/programs.html.602c11ba.js
function de (line 2) | function de(ie,le){const a=s("RouterLink"),n=s("ExternalLinkIcon");retur...
FILE: docs/.vuepress/dist/assets/programs.html.6801ed73.js
function gn (line 1469) | function gn(hn,An){const l=c("CodeGroupItem"),u=c("CodeGroup"),e=c("Sola...
FILE: docs/.vuepress/dist/assets/programs.html.6d41107a.js
function gn (line 1469) | function gn(wn,hn){const l=c("CodeGroupItem"),u=c("CodeGroup"),o=c("Sola...
FILE: docs/.vuepress/dist/assets/programs.html.7db6ff71.js
function t (line 403) | function t(o,e){return p}
FILE: docs/.vuepress/dist/assets/programs.html.90aa36af.js
function wn (line 1469) | function wn(hn,An){const l=c("CodeGroupItem"),u=c("CodeGroup"),e=c("Sola...
FILE: docs/.vuepress/dist/assets/programs.html.96701793.js
function be (line 2) | function be(fe,ye){const s=r("RouterLink"),t=r("ExternalLinkIcon");retur...
FILE: docs/.vuepress/dist/assets/programs.html.9cdb4de3.js
function wn (line 1469) | function wn(An,hn){const l=c("CodeGroupItem"),u=c("CodeGroup"),o=c("Sola...
FILE: docs/.vuepress/dist/assets/programs.html.a673792c.js
function an (line 2) | function an(sn,dn){const s=a("RouterLink"),r=a("ExternalLinkIcon");retur...
FILE: docs/.vuepress/dist/assets/programs.html.c4b45e07.js
function je (line 2) | function je(Ge,He){const l=n("RouterLink"),t=n("ExternalLinkIcon");retur...
FILE: docs/.vuepress/dist/assets/programs.html.d77781f0.js
function lt (line 2) | function lt(ct,pt){const a=n("RouterLink"),o=n("ExternalLinkIcon");retur...
FILE: docs/.vuepress/dist/assets/programs.html.d7e559f7.js
function gn (line 1469) | function gn(hn,An){const l=c("CodeGroupItem"),u=c("CodeGroup"),e=c("Sola...
FILE: docs/.vuepress/dist/assets/programs.html.dd60d7aa.js
function wn (line 1469) | function wn(hn,An){const l=c("CodeGroupItem"),u=c("CodeGroup"),e=c("Sola...
FILE: docs/.vuepress/dist/assets/programs.html.dec531fb.js
function wn (line 1469) | function wn(hn,An){const l=c("CodeGroupItem"),u=c("CodeGroup"),e=c("Sola...
FILE: docs/.vuepress/dist/assets/programs.html.e8e9b38e.js
function gn (line 1469) | function gn(hn,An){const l=c("CodeGroupItem"),u=c("CodeGroup"),e=c("Sola...
FILE: docs/.vuepress/dist/assets/programs.html.ea9dd7e3.js
function dt (line 2) | function dt(it,ct){const a=s("RouterLink"),r=s("ExternalLinkIcon");retur...
FILE: docs/.vuepress/dist/assets/programs.html.ebf949b0.js
function cn (line 2) | function cn(pn,hn){const s=r("RouterLink"),o=r("ExternalLinkIcon");retur...
FILE: docs/.vuepress/dist/assets/programs.html.f73d3347.js
function co (line 2) | function co(po,_o){const n=t("RouterLink"),s=t("ExternalLinkIcon");retur...
FILE: docs/.vuepress/dist/assets/programs.html.fb2104eb.js
function _e (line 2) | function _e(he,pe){const a=s("RouterLink"),r=s("ExternalLinkIcon");retur...
FILE: docs/.vuepress/dist/assets/retrying-transactions.html.63745293.js
function Ts (line 62) | function Ts(zs,Ps){const t=a("ExternalLinkIcon"),i=a("SolanaCodeGroupIte...
FILE: docs/.vuepress/dist/assets/saving-game-state.html.40bb41f5.js
function y (line 77) | function y(w,f){const s=t("ExternalLinkIcon");return o(),e(l,null,[i,n("...
FILE: docs/.vuepress/dist/assets/saving-game-state.html.9d6e5e66.js
function g (line 77) | function g(f,w){const a=t("ExternalLinkIcon");return e(),o(l,null,[i,n("...
FILE: docs/.vuepress/dist/assets/saving-game-state.html.aa5750ab.js
function g (line 77) | function g(f,w){const a=t("ExternalLinkIcon");return e(),o(l,null,[i,n("...
FILE: docs/.vuepress/dist/assets/serialization.html.0d68a263.js
function fn (line 989) | function fn(_n,wn){const e=l("CodeGroupItem"),o=l("CodeGroup"),c=l("Exte...
FILE: docs/.vuepress/dist/assets/serialization.html.4cfc0d5a.js
function hn (line 989) | function hn(Sn,vn){const e=l("CodeGroupItem"),o=l("CodeGroup"),c=l("Exte...
FILE: docs/.vuepress/dist/assets/serialization.html.89a2791f.js
function wn (line 989) | function wn(Sn,vn){const e=l("CodeGroupItem"),o=l("CodeGroup"),c=l("Exte...
FILE: docs/.vuepress/dist/assets/serialization.html.932862af.js
function hn (line 989) | function hn(Sn,zn){const e=l("CodeGroupItem"),o=l("CodeGroup"),c=l("Exte...
FILE: docs/.vuepress/dist/assets/serialization.html.a08f50dc.js
function E (line 626) | function E(C,O){const a=o("ExternalLinkIcon");return c(),l(u,null,[b,n("...
FILE: docs/.vuepress/dist/assets/serialization.html.a34c46cf.js
function wn (line 989) | function wn(hn,Sn){const e=l("CodeGroupItem"),o=l("CodeGroup"),c=l("Exte...
FILE: docs/.vuepress/dist/assets/serialization.html.a93f580e.js
function Sn (line 989) | function Sn(vn,zn){const e=l("CodeGroupItem"),o=l("CodeGroup"),c=l("Exte...
FILE: docs/.vuepress/dist/assets/serialization.html.b36b4ad5.js
function Sn (line 989) | function Sn(zn,vn){const e=l("CodeGroupItem"),o=l("CodeGroup"),c=l("Exte...
FILE: docs/.vuepress/dist/assets/serialization.html.bb0b6d3d.js
function Sn (line 989) | function Sn(zn,vn){const e=l("CodeGroupItem"),o=l("CodeGroup"),c=l("Exte...
FILE: docs/.vuepress/dist/assets/serialization.html.cd6e6685.js
function Sn (line 989) | function Sn(vn,Tn){const e=l("CodeGroupItem"),o=l("CodeGroup"),c=l("Exte...
FILE: docs/.vuepress/dist/assets/serialization.html.d1ade7c6.js
function hn (line 989) | function hn(Sn,zn){const e=l("CodeGroupItem"),o=l("CodeGroup"),c=l("Exte...
FILE: docs/.vuepress/dist/assets/serialization.html.d1b35c96.js
function Sn (line 989) | function Sn(zn,vn){const e=l("CodeGroupItem"),o=l("CodeGroup"),c=l("Exte...
FILE: docs/.vuepress/dist/assets/serialization.html.fc2b2085.js
function hn (line 989) | function hn(Sn,zn){const e=l("CodeGroupItem"),o=l("CodeGroup"),c=l("Exte...
FILE: docs/.vuepress/dist/assets/serialization.html.ff6ce54c.js
function Sn (line 989) | function Sn(vn,Tn){const e=l("CodeGroupItem"),o=l("CodeGroup"),c=l("Exte...
FILE: docs/.vuepress/dist/assets/staking.html.04e151a8.js
function M (line 614) | function M($,U){const t=o("ExternalLinkIcon"),e=o("RouterLink");return u...
FILE: docs/.vuepress/dist/assets/staking.html.0fd3c3b6.js
function pn (line 614) | function pn(ln,un){const l=e("CodeGroupItem"),i=e("CodeGroup"),p=e("Exte...
FILE: docs/.vuepress/dist/assets/staking.html.122e3dd7.js
function pn (line 614) | function pn(ln,un){const l=e("CodeGroupItem"),i=e("CodeGroup"),p=e("Exte...
FILE: docs/.vuepress/dist/assets/staking.html.420a515f.js
function Q (line 614) | function Q(Y,Z){const p=e("CodeGroupItem"),i=e("CodeGroup"),l=e("Externa...
FILE: docs/.vuepress/dist/assets/staking.html.48d1bd77.js
function yn (line 740) | function yn(hn,fn){const u=c("CodeGroupItem"),i=c("CodeGroup"),p=c("Exte...
FILE: docs/.vuepress/dist/assets/staking.html.4f958a15.js
function on (line 614) | function on(cn,pn){const l=e("CodeGroupItem"),u=e("CodeGroup"),p=e("Exte...
FILE: docs/.vuepress/dist/assets/staking.html.59211856.js
function rn (line 614) | function rn(kn,bn){const l=e("CodeGroupItem"),i=e("CodeGroup"),p=e("Exte...
FILE: docs/.vuepress/dist/assets/staking.html.6485c86f.js
function pn (line 614) | function pn(ln,un){const l=e("CodeGroupItem"),i=e("CodeGroup"),p=e("Exte...
FILE: docs/.vuepress/dist/assets/staking.html.79740434.js
function ln (line 614) | function ln(un,rn){const l=e("CodeGroupItem"),i=e("CodeGroup"),p=e("Exte...
FILE: docs/.vuepress/dist/assets/staking.html.8f95d604.js
function pn (line 614) | function pn(ln,un){const l=e("CodeGroupItem"),i=e("CodeGroup"),p=e("Exte...
FILE: docs/.vuepress/dist/assets/staking.html.9a3a894a.js
function pn (line 614) | function pn(ln,un){const l=e("CodeGroupItem"),i=e("CodeGroup"),p=e("Exte...
FILE: docs/.vuepress/dist/assets/staking.html.a5ae14b2.js
function hn (line 740) | function hn(fn,Sn){const u=c("CodeGroupItem"),i=c("CodeGroup"),p=c("Exte...
FILE: docs/.vuepress/dist/assets/staking.html.bbc62dff.js
function L (line 170) | function L(R,D){const t=o("ExternalLinkIcon"),p=o("RouterLink");return u...
FILE: docs/.vuepress/dist/assets/staking.html.f374e09a.js
function hn (line 740) | function hn(fn,Sn){const u=c("CodeGroupItem"),i=c("CodeGroup"),p=c("Exte...
FILE: docs/.vuepress/dist/assets/store-sol-in-pda.html.11610e9c.js
function T (line 468) | function T(E,V){const s=o("ExternalLinkIcon");return c(),l(u,null,[r,k,m...
FILE: docs/.vuepress/dist/assets/store-sol-in-pda.html.c79c00ec.js
function R (line 468) | function R(z,E){const a=o("ExternalLinkIcon");return c(),l(u,null,[i,k,m...
FILE: docs/.vuepress/dist/assets/store-sol-in-pda.html.e4ee6008.js
function R (line 468) | function R(E,V){const a=o("ExternalLinkIcon");return c(),l(u,null,[i,k,m...
FILE: docs/.vuepress/dist/assets/token.html.0e5aea93.js
function Gn (line 1246) | function Gn(Vn,Rn){const p=o("CodeGroupItem"),l=o("CodeGroup"),e=o("Sola...
FILE: docs/.vuepress/dist/assets/token.html.12804e59.js
function Gn (line 1246) | function Gn(Vn,Rn){const p=o("CodeGroupItem"),l=o("CodeGroup"),e=o("Sola...
FILE: docs/.vuepress/dist/assets/token.html.1da2f0eb.js
function Vn (line 1246) | function Vn(Rn,Un){const p=o("CodeGroupItem"),l=o("CodeGroup"),e=o("Sola...
FILE: docs/.vuepress/dist/assets/token.html.495dbb1a.js
function Vn (line 1246) | function Vn(Rn,Un){const p=o("CodeGroupItem"),l=o("CodeGroup"),e=o("Sola...
FILE: docs/.vuepress/dist/assets/token.html.5b1ae1a2.js
function Vn (line 1246) | function Vn(Rn,Un){const p=o("CodeGroupItem"),l=o("CodeGroup"),e=o("Sola...
FILE: docs/.vuepress/dist/assets/token.html.77adbbb4.js
function Vn (line 1246) | function Vn(Rn,Un){const p=o("CodeGroupItem"),l=o("CodeGroup"),e=o("Sola...
FILE: docs/.vuepress/dist/assets/token.html.858f2429.js
function t (line 295) | function t(p,c){return e}
FILE: docs/.vuepress/dist/assets/token.html.87c9f9ba.js
function Gn (line 1246) | function Gn(Vn,Rn){const p=c("CodeGroupItem"),l=c("CodeGroup"),e=c("Sola...
FILE: docs/.vuepress/dist/assets/token.html.b6c1e5ff.js
function Gn (line 1246) | function Gn(Rn,Un){const p=c("CodeGroupItem"),l=c("CodeGroup"),e=c("Sola...
FILE: docs/.vuepress/dist/assets/token.html.c555b525.js
function Vn (line 1246) | function Vn(Gn,zn){const p=c("CodeGroupItem"),l=c("CodeGroup"),e=c("Sola...
FILE: docs/.vuepress/dist/assets/token.html.cb53fbdc.js
function Gn (line 1246) | function Gn(Vn,Rn){const p=o("CodeGroupItem"),l=o("CodeGroup"),e=o("Sola...
FILE: docs/.vuepress/dist/assets/token.html.de032bea.js
function Gn (line 1246) | function Gn(Vn,Rn){const p=o("CodeGroupItem"),l=o("CodeGroup"),e=o("Sola...
FILE: docs/.vuepress/dist/assets/token.html.ea1f1398.js
function Gn (line 1246) | function Gn(Vn,Rn){const p=o("CodeGroupItem"),l=o("CodeGroup"),e=o("Sola...
FILE: docs/.vuepress/dist/assets/token.html.edf00ffd.js
function Vn (line 1246) | function Vn(Rn,Un){const p=o("CodeGroupItem"),l=o("CodeGroup"),e=o("Sola...
FILE: docs/.vuepress/dist/assets/transactions.html.0168eb8a.js
function P (line 1) | function P(Y,M){const t=n("RouterLink"),i=n("ExternalLinkIcon");return o...
FILE: docs/.vuepress/dist/assets/transactions.html.0b44a37d.js
function W (line 1) | function W(X,Y){const r=s("RouterLink"),o=s("ExternalLinkIcon");return i...
FILE: docs/.vuepress/dist/assets/transactions.html.1cb6f901.js
function O (line 1) | function O(Q,U){const h=i("RouterLink"),o=i("ExternalLinkIcon");return e...
FILE: docs/.vuepress/dist/assets/transactions.html.46bc8b92.js
function H (line 1) | function H(Q,X){const a=i("RouterLink"),t=i("ExternalLinkIcon");return o...
FILE: docs/.vuepress/dist/assets/transactions.html.48ea2bf1.js
function U (line 1) | function U(X,Y){const s=a("RouterLink"),o=a("ExternalLinkIcon");return i...
FILE: docs/.vuepress/dist/assets/transactions.html.5f4184a8.js
function W (line 1) | function W(X,Y){const s=a("RouterLink"),n=a("ExternalLinkIcon");return l...
FILE: docs/.vuepress/dist/assets/transactions.html.73b8d7c4.js
function Z (line 1) | function Z($,aa){const r=t("RouterLink"),i=t("ExternalLinkIcon");return ...
FILE: docs/.vuepress/dist/assets/transactions.html.93abdb49.js
function X (line 1) | function X(Y,Z){const r=a("RouterLink"),e=a("ExternalLinkIcon");return c...
FILE: docs/.vuepress/dist/assets/transactions.html.999eb3d9.js
function W (line 1) | function W(X,Y){const s=a("RouterLink"),o=a("ExternalLinkIcon");return i...
FILE: docs/.vuepress/dist/assets/transactions.html.a1a988c9.js
function W (line 1) | function W(X,Y){const s=a("RouterLink"),n=a("ExternalLinkIcon");return l...
FILE: docs/.vuepress/dist/assets/transactions.html.b7388dfe.js
function W (line 1) | function W(X,Y){const i=s("RouterLink"),o=s("ExternalLinkIcon");return e...
FILE: docs/.vuepress/dist/assets/transactions.html.bc7f0379.js
function W (line 1) | function W(X,Y){const t=r("RouterLink"),s=r("ExternalLinkIcon");return i...
FILE: docs/.vuepress/dist/assets/transactions.html.e6d9a389.js
function W (line 1) | function W(X,Y){const a=o("RouterLink"),n=o("ExternalLinkIcon");return i...
FILE: docs/.vuepress/dist/assets/transactions.html.f5f36a28.js
function Y (line 1) | function Y(Z,$){const r=a("RouterLink"),n=a("ExternalLinkIcon");return l...
FILE: docs/.vuepress/dist/assets/versioned-transactions.html.1e1e264b.js
function ue (line 28) | function ue(he,me){const s=r("ExternalLinkIcon");return i(),c(l,null,[T,...
FILE: docs/.vuepress/dist/assets/versioned-transactions.html.1e457979.js
function is (line 28) | function is(ds,us){const n=r("ExternalLinkIcon");return p(),l(c,null,[w,...
FILE: docs/.vuepress/dist/assets/versioned-transactions.html.20e4c983.js
function ma (line 28) | function ma(ua,ga){const s=t("ExternalLinkIcon");return i(),d(c,null,[x,...
FILE: docs/.vuepress/dist/assets/versioned-transactions.html.5b1ec8d4.js
function ue (line 28) | function ue(he,me){const s=r("ExternalLinkIcon");return i(),c(l,null,[T,...
FILE: docs/.vuepress/dist/assets/versioned-transactions.html.7131c1ef.js
function ua (line 28) | function ua(ma,ha){const n=r("ExternalLinkIcon");return c(),i(p,null,[T,...
FILE: docs/.vuepress/dist/assets/versioned-transactions.html.7972f188.js
function ua (line 28) | function ua(da,ma){const s=e("ExternalLinkIcon");return i(),r(l,null,[v,...
FILE: docs/.vuepress/dist/assets/versioned-transactions.html.8ea1a104.js
function is (line 28) | function is(ds,us){const n=r("ExternalLinkIcon");return p(),l(c,null,[w,...
FILE: docs/.vuepress/dist/assets/versioned-transactions.html.dd6b2982.js
function pe (line 28) | function pe(me,be){const n=r("ExternalLinkIcon");return i(),l(c,null,[T,...
Copy disabled (too large)
Download .json
Condensed preview — 1968 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (98,705K chars).
[
{
"path": ".ci/.exclude_files",
"chars": 700,
"preview": ".venv/*\nhello.py\n.ci/scripts.py\ncode/nfts/upload-arweave/upload-arweave.en.py\ncode/local-development/airdropping-sol/air"
},
{
"path": ".ci/scripts.py",
"chars": 1535,
"preview": "import os\nimport re\nimport subprocess\nfrom concurrent.futures import ThreadPoolExecutor\n\nexclude_file = '.ci/.exclude_fi"
},
{
"path": ".devcontainer/Dockerfile",
"chars": 968,
"preview": "# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.209.3/containers/typescript-no"
},
{
"path": ".devcontainer/devcontainer.json",
"chars": 1079,
"preview": "// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:\n// https://github.co"
},
{
"path": ".github/dependabot.yml",
"chars": 586,
"preview": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where "
},
{
"path": ".github/workflows/python.yml",
"chars": 996,
"preview": "name: Test Python Files\n\non:\n schedule:\n - cron: \"0 0 * * *\"\n push:\n branches:\n - master\n pull_request:\n "
},
{
"path": ".gitignore",
"chars": 76,
"preview": "node_modules\n.temp\n.cache\n.idea\n.DS_Store\n**/*/target\n.vscode\n.history\n.venv"
},
{
"path": ".husky/.gitignore",
"chars": 2,
"preview": "_\n"
},
{
"path": ".husky/pre-commit",
"chars": 58,
"preview": "#!/bin/sh\n. \"$(dirname \"$0\")/_/husky.sh\"\n\nnpx lint-staged\n"
},
{
"path": ".prettierignore",
"chars": 41,
"preview": "docs\nnode_modules\n.github\n.devcontainer \n"
},
{
"path": "CONTRIBUTING.md",
"chars": 4125,
"preview": "# Contributing to the Cookbook\n\n👍🎉First off, thanks for taking the time to contribute🎉👍\n\nThe following is a set of guide"
},
{
"path": "README.md",
"chars": 2327,
"preview": "# Solana Cookbook\n\nThe Solana Cookbook is meant to house small digestible code snippets\nfor someone that has no experien"
},
{
"path": "code/account-maps/deriving-pda/anchor-pda-map.preview.rs",
"chars": 1056,
"preview": "#[derive(Accounts)]\n#[instruction(blog_account_bump: u8)]\npub struct InitializeBlog<'info> {\n #[account(\n init"
},
{
"path": "code/account-maps/deriving-pda/anchor-pda-map.rs",
"chars": 2299,
"preview": "use anchor_lang::prelude::*;\n\ndeclare_id!(\"2vD2HBhLnkcYcKxnxLjFYXokHdcsgJnyEXGnSpAX376e\");\n\n#[program]\npub mod mapping_p"
},
{
"path": "code/account-maps/deriving-pda/client.preview.ts",
"chars": 831,
"preview": "async () => {\n const connection = new Connection(\"http://localhost:8899\", \"confirmed\");\n\n const [blogAccount] = await "
},
{
"path": "code/account-maps/deriving-pda/client.ts",
"chars": 1270,
"preview": "import * as borsh from \"@project-serum/borsh\";\nimport { PublicKey } from \"@solana/web3.js\";\n\nexport const BLOG_ACCOUNT_D"
},
{
"path": "code/account-maps/deriving-pda/vanilla-pda-map.preview.rs",
"chars": 4466,
"preview": "fn process_create_post(\n accounts: &[AccountInfo],\n slug: String,\n title: String,\n content: String,\n prog"
},
{
"path": "code/account-maps/deriving-pda/vanilla-pda-map.rs",
"chars": 8484,
"preview": "use std::convert::TryInto;\nuse borsh::{BorshDeserialize, BorshSerialize};\nuse solana_program::{\n sysvar::{rent::Rent,"
},
{
"path": "code/account-maps/trivial/client.preview.ts",
"chars": 1306,
"preview": "const insertABIx = new TransactionInstruction({\n programId: MY_PROGRAM_ID,\n keys: [\n {\n pubkey: userA.publicKe"
},
{
"path": "code/account-maps/trivial/client.ts",
"chars": 3549,
"preview": "import {\n Connection,\n Keypair,\n LAMPORTS_PER_SOL,\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionInstruct"
},
{
"path": "code/account-maps/trivial/vanilla-trivial-map.preview.rs",
"chars": 2739,
"preview": "fn process_init_map(accounts: &[AccountInfo], program_id: &Pubkey) -> ProgramResult {\n let account_info_iter = &mut a"
},
{
"path": "code/account-maps/trivial/vanilla-trivial-map.rs",
"chars": 5083,
"preview": "use std::{collections::BTreeMap};\nuse thiserror::Error;\nuse borsh::{BorshSerialize, BorshDeserialize};\nuse num_traits::F"
},
{
"path": "code/accounts/close-account/client/close-account.adapter.en.tsx",
"chars": 2186,
"preview": "import {\n createCloseAccountInstruction,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { PublicKey, Transactio"
},
{
"path": "code/accounts/close-account/client/close-account.adapter.preview.en.tsx",
"chars": 1003,
"preview": "async function closeAcc() {\n if (!publicKey) throw new WalletNotConnectedError();\n try {\n // Define the token addre"
},
{
"path": "code/accounts/close-account/client/main.en.ts",
"chars": 1797,
"preview": "import {\n Keypair,\n Connection,\n Transaction,\n SystemProgram,\n TransactionInstruction,\n PublicKey,\n clusterApiUrl"
},
{
"path": "code/accounts/close-account/client/main.preview.en.ts",
"chars": 675,
"preview": "// 1. create an account to your program\nlet createNewAccountTx = new Transaction().add(\n SystemProgram.createAccount({\n"
},
{
"path": "code/accounts/close-account/program/Cargo.toml",
"chars": 148,
"preview": "[package]\nedition = \"2018\"\nname = \"close-account\"\nversion = \"0.1.0\"\n\n[dependencies]\nsolana-program = \"=1.8.5\"\n\n[lib]\ncra"
},
{
"path": "code/accounts/close-account/program/Xargo.toml",
"chars": 61,
"preview": "[target.bpfel-unknown-unknown.dependencies.std]\nfeatures = []"
},
{
"path": "code/accounts/close-account/program/src/lib.preview.rs",
"chars": 322,
"preview": "let dest_starting_lamports = dest_account_info.lamports();\n**dest_account_info.lamports.borrow_mut() = dest_starting_lam"
},
{
"path": "code/accounts/close-account/program/src/lib.rs",
"chars": 867,
"preview": "use solana_program::{\n account_info::next_account_info, account_info::AccountInfo, entrypoint,\n entrypoint::Progra"
},
{
"path": "code/accounts/create-account-with-seed/creation/main.en.rs",
"chars": 2140,
"preview": "use solana_client::rpc_client::RpcClient;\nuse solana_program::pubkey::Pubkey;\nuse solana_program::system_instruction;\nus"
},
{
"path": "code/accounts/create-account-with-seed/creation/main.en.ts",
"chars": 1347,
"preview": "import {\n PublicKey,\n SystemProgram,\n Connection,\n clusterApiUrl,\n Transaction,\n Keypair,\n sendAndConfirmTransact"
},
{
"path": "code/accounts/create-account-with-seed/creation/main.preview.en.rs",
"chars": 427,
"preview": "let derived_pubkey = Pubkey::create_with_seed(&base_pubkey, seed, &program_id).unwrap();\n\nlet ix = system_instruction::c"
},
{
"path": "code/accounts/create-account-with-seed/creation/main.preview.en.ts",
"chars": 367,
"preview": "const tx = new Transaction().add(\n SystemProgram.createAccountWithSeed({\n fromPubkey: feePayer.publicKey, // funder\n"
},
{
"path": "code/accounts/create-account-with-seed/generate/main.en.rs",
"chars": 379,
"preview": "use solana_program::pubkey::Pubkey;\nuse solana_sdk::signature::{Keypair, Signer};\n\nfn main() {\n let base_pubkey = Key"
},
{
"path": "code/accounts/create-account-with-seed/generate/main.en.ts",
"chars": 355,
"preview": "import { PublicKey, SystemProgram } from \"@solana/web3.js\";\n\n(async () => {\n let basePubkey = new PublicKey(\n \"G2FAb"
},
{
"path": "code/accounts/create-account-with-seed/generate/main.preview.en.rs",
"chars": 379,
"preview": "use solana_program::pubkey::Pubkey;\nuse solana_sdk::signature::{Keypair, Signer};\n\nfn main() {\n let base_pubkey = Key"
},
{
"path": "code/accounts/create-account-with-seed/generate/main.preview.en.ts",
"chars": 55,
"preview": "PublicKey.createWithSeed(basePubkey, seed, programId);\n"
},
{
"path": "code/accounts/create-account-with-seed/transfer/main.en.ts",
"chars": 1347,
"preview": "import {\n PublicKey,\n SystemProgram,\n Connection,\n clusterApiUrl,\n Transaction,\n Keypair,\n sendAndConfirmTransact"
},
{
"path": "code/accounts/create-account-with-seed/transfer/main.preview.en.ts",
"chars": 372,
"preview": "const tx = new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: derived,\n basePubkey: basePubkey,\n to"
},
{
"path": "code/accounts/create-system-account/create-system-account.en.rs",
"chars": 2080,
"preview": "use solana_client::rpc_client::RpcClient;\nuse solana_program::system_instruction;\nuse solana_sdk::commitment_config::Com"
},
{
"path": "code/accounts/create-system-account/create-system-account.en.ts",
"chars": 1252,
"preview": "import {\n SystemProgram,\n Keypair,\n Transaction,\n sendAndConfirmTransaction,\n Connection,\n clusterApiUrl,\n LAMPOR"
},
{
"path": "code/accounts/create-system-account/create-system-account.preview.en.rs",
"chars": 821,
"preview": "let create_account_ix = system_instruction::create_account(\n &from_pubkey,\n &new_account_pubkey,\n rent_exemptio"
},
{
"path": "code/accounts/create-system-account/create-system-account.preview.en.ts",
"chars": 423,
"preview": "const createAccountParams = {\n fromPubkey: fromKeypair.publicKey,\n newAccountPubkey: newAccountKeypair.publicKey,\n la"
},
{
"path": "code/accounts/get-balance/main.en.cpp",
"chars": 491,
"preview": "// clang++ get_balance.cpp -o get_balance -std=c++17 -lssl -lcrypto -lsodium\n\n#include \"solana.hpp\"\n\nusing namespace man"
},
{
"path": "code/accounts/get-balance/main.en.py",
"chars": 212,
"preview": "from solders.keypair import Keypair\nfrom solana.rpc.api import Client\n\nclient = Client(\"https://api.devnet.solana.com\")\n"
},
{
"path": "code/accounts/get-balance/main.en.rs",
"chars": 644,
"preview": "use solana_client::rpc_client::RpcClient;\nuse solana_program::native_token::LAMPORTS_PER_SOL;\nuse solana_program::pubkey"
},
{
"path": "code/accounts/get-balance/main.en.ts",
"chars": 365,
"preview": "import {\n clusterApiUrl,\n Connection,\n PublicKey,\n LAMPORTS_PER_SOL,\n} from \"@solana/web3.js\";\n\n(async () => {\n con"
},
{
"path": "code/accounts/get-balance/main.preview.en.cpp",
"chars": 198,
"preview": "Connection connection(\"https://api.devnet.solana.com\");\n\nauto key_pair = Keypair::generate();\nauto public_key = key_pair"
},
{
"path": "code/accounts/get-balance/main.preview.en.py",
"chars": 134,
"preview": "client = Client(\"https://api.devnet.solana.com\")\n\nkey_pair = Keypair()\npublic_key = key_pair.pubkey()\n\nclient.get_balanc"
},
{
"path": "code/accounts/get-balance/main.preview.en.rs",
"chars": 42,
"preview": "connection.get_balance(&wallet).unwrap();\n"
},
{
"path": "code/accounts/get-balance/main.preview.en.ts",
"chars": 80,
"preview": "console.log(`${(await connection.getBalance(wallet)) / LAMPORTS_PER_SOL} SOL`);\n"
},
{
"path": "code/accounts/program-derived-address/create-a-pda/client/main.en.ts",
"chars": 1583,
"preview": "import {\n clusterApiUrl,\n Connection,\n Keypair,\n Transaction,\n SystemProgram,\n PublicKey,\n TransactionInstruction"
},
{
"path": "code/accounts/program-derived-address/create-a-pda/client/main.preview.en.ts",
"chars": 658,
"preview": "let tx = new Transaction().add(\n new TransactionInstruction({\n keys: [\n {\n pubkey: feePayer.publicKey,\n "
},
{
"path": "code/accounts/program-derived-address/create-a-pda/program/Cargo.toml",
"chars": 150,
"preview": "[package]\nedition = \"2018\"\nname = \"creation-of-pda\"\nversion = \"0.1.0\"\n\n[dependencies]\nsolana-program = \"=1.8.5\"\n\n[lib]\nc"
},
{
"path": "code/accounts/program-derived-address/create-a-pda/program/Xargo.toml",
"chars": 61,
"preview": "[target.bpfel-unknown-unknown.dependencies.std]\nfeatures = []"
},
{
"path": "code/accounts/program-derived-address/create-a-pda/program/src/lib.preview.rs",
"chars": 329,
"preview": "invoke_signed(\n &system_instruction::create_account(\n &payer_account_info.key,\n &pda_account_info.key,\n"
},
{
"path": "code/accounts/program-derived-address/create-a-pda/program/src/lib.rs",
"chars": 1284,
"preview": "use solana_program::{\n account_info::next_account_info, account_info::AccountInfo, entrypoint,\n entrypoint::Progra"
},
{
"path": "code/accounts/program-derived-address/derived-a-pda/find-program-address.en.rs",
"chars": 304,
"preview": "use solana_program::pubkey::Pubkey;\nuse std::str::FromStr;\n\nfn main() {\n let program_id = Pubkey::from_str(\"G1DCNUQTS"
},
{
"path": "code/accounts/program-derived-address/derived-a-pda/find-program-address.en.ts",
"chars": 474,
"preview": "import { PublicKey } from \"@solana/web3.js\";\n\n(async () => {\n const programId = new PublicKey(\n \"G1DCNUQTSGHehwdLCAm"
},
{
"path": "code/accounts/program-derived-address/sign-a-pda/client/main.en.ts",
"chars": 1894,
"preview": "import {\n clusterApiUrl,\n Connection,\n Keypair,\n Transaction,\n SystemProgram,\n PublicKey,\n TransactionInstruction"
},
{
"path": "code/accounts/program-derived-address/sign-a-pda/client/main.preview.en.ts",
"chars": 671,
"preview": "let tx = new Transaction().add(\n new TransactionInstruction({\n keys: [\n {\n pubkey: pda,\n // Leave"
},
{
"path": "code/accounts/program-derived-address/sign-a-pda/program/.gitignore",
"chars": 7,
"preview": "/target"
},
{
"path": "code/accounts/program-derived-address/sign-a-pda/program/Cargo.toml",
"chars": 150,
"preview": "[package]\nedition = \"2018\"\nname = \"creation-of-pda\"\nversion = \"0.1.0\"\n\n[dependencies]\nsolana-program = \"=1.8.5\"\n\n[lib]\nc"
},
{
"path": "code/accounts/program-derived-address/sign-a-pda/program/Xargo.toml",
"chars": 61,
"preview": "[target.bpfel-unknown-unknown.dependencies.std]\nfeatures = []"
},
{
"path": "code/accounts/program-derived-address/sign-a-pda/program/src/lib.preview.rs",
"chars": 315,
"preview": "invoke_signed(\n &system_instruction::transfer(\n &pda_account_info.key,\n &to_account_info.key,\n 1"
},
{
"path": "code/accounts/program-derived-address/sign-a-pda/program/src/lib.rs",
"chars": 1089,
"preview": "use solana_program::{\n account_info::next_account_info, account_info::AccountInfo, entrypoint,\n entrypoint::Progra"
},
{
"path": "code/accounts/rent-exemption/rent-exemption.en.rs",
"chars": 487,
"preview": "use solana_client::rpc_client::RpcClient;\nuse solana_sdk::commitment_config::CommitmentConfig;\n\nfn main() {\n let rpc_"
},
{
"path": "code/accounts/rent-exemption/rent-exemption.en.sh",
"chars": 16,
"preview": "solana rent 1500"
},
{
"path": "code/accounts/rent-exemption/rent-exemption.en.ts",
"chars": 388,
"preview": "import { Connection, clusterApiUrl } from \"@solana/web3.js\";\n\n(async () => {\n const connection = new Connection(cluster"
},
{
"path": "code/anchor/calculating-account-space-size/Cargo.toml",
"chars": 241,
"preview": "[package]\nname = \"calculating-account-space-size\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n[lib]\ncrate-type = [\"cdylib\", \"lib"
},
{
"path": "code/anchor/calculating-account-space-size/Xargo.toml",
"chars": 62,
"preview": "[target.bpfel-unknown-unknown.dependencies.std]\nfeatures = []\n"
},
{
"path": "code/anchor/calculating-account-space-size/src/account.preview.lib.rs",
"chars": 499,
"preview": "#[account]\npub struct Account {\n pub unsigned8bit: u8,\n pub unsigned16bit: u16,\n pub unsigned32bit: u32,\n pu"
},
{
"path": "code/anchor/calculating-account-space-size/src/deserializer.preview.lib.rs",
"chars": 329,
"preview": "#[derive(Accounts)]\n#[instruction(text: String, vector_capacity: u16)]\npub struct InitializeAccount<'info> {\n #[accou"
},
{
"path": "code/anchor/calculating-account-space-size/src/implementation-space.preview.lib.rs",
"chars": 433,
"preview": "impl Account {\n fn space(text: &str, vector_capacity: u16) -> usize {\n // discriminator\n 8 +\n //"
},
{
"path": "code/anchor/calculating-account-space-size/src/lib.rs",
"chars": 1654,
"preview": "use anchor_lang::prelude::*;\n\n#[program]\npub mod program {\n use super::*;\n pub fn instruction(ctx: Context<Initial"
},
{
"path": "code/anchor/define-program/Cargo.toml",
"chars": 225,
"preview": "[package]\nname = \"define-program\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n[lib]\ncrate-type = [\"cdylib\", \"lib\"]\n\n[features]\nn"
},
{
"path": "code/anchor/define-program/Xargo.toml",
"chars": 62,
"preview": "[target.bpfel-unknown-unknown.dependencies.std]\nfeatures = []\n"
},
{
"path": "code/anchor/define-program/src/define-account.preview.lib.rs",
"chars": 54,
"preview": "#[account]\npub struct Account {\n pub data: bool,\n}\n"
},
{
"path": "code/anchor/define-program/src/define-deserializer.preview.lib.rs",
"chars": 311,
"preview": "#[derive(Accounts)]\npub struct AccountsDeserializer<'info> {\n // account used by the instruction\n #[account(init, "
},
{
"path": "code/anchor/define-program/src/define-program-and-instructions.preview.lib.rs",
"chars": 527,
"preview": "#[program]\npub mod program {\n use super::*;\n // example instruction that receives\n // an account and a boolean "
},
{
"path": "code/anchor/define-program/src/lib.rs",
"chars": 1887,
"preview": "use anchor_lang::prelude::*;\n\n#[program]\npub mod program {\n use super::*;\n // example instruction that receives\n "
},
{
"path": "code/anchor/testing-with-anchor/client/testing-with-anchor.js",
"chars": 1261,
"preview": "const anchor = require(\"@project-serum/anchor\");\n\nconst { SystemProgram } = anchor.web3;\n\ndescribe(\"testing-with-anchor\""
},
{
"path": "code/anchor/testing-with-anchor/client/testing_with_anchor.py",
"chars": 2269,
"preview": "from solders.keypair import Keypair\nfrom solders.system_program import ID as SYS_PROGRAM_ID\n\nfrom pytest import fixture,"
},
{
"path": "code/anchor/testing-with-anchor/program/Cargo.toml",
"chars": 316,
"preview": "[package]\nname = \"testing-with-anchor\"\nversion = \"0.1.0\"\ndescription = \"Created with Anchor\"\nedition = \"2018\"\n\n[lib]\ncra"
},
{
"path": "code/anchor/testing-with-anchor/program/Xargo.toml",
"chars": 62,
"preview": "[target.bpfel-unknown-unknown.dependencies.std]\nfeatures = []\n"
},
{
"path": "code/anchor/testing-with-anchor/program/src/define-increment.preview.lib.rs",
"chars": 480,
"preview": "#[program]\npub mod testing_with_anchor {\n use super::*;\n pub fn initialize(ctx: Context<Initialize>, authority: Pu"
},
{
"path": "code/anchor/testing-with-anchor/program/src/lib.rs",
"chars": 1119,
"preview": "use anchor_lang::prelude::*;\n//use std::collections::HashMap;\n\ndeclare_id!(\"Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"
},
{
"path": "code/basic-transactions/calc-tx-cost/calc-tx-cost.en.ts",
"chars": 800,
"preview": "import {\n clusterApiUrl,\n Connection,\n Keypair,\n SystemProgram,\n Transaction,\n} from \"@solana/web3.js\";\n\n(async () "
},
{
"path": "code/basic-transactions/calc-tx-cost/calc-tx-cost.preview.en.ts",
"chars": 495,
"preview": "const recentBlockhash = await connection.getRecentBlockhash();\n\nconst transaction = new Transaction({\n recentBlockhash:"
},
{
"path": "code/basic-transactions/calc-tx-cost/calc-tx-est-fees-for-message.en.ts",
"chars": 1342,
"preview": "import {\n clusterApiUrl,\n Connection,\n Keypair,\n Message,\n SystemProgram,\n SYSTEM_INSTRUCTION_LAYOUTS,\n Transacti"
},
{
"path": "code/basic-transactions/calc-tx-cost/calc-tx-est-fees-for-message.preview.en.ts",
"chars": 216,
"preview": "const message = new Message(messageParams);\n\nconst fees = await connection.getFeeForMessage(message);\nconsole.log(`Estim"
},
{
"path": "code/basic-transactions/calc-tx-cost/calc-tx-est-fees.en.ts",
"chars": 803,
"preview": "import {\n clusterApiUrl,\n Connection,\n Keypair,\n SystemProgram,\n Transaction,\n} from \"@solana/web3.js\";\n\n(async () "
},
{
"path": "code/basic-transactions/calc-tx-cost/calc-tx-est-fees.preview.en.ts",
"chars": 442,
"preview": "const recentBlockhash = await connection.getLatestBlockhash();\n\nconst transaction = new Transaction({\n recentBlockhash:"
},
{
"path": "code/basic-transactions/compute-budget/computeBudget.en.rs",
"chars": 2111,
"preview": "//! @brief Example Budget Management\n\nuse solana_client::rpc_client::RpcClient;\nuse solana_program::{instruction::Instru"
},
{
"path": "code/basic-transactions/compute-budget/computeBudget.en.tsx",
"chars": 1264,
"preview": "import { BN } from \"@project-serum/anchor\";\nimport {\n Keypair,\n Connection,\n LAMPORTS_PER_SOL,\n sendAndConfirmTransa"
},
{
"path": "code/basic-transactions/compute-budget/computeBudget.preview.en.rs",
"chars": 459,
"preview": "let txn = submit_transaction(\n &connection,\n &wallet_signer,\n // Array of instructions: 0: Set Compute Unit Limt, 1: "
},
{
"path": "code/basic-transactions/compute-budget/computeBudget.preview.en.tsx",
"chars": 405,
"preview": "const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({ \n units: 1000000 \n});\n\nconst addPriorityFee = Com"
},
{
"path": "code/basic-transactions/compute-budget/log_output.txt",
"chars": 271,
"preview": "[ 1] Program ComputeBudget111111111111111111111111111111 invoke [1]\n[ 2] Program ComputeBudget11111111111111111111111111"
},
{
"path": "code/basic-transactions/compute-budget/solana_program.rs",
"chars": 485,
"preview": "//! entry point for instruction execution\n\nuse solana_program::{\n account_info::AccountInfo, entrypoint, entrypoint::"
},
{
"path": "code/basic-transactions/memo/memo.adapter.en.tsx",
"chars": 1375,
"preview": "import { WalletNotConnectedError } from \"@solana/wallet-adapter-base\";\nimport { useConnection, useWallet } from \"@solana"
},
{
"path": "code/basic-transactions/memo/memo.adapter.preview.en.tsx",
"chars": 568,
"preview": "const transaction = new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: publicKey,\n toPubkey: Keypair.g"
},
{
"path": "code/basic-transactions/memo/memo.en.sh",
"chars": 169,
"preview": "solana transfer --from <KEYPAIR> <RECIPIENT_ACCOUNT_ADDRESS> 0.5 --allow-unfunded-recipient --url https://api.devnet.sol"
},
{
"path": "code/basic-transactions/memo/memo.en.ts",
"chars": 1203,
"preview": "import {\n Connection,\n Keypair,\n SystemProgram,\n LAMPORTS_PER_SOL,\n PublicKey,\n Transaction,\n TransactionInstruct"
},
{
"path": "code/basic-transactions/memo/memo.preview.en.ts",
"chars": 564,
"preview": "const transferTransaction = new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: fromKeypair.publicKey,\n "
},
{
"path": "code/basic-transactions/sending-sol/sending-sol.adapter.en.tsx",
"chars": 1036,
"preview": "import { WalletNotConnectedError } from \"@solana/wallet-adapter-base\";\nimport { useConnection, useWallet } from \"@solana"
},
{
"path": "code/basic-transactions/sending-sol/sending-sol.adapter.preview.en.tsx",
"chars": 303,
"preview": "const transaction = new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: publicKey,\n toPubkey: Keypair.g"
},
{
"path": "code/basic-transactions/sending-sol/sending-sol.en.py",
"chars": 674,
"preview": "from solana.rpc.api import Client\nfrom solders.keypair import Keypair\nfrom solana.transaction import Transaction\nfrom so"
},
{
"path": "code/basic-transactions/sending-sol/sending-sol.en.rs",
"chars": 1941,
"preview": "use solana_client::rpc_client::RpcClient;\nuse solana_program::system_instruction;\nuse solana_sdk::commitment_config::Com"
},
{
"path": "code/basic-transactions/sending-sol/sending-sol.en.sh",
"chars": 152,
"preview": "solana transfer --from <KEYPAIR> <RECIPIENT_ACCOUNT_ADDRESS> 0.001 --allow-unfunded-recipient --url https://api.devnet.s"
},
{
"path": "code/basic-transactions/sending-sol/sending-sol.en.ts",
"chars": 848,
"preview": "import {\n Connection,\n Keypair,\n SystemProgram,\n LAMPORTS_PER_SOL,\n Transaction,\n sendAndConfirmTransaction,\n} fro"
},
{
"path": "code/basic-transactions/sending-sol/sending-sol.preview.en.py",
"chars": 197,
"preview": "transaction = Transaction().add(transfer(TransferParams(\n from_pubkey=sender.pubkey(),\n to_pubkey=receiver.pubkey("
},
{
"path": "code/basic-transactions/sending-sol/sending-sol.preview.en.ts",
"chars": 272,
"preview": "const transferTransaction = new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: fromKeypair.publicKey,\n "
},
{
"path": "code/basic-transactions/sending-sol/sending-sol.preview.rs",
"chars": 59,
"preview": "system_instruction::transfer(&from, &to, lamports_to_send);"
},
{
"path": "code/basic-transactions/sending-spl-token/sending-spl-token.adapter.en.tsx",
"chars": 1198,
"preview": "import { WalletNotConnectedError } from \"@solana/wallet-adapter-base\";\nimport { useConnection, useWallet } from \"@solana"
},
{
"path": "code/basic-transactions/sending-spl-token/sending-spl-token.adapter.preview.en.tsx",
"chars": 334,
"preview": "const transaction = new Transaction().add(\n Token.createTransferInstruction(\n TOKEN_PROGRAM_ID,\n fromTokenAccount"
},
{
"path": "code/basic-transactions/sending-spl-token/sending-spl-token.en.sh",
"chars": 427,
"preview": "$ spl-token transfer AQoKYV7tYpTrFZN6P5oUufbQKAUr9mNYGe1TTJC9wajM 50 vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg\nTransfe"
},
{
"path": "code/basic-transactions/sending-spl-token/sending-spl-token.en.ts",
"chars": 2011,
"preview": "import {\n Connection,\n clusterApiUrl,\n Keypair,\n LAMPORTS_PER_SOL,\n Transaction,\n sendAndConfirmTransaction,\n} fro"
},
{
"path": "code/basic-transactions/sending-spl-token/sending-spl-token.preview.en.ts",
"chars": 400,
"preview": "// Add token transfer instructions to transaction\nconst transaction = new web3.Transaction().add(\n splToken.Token.creat"
},
{
"path": "code/data-migration/account-v0.en.rs",
"chars": 4586,
"preview": "//! @brief account_state manages account data\n\nuse arrayref::{array_ref, array_refs};\nuse borsh::{BorshDeserialize, Bors"
},
{
"path": "code/data-migration/account-v0.preview.en.rs",
"chars": 327,
"preview": "#[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]\npub struct AccountContentCurrent {\n pub someva"
},
{
"path": "code/data-migration/account-v1.en.rs",
"chars": 5166,
"preview": "//! @brief account_state manages account data\n\nuse arrayref::{array_ref, array_refs};\nuse borsh::{BorshDeserialize, Bors"
},
{
"path": "code/data-migration/account-v1.preview.en.rs",
"chars": 723,
"preview": "/// Current state (DATA_VERSION 1). If version changes occur, this\n/// should be copied to another (see AccountContentOl"
},
{
"path": "code/data-migration/rust.instruction.en.rs",
"chars": 923,
"preview": "//! instruction Contains the main ProgramInstruction enum\n\nuse {\n crate::error::DataVersionError,\n borsh::{BorshDe"
},
{
"path": "code/data-migration/rust.instruction.preview.en.rs",
"chars": 524,
"preview": "impl ProgramInstruction {\n /// Unpack inbound buffer to associated Instruction\n /// The expected format for input "
},
{
"path": "code/data-migration/rust.instruction1.en.rs",
"chars": 1260,
"preview": "//! instruction Contains the main VersionProgramInstruction enum\n\nuse {\n crate::error::DataVersionError,\n borsh::{"
},
{
"path": "code/data-migration/rust.processor.en.rs",
"chars": 3370,
"preview": "//! Resolve instruction and execute\n\nuse crate::{\n account_state::ProgramAccountState, error::DataVersionError, instr"
},
{
"path": "code/data-migration/rust.processor.preview.en.rs",
"chars": 2848,
"preview": "fn check_account_ownership(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult {\n // Accounts must be own"
},
{
"path": "code/data-migration/rust.processor1.en.rs",
"chars": 4081,
"preview": "//! Resolve instruction and execute\n\nuse crate::{\n account_state::ProgramAccountState, error::DataVersionError,\n i"
},
{
"path": "code/feature-parity-testing/deactivate_one.rs",
"chars": 1130,
"preview": "#[test]\nfn test_base_pass() {\n // Run with all features activated (default for TestValidatorGenesis)\n let inv_feat"
},
{
"path": "code/feature-parity-testing/deactivate_scfs.rs",
"chars": 1471,
"preview": "#[test]\nfn test_devnet_parity_pass() {\n // Use gadget-scfs to get all deactivated features from devnet\n // must ha"
},
{
"path": "code/feature-parity-testing/deactivate_two.rs",
"chars": 1381,
"preview": "#[test]\nfn test_deactivate_tx_cu_pass() {\n // Run with all features activated except 'transaction wide compute cap'\n "
},
{
"path": "code/feature-parity-testing/preamble.rs",
"chars": 4134,
"preview": "#[cfg(test)]\nmod tests {\n use std::{error, path::PathBuf, str::FromStr};\n\n // Use gadget-scfs to get interegate fe"
},
{
"path": "code/feature-parity-testing/preamble_short.rs",
"chars": 2520,
"preview": "/// Setup the test validator passing features\n/// you want to deactivate before running transactions\npub fn setup_valida"
},
{
"path": "code/get-program-accounts/basic/basic.en.rs",
"chars": 560,
"preview": "use solana_client::rpc_client::RpcClient;\nuse solana_program::pubkey::Pubkey;\nuse solana_sdk::commitment_config::Commitm"
},
{
"path": "code/get-program-accounts/basic/basic.en.sh",
"chars": 696,
"preview": "curl https://api.devnet.solana.com -X POST -H \"Content-Type: application/json\" -d '\n {\"jsonrpc\":\"2.0\", \"id\":1, \"method\":"
},
{
"path": "code/get-program-accounts/basic/basic.en.ts",
"chars": 1244,
"preview": "import { clusterApiUrl, Connection, PublicKey } from \"@solana/web3.js\";\n\n(async () => {\n const MY_PROGRAM_ID = new Publ"
},
{
"path": "code/get-program-accounts/dataSlice/dataSlice.en.rs",
"chars": 2449,
"preview": "use solana_client::{\n rpc_client::RpcClient, \n rpc_filter::{RpcFilterType, Memcmp, MemcmpEncodedBytes, MemcmpEncoding}"
},
{
"path": "code/get-program-accounts/dataSlice/dataSlice.en.sh",
"chars": 2116,
"preview": "# Note: encoding only available for \"base58\", \"base64\" or \"base64+zstd\"\ncurl http://api.mainnet-beta.solana.com -X POST "
},
{
"path": "code/get-program-accounts/dataSlice/dataSlice.en.ts",
"chars": 1957,
"preview": "import { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { clusterApiUrl, Connection } from \"@solana/web3.js\";\n\n(asy"
},
{
"path": "code/get-program-accounts/memcmp/memcmp.en.rs",
"chars": 2294,
"preview": "use solana_client::{\n rpc_client::RpcClient, \n rpc_filter::{RpcFilterType, Memcmp, MemcmpEncodedBytes, MemcmpEncoding}"
},
{
"path": "code/get-program-accounts/memcmp/memcmp.en.sh",
"chars": 1532,
"preview": "curl http://api.mainnet-beta.solana.com -X POST -H \"Content-Type: application/json\" -d '\n {\n \"jsonrpc\": \"2.0\",\n \""
},
{
"path": "code/get-program-accounts/memcmp/memcmp.en.ts",
"chars": 1547,
"preview": "import { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { clusterApiUrl, Connection } from \"@solana/web3.js\";\n\n(asy"
},
{
"path": "code/jupiter/executeapi/main.en.ts",
"chars": 427,
"preview": "\n(async() => {\n for (let serializedTransaction of [\n setupTransaction,\n swapTransaction,\n cleanupTransaction,\n"
},
{
"path": "code/jupiter/executeapi/main.preview.en.ts",
"chars": 194,
"preview": "const transaction = Transaction.from(\n Buffer.from(serializedTransaction, \"base64\")\n);\n\nconst txid = await connection.s"
},
{
"path": "code/jupiter/getRoutesapi/main.en.ts",
"chars": 298,
"preview": "(async() => {\n const { data } = await(\n await fetch(\n \"https://quote-api.jup.ag/v1/quote?inputMint=So1111111111"
},
{
"path": "code/jupiter/getRoutesapi/main.preview.en.ts",
"chars": 214,
"preview": "await fetch(\n 'https://quote-api.jup.ag/v1/quote?inputMint=So11111111111111111111111111111111111111112&outputMint=EPj"
},
{
"path": "code/jupiter/getTxapi/main.en.ts",
"chars": 487,
"preview": "(async() => {\n const transactions = await(\n fetch(\"https://quote-api.jup.ag/v1/swap\", {\n method: \"POST\",\n "
},
{
"path": "code/jupiter/getTxapi/main.preview.en.ts",
"chars": 294,
"preview": "await fetch(\"https://quote-api.jup.ag/v1/swap\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\","
},
{
"path": "code/jupiter/inputSetup/main.en.ts",
"chars": 538,
"preview": "import { TOKEN_LIST_URL } from \"@jup-ag/core\";\n\nconst JupiterApp = () => {\n const [tokens, setTokens] = useState<Token["
},
{
"path": "code/jupiter/inputSetup/main.preview.en.ts",
"chars": 217,
"preview": "const [inputMint] = useState<PublicKey>(\n new PublicKey(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\")\n);\nconst [outpu"
},
{
"path": "code/jupiter/installationapi/main.en.ts",
"chars": 243,
"preview": "import { Connection, Keypair, Transaction } from \"@solana/web3.js\";\nimport fetch from \"cross-fetch\";\nimport { Wallet } f"
},
{
"path": "code/jupiter/installationapi/main.preview.en.ts",
"chars": 68,
"preview": "const connection = new Connection(\"https://ssc-dao.genesysgo.net\");\n"
},
{
"path": "code/jupiter/loading-instance/main.en.ts",
"chars": 623,
"preview": "import { Jupiter, RouteInfo, TOKEN_LIST_URL } from \"@jup-ag/core\";\nimport { Connection, PublicKey, Keypair } from \"@sola"
},
{
"path": "code/jupiter/loading-instance/main.preview.en.ts",
"chars": 93,
"preview": "const jupiter = await Jupiter.load({\n connection,\n cluster: ENV,\n user: USER_KEYPAIR,\n});\n"
},
{
"path": "code/jupiter/providerSetup/main.en.ts",
"chars": 1264,
"preview": "import {\n ConnectionProvider,\n WalletProvider,\n useConnection,\n useWallet,\n} from \"@solana/wallet-adapter-react\";\nim"
},
{
"path": "code/jupiter/providerSetup/main.preview.en.ts",
"chars": 309,
"preview": "const JupiterApp = ({ children }) => {\n const { connection } = useConnection();\n const wallet = useWallet();\n\n return"
},
{
"path": "code/jupiter/react-token-list/main.en.ts",
"chars": 307,
"preview": "import { TOKEN_LIST_URL } from \"@jup-ag/core\";\n\nconst JupiterApp = () => {\n const [tokens, setTokens] = useState<Token["
},
{
"path": "code/jupiter/react-token-list/main.preview.en.ts",
"chars": 189,
"preview": "const [tokens, setTokens] = useState<Token[]>([]);\nuseEffect(() => {\n fetch(TOKEN_LIST_URL[ENV])\n .then((response) ="
},
{
"path": "code/jupiter/reactSwap/main.en.ts",
"chars": 2278,
"preview": "import { TOKEN_LIST_URL } from \"@jup-ag/core\";\n\nconst JupiterApp = () => {\n const [tokens, setTokens] = useState<Token["
},
{
"path": "code/jupiter/reactSwap/main.preview.en.ts",
"chars": 562,
"preview": "\n(async() => {\n await exchange({\n wallet: {\n sendTransaction: wallet.sendTransaction,\n publicKey: wallet.p"
},
{
"path": "code/jupiter/retriveapi/main.en.ts",
"chars": 228,
"preview": "const routeMap = await(\n await fetch(\"https://quote-api.jup.ag/v1/route-map\")\n).json();\n\n\nconst allInputMints = Object."
},
{
"path": "code/jupiter/retriveapi/main.preview.en.ts",
"chars": 89,
"preview": "const routeMap = await(\n await fetch(\"https://quote-api.jup.ag/v1/route-map\")\n).json();\n"
},
{
"path": "code/jupiter/route-map/main.en.ts",
"chars": 666,
"preview": "import { Jupiter, RouteInfo, TOKEN_LIST_URL } from \"@jup-ag/core\";\nimport { Connection, PublicKey, Keypair } from \"@sola"
},
{
"path": "code/jupiter/route-map/main.preview.en.ts",
"chars": 40,
"preview": "const routeMap = jupiter.getRouteMap();\n"
},
{
"path": "code/jupiter/routes/main.en.ts",
"chars": 1052,
"preview": "import { Jupiter, RouteInfo, TOKEN_LIST_URL } from \"@jup-ag/core\";\nimport { Connection, PublicKey, Keypair } from \"@sola"
},
{
"path": "code/jupiter/routes/main.preview.en.ts",
"chars": 184,
"preview": "const routes = await jupiter.computeRoutes({\n inputMint: new PublicKey(inputToken), \n outputMint: new PublicKey(output"
},
{
"path": "code/jupiter/swap/main.en.ts",
"chars": 1192,
"preview": "import { Jupiter, RouteInfo, TOKEN_LIST_URL } from \"@jup-ag/core\";\nimport { Connection, PublicKey, Keypair } from \"@sola"
},
{
"path": "code/jupiter/swap/main.preview.en.ts",
"chars": 135,
"preview": "bestRoute = routes.routesInfos[0];\nconst { execute } = await jupiter.exchange({\n bestRoute,\n});\n\n\nconst swapResult = aw"
},
{
"path": "code/jupiter/token-list/main.en.ts",
"chars": 401,
"preview": "import { Jupiter, RouteInfo, TOKEN_LIST_URL } from \"@jup-ag/core\";\nimport { Connection, PublicKey } from \"@solana/web3.j"
},
{
"path": "code/jupiter/token-list/main.preview.en.ts",
"chars": 100,
"preview": "const ENV = \"mainnet-beta\";\nconst tokens: Token[] = await(await fetch(TOKEN_LIST_URL[ENV])).json();\n"
},
{
"path": "code/jupiter/useJupiter/main.en.ts",
"chars": 1202,
"preview": "import { TOKEN_LIST_URL } from \"@jup-ag/core\";\n\nconst JupiterApp = () => {\n const [tokens, setTokens] = useState<Token["
},
{
"path": "code/jupiter/useJupiter/main.preview.en.ts",
"chars": 255,
"preview": "const jupiter = useJupiter({\n amount: 1 * 10 ** 6, \n inputMint,\n outputMint,\n slippage: 1, \n debounceTime: 250, \n})"
},
{
"path": "code/keypairs-and-wallets/check-valid-publickey/check-valid-publickey.cpp",
"chars": 213,
"preview": "#include <iostream>\n#include <solana_sdk.h>\n\nint main()\n{\n auto public_key = PublicKey(\"5oNDL3swdJJF1g9DzJiZ4ynHXgszj"
},
{
"path": "code/keypairs-and-wallets/check-valid-publickey/check-valid-publickey.preview.cpp",
"chars": 128,
"preview": "auto public_key = PublicKey(\"5oNDL3swdJJF1g9DzJiZ4ynHXgszjAEpUkxVYejchzrY\");\nstd::cout << public_key.is_on_curve() << st"
},
{
"path": "code/keypairs-and-wallets/check-valid-publickey/check-valid-publickey.preview.py",
"chars": 98,
"preview": "key = Pubkey.from_string('5oNDL3swdJJF1g9DzJiZ4ynHXgszjAEpUkxVYejchzrY')\nprint(key.is_on_curve())\n"
},
{
"path": "code/keypairs-and-wallets/check-valid-publickey/check-valid-publickey.preview.rs",
"chars": 127,
"preview": "let pubkey = Pubkey::from_str(\"5oNDL3swdJJF1g9DzJiZ4ynHXgszjAEpUkxVYejchzrY\").unwrap();\nprintln!(\"{:?}\", pubkey.is_on_cu"
},
{
"path": "code/keypairs-and-wallets/check-valid-publickey/check-valid-publickey.preview.ts",
"chars": 124,
"preview": "const key = new PublicKey(\"5oNDL3swdJJF1g9DzJiZ4ynHXgszjAEpUkxVYejchzrY\");\nconsole.log(PublicKey.isOnCurve(key.toBytes()"
},
{
"path": "code/keypairs-and-wallets/check-valid-publickey/check-valid-publickey.py",
"chars": 643,
"preview": "from solders.pubkey import Pubkey\n\n# Note that Keypair() will always give a public key that is valid for users\nkey = Pub"
},
{
"path": "code/keypairs-and-wallets/check-valid-publickey/check-valid-publickey.rs",
"chars": 704,
"preview": "use solana_sdk::pubkey::{Pubkey};\nuse std::str::FromStr;\n\nfn main() {\n // Note that Keypair::new() will always give a"
},
{
"path": "code/keypairs-and-wallets/check-valid-publickey/check-valid-publickey.ts",
"chars": 688,
"preview": "import { PublicKey } from \"@solana/web3.js\";\n\n(async function () {\n // Note that Keypair.generate() will always give a "
},
{
"path": "code/keypairs-and-wallets/connect-to-wallet/connect-to-wallet-react.en.tsx",
"chars": 2256,
"preview": "import React, { useMemo, FC, PropsWithChildren } from \"react\";\nimport {\n ConnectionProvider,\n WalletProvider,\n} from \""
},
{
"path": "code/keypairs-and-wallets/connect-to-wallet/connect-to-wallet-react.preview.en.tsx",
"chars": 428,
"preview": "const { wallet } = useWallet();\nconst { setVisible } = useWalletModal();\n\nconst onRequestConnectWallet = () => {\n setVi"
},
{
"path": "code/keypairs-and-wallets/connect-to-wallet/connect-to-wallet-svelte.en.html",
"chars": 916,
"preview": "<script>\n import { walletStore } from \"@svelte-on-solana/wallet-adapter-core\";\n import {\n WalletProvider,\n Walle"
},
{
"path": "code/keypairs-and-wallets/connect-to-wallet/connect-to-wallet-svelte.preview.en.html",
"chars": 304,
"preview": "<script>\n import { walletStore } from \"@svelte-on-solana/wallet-adapter-core\";\n import { WalletMultiButton } from \"@sv"
},
{
"path": "code/keypairs-and-wallets/connect-to-wallet/connect-to-wallet-vue.en.vue",
"chars": 739,
"preview": "<script setup>\nimport { WalletMultiButton } from \"solana-wallets-vue\";\nimport {\n LedgerWalletAdapter,\n PhantomWalletAd"
},
{
"path": "code/keypairs-and-wallets/connect-to-wallet/connect-to-wallet-vue.preview.en.vue",
"chars": 151,
"preview": "<script setup>\nimport { WalletMultiButton } from \"solana-wallets-vue\";\n</script>\n\n<template>\n <wallet-multi-button></wa"
},
{
"path": "code/keypairs-and-wallets/generate-keypair/generate-keypair.en.cpp",
"chars": 322,
"preview": "// clang++ generate_keypair.cpp -o generate_keypair -std=c++17 -lssl -lcrypto -lsodium\n\n#include \"solana.hpp\"\n\nusing nam"
},
{
"path": "code/keypairs-and-wallets/generate-keypair/generate-keypair.en.py",
"chars": 213,
"preview": "from solders.keypair import Keypair\nimport based58\n\nkeypair = Keypair()\nprint(\"Keypair PublicKey: \", keypair.pubkey())\n\n"
},
{
"path": "code/keypairs-and-wallets/generate-keypair/generate-keypair.en.rs",
"chars": 86,
"preview": "use solana_sdk::signature::{Keypair};\n\nfn main() {\n let wallet = Keypair::new();\n}\n"
},
{
"path": "code/keypairs-and-wallets/generate-keypair/generate-keypair.en.sh",
"chars": 75,
"preview": "$ solana-keygen new\n\n# pubkey: 9ZNTfG4NyQgxy2SWjSiQoUyBPEvXT2xo7fKc5hPYYJ7b"
},
{
"path": "code/keypairs-and-wallets/generate-keypair/generate-keypair.en.ts",
"chars": 101,
"preview": "import { Keypair } from \"@solana/web3.js\";\n\n(async () => {\n let keypair = Keypair.generate();\n})();\n"
},
{
"path": "code/keypairs-and-wallets/generate-keypair/generate-keypair.preview.en.cpp",
"chars": 37,
"preview": "auto key_pair = Keypair::generate();\n"
},
{
"path": "code/keypairs-and-wallets/generate-keypair/generate-keypair.preview.en.py",
"chars": 19,
"preview": "keypair = Keypair()"
},
{
"path": "code/keypairs-and-wallets/generate-keypair/generate-keypair.preview.en.rs",
"chars": 28,
"preview": "let wallet = Keypair::new();"
},
{
"path": "code/keypairs-and-wallets/generate-keypair/generate-keypair.preview.en.sh",
"chars": 17,
"preview": "solana-keygen new"
},
{
"path": "code/keypairs-and-wallets/generate-keypair/generate-keypair.preview.en.ts",
"chars": 34,
"preview": "let keypair = Keypair.generate();\n"
},
{
"path": "code/keypairs-and-wallets/generate-mnemonic/from-bip39.preview.py",
"chars": 64,
"preview": "mnemo = Mnemonic(\"english\")\nwords = mnemo.generate(strength=256)"
},
{
"path": "code/keypairs-and-wallets/generate-mnemonic/from-bip39.preview.ts",
"chars": 43,
"preview": "const mnemonic = bip39.generateMnemonic();\n"
},
{
"path": "code/keypairs-and-wallets/generate-mnemonic/from-bip39.py",
"chars": 108,
"preview": "from mnemonic import Mnemonic\n\nmnemo = Mnemonic(\"english\")\nwords = mnemo.generate(strength=256)\nprint(words)"
}
]
// ... and 1768 more files (download for full content)
About this extraction
This page contains the full source code of the solana-dev-adv/solana-cookbook GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1968 files (86.1 MB), approximately 22.7M tokens, and a symbol index with 1254 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.