From 758981c6b2cba205de3296d0ff4085b083b85342 Mon Sep 17 00:00:00 2001 From: ananas Date: Sat, 11 Oct 2025 17:25:44 +0100 Subject: [PATCH 01/11] feat: ctoken pinocchio --- .../setup-and-build-nocheck/action.yml | 139 + .github/actions/setup-and-build/action.yml | 231 +- .github/workflows/cli-v1.yml | 29 +- .github/workflows/cli-v2.yml | 17 +- .github/workflows/forester-tests.yml | 22 +- .github/workflows/js-v2.yml | 52 +- .github/workflows/js.yml | 46 +- ...sdk-tests.yml => light-examples-tests.yml} | 49 +- .../workflows/light-system-programs-tests.yml | 73 +- .github/workflows/lint.yml | 3 +- .github/workflows/prover-release.yml | 17 +- .github/workflows/prover-test.yml | 299 +- .github/workflows/release-pr-rust.yml | 167 + .github/workflows/release-pr-validation.yml | 30 - .github/workflows/release-rust.yml | 91 - .github/workflows/release.yml | 167 + .github/workflows/rust.yml | 40 +- .gitignore | 1 - CLAUDE.md | 105 + Cargo.lock | 2595 +++---- Cargo.toml | 135 +- DOCS.md | 227 + README.md | 1 - anchor-programs/system/Cargo.toml | 3 +- .../system/src/cpi_context_account.rs | 6 +- anchor-programs/system/src/lib.rs | 3 + audits/accretion-pinocchio-audit-06-2025.pdf | Bin 140112 -> 0 bytes .../ottersec_refactor_audit_final_06-2025.pdf | Bin 1015640 -> 0 bytes audits/ottersec_zerocopy_audit_03-2025.pdf | Bin 1011056 -> 0 bytes cli/.mocharc.json | 7 +- ...VTkCUhDHLELqyJaq1Y7UVVmqxXqZjVHwHY3rK.json | 15 +- ...FXkJg8BrzJt56adFYYuwg5etzDtBbQYTsixu.json} | 2 +- ...yLZUMmF7ZtqESaw7wifBXLfXHQYoE4GAmrahU.json | 1 - ...oBxB9xWev4BkLvkGdapsz6sZGkzViPNph7VFi.json | 1 - ...Ld4bqSVZVeCJnH1F6C8jNygAhaDfxDwePyyGb.json | 1 - ...p1a4YQgk9PeZv5s4DBUmbF5NxqYpk9HGjQsd8.json | 1 - ...97jC88YXTuSukYHa8Z5Bi2ZDUtmzfkDTA2mG2.json | 1 - ...3anwEQ9cphpJ1U7Scwj57bx2xueReg7R9cKU.json} | 2 +- ...MsJLfXt2QHzim242SUi3nvjJs8Pn7Eac9H9vg.json | 1 - ...ekBWgo64gpauB6QtuZNesuv19xrhaC1ZM1THQ.json | 1 - ...vVGzCUMoiKKHWh4S1SgZJ9vCvKpcz6RT6A8dq.json | 1 - ...ZR3yGomuQgFduNDzjtGvVWfDRGLuDVjv9a96P.json | 1 - ...oVPKgEPw5o8wc2T816GE7b378nMXnhH3Xbq4y.json | 1 - ...zrEhBG733DoEJNgHCyRS3XmmyVNZx5fonubE4.json | 2 +- ...hkH5roePvcudTgUL8ppEBfTay1desGh8G8QxK.json | 2 +- ...apXUR3As5SjnHBAVvmApNiLsbeZpF3euWnW6B.json | 1 - ...wMpSX8FAGMZVP85AwxqCaQMfEk9Em1v8QK9Rf.json | 1 - ...PDc4bCgHAnsenunGA8Y77j3XEDyjgfyCKgcoc.json | 1 - ...jdgYpZ1Xr7B1cMLLUE81oTtJbNNAyKary2nV6.json | 1 - ...eyjUCWGS2eF7L7gyNMuz6JWdqYpAvb1KRoHxs.json | 2 +- ...rGGjrPXgsyV2NmcRjzAQzWWiaVyAaixbLCNNu.json | 1 + cli/eslint.config.js | 86 - cli/eslint.config.mjs | 27 + cli/package.json | 115 +- cli/pnpm-lock.yaml | 6521 +++++++++++++++++ cli/scripts/buildProver.sh | 89 + cli/src/commands/approve-and-mint-to/index.ts | 10 +- cli/src/commands/balance/index.ts | 5 +- cli/src/commands/config/config.ts | 61 +- cli/src/commands/create-mint/index.ts | 2 +- .../commands/merge-token-accounts/index.ts | 2 +- cli/src/commands/mint-to/index.ts | 2 +- cli/src/commands/start-prover/index.ts | 51 +- cli/src/commands/test-validator/index.ts | 39 + cli/src/commands/transfer/index.ts | 2 +- cli/src/psp-utils/download.ts | 2 +- cli/src/utils/constants.ts | 4 +- cli/src/utils/downloadProverBinary.ts | 155 - cli/src/utils/initTestEnv.ts | 14 +- cli/src/utils/process.ts | 6 +- cli/src/utils/processProverServer.ts | 146 +- cli/src/utils/utils.ts | 45 +- .../approve-and-mint-to/index.test.ts | 26 +- cli/test/commands/balance/index.test.ts | 89 +- cli/test/commands/compress-sol/index.test.ts | 92 +- cli/test/commands/compress-spl/index.test.ts | 30 +- cli/test/commands/config/index.test.ts | 46 +- cli/test/commands/create-mint/index.test.ts | 18 +- .../commands/create-token-pool/index.test.ts | 18 +- .../commands/decompress-sol/index.test.ts | 159 +- .../commands/decompress-spl/index.test.ts | 22 +- .../merge-token-accounts/index.test.ts | 32 +- cli/test/commands/mint-to/index.test.ts | 18 +- .../commands/test-validator/index.test.ts | 2 +- cli/test/commands/token-balance/index.test.ts | 18 +- cli/test/commands/transfer/index.test.ts | 22 +- cli/test/helpers/init.js | 14 +- cli/test_bin/dev | 11 +- cli/test_bin/run | 4 +- cli/tsconfig.json | 6 +- cli/tsconfig.test.json | 5 +- forester-utils/Cargo.toml | 13 +- .../src/instructions/address_batch_update.rs | 23 +- .../src/instructions/state_batch_append.rs | 197 +- .../src/instructions/state_batch_nullify.rs | 189 +- forester-utils/src/lib.rs | 4 - forester-utils/src/registry.rs | 1 - forester-utils/src/utils.rs | 19 +- forester/.env.example | 59 +- forester/Cargo.toml | 3 +- forester/README.md | 118 +- forester/package.json | 2 +- forester/scripts/compare_performance.py | 322 + forester/scripts/v2_stats.py | 272 + forester/src/cli.rs | 19 +- forester/src/config.rs | 19 +- forester/src/epoch_manager.rs | 235 +- forester/src/errors.rs | 3 - forester/src/health_check.rs | 2 +- forester/src/lib.rs | 2 +- forester/src/main.rs | 1 - forester/src/metrics.rs | 3 + forester/src/processor/tx_cache.rs | 8 +- forester/src/processor/v1/send_transaction.rs | 75 +- forester/src/processor/v1/tx_builder.rs | 8 +- forester/src/processor/v2/address.rs | 16 +- forester/src/processor/v2/common.rs | 150 +- forester/src/processor/v2/state.rs | 31 +- forester/src/rollover/operations.rs | 1 - forester/tests/e2e_test.rs | 13 +- forester/tests/legacy/address_v2_test.rs | 5 +- forester/tests/legacy/batched_address_test.rs | 10 +- .../batched_state_async_indexer_test.rs | 7 +- .../legacy/batched_state_indexer_test.rs | 5 +- forester/tests/legacy/batched_state_test.rs | 5 +- forester/tests/legacy/e2e_test.rs | 6 +- forester/tests/legacy/e2e_v1_test.rs | 6 +- forester/tests/legacy/priority_fee_test.rs | 1 + forester/tests/priority_fee_test.rs | 3 +- forester/tests/test_batch_append_spent.rs | 415 -- forester/tests/test_utils.rs | 1 - js/compressed-token/.eslintignore | 3 + js/compressed-token/.eslintrc.json | 21 + js/compressed-token/eslint.config.cjs | 113 - js/compressed-token/package.json | 22 +- js/compressed-token/rollup.config.js | 7 +- js/stateless.js/.eslintignore | 4 + js/stateless.js/.eslintrc.json | 21 + js/stateless.js/eslint.config.cjs | 117 - js/stateless.js/package.json | 20 +- js/stateless.js/rollup.config.js | 7 +- js/stateless.js/src/constants.ts | 80 +- js/stateless.js/src/rpc-interface.ts | 22 +- js/stateless.js/src/rpc.ts | 16 +- .../src/test-helpers/test-rpc/test-rpc.ts | 17 +- js/stateless.js/src/utils/address.ts | 45 +- js/stateless.js/src/utils/conversion.ts | 13 - js/stateless.js/src/utils/index.ts | 1 - js/stateless.js/src/utils/instruction.ts | 253 - js/stateless.js/tests/e2e/rpc-interop.test.ts | 138 +- .../tests/e2e/rpc-multi-trees.test.ts | 13 - .../tests/unit/utils/address-v2.test.ts | 76 - package.json | 5 +- pnpm-lock.yaml | 5843 ++++++++------- pnpm-workspace.yaml | 1 - program-libs/account-checks/CLAUDE.md | 81 + program-libs/account-checks/Cargo.toml | 2 +- .../account-checks/docs/ACCOUNT_CHECKS.md | 324 + .../account-checks/docs/ACCOUNT_INFO_TRAIT.md | 183 + .../account-checks/docs/ACCOUNT_ITERATOR.md | 290 + program-libs/account-checks/docs/CLAUDE.md | 34 + .../account-checks/docs/DISCRIMINATOR.md | 221 + program-libs/account-checks/docs/ERRORS.md | 153 + .../account-checks/docs/PACKED_ACCOUNTS.md | 224 + .../src/account_info/account_info_trait.rs | 2 +- .../src/account_info/test_account_info.rs | 7 +- .../account-checks/src/account_iterator.rs | 67 +- program-libs/account-checks/src/checks.rs | 5 + program-libs/account-checks/src/error.rs | 3 + .../account-checks/src/packed_accounts.rs | 5 +- program-libs/account-checks/tests/tests.rs | 2 +- program-libs/batched-merkle-tree/Cargo.toml | 8 +- program-libs/batched-merkle-tree/src/batch.rs | 3 - .../src/queue_batch_metadata.rs | 1 - .../tests/account_access.rs | 3 + .../tests/initialize_address_tree.rs | 0 .../tests/initialize_state_tree.rs | 0 .../batched-merkle-tree}/tests/merkle_tree.rs | 11 +- .../batched-merkle-tree}/tests/queue.rs | 1 + .../tests/rollover_address_tree.rs | 1 + .../tests/rollover_state_tree.rs | 1 + program-libs/bloom-filter/Cargo.toml | 2 +- program-libs/compressed-account/Cargo.toml | 7 +- .../src/compressed_account.rs | 17 +- .../src/instruction_data/cpi_context.rs | 18 - .../src/instruction_data/data.rs | 64 +- .../instruction_data/insert_into_queues.rs | 11 +- .../src/instruction_data/invoke_cpi.rs | 97 +- .../src/instruction_data/traits.rs | 46 +- .../src/instruction_data/with_account_info.rs | 200 +- .../src/instruction_data/with_readonly.rs | 158 +- .../src/instruction_data/zero_copy.rs | 14 +- .../src/instruction_data/zero_copy_set.rs | 15 +- program-libs/compressed-account/src/lib.rs | 6 +- .../tests/account_option_config.rs | 85 +- .../tests/instruction_data.rs | 389 - program-libs/compressible/CLAUDE.md | 45 + program-libs/compressible/Cargo.toml | 41 + .../compressible/docs/CLAUDE.md | 0 .../compressible/docs/CONFIG_ACCOUNT.md | 164 + program-libs/compressible/docs/ERRORS.md | 76 + program-libs/compressible/docs/RENT.md | 238 + program-libs/compressible/docs/SOLANA_RENT.md | 141 + .../compressible/src/compression_info.rs | 622 ++ program-libs/compressible/src/config.rs | 261 + program-libs/compressible/src/error.rs | 46 + program-libs/compressible/src/lib.rs | 9 + program-libs/compressible/src/rent.rs | 736 ++ .../concurrent-merkle-tree/Cargo.toml | 4 +- .../concurrent-merkle-tree/src/lib.rs | 2 - program-libs/ctoken-types/Cargo.toml | 54 + program-libs/ctoken-types/src/constants.rs | 26 + program-libs/ctoken-types/src/error.rs | 199 + program-libs/ctoken-types/src/hash_cache.rs | 61 + .../create_associated_token_account.rs | 19 + .../src/instructions/create_ctoken_account.rs | 16 + .../instructions/extensions/compressible.rs | 111 + .../src/instructions/extensions/mod.rs | 31 + .../instructions/extensions/token_metadata.rs | 14 + .../instructions/mint_action/cpi_context.rs | 41 + .../mint_action/create_spl_mint.rs | 9 + .../mint_action/instruction_data.rs | 211 + .../mint_action/mint_to_compressed.rs | 18 + .../mint_action/mint_to_ctoken.rs | 16 + .../src/instructions/mint_action/mod.rs | 15 + .../mint_action/update_metadata.rs | 60 + .../instructions/mint_action/update_mint.rs | 10 + .../ctoken-types/src/instructions/mod.rs | 6 + .../src/instructions/transfer2/compression.rs | 212 + .../src/instructions/transfer2/cpi_context.rs | 62 + .../transfer2/instruction_data.rs | 78 + .../src/instructions/transfer2/mod.rs | 7 + program-libs/ctoken-types/src/lib.rs | 13 + .../src/state/compressed_token/hash.rs | 141 + .../src/state/compressed_token/mod.rs | 6 + .../src/state/compressed_token/token_data.rs | 84 + .../compressed_token/token_data_version.rs | 60 + .../ctoken-types/src/state/ctoken/borsh.rs | 152 + .../src/state/ctoken/ctoken_struct.rs | 97 + .../ctoken-types/src/state/ctoken/mod.rs | 6 + .../src/state/ctoken/zero_copy.rs | 661 ++ .../src/state/extensions/extension_struct.rs | 212 + .../src/state/extensions/extension_type.rs | 48 + .../ctoken-types/src/state/extensions/mod.rs | 8 + .../src/state/extensions/token_metadata.rs | 38 + .../ctoken-types/src/state/mint/borsh.rs | 86 + .../src/state/mint/compressed_mint.rs | 106 + .../ctoken-types/src/state/mint/mod.rs | 6 + .../ctoken-types/src/state/mint/zero_copy.rs | 186 + program-libs/ctoken-types/src/state/mod.rs | 9 + .../ctoken-types/tests/compressed_mint.rs | 272 + .../ctoken-types/tests/ctoken/failing.rs | 19 + program-libs/ctoken-types/tests/ctoken/mod.rs | 4 + .../tests/ctoken/randomized_solana_ctoken.rs | 395 + .../ctoken-types/tests/ctoken/spl_compat.rs | 486 ++ .../tests/ctoken/zero_copy_new.rs | 111 + program-libs/ctoken-types/tests/hash_tests.rs | 451 ++ .../tests/mint_borsh_zero_copy.rs | 226 + .../ctoken-types/tests/mint_compat.rs | 237 + program-libs/ctoken-types/tests/mod.rs | 2 + program-libs/ctoken-types/tests/token_data.rs | 285 + .../ctoken-types/tests/token_data_hash.rs | 313 + .../ctoken-types/tests/token_metadata.rs | 323 + program-libs/hash-set/Cargo.toml | 2 +- program-libs/hash-set/src/lib.rs | 2 +- program-libs/hasher/Cargo.toml | 10 +- program-libs/hasher/src/errors.rs | 6 - program-libs/hasher/src/hash_chain.rs | 12 +- program-libs/hasher/src/hash_to_field_size.rs | 3 +- program-libs/hasher/src/keccak.rs | 2 - program-libs/hasher/src/lib.rs | 1 - program-libs/hasher/src/poseidon.rs | 19 +- program-libs/hasher/src/sha256.rs | 37 +- program-libs/indexed-array/Cargo.toml | 4 +- program-libs/indexed-array/src/array.rs | 2 +- program-libs/indexed-merkle-tree/Cargo.toml | 4 +- program-libs/indexed-merkle-tree/src/array.rs | 2 +- program-libs/merkle-tree-metadata/Cargo.toml | 2 +- program-libs/verifier/Cargo.toml | 2 +- program-libs/verifier/src/lib.rs | 189 +- .../verifying_keys/address_append_40_10.rs | 65 + .../verifying_keys/address_append_40_250.rs | 65 + .../append_with_proofs_32_10.rs | 66 + .../append_with_proofs_32_500.rs | 65 + .../batch_address_append_40_10.rs | 65 - .../batch_address_append_40_250.rs | 65 - .../src/verifying_keys/batch_append_32_10.rs | 65 - .../src/verifying_keys/batch_append_32_500.rs | 65 - .../src/verifying_keys/batch_update_32_10.rs | 65 - .../src/verifying_keys/batch_update_32_500.rs | 65 - .../src/verifying_keys/combined_26_26_1_1.rs | 87 + .../src/verifying_keys/combined_26_26_1_2.rs | 100 + .../src/verifying_keys/combined_26_26_2_1.rs | 101 + .../src/verifying_keys/combined_26_26_2_2.rs | 114 + .../src/verifying_keys/combined_26_26_3_1.rs | 114 + .../src/verifying_keys/combined_26_26_3_2.rs | 128 + .../src/verifying_keys/combined_26_26_4_1.rs | 129 + .../src/verifying_keys/combined_26_26_4_2.rs | 142 + .../src/verifying_keys/combined_32_40_1_1.rs | 65 + .../src/verifying_keys/combined_32_40_1_2.rs | 65 + .../src/verifying_keys/combined_32_40_1_3.rs | 65 + .../src/verifying_keys/combined_32_40_1_4.rs | 65 + .../src/verifying_keys/combined_32_40_2_1.rs | 65 + .../src/verifying_keys/combined_32_40_2_2.rs | 65 + .../src/verifying_keys/combined_32_40_2_3.rs | 65 + .../src/verifying_keys/combined_32_40_2_4.rs | 65 + .../src/verifying_keys/combined_32_40_3_1.rs | 66 + .../src/verifying_keys/combined_32_40_3_2.rs | 65 + .../src/verifying_keys/combined_32_40_3_3.rs | 65 + .../src/verifying_keys/combined_32_40_3_4.rs | 65 + .../src/verifying_keys/combined_32_40_4_1.rs | 65 + .../src/verifying_keys/combined_32_40_4_2.rs | 65 + .../src/verifying_keys/combined_32_40_4_3.rs | 65 + .../src/verifying_keys/combined_32_40_4_4.rs | 65 + .../src/verifying_keys/inclusion_26_1.rs | 72 + .../src/verifying_keys/inclusion_26_2.rs | 86 + .../src/verifying_keys/inclusion_26_3.rs | 100 + .../src/verifying_keys/inclusion_26_4.rs | 114 + .../src/verifying_keys/inclusion_26_8.rs | 170 + .../src/verifying_keys/inclusion_32_1.rs | 65 + .../src/verifying_keys/inclusion_32_2.rs | 65 + .../src/verifying_keys/inclusion_32_3.rs | 65 + .../src/verifying_keys/inclusion_32_4.rs | 65 + .../src/verifying_keys/inclusion_32_8.rs | 65 + .../verifier/src/verifying_keys/mod.rs | 163 +- .../src/verifying_keys/non_inclusion_26_1.rs | 72 + .../src/verifying_keys/non_inclusion_26_2.rs | 86 + .../src/verifying_keys/non_inclusion_40_1.rs | 65 + .../src/verifying_keys/non_inclusion_40_2.rs | 65 + .../src/verifying_keys/non_inclusion_40_3.rs | 65 + .../src/verifying_keys/non_inclusion_40_4.rs | 65 + .../src/verifying_keys/non_inclusion_40_8.rs | 65 + .../src/verifying_keys/update_32_10.rs | 65 + .../src/verifying_keys/update_32_500.rs | 65 + .../verifying_keys/v1_combined_26_26_1_1.rs | 86 - .../verifying_keys/v1_combined_26_26_1_2.rs | 100 - .../verifying_keys/v1_combined_26_26_1_4.rs | 128 - .../verifying_keys/v1_combined_26_26_1_8.rs | 185 - .../verifying_keys/v1_combined_26_26_2_1.rs | 100 - .../verifying_keys/v1_combined_26_26_2_2.rs | 114 - .../verifying_keys/v1_combined_26_26_2_4.rs | 143 - .../verifying_keys/v1_combined_26_26_2_8.rs | 198 - .../verifying_keys/v1_combined_26_26_3_1.rs | 114 - .../verifying_keys/v1_combined_26_26_3_2.rs | 128 - .../verifying_keys/v1_combined_26_26_3_4.rs | 157 - .../verifying_keys/v1_combined_26_26_3_8.rs | 212 - .../verifying_keys/v1_combined_26_26_4_1.rs | 128 - .../verifying_keys/v1_combined_26_26_4_2.rs | 142 - .../verifying_keys/v1_combined_26_26_4_4.rs | 170 - .../verifying_keys/v1_combined_26_26_4_8.rs | 226 - .../verifying_keys/v1_combined_26_26_8_1.rs | 184 - .../verifying_keys/v1_combined_26_26_8_2.rs | 198 - .../verifying_keys/v1_combined_26_26_8_4.rs | 227 - .../verifying_keys/v1_combined_26_26_8_8.rs | 284 - .../src/verifying_keys/v1_inclusion_26_1.rs | 73 - .../src/verifying_keys/v1_inclusion_26_2.rs | 86 - .../src/verifying_keys/v1_inclusion_26_3.rs | 100 - .../src/verifying_keys/v1_inclusion_26_4.rs | 114 - .../src/verifying_keys/v1_inclusion_26_8.rs | 170 - .../verifying_keys/v1_non_inclusion_26_1.rs | 73 - .../verifying_keys/v1_non_inclusion_26_2.rs | 86 - .../verifying_keys/v1_non_inclusion_26_3.rs | 65 - .../verifying_keys/v1_non_inclusion_26_4.rs | 65 - .../verifying_keys/v1_non_inclusion_26_8.rs | 65 - .../verifying_keys/v2_combined_32_40_1_1.rs | 65 - .../verifying_keys/v2_combined_32_40_1_2.rs | 65 - .../verifying_keys/v2_combined_32_40_1_3.rs | 65 - .../verifying_keys/v2_combined_32_40_1_4.rs | 65 - .../verifying_keys/v2_combined_32_40_2_1.rs | 65 - .../verifying_keys/v2_combined_32_40_2_2.rs | 65 - .../verifying_keys/v2_combined_32_40_2_3.rs | 65 - .../verifying_keys/v2_combined_32_40_2_4.rs | 65 - .../verifying_keys/v2_combined_32_40_3_1.rs | 65 - .../verifying_keys/v2_combined_32_40_3_2.rs | 65 - .../verifying_keys/v2_combined_32_40_3_3.rs | 65 - .../verifying_keys/v2_combined_32_40_3_4.rs | 65 - .../verifying_keys/v2_combined_32_40_4_1.rs | 65 - .../verifying_keys/v2_combined_32_40_4_2.rs | 65 - .../verifying_keys/v2_combined_32_40_4_3.rs | 65 - .../verifying_keys/v2_combined_32_40_4_4.rs | 65 - .../src/verifying_keys/v2_inclusion_32_1.rs | 65 - .../src/verifying_keys/v2_inclusion_32_10.rs | 65 - .../src/verifying_keys/v2_inclusion_32_11.rs | 65 - .../src/verifying_keys/v2_inclusion_32_12.rs | 65 - .../src/verifying_keys/v2_inclusion_32_13.rs | 65 - .../src/verifying_keys/v2_inclusion_32_14.rs | 65 - .../src/verifying_keys/v2_inclusion_32_15.rs | 65 - .../src/verifying_keys/v2_inclusion_32_16.rs | 65 - .../src/verifying_keys/v2_inclusion_32_17.rs | 65 - .../src/verifying_keys/v2_inclusion_32_18.rs | 65 - .../src/verifying_keys/v2_inclusion_32_19.rs | 65 - .../src/verifying_keys/v2_inclusion_32_2.rs | 65 - .../src/verifying_keys/v2_inclusion_32_20.rs | 65 - .../src/verifying_keys/v2_inclusion_32_3.rs | 65 - .../src/verifying_keys/v2_inclusion_32_4.rs | 65 - .../src/verifying_keys/v2_inclusion_32_5.rs | 65 - .../src/verifying_keys/v2_inclusion_32_6.rs | 65 - .../src/verifying_keys/v2_inclusion_32_7.rs | 65 - .../src/verifying_keys/v2_inclusion_32_8.rs | 65 - .../src/verifying_keys/v2_inclusion_32_9.rs | 65 - .../verifying_keys/v2_non_inclusion_40_1.rs | 65 - .../verifying_keys/v2_non_inclusion_40_10.rs | 65 - .../verifying_keys/v2_non_inclusion_40_11.rs | 65 - .../verifying_keys/v2_non_inclusion_40_12.rs | 65 - .../verifying_keys/v2_non_inclusion_40_13.rs | 65 - .../verifying_keys/v2_non_inclusion_40_14.rs | 65 - .../verifying_keys/v2_non_inclusion_40_15.rs | 65 - .../verifying_keys/v2_non_inclusion_40_16.rs | 65 - .../verifying_keys/v2_non_inclusion_40_17.rs | 65 - .../verifying_keys/v2_non_inclusion_40_18.rs | 65 - .../verifying_keys/v2_non_inclusion_40_19.rs | 65 - .../verifying_keys/v2_non_inclusion_40_2.rs | 65 - .../verifying_keys/v2_non_inclusion_40_20.rs | 65 - .../verifying_keys/v2_non_inclusion_40_21.rs | 65 - .../verifying_keys/v2_non_inclusion_40_22.rs | 65 - .../verifying_keys/v2_non_inclusion_40_23.rs | 65 - .../verifying_keys/v2_non_inclusion_40_24.rs | 65 - .../verifying_keys/v2_non_inclusion_40_25.rs | 65 - .../verifying_keys/v2_non_inclusion_40_26.rs | 65 - .../verifying_keys/v2_non_inclusion_40_27.rs | 65 - .../verifying_keys/v2_non_inclusion_40_28.rs | 65 - .../verifying_keys/v2_non_inclusion_40_29.rs | 65 - .../verifying_keys/v2_non_inclusion_40_3.rs | 65 - .../verifying_keys/v2_non_inclusion_40_30.rs | 65 - .../verifying_keys/v2_non_inclusion_40_31.rs | 65 - .../verifying_keys/v2_non_inclusion_40_32.rs | 65 - .../verifying_keys/v2_non_inclusion_40_4.rs | 65 - .../verifying_keys/v2_non_inclusion_40_5.rs | 65 - .../verifying_keys/v2_non_inclusion_40_6.rs | 65 - .../verifying_keys/v2_non_inclusion_40_7.rs | 65 - .../verifying_keys/v2_non_inclusion_40_8.rs | 65 - .../verifying_keys/v2_non_inclusion_40_9.rs | 65 - program-libs/zero-copy-derive/Cargo.toml | 8 +- program-libs/zero-copy-derive/src/lib.rs | 14 +- .../zero-copy-derive/src/shared/utils.rs | 2 +- .../tests/instruction_data.rs | 13 +- .../zero-copy-derive}/tests/random.rs | 15 +- .../zero-copy-derive}/tests/ui.rs | 7 +- .../tests/ui/fail/01_empty_struct.rs | 2 +- .../tests/ui/fail/01_empty_struct.stderr | 0 .../tests/ui/fail/07_tuple_struct.rs | 4 +- .../tests/ui/fail/07_tuple_struct.stderr | 0 .../tests/ui/fail/08_newtype_pattern.rs | 4 +- .../tests/ui/fail/08_newtype_pattern.stderr | 0 .../tests/ui/fail/47_tuple_struct_empty.rs | 4 +- .../ui/fail/47_tuple_struct_empty.stderr | 0 .../tests/ui/fail/48_tuple_single_field.rs | 2 +- .../ui/fail/48_tuple_single_field.stderr | 0 .../tests/ui/fail/54_floating_point_types.rs | 2 +- .../ui/fail/54_floating_point_types.stderr | 34 +- .../tests/ui/fail/55_usize_isize_types.rs | 2 +- .../tests/ui/fail/55_usize_isize_types.stderr | 45 +- .../tests/ui/fail/58_array_of_options.rs | 2 +- .../tests/ui/fail/58_array_of_options.stderr | 9 + .../tests/ui/fail/67_char_type.rs | 2 +- .../tests/ui/fail/67_char_type.stderr | 44 +- .../tests/ui/fail/missing_repr_c.rs | 0 .../tests/ui/fail/missing_repr_c.stderr | 0 .../tests/ui/fail/unsupported_field_type.rs | 0 .../ui/fail/unsupported_field_type.stderr | 0 .../tests/ui/fail/unsupported_tuple_struct.rs | 0 .../ui/fail/unsupported_tuple_struct.stderr | 0 .../tests/ui/fail/unsupported_union.rs | 0 .../tests/ui/fail/unsupported_union.stderr | 0 .../tests/ui/fail_mut/missing_repr_c_mut.rs | 0 .../ui/fail_mut/missing_repr_c_mut.stderr | 0 .../tests/ui/pass/02_single_u8_field.rs | 2 +- .../tests/ui/pass/03_all_primitives.rs | 7 +- .../tests/ui/pass/04_nested_vecs.rs | 7 +- .../tests/ui/pass/05_nested_options.rs | 8 +- .../tests/ui/pass/06_array_fields.rs | 7 +- .../tests/ui/pass/09_enum_unit_variants.rs | 0 .../tests/ui/pass/10_enum_mixed_variants.rs | 0 .../tests/ui/pass/11_pubkey_fields.rs | 7 +- .../tests/ui/pass/12_mixed_visibility.rs | 17 +- .../tests/ui/pass/13_large_struct.rs | 36 +- .../tests/ui/pass/14_vec_of_arrays.rs | 11 +- .../tests/ui/pass/15_option_vec.rs | 7 +- .../tests/ui/pass/16_bool_fields.rs | 7 +- .../tests/ui/pass/17_signed_integers.rs | 11 +- .../tests/ui/pass/18_zero_sized_arrays.rs | 7 +- .../tests/ui/pass/19_max_sized_array.rs | 2 +- .../tests/ui/pass/20_nested_struct_fields.rs | 7 +- .../tests/ui/pass/21_enum_single_variant.rs | 3 +- .../tests/ui/pass/22_primitive_after_vec.rs | 12 +- .../ui/pass/23_multiple_options_after_vec.rs | 5 +- .../tests/ui/pass/24_vec_option_vec.rs | 5 +- .../tests/ui/pass/25_all_optional.rs | 7 +- .../tests/ui/pass/26_deep_nesting.rs | 5 +- .../tests/ui/pass/27_mixed_arrays.rs | 7 +- .../tests/ui/pass/28_field_named_data.rs | 13 +- .../tests/ui/pass/29_field_named_bytes.rs | 13 +- .../tests/ui/pass/30_underscore_fields.rs | 11 +- .../tests/ui/pass/31_numeric_suffix_fields.rs | 13 +- .../tests/ui/pass/32_camel_case_fields.rs | 7 +- .../tests/ui/pass/33_single_letter_fields.rs | 15 +- .../tests/ui/pass/34_vec_of_bools.rs | 13 +- .../tests/ui/pass/35_option_bool.rs | 13 +- .../tests/ui/pass/36_array_of_bools.rs | 11 +- .../ui/pass/37_meta_boundary_primitive.rs | 18 +- .../tests/ui/pass/38_meta_boundary_option.rs | 11 +- .../tests/ui/pass/39_enum_with_array.rs | 3 +- .../ui/pass/40_enum_discriminant_order.rs | 3 +- .../ui/pass/41_struct_with_lifetime_name.rs | 13 +- .../tests/ui/pass/42_reserved_keywords.rs | 11 +- .../tests/ui/pass/43_alternating_types.rs | 5 +- .../tests/ui/pass/44_all_vecs.rs | 2 +- .../tests/ui/pass/45_single_vec.rs | 8 +- .../tests/ui/pass/46_single_option.rs | 15 +- .../tests/ui/pass/49_max_meta_fields.rs | 11 +- .../ui/pass/50_combination_all_features.rs | 5 +- .../tests/ui/pass/51_deep_nested_structs.rs | 6 +- .../ui/pass/52_enum_containing_struct.rs | 6 +- .../tests/ui/pass/53_enum_containing_vec.rs | 2 +- .../tests/ui/pass/56_all_derives.rs | 7 +- .../tests/ui/pass/57_option_of_array.rs | 4 +- .../tests/ui/pass/59_vec_of_options.rs | 5 +- .../tests/ui/pass/60_option_pubkey.rs | 2 +- .../tests/ui/pass/61_vec_pubkey.rs | 21 +- .../tests/ui/pass/62_array_pubkey.rs | 2 +- .../tests/ui/pass/63_arrays_only.rs | 2 +- .../tests/ui/pass/64_option_first_field.rs | 13 +- .../tests/ui/pass/65_vec_of_vec.rs | 5 +- .../tests/ui/pass/66_triple_nested_option.rs | 6 +- .../ui/pass/68_enum_containing_option.rs | 2 +- .../tests/ui/pass/69_very_long_field_names.rs | 24 +- .../tests/ui/pass/70_rust_type_field_names.rs | 7 +- .../tests/ui/pass/basic_enum.rs | 4 +- .../tests/ui/pass/basic_struct.rs | 6 +- .../tests/ui/pass/complex_enum.rs | 6 +- .../zero-copy-derive}/tests/ui/pass/readme.md | 0 .../tests/ui/pass/repr_c_packed_test.rs | 2 +- .../tests/ui/pass/with_arrays.rs | 6 +- .../tests/ui/pass/with_options.rs | 10 +- .../tests/ui/pass/with_pubkey.rs | 24 +- .../tests/ui/pass/with_vectors.rs | 8 +- .../tests/ui/pass_mut/basic_mut.rs | 0 .../tests/ui/pass_mut/complex_mut.rs | 0 program-libs/zero-copy/Cargo.toml | 7 +- program-libs/zero-copy/src/lib.rs | 17 +- .../zero-copy/src/traits/zero_copy_at.rs | 28 + .../account-compression-test/Cargo.toml | 3 +- .../tests/batched_merkle_tree_test.rs | 1 - .../tests/group_authority_tests.rs | 10 +- .../batched-merkle-tree-test/Cargo.toml | 28 - .../batched-merkle-tree-test/src/lib.rs | 1 - .../compressed-token-test/Cargo.toml | 30 +- .../compressed-token-test/tests/account.rs | 1161 +++ .../tests/compressible.rs | 747 ++ .../compressed-token-test/tests/metadata.rs | 1222 +++ .../compressed-token-test/tests/mint.rs | 2684 +++++++ .../compressed-token-test/tests/test.rs | 103 +- .../compressed-token-test/tests/transfer2.rs | 1457 ++++ .../tests/transfer2_functional.rs | 3013 ++++++++ .../create-address-test-program/Cargo.toml | 3 +- .../create-address-test-program/src/lib.rs | 31 +- program-tests/e2e-test/Cargo.toml | 1 - program-tests/e2e-test/tests/test.rs | 8 +- program-tests/merkle-tree/Cargo.toml | 2 +- program-tests/merkle-tree/src/lib.rs | 3 - program-tests/profile/Cargo.toml | 25 + program-tests/profile/src/lib.rs | 132 + program-tests/profile/tests/macro_test.rs | 36 + program-tests/registry-test/Cargo.toml | 3 +- program-tests/registry-test/tests/tests.rs | 8 +- program-tests/sdk-anchor-test/package.json | 19 + program-tests/system-cpi-test/Cargo.toml | 9 +- .../system-cpi-test/src/cpi_context_event.rs | 150 - .../src/cpi_context_event_inputs.rs | 260 - .../system-cpi-test/src/create_pda.rs | 6 +- program-tests/system-cpi-test/src/lib.rs | 24 - program-tests/system-cpi-test/tests/test.rs | 28 +- .../tests/test_cpi_context_event.rs | 432 -- .../tests/test_program_owned_trees.rs | 13 +- program-tests/system-cpi-v2-test/Cargo.toml | 3 +- .../system-cpi-v2-test/tests/event.rs | 4 +- .../tests/invoke_cpi_with_read_only.rs | 150 +- program-tests/system-test/Cargo.toml | 3 +- program-tests/system-test/tests/test.rs | 66 +- .../tests/test_re_init_cpi_account.rs | 6 +- program-tests/utils/Cargo.toml | 7 +- program-tests/utils/src/assert_account.rs | 191 + program-tests/utils/src/assert_claim.rs | 150 + .../utils/src/assert_close_token_account.rs | 274 + .../utils/src/assert_create_token_account.rs | 168 + .../utils/src/assert_ctoken_transfer.rs | 172 + program-tests/utils/src/assert_metadata.rs | 261 + program-tests/utils/src/assert_mint_action.rs | 161 + .../utils/src/assert_mint_to_compressed.rs | 191 + program-tests/utils/src/assert_spl_mint.rs | 97 + program-tests/utils/src/assert_transfer2.rs | 580 ++ program-tests/utils/src/conversions.rs | 29 +- program-tests/utils/src/e2e_test_env.rs | 53 +- program-tests/utils/src/lib.rs | 11 + program-tests/utils/src/mint_assert.rs | 79 + program-tests/utils/src/spl.rs | 50 +- .../utils/src/test_batch_forester.rs | 3 +- program-tests/utils/src/test_keypairs.rs | 32 +- .../zero-copy-derive-test/Cargo.toml | 20 - .../zero-copy-derive-test/src/lib.rs | 1 - programs/account-compression/Cargo.toml | 1 - .../src/instructions/migrate_state.rs | 2 +- .../resize_registered_program_account.rs | 2 +- programs/account-compression/src/lib.rs | 4 +- .../src/processor/insert_into_queues.rs | 1 + .../account-compression/src/state/address.rs | 6 +- .../src/state/public_state_merkle_tree.rs | 6 +- .../account-compression/src/state/queue.rs | 4 +- programs/compressed-token/README.md | 13 +- .../compressed-token/{ => anchor}/Cargo.toml | 12 +- programs/compressed-token/anchor/README.md | 9 + .../compressed-token/{ => anchor}/Xargo.toml | 0 .../{ => anchor}/src/batch_compress.rs | 0 .../compressed-token/{ => anchor}/src/burn.rs | 37 +- .../{ => anchor}/src/constants.rs | 4 + .../{ => anchor}/src/delegation.rs | 38 +- .../{ => anchor}/src/freeze.rs | 95 +- .../{ => anchor}/src/instructions/burn.rs | 0 .../src/instructions/create_token_pool.rs | 0 .../{ => anchor}/src/instructions/freeze.rs | 0 .../{ => anchor}/src/instructions/generic.rs | 0 .../{ => anchor}/src/instructions/mod.rs | 0 .../{ => anchor}/src/instructions/transfer.rs | 0 .../compressed-token/{ => anchor}/src/lib.rs | 143 +- .../src/process_compress_spl_token_account.rs | 0 .../{ => anchor}/src/process_mint.rs | 23 +- .../{ => anchor}/src/process_transfer.rs | 154 +- .../{ => anchor}/src/spl_compression.rs | 14 +- programs/compressed-token/program/CLAUDE.md | 139 + programs/compressed-token/program/Cargo.toml | 82 + programs/compressed-token/program/README.md | 9 + .../compressed-token/program}/Xargo.toml | 0 .../compressed-token/program/docs/ACCOUNTS.md | 94 + .../compressed-token/program/docs/CLAUDE.md | 17 + .../program/docs/instructions/CLAIM.md | 117 + .../program/docs/instructions/CLAUDE.md | 42 + .../docs/instructions/CLOSE_TOKEN_ACCOUNT.md | 152 + .../docs/instructions/CREATE_TOKEN_ACCOUNT.md | 167 + .../docs/instructions/CTOKEN_TRANSFER.md | 90 + .../program/docs/instructions/MINT_ACTION.md | 216 + .../program/docs/instructions/TRANSFER2.md | 321 + .../instructions/WITHDRAW_FUNDING_POOL.md | 86 + .../compressed-token/program/src/claim.rs | 127 + .../src/close_token_account/accounts.rs | 39 + .../program/src/close_token_account/mod.rs | 2 + .../src/close_token_account/processor.rs | 259 + .../program/src/convert_account_infos.rs | 64 + .../src/create_associated_token_account.rs | 234 + .../program/src/create_token_account.rs | 252 + .../program/src/ctoken_transfer.rs | 126 + .../program/src/extensions/mod.rs | 211 + .../program/src/extensions/processor.rs | 35 + .../program/src/extensions/token_metadata.rs | 72 + programs/compressed-token/program/src/lib.rs | 164 + .../program/src/mint_action/accounts.rs | 471 ++ .../src/mint_action/actions/authority.rs | 59 + .../src/mint_action/actions/create_mint.rs | 100 + .../create_spl_mint/create_mint_account.rs | 90 + .../create_spl_mint/create_token_pool.rs | 100 + .../actions/create_spl_mint/mod.rs | 7 + .../actions/create_spl_mint/process.rs | 88 + .../src/mint_action/actions/mint_to.rs | 121 + .../src/mint_action/actions/mint_to_ctoken.rs | 100 + .../program/src/mint_action/actions/mod.rs | 9 + .../mint_action/actions/process_actions.rs | 115 + .../mint_action/actions/update_metadata.rs | 150 + .../program/src/mint_action/mint_input.rs | 44 + .../program/src/mint_action/mint_output.rs | 86 + .../program/src/mint_action/mod.rs | 8 + .../program/src/mint_action/processor.rs | 145 + .../program/src/mint_action/queue_indices.rs | 72 + .../src/mint_action/zero_copy_config.rs | 118 + .../program/src/shared/accounts.rs | 76 + .../src/shared/convert_program_error.rs | 5 + .../program/src/shared/cpi.rs | 209 + .../program/src/shared/cpi_bytes_size.rs | 149 + .../program/src/shared/create_pda_account.rs | 98 + .../src/shared/initialize_ctoken_account.rs | 166 + .../program/src/shared/mint_to_token_pool.rs | 59 + .../program/src/shared/mod.rs | 20 + .../program/src/shared/owner_validation.rs | 99 + .../program/src/shared/token_input.rs | 132 + .../program/src/shared/token_output.rs | 155 + .../program/src/shared/transfer_lamports.rs | 94 + .../src/shared/validate_ata_derivation.rs | 29 + .../program/src/transfer2/accounts.rs | 156 + .../program/src/transfer2/change_account.rs | 96 + .../compression/ctoken/compress_and_close.rs | 193 + .../ctoken/compress_or_decompress_ctokens.rs | 138 + .../transfer2/compression/ctoken/inputs.rs | 97 + .../src/transfer2/compression/ctoken/mod.rs | 41 + .../program/src/transfer2/compression/mod.rs | 153 + .../src/transfer2/compression/native.rs | 369 + .../program/src/transfer2/compression/spl.rs | 148 + .../program/src/transfer2/config.rs | 46 + .../program/src/transfer2/cpi.rs | 50 + .../program/src/transfer2/mod.rs | 8 + .../program/src/transfer2/processor.rs | 244 + .../program/src/transfer2/sum_check.rs | 120 + .../program/src/transfer2/token_inputs.rs | 45 + .../program/src/transfer2/token_outputs.rs | 69 + .../program/src/withdraw_funding_pool.rs | 119 + .../program/tests/allocation_test.rs | 234 + .../program/tests/check_authority.rs | 151 + .../program/tests/exact_allocation_test.rs | 390 + .../compressed-token/program/tests/mint.rs | 431 ++ .../program/tests/mint_action.rs | 353 + .../tests/mint_action_accounts_validation.rs | 795 ++ .../program/tests/multi_sum_check.rs | 374 + .../program/tests/print_error_codes.rs | 404 + .../program/tests/queue_indices.rs | 275 + .../program/tests/token_input.rs | 194 + .../program/tests/token_output.rs | 157 + programs/compressed-token/src/token_data.rs | 431 -- programs/package.json | 4 +- programs/registry/CLAUDE.md | 177 + programs/registry/Cargo.toml | 3 +- programs/registry/output.txtclear | 20 + programs/registry/src/compressible/claim.rs | 89 + .../src/compressible/compress_and_close.rs | 85 + .../src/compressible/create_config.rs | 31 + .../src/compressible/create_config_counter.rs | 38 + programs/registry/src/compressible/mod.rs | 13 + .../src/compressible/update_config.rs | 20 + .../src/compressible/withdraw_funding_pool.rs | 106 + programs/registry/src/errors.rs | 2 + programs/registry/src/lib.rs | 119 +- programs/system/CHANGELOG.md | 99 + programs/system/Cargo.toml | 10 +- .../src/account_compression_state/address.rs | 6 +- .../src/account_compression_state/state.rs | 4 +- .../system/src/accounts/account_checks.rs | 8 +- .../src/accounts/init_context_account.rs | 8 +- programs/system/src/accounts/mode.rs | 6 +- .../src/accounts/remaining_account_checks.rs | 2 +- programs/system/src/constants.rs | 4 +- programs/system/src/context.rs | 69 +- programs/system/src/cpi_context/account.rs | 6 +- programs/system/src/cpi_context/address.rs | 3 - .../src/cpi_context/instruction_data_trait.rs | 10 +- .../src/cpi_context/process_cpi_context.rs | 36 +- programs/system/src/cpi_context/state.rs | 195 +- programs/system/src/errors.rs | 24 - programs/system/src/invoke/verify_signer.rs | 2 +- ...instruction_v2.rs => instruction_small.rs} | 12 +- programs/system/src/invoke_cpi/mod.rs | 2 +- programs/system/src/invoke_cpi/processor.rs | 2 +- .../system/src/invoke_cpi/verify_signer.rs | 2 +- programs/system/src/lib.rs | 9 +- programs/system/src/processor/cpi.rs | 13 +- .../src/processor/create_address_cpi_data.rs | 123 +- .../src/processor/create_inputs_cpi_data.rs | 21 +- .../src/processor/create_outputs_cpi_data.rs | 13 +- programs/system/src/processor/process.rs | 3 +- .../system/src/processor/read_only_account.rs | 2 +- .../system/src/processor/read_only_address.rs | 2 +- .../system/src/processor/sol_compression.rs | 2 +- programs/system/src/processor/sum_check.rs | 2 +- programs/system/src/processor/verify_proof.rs | 2 +- programs/system/src/utils.rs | 2 +- programs/system/tests/cpi_context.rs | 13 +- .../system/tests/invoke_cpi_instruction.rs | 28 +- ..._v2.rs => invoke_cpi_instruction_small.rs} | 135 +- prover/client/Cargo.toml | 4 +- prover/client/src/helpers.rs | 2 +- prover/client/src/proof_client.rs | 2 +- .../proof_types/batch_append/proof_inputs.rs | 8 +- prover/client/src/prover.rs | 85 +- prover/client/tests/batch_address_append.rs | 4 +- prover/client/tests/batch_append.rs | 5 +- prover/client/tests/batch_update.rs | 4 +- prover/client/tests/combined.rs | 7 +- prover/client/tests/inclusion.rs | 10 +- prover/client/tests/non_inclusion.rs | 10 +- prover/server/Dockerfile | 10 +- prover/server/README.md | 3 + prover/server/docker-compose.yml | 2 +- .../FormalVerification/Circuit.lean | 198 +- .../FormalVerification/Merkle.lean | 83 +- .../FormalVerification/Rangecheck.lean | 23 +- prover/server/formal-verification/Main.lean | 24 +- .../formal-verification/lake-manifest.json | 4 +- .../server/formal-verification/lakefile.lean | 2 +- prover/server/go.mod | 58 +- prover/server/go.sum | 137 +- prover/server/integration_test.go | 523 +- prover/server/main.go | 483 +- .../{v2 => }/batch_address_append_circuit.go | 57 +- .../batch_address_append_circuit_test.go | 2 +- .../prover/{v2 => }/batch_append_circuit.go | 23 +- .../{v2 => }/batch_append_circuit_test.go | 20 +- .../prover/{v2 => }/batch_circuit_helpers.go | 6 +- .../prover/{v2 => }/batch_update_circuit.go | 25 +- .../{v2 => }/batch_update_circuit_test.go | 28 +- ...oof_request_meta.go => circuit_builder.go} | 46 +- .../prover/{common => }/circuit_utils.go | 9 +- .../prover/{v2 => }/combined_circuit.go | 25 +- .../{v2 => }/combined_proving_system.go | 17 +- ...m.go => combined_proving_system_legacy.go} | 119 +- .../server/prover/{v2 => }/combined_test.go | 17 +- prover/server/prover/common/key_downloader.go | 413 -- .../server/prover/common/lazy_key_manager.go | 438 -- prover/server/prover/common/types.go | 30 - prover/server/prover/{v2 => }/extractor.go | 9 +- .../prover/{v2 => }/inclusion_circuit.go | 17 +- .../{v2 => }/inclusion_proving_system.go | 13 +- ....go => inclusion_proving_system_legacy.go} | 29 +- .../server/prover/{v2 => }/inclusion_test.go | 8 +- .../prover/{common => }/is_less_test.go | 8 +- .../{common => }/leaf_hash_gadget_test.go | 6 +- prover/server/prover/{common => }/marshal.go | 66 +- .../{v2 => }/marshal_batch_address_append.go | 67 +- .../marshal_batch_append_with_proofs.go | 57 +- .../prover/{v2 => }/marshal_combined.go | 11 +- .../server/prover/marshal_combined_legacy.go | 59 + .../prover/{v2 => }/marshal_inclusion.go | 23 +- .../server/prover/marshal_inclusion_legacy.go | 69 + .../prover/{v2 => }/marshal_non_inclusion.go | 33 +- .../prover/marshal_non_inclusion_legacy.go | 100 + .../server/prover/{v2 => }/marshal_update.go | 81 +- .../prover/{v2 => }/non_inclusion_circuit.go | 32 +- .../{v2 => }/non_inclusion_proving_system.go | 13 +- ...=> non_inclusion_proving_system_legacy.go} | 83 +- .../prover/{v2 => }/non_inclusion_test.go | 8 +- prover/server/prover/poseidon/poseidon.go | 2 +- .../server/prover/poseidon/poseidon_test.go | 2 +- .../prover/{common => }/proving_keys_utils.go | 216 +- .../prover/{common => }/string_utils.go | 2 +- .../{v2 => }/test_data_generator_test.go | 8 +- .../prover/{v2 => }/test_data_helpers.go | 58 +- prover/server/prover/v1/circuit_builder.go | 21 - prover/server/prover/v1/circuit_setup.go | 222 - prover/server/prover/v1/combined_circuit.go | 43 - .../server/prover/v1/combined_manual_test.go | 183 - prover/server/prover/v1/combined_test.go | 251 - prover/server/prover/v1/inclusion_circuit.go | 34 - prover/server/prover/v1/inclusion_test.go | 231 - prover/server/prover/v1/legacy_gadgets.go | 73 - prover/server/prover/v1/marshal_combined.go | 66 - prover/server/prover/v1/marshal_inclusion.go | 71 - .../server/prover/v1/marshal_non_inclusion.go | 93 - .../server/prover/v1/non_inclusion_circuit.go | 42 - prover/server/prover/v1/non_inclusion_test.go | 343 - prover/server/prover/v1/test_data_helpers.go | 155 - prover/server/prover/v2/circuit_builder.go | 36 - prover/server/redis_queue_test.go | 70 +- prover/server/scripts/download_keys.sh | 317 + prover/server/scripts/generate_checksums.py | 16 +- prover/server/scripts/generate_keys.sh | 258 +- prover/server/scripts/regenerate_all_vkeys.sh | 37 - prover/server/server/metrics.go | 8 - prover/server/server/queue.go | 6 +- prover/server/server/queue_job.go | 240 +- prover/server/server/server.go | 301 +- rust-toolchain.toml | 2 +- scripts/bench_ctoken_cu.sh | 3 + scripts/{deploy => }/build-verifiable.sh | 0 .../bump-versions-and-publish-npm.sh | 0 scripts/{deploy => }/deploy-devnet.sh | 0 scripts/{deploy => }/deploy.sh | 0 scripts/devenv.sh | 6 +- scripts/devenv/download-gnark-keys.sh | 46 - scripts/devenv/install-anchor.sh | 43 - scripts/devenv/install-dependencies.sh | 17 - scripts/devenv/install-go.sh | 21 - scripts/devenv/install-jq.sh | 19 - scripts/devenv/install-node.sh | 21 - scripts/devenv/install-photon.sh | 32 - scripts/devenv/install-pnpm.sh | 20 - scripts/devenv/install-redis.sh | 147 - scripts/devenv/install-rust.sh | 21 - scripts/devenv/install-solana.sh | 21 - scripts/devenv/install.sh | 74 - scripts/devenv/shared.sh | 81 - scripts/devenv/versions.sh | 20 - scripts/format.sh | 11 + scripts/install.sh | 458 +- .../push-compressed-token-idl.sh | 0 .../{release => }/push-stateless-js-idls.sh | 0 scripts/release-all-rust-crates.sh | 59 + scripts/release/create-release-pr.sh | 195 - scripts/release/detect-version-changes.sh | 56 - scripts/release/validate-packages.sh | 97 - scripts/test.sh | 4 +- sdk-libs/client/Cargo.toml | 11 +- sdk-libs/client/src/constants.rs | 10 - sdk-libs/client/src/indexer/indexer_trait.rs | 21 +- sdk-libs/client/src/indexer/mod.rs | 4 +- sdk-libs/client/src/indexer/photon_indexer.rs | 194 +- sdk-libs/client/src/indexer/tree_info.rs | 77 +- sdk-libs/client/src/indexer/types.rs | 19 +- sdk-libs/client/src/lib.rs | 11 +- sdk-libs/client/src/local_test_validator.rs | 14 +- sdk-libs/client/src/rpc/client.rs | 50 +- sdk-libs/client/src/rpc/errors.rs | 22 - sdk-libs/client/src/rpc/indexer.rs | 18 +- sdk-libs/client/src/rpc/mod.rs | 2 - sdk-libs/client/src/rpc/rpc_trait.rs | 21 +- sdk-libs/compressed-token-sdk/Cargo.toml | 60 + sdk-libs/compressed-token-sdk/src/account.rs | 209 + sdk-libs/compressed-token-sdk/src/account2.rs | 580 ++ sdk-libs/compressed-token-sdk/src/error.rs | 108 + .../src/instructions/approve/account_metas.rs | 136 + .../src/instructions/approve/instruction.rs | 91 + .../src/instructions/approve/mod.rs | 5 + .../batch_compress/account_metas.rs | 183 + .../batch_compress/instruction.rs | 88 + .../src/instructions/batch_compress/mod.rs | 5 + .../src/instructions/burn.rs | 40 + .../src/instructions/claim.rs | 56 + .../src/instructions/close.rs | 51 + .../src/instructions/compress_and_close.rs | 465 ++ .../create_associated_token_account.rs | 235 + .../create_compressed_mint/account_metas.rs | 141 + .../create_compressed_mint/instruction.rs | 222 + .../create_compressed_mint/mod.rs | 49 + .../src/instructions/create_spl_mint.rs | 71 + .../create_token_account/instruction.rs | 116 + .../instructions/create_token_account/mod.rs | 3 + .../src/instructions/ctoken_accounts.rs | 36 + .../src/instructions/decompress_full.rs | 221 + .../instructions/mint_action/account_metas.rs | 222 + .../instructions/mint_action/cpi_accounts.rs | 504 ++ .../instructions/mint_action/instruction.rs | 811 ++ .../src/instructions/mint_action/mod.rs | 71 + .../src/instructions/mint_to.rs | 43 + .../mint_to_compressed/account_metas.rs | 221 + .../mint_to_compressed/instruction.rs | 123 + .../instructions/mint_to_compressed/mod.rs | 10 + .../src/instructions/mod.rs | 66 + .../instructions/transfer/account_infos.rs | 112 + .../instructions/transfer/account_metas.rs | 221 + .../src/instructions/transfer/instruction.rs | 282 + .../src/instructions/transfer/mod.rs | 8 + .../instructions/transfer2/account_metas.rs | 126 + .../instructions/transfer2/cpi_accounts.rs | 190 + .../src/instructions/transfer2/instruction.rs | 175 + .../src/instructions/transfer2/mod.rs | 8 + .../update_compressed_mint/account_metas.rs | 90 + .../update_compressed_mint/instruction.rs | 154 + .../update_compressed_mint/mod.rs | 11 + .../src/instructions/withdraw_funding_pool.rs | 44 + sdk-libs/compressed-token-sdk/src/lib.rs | 14 + .../src/token_metadata_ui.rs | 37 + .../compressed-token-sdk/src/token_pool.rs | 21 + sdk-libs/compressed-token-sdk/src/utils.rs | 18 + .../tests/account_metas_test.rs | 129 + .../tests/create_associated_token_account.rs | 112 + .../tests/mint_action_cpi_accounts_tests.rs | 1067 +++ sdk-libs/compressed-token-types/Cargo.toml | 21 + .../src/account_infos/batch_compress.rs | 192 + .../src/account_infos/burn.rs | 174 + .../src/account_infos/config.rs | 16 + .../account_infos/create_compressed_mint.rs | 143 + .../src/account_infos/freeze.rs | 158 + .../src/account_infos/mint_to.rs | 233 + .../src/account_infos/mint_to_compressed.rs | 320 + .../src/account_infos/mod.rs | 16 + .../src/account_infos/transfer.rs | 285 + .../compressed-token-types/src/constants.rs | 52 + sdk-libs/compressed-token-types/src/error.rs | 35 + .../src/instruction/batch_compress.rs | 13 + .../src/instruction/burn.rs | 15 + .../src/instruction/delegation.rs | 27 + .../src/instruction/freeze.rs | 21 + .../src/instruction/generic.rs | 10 + .../src/instruction/mint_to.rs | 12 + .../src/instruction/mod.rs | 21 + .../src/instruction/transfer.rs | 99 + .../src/instruction/update_compressed_mint.rs | 29 + sdk-libs/compressed-token-types/src/lib.rs | 14 + .../compressed-token-types/src/token_data.rs | 25 + sdk-libs/macros/Cargo.toml | 10 +- sdk-libs/macros/src/discriminator.rs | 16 +- sdk-libs/macros/src/hasher/data_hasher.rs | 53 +- sdk-libs/macros/src/hasher/input_validator.rs | 30 - sdk-libs/macros/src/hasher/light_hasher.rs | 413 +- sdk-libs/macros/src/hasher/mod.rs | 2 +- sdk-libs/macros/src/hasher/to_byte_array.rs | 63 +- sdk-libs/macros/src/lib.rs | 57 +- sdk-libs/macros/tests/discriminator.rs | 16 - sdk-libs/macros/tests/hasher.rs | 158 +- sdk-libs/photon-api/Cargo.toml | 2 +- sdk-libs/photon-api/src/apis/configuration.rs | 11 - .../photon-api/src/models/account_list.rs | 4 +- sdk-libs/program-test/Cargo.toml | 25 +- .../src/accounts/compressible_config.rs | 154 + .../program-test/src/accounts/initialize.rs | 63 +- sdk-libs/program-test/src/accounts/mod.rs | 14 +- .../src/accounts/test_accounts.rs | 211 +- .../src/accounts/test_keypairs.rs | 2 +- sdk-libs/program-test/src/compressible.rs | 156 + .../src/forester/claim_forester.rs | 98 + .../forester/compress_and_close_forester.rs | 233 + sdk-libs/program-test/src/forester/mod.rs | 7 + .../src/forester/register_forester.rs | 80 + .../program-test/src/indexer/address_tree.rs | 6 +- .../program-test/src/indexer/extensions.rs | 1 - .../program-test/src/indexer/state_tree.rs | 2 +- .../program-test/src/indexer/test_indexer.rs | 259 +- sdk-libs/program-test/src/lib.rs | 25 +- sdk-libs/program-test/src/logging/decoder.rs | 100 +- .../program-test/src/logging/decoder.rs:70:15 | 0 .../src/logging/decoder.rs:946:15 | 0 .../program-test/src/logging/formatter.rs | 125 +- .../src/logging/formatter.rs:1218:19 | 0 sdk-libs/program-test/src/logging/types.rs | 34 +- .../program-test/src/logging/types.rs:473:15 | 0 .../program-test/src/program_test/config.rs | 48 +- .../program-test/src/program_test/indexer.rs | 16 +- .../src/program_test/light_program_test.rs | 322 +- sdk-libs/program-test/src/program_test/rpc.rs | 49 +- .../program-test/src/program_test/test_rpc.rs | 34 +- .../program-test/src/utils/create_account.rs | 2 +- .../program-test/src/utils/load_accounts.rs | 140 - sdk-libs/program-test/src/utils/mod.rs | 2 - .../src/utils/setup_light_programs.rs | 40 +- sdk-libs/sdk-pinocchio/Cargo.toml | 3 +- sdk-libs/sdk-pinocchio/src/address.rs | 43 +- .../src/cpi/{v1 => }/accounts.rs | 27 +- .../sdk-pinocchio/src/cpi/accounts_small.rs | 68 + sdk-libs/sdk-pinocchio/src/cpi/invoke.rs | 202 + sdk-libs/sdk-pinocchio/src/cpi/mod.rs | 14 +- sdk-libs/sdk-pinocchio/src/cpi/traits.rs | 99 - sdk-libs/sdk-pinocchio/src/cpi/v1/invoke.rs | 138 - sdk-libs/sdk-pinocchio/src/cpi/v1/mod.rs | 5 - sdk-libs/sdk-pinocchio/src/cpi/v2/accounts.rs | 108 - sdk-libs/sdk-pinocchio/src/cpi/v2/invoke.rs | 116 - sdk-libs/sdk-pinocchio/src/cpi/v2/mod.rs | 5 - sdk-libs/sdk-pinocchio/src/error.rs | 12 - sdk-libs/sdk-pinocchio/src/lib.rs | 2 +- sdk-libs/sdk-types/Cargo.toml | 4 +- sdk-libs/sdk-types/src/address.rs | 182 +- sdk-libs/sdk-types/src/constants.rs | 4 +- .../{cpi_accounts/v1.rs => cpi_accounts.rs} | 65 +- sdk-libs/sdk-types/src/cpi_accounts/config.rs | 42 - sdk-libs/sdk-types/src/cpi_accounts/mod.rs | 14 - .../v2.rs => cpi_accounts_small.rs} | 74 +- .../sdk-types/src/instruction/account_meta.rs | 21 +- .../sdk-types/src/instruction/tree_info.rs | 39 +- sdk-libs/sdk-types/src/lib.rs | 9 +- sdk-libs/sdk/Cargo.toml | 8 +- sdk-libs/sdk/src/account.rs | 1136 +-- sdk-libs/sdk/src/address.rs | 89 +- sdk-libs/sdk/src/cpi/account.rs | 88 - sdk-libs/sdk/src/cpi/{v1 => }/accounts.rs | 30 +- .../src/cpi/{v2 => }/accounts_cpi_context.rs | 6 - sdk-libs/sdk/src/cpi/accounts_small_ix.rs | 134 + sdk-libs/sdk/src/cpi/instruction.rs | 104 - sdk-libs/sdk/src/cpi/invoke.rs | 426 +- sdk-libs/sdk/src/cpi/mod.rs | 43 +- sdk-libs/sdk/src/cpi/v1/invoke.rs | 378 - sdk-libs/sdk/src/cpi/v1/mod.rs | 32 - sdk-libs/sdk/src/cpi/v2/accounts.rs | 96 - sdk-libs/sdk/src/cpi/v2/invoke.rs | 281 - sdk-libs/sdk/src/cpi/v2/mod.rs | 172 - sdk-libs/sdk/src/error.rs | 29 +- sdk-libs/sdk/src/instruction/mod.rs | 204 +- sdk-libs/sdk/src/instruction/pack_accounts.rs | 251 +- .../sdk/src/instruction/system_accounts.rs | 138 +- sdk-libs/sdk/src/lib.rs | 113 +- sdk-libs/sdk/src/token.rs | 31 +- sdk-libs/sdk/src/utils.rs | 13 - sdk-libs/token-client/Cargo.toml | 27 + .../create_compressible_token_account.rs | 95 + .../token-client/src/actions/create_mint.rs | 61 + .../src/actions/create_spl_mint.rs | 68 + .../src/actions/ctoken_transfer.rs | 77 + .../token-client/src/actions/mint_action.rs | 147 + .../src/actions/mint_to_compressed.rs | 51 + sdk-libs/token-client/src/actions/mod.rs | 15 + .../src/actions/transfer2/approve.rs | 53 + .../src/actions/transfer2/compress.rs | 72 + .../actions/transfer2/compress_and_close.rs | 60 + .../src/actions/transfer2/ctoken_to_spl.rs | 47 + .../src/actions/transfer2/decompress.rs | 54 + .../token-client/src/actions/transfer2/mod.rs | 17 + .../src/actions/transfer2/spl_to_ctoken.rs | 74 + .../src/actions/transfer2/transfer.rs | 56 + .../actions/transfer2/transfer_delegated.rs | 68 + .../src/actions/update_compressed_mint.rs | 113 + .../src/instructions/create_mint.rs | 91 + .../src/instructions/create_spl_mint.rs | 111 + .../src/instructions/mint_action.rs | 256 + .../src/instructions/mint_to_compressed.rs | 111 + sdk-libs/token-client/src/instructions/mod.rs | 6 + .../src/instructions/transfer2.rs | 629 ++ .../instructions/update_compressed_mint.rs | 111 + sdk-libs/token-client/src/lib.rs | 2 + sdk-tests/client-test/Cargo.toml | 11 +- .../client-test/tests/bmt_program_test.rs | 176 - sdk-tests/client-test/tests/light_client.rs | 92 +- .../client-test/tests/light_program_test.rs | 81 +- sdk-tests/sdk-anchor-test/.gitignore | 1 + sdk-tests/sdk-anchor-test/Anchor.toml | 9 +- sdk-tests/sdk-anchor-test/package.json | 28 +- .../programs/sdk-anchor-test/Cargo.toml | 8 +- .../programs/sdk-anchor-test/src/lib.rs | 311 +- .../programs/sdk-anchor-test/src/read_only.rs | 152 - .../sdk-anchor-test/tests/read_only.rs | 429 -- .../programs/sdk-anchor-test/tests/test.rs | 227 +- .../target/idl/sdk_anchor_test.json | 726 -- .../target/types/sdk_anchor_test.ts | 732 -- sdk-tests/sdk-anchor-test/tests/test_v1.ts | 331 - sdk-tests/sdk-anchor-test/tests/test_v2.ts | 342 - sdk-tests/sdk-anchor-test/tsconfig.json | 3 +- sdk-tests/sdk-native-test/Cargo.toml | 5 +- sdk-tests/sdk-native-test/src/create_pda.rs | 28 +- sdk-tests/sdk-native-test/src/lib.rs | 2 +- sdk-tests/sdk-native-test/src/update_pda.rs | 26 +- sdk-tests/sdk-native-test/tests/test.rs | 3 +- .../Cargo.toml | 11 +- .../Xargo.toml | 0 .../src/create_pda.rs | 52 +- .../src/lib.rs | 4 +- .../src/update_pda.rs | 24 +- .../tests/test.rs | 24 +- sdk-tests/sdk-pinocchio-v1-test/src/lib.rs | 44 - sdk-tests/sdk-pinocchio-v1-test/tests/test.rs | 197 - sdk-tests/sdk-pinocchio-v2-test/Cargo.toml | 43 - .../sdk-pinocchio-v2-test/src/create_pda.rs | 80 - .../sdk-pinocchio-v2-test/src/update_pda.rs | 62 - sdk-tests/sdk-token-test/CLAUDE.md | 13 + sdk-tests/sdk-token-test/Cargo.toml | 64 + .../Xargo.toml | 2 +- .../src/ctoken_pda/create_pda.rs | 47 + .../sdk-token-test/src/ctoken_pda/mint.rs | 89 + .../sdk-token-test/src/ctoken_pda/mod.rs | 17 + .../src/ctoken_pda/processor.rs | 45 + sdk-tests/sdk-token-test/src/lib.rs | 410 ++ .../src/mint_compressed_tokens_cpi_write.rs | 63 + .../src/pda_ctoken/create_pda.rs | 48 + .../sdk-token-test/src/pda_ctoken/mint.rs | 76 + .../sdk-token-test/src/pda_ctoken/mod.rs | 22 + .../src/pda_ctoken/processor.rs | 54 + .../src/process_batch_compress_tokens.rs | 57 + .../src/process_compress_and_close_cpi.rs | 55 + .../process_compress_and_close_cpi_context.rs | 52 + .../process_compress_and_close_cpi_indices.rs | 44 + .../src/process_compress_full_and_close.rs | 121 + .../src/process_compress_tokens.rs | 43 + .../src/process_create_compressed_account.rs | 148 + ...s_create_ctoken_with_compress_to_pubkey.rs | 60 + .../src/process_create_escrow_pda.rs | 49 + .../process_decompress_full_cpi_context.rs | 50 + .../src/process_decompress_tokens.rs | 50 + .../src/process_four_invokes.rs | 196 + .../src/process_four_transfer2.rs | 312 + .../src/process_transfer_tokens.rs | 48 + .../src/process_update_deposit.rs | 306 + .../tests/compress_and_close_cpi.rs | 652 ++ sdk-tests/sdk-token-test/tests/ctoken_pda.rs | 280 + .../tests/decompress_full_cpi.rs | 507 ++ sdk-tests/sdk-token-test/tests/pda_ctoken.rs | 354 + sdk-tests/sdk-token-test/tests/test.rs | 614 ++ .../tests/test_4_invocations.rs | 597 ++ .../sdk-token-test/tests/test_4_transfer2.rs | 593 ++ .../tests/test_compress_full_and_close.rs | 377 + .../tests/test_compress_to_pubkey.rs | 114 + .../sdk-token-test/tests/test_deposit.rs | 483 ++ sdk-tests/sdk-v1-native-test/Cargo.toml | 42 - .../sdk-v1-native-test/src/create_pda.rs | 83 - sdk-tests/sdk-v1-native-test/src/lib.rs | 51 - .../sdk-v1-native-test/src/update_pda.rs | 81 - sdk-tests/sdk-v1-native-test/tests/test.rs | 174 - sparse-merkle-tree/Cargo.toml | 4 +- sparse-merkle-tree/src/merkle_tree.rs | 2 +- xtask/Cargo.toml | 3 +- xtask/src/bench.rs | 2 +- xtask/src/hash_set.rs | 4 +- xtask/src/new_deployment.rs | 1 - 1171 files changed, 80851 insertions(+), 37014 deletions(-) create mode 100644 .github/actions/setup-and-build-nocheck/action.yml rename .github/workflows/{sdk-tests.yml => light-examples-tests.yml} (52%) create mode 100644 .github/workflows/release-pr-rust.yml delete mode 100644 .github/workflows/release-pr-validation.yml delete mode 100644 .github/workflows/release-rust.yml create mode 100644 .github/workflows/release.yml create mode 100644 CLAUDE.md create mode 100644 DOCS.md delete mode 100644 audits/accretion-pinocchio-audit-06-2025.pdf delete mode 100644 audits/ottersec_refactor_audit_final_06-2025.pdf delete mode 100644 audits/ottersec_zerocopy_audit_03-2025.pdf rename cli/accounts/{batch_address_merkle_tree_amt2kaJA14v3urZbZvnc5v2np8jqvc4Z8zDep5wbtzx.json => batch_state_merkle_tree_HLKs5NJ8FXkJg8BrzJt56adFYYuwg5etzDtBbQYTsixu.json} (98%) delete mode 100644 cli/accounts/batch_state_merkle_tree_bmt1LryLZUMmF7ZtqESaw7wifBXLfXHQYoE4GAmrahU.json delete mode 100644 cli/accounts/batch_state_merkle_tree_bmt2UxoBxB9xWev4BkLvkGdapsz6sZGkzViPNph7VFi.json delete mode 100644 cli/accounts/batch_state_merkle_tree_bmt3ccLd4bqSVZVeCJnH1F6C8jNygAhaDfxDwePyyGb.json delete mode 100644 cli/accounts/batch_state_merkle_tree_bmt4d3p1a4YQgk9PeZv5s4DBUmbF5NxqYpk9HGjQsd8.json delete mode 100644 cli/accounts/batch_state_merkle_tree_bmt5yU97jC88YXTuSukYHa8Z5Bi2ZDUtmzfkDTA2mG2.json rename cli/accounts/{batched_output_queue_oq1na8gojfdUhsfCpyjNt6h4JaDWtHf1yQj4koBWfto.json => batched_output_queue_6L7SzhYB3anwEQ9cphpJ1U7Scwj57bx2xueReg7R9cKU.json} (80%) delete mode 100644 cli/accounts/batched_output_queue_oq2UkeMsJLfXt2QHzim242SUi3nvjJs8Pn7Eac9H9vg.json delete mode 100644 cli/accounts/batched_output_queue_oq3AxjekBWgo64gpauB6QtuZNesuv19xrhaC1ZM1THQ.json delete mode 100644 cli/accounts/batched_output_queue_oq4ypwvVGzCUMoiKKHWh4S1SgZJ9vCvKpcz6RT6A8dq.json delete mode 100644 cli/accounts/batched_output_queue_oq5oh5ZR3yGomuQgFduNDzjtGvVWfDRGLuDVjv9a96P.json delete mode 100644 cli/accounts/cpi_context_cpi15BoVPKgEPw5o8wc2T816GE7b378nMXnhH3Xbq4y.json delete mode 100644 cli/accounts/cpi_context_cpi2yGapXUR3As5SjnHBAVvmApNiLsbeZpF3euWnW6B.json delete mode 100644 cli/accounts/cpi_context_cpi3mbwMpSX8FAGMZVP85AwxqCaQMfEk9Em1v8QK9Rf.json delete mode 100644 cli/accounts/cpi_context_cpi4yyPDc4bCgHAnsenunGA8Y77j3XEDyjgfyCKgcoc.json delete mode 100644 cli/accounts/cpi_context_cpi5ZTjdgYpZ1Xr7B1cMLLUE81oTtJbNNAyKary2nV6.json create mode 100644 cli/accounts/group_pda_G6iaDqLrGGjrPXgsyV2NmcRjzAQzWWiaVyAaixbLCNNu.json delete mode 100644 cli/eslint.config.js create mode 100644 cli/eslint.config.mjs create mode 100644 cli/pnpm-lock.yaml create mode 100755 cli/scripts/buildProver.sh delete mode 100644 cli/src/utils/downloadProverBinary.ts create mode 100755 forester/scripts/compare_performance.py create mode 100755 forester/scripts/v2_stats.py delete mode 100644 forester/tests/test_batch_append_spent.rs create mode 100644 js/compressed-token/.eslintignore create mode 100644 js/compressed-token/.eslintrc.json delete mode 100644 js/compressed-token/eslint.config.cjs create mode 100644 js/stateless.js/.eslintignore create mode 100644 js/stateless.js/.eslintrc.json delete mode 100644 js/stateless.js/eslint.config.cjs delete mode 100644 js/stateless.js/src/utils/instruction.ts delete mode 100644 js/stateless.js/tests/unit/utils/address-v2.test.ts create mode 100644 program-libs/account-checks/CLAUDE.md create mode 100644 program-libs/account-checks/docs/ACCOUNT_CHECKS.md create mode 100644 program-libs/account-checks/docs/ACCOUNT_INFO_TRAIT.md create mode 100644 program-libs/account-checks/docs/ACCOUNT_ITERATOR.md create mode 100644 program-libs/account-checks/docs/CLAUDE.md create mode 100644 program-libs/account-checks/docs/DISCRIMINATOR.md create mode 100644 program-libs/account-checks/docs/ERRORS.md create mode 100644 program-libs/account-checks/docs/PACKED_ACCOUNTS.md rename {program-tests/batched-merkle-tree-test => program-libs/batched-merkle-tree}/tests/account_access.rs (99%) rename {program-tests/batched-merkle-tree-test => program-libs/batched-merkle-tree}/tests/initialize_address_tree.rs (100%) rename {program-tests/batched-merkle-tree-test => program-libs/batched-merkle-tree}/tests/initialize_state_tree.rs (100%) rename {program-tests/batched-merkle-tree-test => program-libs/batched-merkle-tree}/tests/merkle_tree.rs (99%) rename {program-tests/batched-merkle-tree-test => program-libs/batched-merkle-tree}/tests/queue.rs (99%) rename {program-tests/batched-merkle-tree-test => program-libs/batched-merkle-tree}/tests/rollover_address_tree.rs (99%) rename {program-tests/batched-merkle-tree-test => program-libs/batched-merkle-tree}/tests/rollover_state_tree.rs (99%) delete mode 100644 program-libs/compressed-account/tests/instruction_data.rs create mode 100644 program-libs/compressible/CLAUDE.md create mode 100644 program-libs/compressible/Cargo.toml rename prover/server/scripts/ph2.sh => program-libs/compressible/docs/CLAUDE.md (100%) create mode 100644 program-libs/compressible/docs/CONFIG_ACCOUNT.md create mode 100644 program-libs/compressible/docs/ERRORS.md create mode 100644 program-libs/compressible/docs/RENT.md create mode 100644 program-libs/compressible/docs/SOLANA_RENT.md create mode 100644 program-libs/compressible/src/compression_info.rs create mode 100644 program-libs/compressible/src/config.rs create mode 100644 program-libs/compressible/src/error.rs create mode 100644 program-libs/compressible/src/lib.rs create mode 100644 program-libs/compressible/src/rent.rs create mode 100644 program-libs/ctoken-types/Cargo.toml create mode 100644 program-libs/ctoken-types/src/constants.rs create mode 100644 program-libs/ctoken-types/src/error.rs create mode 100644 program-libs/ctoken-types/src/hash_cache.rs create mode 100644 program-libs/ctoken-types/src/instructions/create_associated_token_account.rs create mode 100644 program-libs/ctoken-types/src/instructions/create_ctoken_account.rs create mode 100644 program-libs/ctoken-types/src/instructions/extensions/compressible.rs create mode 100644 program-libs/ctoken-types/src/instructions/extensions/mod.rs create mode 100644 program-libs/ctoken-types/src/instructions/extensions/token_metadata.rs create mode 100644 program-libs/ctoken-types/src/instructions/mint_action/cpi_context.rs create mode 100644 program-libs/ctoken-types/src/instructions/mint_action/create_spl_mint.rs create mode 100644 program-libs/ctoken-types/src/instructions/mint_action/instruction_data.rs create mode 100644 program-libs/ctoken-types/src/instructions/mint_action/mint_to_compressed.rs create mode 100644 program-libs/ctoken-types/src/instructions/mint_action/mint_to_ctoken.rs create mode 100644 program-libs/ctoken-types/src/instructions/mint_action/mod.rs create mode 100644 program-libs/ctoken-types/src/instructions/mint_action/update_metadata.rs create mode 100644 program-libs/ctoken-types/src/instructions/mint_action/update_mint.rs create mode 100644 program-libs/ctoken-types/src/instructions/mod.rs create mode 100644 program-libs/ctoken-types/src/instructions/transfer2/compression.rs create mode 100644 program-libs/ctoken-types/src/instructions/transfer2/cpi_context.rs create mode 100644 program-libs/ctoken-types/src/instructions/transfer2/instruction_data.rs create mode 100644 program-libs/ctoken-types/src/instructions/transfer2/mod.rs create mode 100644 program-libs/ctoken-types/src/lib.rs create mode 100644 program-libs/ctoken-types/src/state/compressed_token/hash.rs create mode 100644 program-libs/ctoken-types/src/state/compressed_token/mod.rs create mode 100644 program-libs/ctoken-types/src/state/compressed_token/token_data.rs create mode 100644 program-libs/ctoken-types/src/state/compressed_token/token_data_version.rs create mode 100644 program-libs/ctoken-types/src/state/ctoken/borsh.rs create mode 100644 program-libs/ctoken-types/src/state/ctoken/ctoken_struct.rs create mode 100644 program-libs/ctoken-types/src/state/ctoken/mod.rs create mode 100644 program-libs/ctoken-types/src/state/ctoken/zero_copy.rs create mode 100644 program-libs/ctoken-types/src/state/extensions/extension_struct.rs create mode 100644 program-libs/ctoken-types/src/state/extensions/extension_type.rs create mode 100644 program-libs/ctoken-types/src/state/extensions/mod.rs create mode 100644 program-libs/ctoken-types/src/state/extensions/token_metadata.rs create mode 100644 program-libs/ctoken-types/src/state/mint/borsh.rs create mode 100644 program-libs/ctoken-types/src/state/mint/compressed_mint.rs create mode 100644 program-libs/ctoken-types/src/state/mint/mod.rs create mode 100644 program-libs/ctoken-types/src/state/mint/zero_copy.rs create mode 100644 program-libs/ctoken-types/src/state/mod.rs create mode 100644 program-libs/ctoken-types/tests/compressed_mint.rs create mode 100644 program-libs/ctoken-types/tests/ctoken/failing.rs create mode 100644 program-libs/ctoken-types/tests/ctoken/mod.rs create mode 100644 program-libs/ctoken-types/tests/ctoken/randomized_solana_ctoken.rs create mode 100644 program-libs/ctoken-types/tests/ctoken/spl_compat.rs create mode 100644 program-libs/ctoken-types/tests/ctoken/zero_copy_new.rs create mode 100644 program-libs/ctoken-types/tests/hash_tests.rs create mode 100644 program-libs/ctoken-types/tests/mint_borsh_zero_copy.rs create mode 100644 program-libs/ctoken-types/tests/mint_compat.rs create mode 100644 program-libs/ctoken-types/tests/mod.rs create mode 100644 program-libs/ctoken-types/tests/token_data.rs create mode 100644 program-libs/ctoken-types/tests/token_data_hash.rs create mode 100644 program-libs/ctoken-types/tests/token_metadata.rs create mode 100644 program-libs/verifier/src/verifying_keys/address_append_40_10.rs create mode 100644 program-libs/verifier/src/verifying_keys/address_append_40_250.rs create mode 100644 program-libs/verifier/src/verifying_keys/append_with_proofs_32_10.rs create mode 100644 program-libs/verifier/src/verifying_keys/append_with_proofs_32_500.rs delete mode 100644 program-libs/verifier/src/verifying_keys/batch_address_append_40_10.rs delete mode 100644 program-libs/verifier/src/verifying_keys/batch_address_append_40_250.rs delete mode 100644 program-libs/verifier/src/verifying_keys/batch_append_32_10.rs delete mode 100644 program-libs/verifier/src/verifying_keys/batch_append_32_500.rs delete mode 100644 program-libs/verifier/src/verifying_keys/batch_update_32_10.rs delete mode 100644 program-libs/verifier/src/verifying_keys/batch_update_32_500.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_26_26_1_1.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_26_26_1_2.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_26_26_2_1.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_26_26_2_2.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_26_26_3_1.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_26_26_3_2.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_26_26_4_1.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_26_26_4_2.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_32_40_1_1.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_32_40_1_2.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_32_40_1_3.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_32_40_1_4.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_32_40_2_1.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_32_40_2_2.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_32_40_2_3.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_32_40_2_4.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_32_40_3_1.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_32_40_3_2.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_32_40_3_3.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_32_40_3_4.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_32_40_4_1.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_32_40_4_2.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_32_40_4_3.rs create mode 100644 program-libs/verifier/src/verifying_keys/combined_32_40_4_4.rs create mode 100644 program-libs/verifier/src/verifying_keys/inclusion_26_1.rs create mode 100644 program-libs/verifier/src/verifying_keys/inclusion_26_2.rs create mode 100644 program-libs/verifier/src/verifying_keys/inclusion_26_3.rs create mode 100644 program-libs/verifier/src/verifying_keys/inclusion_26_4.rs create mode 100644 program-libs/verifier/src/verifying_keys/inclusion_26_8.rs create mode 100644 program-libs/verifier/src/verifying_keys/inclusion_32_1.rs create mode 100644 program-libs/verifier/src/verifying_keys/inclusion_32_2.rs create mode 100644 program-libs/verifier/src/verifying_keys/inclusion_32_3.rs create mode 100644 program-libs/verifier/src/verifying_keys/inclusion_32_4.rs create mode 100644 program-libs/verifier/src/verifying_keys/inclusion_32_8.rs create mode 100644 program-libs/verifier/src/verifying_keys/non_inclusion_26_1.rs create mode 100644 program-libs/verifier/src/verifying_keys/non_inclusion_26_2.rs create mode 100644 program-libs/verifier/src/verifying_keys/non_inclusion_40_1.rs create mode 100644 program-libs/verifier/src/verifying_keys/non_inclusion_40_2.rs create mode 100644 program-libs/verifier/src/verifying_keys/non_inclusion_40_3.rs create mode 100644 program-libs/verifier/src/verifying_keys/non_inclusion_40_4.rs create mode 100644 program-libs/verifier/src/verifying_keys/non_inclusion_40_8.rs create mode 100644 program-libs/verifier/src/verifying_keys/update_32_10.rs create mode 100644 program-libs/verifier/src/verifying_keys/update_32_500.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_1_1.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_1_2.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_1_4.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_1_8.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_2_1.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_2_2.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_2_4.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_2_8.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_3_1.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_3_2.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_3_4.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_3_8.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_4_1.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_4_2.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_4_4.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_4_8.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_8_1.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_8_2.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_8_4.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_combined_26_26_8_8.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_inclusion_26_1.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_inclusion_26_2.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_inclusion_26_3.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_inclusion_26_4.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_inclusion_26_8.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_non_inclusion_26_1.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_non_inclusion_26_2.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_non_inclusion_26_3.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_non_inclusion_26_4.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v1_non_inclusion_26_8.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_combined_32_40_1_1.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_combined_32_40_1_2.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_combined_32_40_1_3.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_combined_32_40_1_4.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_combined_32_40_2_1.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_combined_32_40_2_2.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_combined_32_40_2_3.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_combined_32_40_2_4.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_combined_32_40_3_1.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_combined_32_40_3_2.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_combined_32_40_3_3.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_combined_32_40_3_4.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_combined_32_40_4_1.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_combined_32_40_4_2.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_combined_32_40_4_3.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_combined_32_40_4_4.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_1.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_10.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_11.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_12.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_13.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_14.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_15.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_16.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_17.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_18.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_19.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_2.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_20.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_3.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_4.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_5.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_6.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_7.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_8.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_inclusion_32_9.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_1.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_10.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_11.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_12.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_13.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_14.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_15.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_16.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_17.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_18.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_19.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_2.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_20.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_21.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_22.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_23.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_24.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_25.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_26.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_27.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_28.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_29.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_3.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_30.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_31.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_32.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_4.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_5.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_6.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_7.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_8.rs delete mode 100644 program-libs/verifier/src/verifying_keys/v2_non_inclusion_40_9.rs rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/instruction_data.rs (99%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/random.rs (99%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui.rs (63%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/01_empty_struct.rs (87%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/01_empty_struct.stderr (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/07_tuple_struct.rs (60%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/07_tuple_struct.stderr (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/08_newtype_pattern.rs (55%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/08_newtype_pattern.stderr (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/47_tuple_struct_empty.rs (54%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/47_tuple_struct_empty.stderr (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/48_tuple_single_field.rs (65%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/48_tuple_single_field.stderr (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/54_floating_point_types.rs (92%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/54_floating_point_types.stderr (93%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/55_usize_isize_types.rs (92%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/55_usize_isize_types.stderr (92%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/58_array_of_options.rs (92%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/58_array_of_options.stderr (87%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/67_char_type.rs (92%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/67_char_type.stderr (95%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/missing_repr_c.rs (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/missing_repr_c.stderr (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/unsupported_field_type.rs (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/unsupported_field_type.stderr (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/unsupported_tuple_struct.rs (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/unsupported_tuple_struct.stderr (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/unsupported_union.rs (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail/unsupported_union.stderr (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail_mut/missing_repr_c_mut.rs (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/fail_mut/missing_repr_c_mut.stderr (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/02_single_u8_field.rs (98%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/03_all_primitives.rs (92%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/04_nested_vecs.rs (92%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/05_nested_options.rs (90%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/06_array_fields.rs (91%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/09_enum_unit_variants.rs (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/10_enum_mixed_variants.rs (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/11_pubkey_fields.rs (91%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/12_mixed_visibility.rs (84%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/13_large_struct.rs (81%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/14_vec_of_arrays.rs (86%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/15_option_vec.rs (89%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/16_bool_fields.rs (91%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/17_signed_integers.rs (84%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/18_zero_sized_arrays.rs (90%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/19_max_sized_array.rs (98%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/20_nested_struct_fields.rs (94%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/21_enum_single_variant.rs (95%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/22_primitive_after_vec.rs (82%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/23_multiple_options_after_vec.rs (92%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/24_vec_option_vec.rs (92%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/25_all_optional.rs (92%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/26_deep_nesting.rs (91%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/27_mixed_arrays.rs (91%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/28_field_named_data.rs (87%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/29_field_named_bytes.rs (87%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/30_underscore_fields.rs (87%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/31_numeric_suffix_fields.rs (82%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/32_camel_case_fields.rs (92%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/33_single_letter_fields.rs (82%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/34_vec_of_bools.rs (86%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/35_option_bool.rs (87%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/36_array_of_bools.rs (85%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/37_meta_boundary_primitive.rs (80%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/38_meta_boundary_option.rs (87%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/39_enum_with_array.rs (96%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/40_enum_discriminant_order.rs (96%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/41_struct_with_lifetime_name.rs (87%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/42_reserved_keywords.rs (88%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/43_alternating_types.rs (93%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/44_all_vecs.rs (98%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/45_single_vec.rs (94%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/46_single_option.rs (80%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/49_max_meta_fields.rs (92%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/50_combination_all_features.rs (95%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/51_deep_nested_structs.rs (95%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/52_enum_containing_struct.rs (96%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/53_enum_containing_vec.rs (96%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/56_all_derives.rs (93%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/57_option_of_array.rs (96%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/59_vec_of_options.rs (94%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/60_option_pubkey.rs (97%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/61_vec_pubkey.rs (81%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/62_array_pubkey.rs (98%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/63_arrays_only.rs (97%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/64_option_first_field.rs (92%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/65_vec_of_vec.rs (94%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/66_triple_nested_option.rs (93%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/68_enum_containing_option.rs (96%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/69_very_long_field_names.rs (73%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/70_rust_type_field_names.rs (93%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/basic_enum.rs (95%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/basic_struct.rs (90%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/complex_enum.rs (92%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/readme.md (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/repr_c_packed_test.rs (97%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/with_arrays.rs (91%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/with_options.rs (91%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/with_pubkey.rs (79%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass/with_vectors.rs (92%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass_mut/basic_mut.rs (100%) rename {program-tests/zero-copy-derive-test => program-libs/zero-copy-derive}/tests/ui/pass_mut/complex_mut.rs (100%) delete mode 100644 program-tests/batched-merkle-tree-test/Cargo.toml delete mode 100644 program-tests/batched-merkle-tree-test/src/lib.rs create mode 100644 program-tests/compressed-token-test/tests/account.rs create mode 100644 program-tests/compressed-token-test/tests/compressible.rs create mode 100644 program-tests/compressed-token-test/tests/metadata.rs create mode 100644 program-tests/compressed-token-test/tests/mint.rs create mode 100644 program-tests/compressed-token-test/tests/transfer2.rs create mode 100644 program-tests/compressed-token-test/tests/transfer2_functional.rs create mode 100644 program-tests/profile/Cargo.toml create mode 100644 program-tests/profile/src/lib.rs create mode 100644 program-tests/profile/tests/macro_test.rs create mode 100644 program-tests/sdk-anchor-test/package.json delete mode 100644 program-tests/system-cpi-test/src/cpi_context_event.rs delete mode 100644 program-tests/system-cpi-test/src/cpi_context_event_inputs.rs delete mode 100644 program-tests/system-cpi-test/tests/test_cpi_context_event.rs create mode 100644 program-tests/utils/src/assert_account.rs create mode 100644 program-tests/utils/src/assert_claim.rs create mode 100644 program-tests/utils/src/assert_close_token_account.rs create mode 100644 program-tests/utils/src/assert_create_token_account.rs create mode 100644 program-tests/utils/src/assert_ctoken_transfer.rs create mode 100644 program-tests/utils/src/assert_metadata.rs create mode 100644 program-tests/utils/src/assert_mint_action.rs create mode 100644 program-tests/utils/src/assert_mint_to_compressed.rs create mode 100644 program-tests/utils/src/assert_spl_mint.rs create mode 100644 program-tests/utils/src/assert_transfer2.rs create mode 100644 program-tests/utils/src/mint_assert.rs delete mode 100644 program-tests/zero-copy-derive-test/Cargo.toml delete mode 100644 program-tests/zero-copy-derive-test/src/lib.rs rename programs/compressed-token/{ => anchor}/Cargo.toml (84%) create mode 100644 programs/compressed-token/anchor/README.md rename programs/compressed-token/{ => anchor}/Xargo.toml (100%) rename programs/compressed-token/{ => anchor}/src/batch_compress.rs (100%) rename programs/compressed-token/{ => anchor}/src/burn.rs (96%) rename programs/compressed-token/{ => anchor}/src/constants.rs (54%) rename programs/compressed-token/{ => anchor}/src/delegation.rs (96%) rename programs/compressed-token/{ => anchor}/src/freeze.rs (87%) rename programs/compressed-token/{ => anchor}/src/instructions/burn.rs (100%) rename programs/compressed-token/{ => anchor}/src/instructions/create_token_pool.rs (100%) rename programs/compressed-token/{ => anchor}/src/instructions/freeze.rs (100%) rename programs/compressed-token/{ => anchor}/src/instructions/generic.rs (100%) rename programs/compressed-token/{ => anchor}/src/instructions/mod.rs (100%) rename programs/compressed-token/{ => anchor}/src/instructions/transfer.rs (100%) rename programs/compressed-token/{ => anchor}/src/lib.rs (65%) rename programs/compressed-token/{ => anchor}/src/process_compress_spl_token_account.rs (100%) rename programs/compressed-token/{ => anchor}/src/process_mint.rs (97%) rename programs/compressed-token/{ => anchor}/src/process_transfer.rs (89%) rename programs/compressed-token/{ => anchor}/src/spl_compression.rs (95%) create mode 100644 programs/compressed-token/program/CLAUDE.md create mode 100644 programs/compressed-token/program/Cargo.toml create mode 100644 programs/compressed-token/program/README.md rename {sdk-tests/sdk-pinocchio-v1-test => programs/compressed-token/program}/Xargo.toml (100%) create mode 100644 programs/compressed-token/program/docs/ACCOUNTS.md create mode 100644 programs/compressed-token/program/docs/CLAUDE.md create mode 100644 programs/compressed-token/program/docs/instructions/CLAIM.md create mode 100644 programs/compressed-token/program/docs/instructions/CLAUDE.md create mode 100644 programs/compressed-token/program/docs/instructions/CLOSE_TOKEN_ACCOUNT.md create mode 100644 programs/compressed-token/program/docs/instructions/CREATE_TOKEN_ACCOUNT.md create mode 100644 programs/compressed-token/program/docs/instructions/CTOKEN_TRANSFER.md create mode 100644 programs/compressed-token/program/docs/instructions/MINT_ACTION.md create mode 100644 programs/compressed-token/program/docs/instructions/TRANSFER2.md create mode 100644 programs/compressed-token/program/docs/instructions/WITHDRAW_FUNDING_POOL.md create mode 100644 programs/compressed-token/program/src/claim.rs create mode 100644 programs/compressed-token/program/src/close_token_account/accounts.rs create mode 100644 programs/compressed-token/program/src/close_token_account/mod.rs create mode 100644 programs/compressed-token/program/src/close_token_account/processor.rs create mode 100644 programs/compressed-token/program/src/convert_account_infos.rs create mode 100644 programs/compressed-token/program/src/create_associated_token_account.rs create mode 100644 programs/compressed-token/program/src/create_token_account.rs create mode 100644 programs/compressed-token/program/src/ctoken_transfer.rs create mode 100644 programs/compressed-token/program/src/extensions/mod.rs create mode 100644 programs/compressed-token/program/src/extensions/processor.rs create mode 100644 programs/compressed-token/program/src/extensions/token_metadata.rs create mode 100644 programs/compressed-token/program/src/lib.rs create mode 100644 programs/compressed-token/program/src/mint_action/accounts.rs create mode 100644 programs/compressed-token/program/src/mint_action/actions/authority.rs create mode 100644 programs/compressed-token/program/src/mint_action/actions/create_mint.rs create mode 100644 programs/compressed-token/program/src/mint_action/actions/create_spl_mint/create_mint_account.rs create mode 100644 programs/compressed-token/program/src/mint_action/actions/create_spl_mint/create_token_pool.rs create mode 100644 programs/compressed-token/program/src/mint_action/actions/create_spl_mint/mod.rs create mode 100644 programs/compressed-token/program/src/mint_action/actions/create_spl_mint/process.rs create mode 100644 programs/compressed-token/program/src/mint_action/actions/mint_to.rs create mode 100644 programs/compressed-token/program/src/mint_action/actions/mint_to_ctoken.rs create mode 100644 programs/compressed-token/program/src/mint_action/actions/mod.rs create mode 100644 programs/compressed-token/program/src/mint_action/actions/process_actions.rs create mode 100644 programs/compressed-token/program/src/mint_action/actions/update_metadata.rs create mode 100644 programs/compressed-token/program/src/mint_action/mint_input.rs create mode 100644 programs/compressed-token/program/src/mint_action/mint_output.rs create mode 100644 programs/compressed-token/program/src/mint_action/mod.rs create mode 100644 programs/compressed-token/program/src/mint_action/processor.rs create mode 100644 programs/compressed-token/program/src/mint_action/queue_indices.rs create mode 100644 programs/compressed-token/program/src/mint_action/zero_copy_config.rs create mode 100644 programs/compressed-token/program/src/shared/accounts.rs create mode 100644 programs/compressed-token/program/src/shared/convert_program_error.rs create mode 100644 programs/compressed-token/program/src/shared/cpi.rs create mode 100644 programs/compressed-token/program/src/shared/cpi_bytes_size.rs create mode 100644 programs/compressed-token/program/src/shared/create_pda_account.rs create mode 100644 programs/compressed-token/program/src/shared/initialize_ctoken_account.rs create mode 100644 programs/compressed-token/program/src/shared/mint_to_token_pool.rs create mode 100644 programs/compressed-token/program/src/shared/mod.rs create mode 100644 programs/compressed-token/program/src/shared/owner_validation.rs create mode 100644 programs/compressed-token/program/src/shared/token_input.rs create mode 100644 programs/compressed-token/program/src/shared/token_output.rs create mode 100644 programs/compressed-token/program/src/shared/transfer_lamports.rs create mode 100644 programs/compressed-token/program/src/shared/validate_ata_derivation.rs create mode 100644 programs/compressed-token/program/src/transfer2/accounts.rs create mode 100644 programs/compressed-token/program/src/transfer2/change_account.rs create mode 100644 programs/compressed-token/program/src/transfer2/compression/ctoken/compress_and_close.rs create mode 100644 programs/compressed-token/program/src/transfer2/compression/ctoken/compress_or_decompress_ctokens.rs create mode 100644 programs/compressed-token/program/src/transfer2/compression/ctoken/inputs.rs create mode 100644 programs/compressed-token/program/src/transfer2/compression/ctoken/mod.rs create mode 100644 programs/compressed-token/program/src/transfer2/compression/mod.rs create mode 100644 programs/compressed-token/program/src/transfer2/compression/native.rs create mode 100644 programs/compressed-token/program/src/transfer2/compression/spl.rs create mode 100644 programs/compressed-token/program/src/transfer2/config.rs create mode 100644 programs/compressed-token/program/src/transfer2/cpi.rs create mode 100644 programs/compressed-token/program/src/transfer2/mod.rs create mode 100644 programs/compressed-token/program/src/transfer2/processor.rs create mode 100644 programs/compressed-token/program/src/transfer2/sum_check.rs create mode 100644 programs/compressed-token/program/src/transfer2/token_inputs.rs create mode 100644 programs/compressed-token/program/src/transfer2/token_outputs.rs create mode 100644 programs/compressed-token/program/src/withdraw_funding_pool.rs create mode 100644 programs/compressed-token/program/tests/allocation_test.rs create mode 100644 programs/compressed-token/program/tests/check_authority.rs create mode 100644 programs/compressed-token/program/tests/exact_allocation_test.rs create mode 100644 programs/compressed-token/program/tests/mint.rs create mode 100644 programs/compressed-token/program/tests/mint_action.rs create mode 100644 programs/compressed-token/program/tests/mint_action_accounts_validation.rs create mode 100644 programs/compressed-token/program/tests/multi_sum_check.rs create mode 100644 programs/compressed-token/program/tests/print_error_codes.rs create mode 100644 programs/compressed-token/program/tests/queue_indices.rs create mode 100644 programs/compressed-token/program/tests/token_input.rs create mode 100644 programs/compressed-token/program/tests/token_output.rs delete mode 100644 programs/compressed-token/src/token_data.rs create mode 100644 programs/registry/CLAUDE.md create mode 100644 programs/registry/output.txtclear create mode 100644 programs/registry/src/compressible/claim.rs create mode 100644 programs/registry/src/compressible/compress_and_close.rs create mode 100644 programs/registry/src/compressible/create_config.rs create mode 100644 programs/registry/src/compressible/create_config_counter.rs create mode 100644 programs/registry/src/compressible/mod.rs create mode 100644 programs/registry/src/compressible/update_config.rs create mode 100644 programs/registry/src/compressible/withdraw_funding_pool.rs create mode 100644 programs/system/CHANGELOG.md rename programs/system/src/invoke_cpi/{instruction_v2.rs => instruction_small.rs} (93%) rename programs/system/tests/{invoke_cpi_instruction_v2.rs => invoke_cpi_instruction_small.rs} (83%) rename prover/server/prover/{v2 => }/batch_address_append_circuit.go (87%) rename prover/server/prover/{v2 => }/batch_address_append_circuit_test.go (99%) rename prover/server/prover/{v2 => }/batch_append_circuit.go (92%) rename prover/server/prover/{v2 => }/batch_append_circuit_test.go (95%) rename prover/server/prover/{v2 => }/batch_circuit_helpers.go (92%) rename prover/server/prover/{v2 => }/batch_update_circuit.go (92%) rename prover/server/prover/{v2 => }/batch_update_circuit_test.go (92%) rename prover/server/prover/{common/proof_request_meta.go => circuit_builder.go} (57%) rename prover/server/prover/{common => }/circuit_utils.go (96%) rename prover/server/prover/{v2 => }/combined_circuit.go (80%) rename prover/server/prover/{v2 => }/combined_proving_system.go (94%) rename prover/server/prover/{v1/combined_proving_system.go => combined_proving_system_legacy.go} (59%) rename prover/server/prover/{v2 => }/combined_test.go (95%) delete mode 100644 prover/server/prover/common/key_downloader.go delete mode 100644 prover/server/prover/common/lazy_key_manager.go delete mode 100644 prover/server/prover/common/types.go rename prover/server/prover/{v2 => }/extractor.go (96%) rename prover/server/prover/{v2 => }/inclusion_circuit.go (83%) rename prover/server/prover/{v2 => }/inclusion_proving_system.go (92%) rename prover/server/prover/{v1/inclusion_proving_system.go => inclusion_proving_system_legacy.go} (71%) rename prover/server/prover/{v2 => }/inclusion_test.go (96%) rename prover/server/prover/{common => }/is_less_test.go (95%) rename prover/server/prover/{common => }/leaf_hash_gadget_test.go (96%) rename prover/server/prover/{common => }/marshal.go (81%) rename prover/server/prover/{v2 => }/marshal_batch_address_append.go (65%) rename prover/server/prover/{v2 => }/marshal_batch_append_with_proofs.go (55%) rename prover/server/prover/{v2 => }/marshal_combined.go (89%) create mode 100644 prover/server/prover/marshal_combined_legacy.go rename prover/server/prover/{v2 => }/marshal_inclusion.go (75%) create mode 100644 prover/server/prover/marshal_inclusion_legacy.go rename prover/server/prover/{v2 => }/marshal_non_inclusion.go (67%) create mode 100644 prover/server/prover/marshal_non_inclusion_legacy.go rename prover/server/prover/{v2 => }/marshal_update.go (51%) rename prover/server/prover/{v2 => }/non_inclusion_circuit.go (75%) rename prover/server/prover/{v2 => }/non_inclusion_proving_system.go (93%) rename prover/server/prover/{v1/non_inclusion_proving_system.go => non_inclusion_proving_system_legacy.go} (55%) rename prover/server/prover/{v2 => }/non_inclusion_test.go (96%) rename prover/server/prover/{common => }/proving_keys_utils.go (60%) rename prover/server/prover/{common => }/string_utils.go (98%) rename prover/server/prover/{v2 => }/test_data_generator_test.go (97%) rename prover/server/prover/{v2 => }/test_data_helpers.go (85%) delete mode 100644 prover/server/prover/v1/circuit_builder.go delete mode 100644 prover/server/prover/v1/circuit_setup.go delete mode 100644 prover/server/prover/v1/combined_circuit.go delete mode 100644 prover/server/prover/v1/combined_manual_test.go delete mode 100644 prover/server/prover/v1/combined_test.go delete mode 100644 prover/server/prover/v1/inclusion_circuit.go delete mode 100644 prover/server/prover/v1/inclusion_test.go delete mode 100644 prover/server/prover/v1/legacy_gadgets.go delete mode 100644 prover/server/prover/v1/marshal_combined.go delete mode 100644 prover/server/prover/v1/marshal_inclusion.go delete mode 100644 prover/server/prover/v1/marshal_non_inclusion.go delete mode 100644 prover/server/prover/v1/non_inclusion_circuit.go delete mode 100644 prover/server/prover/v1/non_inclusion_test.go delete mode 100644 prover/server/prover/v1/test_data_helpers.go delete mode 100644 prover/server/prover/v2/circuit_builder.go create mode 100755 prover/server/scripts/download_keys.sh delete mode 100755 prover/server/scripts/regenerate_all_vkeys.sh create mode 100755 scripts/bench_ctoken_cu.sh rename scripts/{deploy => }/build-verifiable.sh (100%) rename scripts/{release => }/bump-versions-and-publish-npm.sh (100%) rename scripts/{deploy => }/deploy-devnet.sh (100%) rename scripts/{deploy => }/deploy.sh (100%) delete mode 100755 scripts/devenv/download-gnark-keys.sh delete mode 100755 scripts/devenv/install-anchor.sh delete mode 100755 scripts/devenv/install-dependencies.sh delete mode 100755 scripts/devenv/install-go.sh delete mode 100755 scripts/devenv/install-jq.sh delete mode 100755 scripts/devenv/install-node.sh delete mode 100755 scripts/devenv/install-photon.sh delete mode 100755 scripts/devenv/install-pnpm.sh delete mode 100755 scripts/devenv/install-redis.sh delete mode 100755 scripts/devenv/install-rust.sh delete mode 100755 scripts/devenv/install-solana.sh delete mode 100755 scripts/devenv/install.sh delete mode 100755 scripts/devenv/shared.sh delete mode 100755 scripts/devenv/versions.sh rename scripts/{release => }/push-compressed-token-idl.sh (100%) rename scripts/{release => }/push-stateless-js-idls.sh (100%) create mode 100755 scripts/release-all-rust-crates.sh delete mode 100755 scripts/release/create-release-pr.sh delete mode 100755 scripts/release/detect-version-changes.sh delete mode 100755 scripts/release/validate-packages.sh create mode 100644 sdk-libs/compressed-token-sdk/Cargo.toml create mode 100644 sdk-libs/compressed-token-sdk/src/account.rs create mode 100644 sdk-libs/compressed-token-sdk/src/account2.rs create mode 100644 sdk-libs/compressed-token-sdk/src/error.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/approve/account_metas.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/approve/instruction.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/approve/mod.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/batch_compress/account_metas.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/batch_compress/instruction.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/batch_compress/mod.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/burn.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/claim.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/close.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/compress_and_close.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/create_associated_token_account.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/create_compressed_mint/account_metas.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/create_compressed_mint/instruction.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/create_compressed_mint/mod.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/create_spl_mint.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/create_token_account/instruction.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/create_token_account/mod.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/ctoken_accounts.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/decompress_full.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/mint_action/account_metas.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/mint_action/cpi_accounts.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/mint_action/instruction.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/mint_action/mod.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/mint_to.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/mint_to_compressed/account_metas.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/mint_to_compressed/instruction.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/mint_to_compressed/mod.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/mod.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/transfer/account_infos.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/transfer/account_metas.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/transfer/instruction.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/transfer/mod.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/transfer2/account_metas.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/transfer2/cpi_accounts.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/transfer2/instruction.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/transfer2/mod.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/update_compressed_mint/account_metas.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/update_compressed_mint/instruction.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/update_compressed_mint/mod.rs create mode 100644 sdk-libs/compressed-token-sdk/src/instructions/withdraw_funding_pool.rs create mode 100644 sdk-libs/compressed-token-sdk/src/lib.rs create mode 100644 sdk-libs/compressed-token-sdk/src/token_metadata_ui.rs create mode 100644 sdk-libs/compressed-token-sdk/src/token_pool.rs create mode 100644 sdk-libs/compressed-token-sdk/src/utils.rs create mode 100644 sdk-libs/compressed-token-sdk/tests/account_metas_test.rs create mode 100644 sdk-libs/compressed-token-sdk/tests/create_associated_token_account.rs create mode 100644 sdk-libs/compressed-token-sdk/tests/mint_action_cpi_accounts_tests.rs create mode 100644 sdk-libs/compressed-token-types/Cargo.toml create mode 100644 sdk-libs/compressed-token-types/src/account_infos/batch_compress.rs create mode 100644 sdk-libs/compressed-token-types/src/account_infos/burn.rs create mode 100644 sdk-libs/compressed-token-types/src/account_infos/config.rs create mode 100644 sdk-libs/compressed-token-types/src/account_infos/create_compressed_mint.rs create mode 100644 sdk-libs/compressed-token-types/src/account_infos/freeze.rs create mode 100644 sdk-libs/compressed-token-types/src/account_infos/mint_to.rs create mode 100644 sdk-libs/compressed-token-types/src/account_infos/mint_to_compressed.rs create mode 100644 sdk-libs/compressed-token-types/src/account_infos/mod.rs create mode 100644 sdk-libs/compressed-token-types/src/account_infos/transfer.rs create mode 100644 sdk-libs/compressed-token-types/src/constants.rs create mode 100644 sdk-libs/compressed-token-types/src/error.rs create mode 100644 sdk-libs/compressed-token-types/src/instruction/batch_compress.rs create mode 100644 sdk-libs/compressed-token-types/src/instruction/burn.rs create mode 100644 sdk-libs/compressed-token-types/src/instruction/delegation.rs create mode 100644 sdk-libs/compressed-token-types/src/instruction/freeze.rs create mode 100644 sdk-libs/compressed-token-types/src/instruction/generic.rs create mode 100644 sdk-libs/compressed-token-types/src/instruction/mint_to.rs create mode 100644 sdk-libs/compressed-token-types/src/instruction/mod.rs create mode 100644 sdk-libs/compressed-token-types/src/instruction/transfer.rs create mode 100644 sdk-libs/compressed-token-types/src/instruction/update_compressed_mint.rs create mode 100644 sdk-libs/compressed-token-types/src/lib.rs create mode 100644 sdk-libs/compressed-token-types/src/token_data.rs delete mode 100644 sdk-libs/macros/tests/discriminator.rs create mode 100644 sdk-libs/program-test/src/accounts/compressible_config.rs create mode 100644 sdk-libs/program-test/src/compressible.rs create mode 100644 sdk-libs/program-test/src/forester/claim_forester.rs create mode 100644 sdk-libs/program-test/src/forester/compress_and_close_forester.rs create mode 100644 sdk-libs/program-test/src/forester/mod.rs create mode 100644 sdk-libs/program-test/src/forester/register_forester.rs create mode 100644 sdk-libs/program-test/src/logging/decoder.rs:70:15 create mode 100644 sdk-libs/program-test/src/logging/decoder.rs:946:15 create mode 100644 sdk-libs/program-test/src/logging/formatter.rs:1218:19 create mode 100644 sdk-libs/program-test/src/logging/types.rs:473:15 delete mode 100644 sdk-libs/program-test/src/utils/load_accounts.rs rename sdk-libs/sdk-pinocchio/src/cpi/{v1 => }/accounts.rs (86%) create mode 100644 sdk-libs/sdk-pinocchio/src/cpi/accounts_small.rs create mode 100644 sdk-libs/sdk-pinocchio/src/cpi/invoke.rs delete mode 100644 sdk-libs/sdk-pinocchio/src/cpi/traits.rs delete mode 100644 sdk-libs/sdk-pinocchio/src/cpi/v1/invoke.rs delete mode 100644 sdk-libs/sdk-pinocchio/src/cpi/v1/mod.rs delete mode 100644 sdk-libs/sdk-pinocchio/src/cpi/v2/accounts.rs delete mode 100644 sdk-libs/sdk-pinocchio/src/cpi/v2/invoke.rs delete mode 100644 sdk-libs/sdk-pinocchio/src/cpi/v2/mod.rs rename sdk-libs/sdk-types/src/{cpi_accounts/v1.rs => cpi_accounts.rs} (85%) delete mode 100644 sdk-libs/sdk-types/src/cpi_accounts/config.rs delete mode 100644 sdk-libs/sdk-types/src/cpi_accounts/mod.rs rename sdk-libs/sdk-types/src/{cpi_accounts/v2.rs => cpi_accounts_small.rs} (69%) delete mode 100644 sdk-libs/sdk/src/cpi/account.rs rename sdk-libs/sdk/src/cpi/{v1 => }/accounts.rs (85%) rename sdk-libs/sdk/src/cpi/{v2 => }/accounts_cpi_context.rs (65%) create mode 100644 sdk-libs/sdk/src/cpi/accounts_small_ix.rs delete mode 100644 sdk-libs/sdk/src/cpi/instruction.rs delete mode 100644 sdk-libs/sdk/src/cpi/v1/invoke.rs delete mode 100644 sdk-libs/sdk/src/cpi/v1/mod.rs delete mode 100644 sdk-libs/sdk/src/cpi/v2/accounts.rs delete mode 100644 sdk-libs/sdk/src/cpi/v2/invoke.rs delete mode 100644 sdk-libs/sdk/src/cpi/v2/mod.rs create mode 100644 sdk-libs/token-client/Cargo.toml create mode 100644 sdk-libs/token-client/src/actions/create_compressible_token_account.rs create mode 100644 sdk-libs/token-client/src/actions/create_mint.rs create mode 100644 sdk-libs/token-client/src/actions/create_spl_mint.rs create mode 100644 sdk-libs/token-client/src/actions/ctoken_transfer.rs create mode 100644 sdk-libs/token-client/src/actions/mint_action.rs create mode 100644 sdk-libs/token-client/src/actions/mint_to_compressed.rs create mode 100644 sdk-libs/token-client/src/actions/mod.rs create mode 100644 sdk-libs/token-client/src/actions/transfer2/approve.rs create mode 100644 sdk-libs/token-client/src/actions/transfer2/compress.rs create mode 100644 sdk-libs/token-client/src/actions/transfer2/compress_and_close.rs create mode 100644 sdk-libs/token-client/src/actions/transfer2/ctoken_to_spl.rs create mode 100644 sdk-libs/token-client/src/actions/transfer2/decompress.rs create mode 100644 sdk-libs/token-client/src/actions/transfer2/mod.rs create mode 100644 sdk-libs/token-client/src/actions/transfer2/spl_to_ctoken.rs create mode 100644 sdk-libs/token-client/src/actions/transfer2/transfer.rs create mode 100644 sdk-libs/token-client/src/actions/transfer2/transfer_delegated.rs create mode 100644 sdk-libs/token-client/src/actions/update_compressed_mint.rs create mode 100644 sdk-libs/token-client/src/instructions/create_mint.rs create mode 100644 sdk-libs/token-client/src/instructions/create_spl_mint.rs create mode 100644 sdk-libs/token-client/src/instructions/mint_action.rs create mode 100644 sdk-libs/token-client/src/instructions/mint_to_compressed.rs create mode 100644 sdk-libs/token-client/src/instructions/mod.rs create mode 100644 sdk-libs/token-client/src/instructions/transfer2.rs create mode 100644 sdk-libs/token-client/src/instructions/update_compressed_mint.rs create mode 100644 sdk-libs/token-client/src/lib.rs delete mode 100644 sdk-tests/client-test/tests/bmt_program_test.rs delete mode 100644 sdk-tests/sdk-anchor-test/programs/sdk-anchor-test/src/read_only.rs delete mode 100644 sdk-tests/sdk-anchor-test/programs/sdk-anchor-test/tests/read_only.rs delete mode 100644 sdk-tests/sdk-anchor-test/target/idl/sdk_anchor_test.json delete mode 100644 sdk-tests/sdk-anchor-test/target/types/sdk_anchor_test.ts delete mode 100644 sdk-tests/sdk-anchor-test/tests/test_v1.ts delete mode 100644 sdk-tests/sdk-anchor-test/tests/test_v2.ts rename sdk-tests/{sdk-pinocchio-v1-test => sdk-pinocchio-test}/Cargo.toml (78%) rename sdk-tests/{sdk-pinocchio-v2-test => sdk-pinocchio-test}/Xargo.toml (100%) rename sdk-tests/{sdk-pinocchio-v1-test => sdk-pinocchio-test}/src/create_pda.rs (57%) rename sdk-tests/{sdk-pinocchio-v2-test => sdk-pinocchio-test}/src/lib.rs (91%) rename sdk-tests/{sdk-pinocchio-v1-test => sdk-pinocchio-test}/src/update_pda.rs (76%) rename sdk-tests/{sdk-pinocchio-v2-test => sdk-pinocchio-test}/tests/test.rs (91%) delete mode 100644 sdk-tests/sdk-pinocchio-v1-test/src/lib.rs delete mode 100644 sdk-tests/sdk-pinocchio-v1-test/tests/test.rs delete mode 100644 sdk-tests/sdk-pinocchio-v2-test/Cargo.toml delete mode 100644 sdk-tests/sdk-pinocchio-v2-test/src/create_pda.rs delete mode 100644 sdk-tests/sdk-pinocchio-v2-test/src/update_pda.rs create mode 100644 sdk-tests/sdk-token-test/CLAUDE.md create mode 100644 sdk-tests/sdk-token-test/Cargo.toml rename sdk-tests/{sdk-v1-native-test => sdk-token-test}/Xargo.toml (77%) create mode 100644 sdk-tests/sdk-token-test/src/ctoken_pda/create_pda.rs create mode 100644 sdk-tests/sdk-token-test/src/ctoken_pda/mint.rs create mode 100644 sdk-tests/sdk-token-test/src/ctoken_pda/mod.rs create mode 100644 sdk-tests/sdk-token-test/src/ctoken_pda/processor.rs create mode 100644 sdk-tests/sdk-token-test/src/lib.rs create mode 100644 sdk-tests/sdk-token-test/src/mint_compressed_tokens_cpi_write.rs create mode 100644 sdk-tests/sdk-token-test/src/pda_ctoken/create_pda.rs create mode 100644 sdk-tests/sdk-token-test/src/pda_ctoken/mint.rs create mode 100644 sdk-tests/sdk-token-test/src/pda_ctoken/mod.rs create mode 100644 sdk-tests/sdk-token-test/src/pda_ctoken/processor.rs create mode 100644 sdk-tests/sdk-token-test/src/process_batch_compress_tokens.rs create mode 100644 sdk-tests/sdk-token-test/src/process_compress_and_close_cpi.rs create mode 100644 sdk-tests/sdk-token-test/src/process_compress_and_close_cpi_context.rs create mode 100644 sdk-tests/sdk-token-test/src/process_compress_and_close_cpi_indices.rs create mode 100644 sdk-tests/sdk-token-test/src/process_compress_full_and_close.rs create mode 100644 sdk-tests/sdk-token-test/src/process_compress_tokens.rs create mode 100644 sdk-tests/sdk-token-test/src/process_create_compressed_account.rs create mode 100644 sdk-tests/sdk-token-test/src/process_create_ctoken_with_compress_to_pubkey.rs create mode 100644 sdk-tests/sdk-token-test/src/process_create_escrow_pda.rs create mode 100644 sdk-tests/sdk-token-test/src/process_decompress_full_cpi_context.rs create mode 100644 sdk-tests/sdk-token-test/src/process_decompress_tokens.rs create mode 100644 sdk-tests/sdk-token-test/src/process_four_invokes.rs create mode 100644 sdk-tests/sdk-token-test/src/process_four_transfer2.rs create mode 100644 sdk-tests/sdk-token-test/src/process_transfer_tokens.rs create mode 100644 sdk-tests/sdk-token-test/src/process_update_deposit.rs create mode 100644 sdk-tests/sdk-token-test/tests/compress_and_close_cpi.rs create mode 100644 sdk-tests/sdk-token-test/tests/ctoken_pda.rs create mode 100644 sdk-tests/sdk-token-test/tests/decompress_full_cpi.rs create mode 100644 sdk-tests/sdk-token-test/tests/pda_ctoken.rs create mode 100644 sdk-tests/sdk-token-test/tests/test.rs create mode 100644 sdk-tests/sdk-token-test/tests/test_4_invocations.rs create mode 100644 sdk-tests/sdk-token-test/tests/test_4_transfer2.rs create mode 100644 sdk-tests/sdk-token-test/tests/test_compress_full_and_close.rs create mode 100644 sdk-tests/sdk-token-test/tests/test_compress_to_pubkey.rs create mode 100644 sdk-tests/sdk-token-test/tests/test_deposit.rs delete mode 100644 sdk-tests/sdk-v1-native-test/Cargo.toml delete mode 100644 sdk-tests/sdk-v1-native-test/src/create_pda.rs delete mode 100644 sdk-tests/sdk-v1-native-test/src/lib.rs delete mode 100644 sdk-tests/sdk-v1-native-test/src/update_pda.rs delete mode 100644 sdk-tests/sdk-v1-native-test/tests/test.rs diff --git a/.github/actions/setup-and-build-nocheck/action.yml b/.github/actions/setup-and-build-nocheck/action.yml new file mode 100644 index 0000000000..66aa83fe11 --- /dev/null +++ b/.github/actions/setup-and-build-nocheck/action.yml @@ -0,0 +1,139 @@ +name: Setup and build nocheck +description: Checkout sources, install dependencies, build and prepare for tests +inputs: + branch: + description: "Branch to checkout" + required: true + +runs: + using: "composite" + steps: + - name: Checkout sources + uses: actions/checkout@v4 + with: + ref: ${{ inputs.branch }} + + - name: Restore .local directory cache + id: restore-local-cache + uses: actions/cache@v4 + with: + path: | + .local + prover/server/proving-keys + key: ${{ runner.os }}-local-v3-${{ hashFiles('scripts/install.sh', 'prover/server/scripts/download_keys.sh') }} + restore-keys: | + ${{ runner.os }}-local-v3- + ${{ runner.os }}-local-v2- + + - name: Install dependencies + if: steps.restore-local-cache.outputs.cache-hit != 'true' + shell: bash + run: | + ./scripts/install.sh + + - name: Verify and repair installation + shell: bash + run: | + # Even if cache was restored, run install script to check and install missing components + # The install script now checks for actual file existence, so it will only install what's missing + echo "=== Verifying installation integrity ===" + ./scripts/install.sh --no-reset + + - name: Validate environment setup + shell: bash + run: | + echo "=== Validating environment setup ===" + source ./scripts/devenv.sh + + # Quick validation of critical components + [ -f "$GOROOT/bin/go" ] || { echo "✗ Go not found"; exit 1; } + [ -f "$CARGO_HOME/bin/cargo" ] || { echo "✗ Cargo not found"; exit 1; } + [ -d "prover/server/proving-keys" ] || { echo "✗ Proving keys not found"; exit 1; } + + echo "✓ All critical components found" + + - name: Set local environment + shell: bash + run: | + source ./scripts/devenv.sh + # Export critical environment variables for subsequent steps + echo "GOROOT=$GOROOT" >> $GITHUB_ENV + echo "CARGO_HOME=$CARGO_HOME" >> $GITHUB_ENV + echo "RUSTUP_HOME=$RUSTUP_HOME" >> $GITHUB_ENV + echo "PATH=$PATH" >> $GITHUB_ENV + echo "CARGO_FEATURES=$CARGO_FEATURES" >> $GITHUB_ENV + echo "REDIS_URL=$REDIS_URL" >> $GITHUB_ENV + + - name: Rust cache + uses: swatinem/rust-cache@v2 + with: + cache-all-crates: true + cache-on-failure: true + # Add workspace target directory + workspaces: | + . -> target + cli -> cli/target + examples -> examples/target + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + run_install: false + + - name: Get pnpm store directory + id: pnpm-store + shell: bash + run: | + # Get the store path before any pnpm operations + STORE_PATH=$(pnpm store path --silent) + echo "STORE_PATH=${STORE_PATH}" >> $GITHUB_ENV + echo "path=${STORE_PATH}" >> $GITHUB_OUTPUT + + - name: Setup pnpm cache + id: pnpm-cache + uses: actions/cache@v4 + with: + path: ${{ steps.pnpm-store.outputs.path }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + shell: bash + run: | + # Install dependencies + pnpm install --frozen-lockfile + + # Validate node_modules was created + if [ ! -d "node_modules" ] || [ -z "$(ls -A node_modules 2>/dev/null)" ]; then + echo "Error: node_modules not created after pnpm install" + exit 1 + fi + + - name: Save pnpm cache + # Save cache even on failure to speed up retries + if: steps.pnpm-cache.outputs.cache-hit != 'true' + uses: actions/cache/save@v4 + with: + path: ${{ steps.pnpm-store.outputs.path }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml') }} + + - name: Build and prepare for tests + shell: bash + run: | + source ./scripts/devenv.sh + mkdir -p /home/runner/.config/solana/ + if [ ! -f /home/runner/.config/solana/id.json ]; then + solana-keygen new --no-bip39-passphrase -o /home/runner/.config/solana/id.json + fi + npx nx build @lightprotocol/programs + npx nx build @lightprotocol/zk-compression-cli + + - name: Save .local directory cache + if: steps.restore-local-cache.outputs.cache-hit != 'true' + uses: actions/cache/save@v4 + with: + path: | + .local + prover/server/proving-keys + key: ${{ runner.os }}-local-v3-${{ hashFiles('scripts/install.sh', 'prover/server/scripts/download_keys.sh') }} diff --git a/.github/actions/setup-and-build/action.yml b/.github/actions/setup-and-build/action.yml index e90cac95d2..fb5e7469da 100644 --- a/.github/actions/setup-and-build/action.yml +++ b/.github/actions/setup-and-build/action.yml @@ -6,16 +6,11 @@ inputs: description: 'Comma-separated list of components to skip (e.g., "redis,go"). If not specified, all components are installed.' required: false default: "" - cache-suffix: - description: 'Optional suffix for cache keys to enable separate caches per workflow (e.g., "system-programs", "sdk-tests", "rust")' - required: false - default: "" runs: using: "composite" steps: - name: Free Disk Space (Ubuntu) - if: "!contains(inputs.skip-components, 'disk-cleanup')" uses: jlumbroso/free-disk-space@main with: tool-cache: false @@ -23,107 +18,123 @@ runs: large-packages: false docker-images: false + - name: Checkout sources + uses: actions/checkout@v4 + + - name: Restore .local directory cache + id: restore-local-cache + uses: actions/cache@v4 + with: + path: | + .local + prover/server/proving-keys + key: ${{ runner.os }}-local-v3-${{ hashFiles('scripts/install.sh', 'prover/server/scripts/download_keys.sh') }} + restore-keys: | + ${{ runner.os }}-local-v3- + ${{ runner.os }}-local-v2- + - name: Install system dependencies shell: bash run: | sudo apt-get update sudo apt-get install -y libudev-dev pkg-config build-essential - - name: Load versions - id: versions + - name: Install dependencies + if: steps.restore-local-cache.outputs.cache-hit != 'true' shell: bash run: | - source scripts/devenv/versions.sh - echo "rust=${RUST_VERSION}" >> $GITHUB_OUTPUT - echo "go=${GO_VERSION}" >> $GITHUB_OUTPUT - echo "node=${NODE_VERSION}" >> $GITHUB_OUTPUT - echo "pnpm=${PNPM_VERSION}" >> $GITHUB_OUTPUT - echo "solana=${SOLANA_VERSION}" >> $GITHUB_OUTPUT - echo "anchor=${ANCHOR_VERSION}" >> $GITHUB_OUTPUT - echo "photon=${PHOTON_VERSION}" >> $GITHUB_OUTPUT - echo "photon_commit=${PHOTON_COMMIT}" >> $GITHUB_OUTPUT - echo "redis=${REDIS_VERSION}" >> $GITHUB_OUTPUT - - - name: Setup Rust toolchain - uses: actions-rust-lang/setup-rust-toolchain@v1 - with: - toolchain: ${{ steps.versions.outputs.rust }} - components: rustfmt, clippy - cache-workspaces: | - . -> target - cli -> cli/target + if [ -n "${{ inputs.skip-components }}" ]; then + ./scripts/install.sh --skip-components "${{ inputs.skip-components }}" + else + ./scripts/install.sh + fi - - name: Setup Go - uses: actions/setup-go@v5 - with: - go-version: ${{ steps.versions.outputs.go }} - cache-dependency-path: prover/server/go.sum + - name: Verify and repair installation + shell: bash + run: | + # Even if cache was restored, run install script to check and install missing components + # The install script now checks for actual file existence, so it will only install what's missing + echo "=== Verifying installation integrity ===" + if [ -n "${{ inputs.skip-components }}" ]; then + ./scripts/install.sh --no-reset --skip-components "${{ inputs.skip-components }}" + else + ./scripts/install.sh --no-reset + fi - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: ${{ steps.versions.outputs.node }} + - name: Validate environment setup + shell: bash + run: | + echo "=== Validating environment setup ===" + source ./scripts/devenv.sh + + # Check critical binaries exist + echo "Checking Go installation..." + if [ -f "$GOROOT/bin/go" ]; then + echo "✓ Go found at: $GOROOT/bin/go" + $GOROOT/bin/go version || echo "⚠ Go binary exists but failed to run" + else + echo "✗ Go not found at expected location: $GOROOT/bin/go" + exit 1 + fi - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: ${{ steps.versions.outputs.pnpm }} - run_install: false + echo "Checking Rust installation..." + if [ -f "$CARGO_HOME/bin/cargo" ]; then + echo "✓ Cargo found at: $CARGO_HOME/bin/cargo" + $CARGO_HOME/bin/cargo --version || echo "⚠ Cargo binary exists but failed to run" + else + echo "✗ Cargo not found at expected location: $CARGO_HOME/bin/cargo" + exit 1 + fi - - name: Cache Solana CLI - id: cache-solana - uses: actions/cache@v4 - with: - path: | - .local/bin/solana* - .local/bin/agave* - .local/bin/cargo-* - .local/bin/platform-tools-sdk - key: ${{ runner.os }}-solana-${{ steps.versions.outputs.solana }} - - - name: Install Solana CLI - if: steps.cache-solana.outputs.cache-hit != 'true' - shell: bash - run: bash scripts/devenv/install-solana.sh + echo "Checking Node installation..." + which node && node --version || echo "⚠ Node not in PATH" - - name: Cache Anchor CLI - id: cache-anchor - uses: actions/cache@v4 - with: - path: | - .local/cargo/bin/avm - .local/cargo/bin/anchor - key: ${{ runner.os }}-anchor-${{ steps.versions.outputs.anchor }} + echo "Checking pnpm installation..." + which pnpm && pnpm --version || echo "⚠ pnpm not in PATH" - - name: Install Anchor CLI - if: steps.cache-anchor.outputs.cache-hit != 'true' - shell: bash - run: bash scripts/devenv/install-anchor.sh + echo "Checking Solana installation..." + which solana && solana --version || echo "⚠ Solana not in PATH" - - name: Cache Photon indexer - id: cache-photon - uses: actions/cache@v4 - with: - path: .local/cargo/bin/photon - key: ${{ runner.os }}-photon-${{ steps.versions.outputs.photon }}-${{ steps.versions.outputs.photon_commit }} + echo "Checking Anchor installation..." + which anchor && anchor --version || echo "⚠ Anchor not in PATH" - - name: Install Photon indexer - if: steps.cache-photon.outputs.cache-hit != 'true' - shell: bash - run: bash scripts/devenv/install-photon.sh + # Check proving keys + if [ -d "prover/server/proving-keys" ] && [ -n "$(ls -A prover/server/proving-keys 2>/dev/null)" ]; then + echo "✓ Proving keys found: $(ls prover/server/proving-keys | wc -l) files" + else + echo "✗ Proving keys directory missing or empty" + exit 1 + fi - - name: Set Light Protocol environment variables + echo "=== Environment validation complete ===" + + - name: Set local environment shell: bash run: | - # Add .local/bin to PATH for Solana, Anchor, Photon, Redis - echo "${PWD}/.local/bin" >> $GITHUB_PATH - echo "${PWD}/.local/cargo/bin" >> $GITHUB_PATH + source ./scripts/devenv.sh + # Export critical environment variables for subsequent steps + echo "GOROOT=$GOROOT" >> $GITHUB_ENV + echo "CARGO_HOME=$CARGO_HOME" >> $GITHUB_ENV + echo "RUSTUP_HOME=$RUSTUP_HOME" >> $GITHUB_ENV + echo "PATH=$PATH" >> $GITHUB_ENV + echo "CARGO_FEATURES=$CARGO_FEATURES" >> $GITHUB_ENV + echo "REDIS_URL=$REDIS_URL" >> $GITHUB_ENV + + - name: Rust cache + uses: swatinem/rust-cache@v2 + with: + cache-all-crates: true + cache-on-failure: true + # Add workspace target directory + workspaces: | + . -> target + cli -> cli/target + examples -> examples/target - # Light Protocol-specific environment variables - # (Official actions handle Rust, Go, Node.js environment setup) - echo "CARGO_FEATURES=v2_ix" >> $GITHUB_ENV - echo "REDIS_URL=redis://localhost:6379" >> $GITHUB_ENV - echo "SBF_OUT_DIR=target/deploy" >> $GITHUB_ENV + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + run_install: false - name: Get pnpm store directory id: pnpm-store @@ -166,6 +177,7 @@ runs: - name: Generate Solana keypair shell: bash run: | + source ./scripts/devenv.sh mkdir -p /home/runner/.config/solana/ if [ ! -f /home/runner/.config/solana/id.json ]; then solana-keygen new --no-bip39-passphrase -o /home/runner/.config/solana/id.json @@ -177,48 +189,25 @@ runs: mkdir -p ./target/deploy cp ./third-party/solana-program-library/spl_noop.so ./target/deploy/spl_noop.so - - name: Cache Solana programs - id: cache-programs - uses: actions/cache@v4 - with: - path: | - target/deploy/*.so - target/idl - target/types - key: ${{ runner.os }}-programs-${{ hashFiles('programs/**/Cargo.toml', 'programs/**/Cargo.lock', 'programs/**/*.rs', 'program-libs/**/*.rs') }} - restore-keys: | - ${{ runner.os }}-programs- - - - name: Cache Solana program-tests - id: cache-program-tests - uses: actions/cache@v4 - with: - path: | - target/deploy/create_address_test_program.so - target/deploy/sdk_anchor_test.so - key: ${{ runner.os }}-program-tests-${{ hashFiles('program-tests/**/Cargo.toml', 'program-tests/**/Cargo.lock', 'program-tests/**/*.rs', 'test-programs/**/Cargo.toml', 'test-programs/**/*.rs') }} - restore-keys: | - ${{ runner.os }}-program-tests- - - name: Build Rust programs - if: steps.cache-programs.outputs.cache-hit != 'true' shell: bash run: | + source ./scripts/devenv.sh echo "Building Rust programs..." - if ! npx nx build @lightprotocol/programs; then + npx nx build @lightprotocol/programs || { echo "Failed to build programs, retrying with verbose output..." npx nx build @lightprotocol/programs --verbose - fi + exit 1 + } - - name: Build Rust program-tests - if: steps.cache-program-tests.outputs.cache-hit != 'true' - shell: bash - run: | - echo "Building Rust program-tests..." - if ! npx nx build @lightprotocol/program-tests; then - echo "Failed to build program-tests, retrying with verbose output..." - npx nx build @lightprotocol/program-tests --verbose - fi + - name: Save .local directory cache + if: steps.restore-local-cache.outputs.cache-hit != 'true' + uses: actions/cache/save@v4 + with: + path: | + .local + prover/server/proving-keys + key: ${{ runner.os }}-local-v3-${{ hashFiles('scripts/install.sh', 'prover/server/scripts/download_keys.sh') }} - name: Check for git changes shell: bash diff --git a/.github/workflows/cli-v1.yml b/.github/workflows/cli-v1.yml index 10c7806628..018ac91842 100644 --- a/.github/workflows/cli-v1.yml +++ b/.github/workflows/cli-v1.yml @@ -43,18 +43,41 @@ jobs: - name: Checkout sources uses: actions/checkout@v4 + - name: Cache nx + uses: actions/cache@v4 + with: + path: | + .nx/cache + node_modules/.cache/nx + key: nx-cli-v1-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'nx.json') }} + restore-keys: | + nx-cli-v1-${{ runner.os }}- + - name: Setup and build uses: ./.github/actions/setup-and-build with: - skip-components: "redis,disk-cleanup" - cache-suffix: "js" + skip-components: "redis" + + - name: Build stateless.js with V1 + run: | + source ./scripts/devenv.sh + cd js/stateless.js + pnpm build:v1 + + - name: Build compressed-token with V1 + run: | + source ./scripts/devenv.sh + cd js/compressed-token + pnpm build:v1 - - name: Build CLI + - name: Build CLI with V1 run: | + source ./scripts/devenv.sh npx nx build @lightprotocol/zk-compression-cli - name: Run CLI tests with V1 run: | + source ./scripts/devenv.sh npx nx test @lightprotocol/zk-compression-cli - name: Display prover logs on failure diff --git a/.github/workflows/cli-v2.yml b/.github/workflows/cli-v2.yml index 41e1855688..2f7fd728ef 100644 --- a/.github/workflows/cli-v2.yml +++ b/.github/workflows/cli-v2.yml @@ -43,28 +43,41 @@ jobs: - name: Checkout sources uses: actions/checkout@v4 + - name: Cache nx + uses: actions/cache@v4 + with: + path: | + .nx/cache + node_modules/.cache/nx + key: nx-cli-v2-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'nx.json') }} + restore-keys: | + nx-cli-v2-${{ runner.os }}- + - name: Setup and build uses: ./.github/actions/setup-and-build with: - skip-components: "redis,disk-cleanup" - cache-suffix: "js" + skip-components: "redis" - name: Build stateless.js with V2 run: | + source ./scripts/devenv.sh cd js/stateless.js pnpm build:v2 - name: Build compressed-token with V2 run: | + source ./scripts/devenv.sh cd js/compressed-token pnpm build:v2 - name: Build CLI with V2 run: | + source ./scripts/devenv.sh npx nx build @lightprotocol/zk-compression-cli - name: Run CLI tests with V2 run: | + source ./scripts/devenv.sh npx nx test @lightprotocol/zk-compression-cli - name: Display prover logs on failure diff --git a/.github/workflows/forester-tests.yml b/.github/workflows/forester-tests.yml index f38c02b042..ddaf015326 100644 --- a/.github/workflows/forester-tests.yml +++ b/.github/workflows/forester-tests.yml @@ -43,7 +43,7 @@ jobs: test: name: Forester e2e test runs-on: warp-ubuntu-latest-x64-4x - timeout-minutes: 60 + timeout-minutes: 45 services: redis: @@ -66,7 +66,12 @@ jobs: uses: ./.github/actions/setup-and-build with: skip-components: "redis" - cache-suffix: "rust" + + - name: Clean build artifacts before tests + shell: bash + run: | + cargo clean + rm -rf target/debug/deps/* - name: Check available disk space shell: bash @@ -75,7 +80,16 @@ jobs: du -sh /home/runner/work/* | sort -hr | head -n 10 - name: Build CLI - run: npx nx build @lightprotocol/zk-compression-cli + run: | + source ./scripts/devenv.sh + npx nx build @lightprotocol/zk-compression-cli + + - name: Build test program + run: | + source ./scripts/devenv.sh + cargo test-sbf -p create-address-test-program - name: Test - run: cargo test --package forester e2e_test -- --nocapture + run: | + source ./scripts/devenv.sh + cargo test --package forester e2e_test -- --nocapture diff --git a/.github/workflows/js-v2.yml b/.github/workflows/js-v2.yml index c89ffd79b2..e6ecbc8f89 100644 --- a/.github/workflows/js-v2.yml +++ b/.github/workflows/js-v2.yml @@ -43,63 +43,47 @@ jobs: - name: Checkout sources uses: actions/checkout@v4 + - name: Cache nx + uses: actions/cache@v4 + with: + path: | + .nx/cache + node_modules/.cache/nx + key: nx-js-v2-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'nx.json') }} + restore-keys: | + nx-js-v2-${{ runner.os }}- + - name: Setup and build uses: ./.github/actions/setup-and-build with: - skip-components: "redis,disk-cleanup" - cache-suffix: "js" + skip-components: "redis" - name: Build stateless.js with V2 run: | + source ./scripts/devenv.sh cd js/stateless.js pnpm build:v2 - name: Build compressed-token with V2 run: | + source ./scripts/devenv.sh cd js/compressed-token pnpm build:v2 - name: Build CLI run: | + source ./scripts/devenv.sh npx nx build @lightprotocol/zk-compression-cli - name: Run stateless.js tests with V2 run: | - echo "Running stateless.js tests with retry logic (max 2 attempts)..." - attempt=1 - max_attempts=2 - until npx nx test @lightprotocol/stateless.js; do - attempt=$((attempt + 1)) - if [ $attempt -gt $max_attempts ]; then - echo "Tests failed after $max_attempts attempts" - exit 1 - fi - echo "Attempt $attempt/$max_attempts failed, retrying..." - sleep 5 - done - echo "Tests passed on attempt $attempt" + source ./scripts/devenv.sh + npx nx test @lightprotocol/stateless.js - name: Run compressed-token tests with V2 run: | - echo "Running compressed-token tests with retry logic (max 2 attempts)..." - attempt=1 - max_attempts=2 - until npx nx test @lightprotocol/compressed-token; do - attempt=$((attempt + 1)) - if [ $attempt -gt $max_attempts ]; then - echo "Tests failed after $max_attempts attempts" - exit 1 - fi - echo "Attempt $attempt/$max_attempts failed, retrying..." - sleep 5 - done - echo "Tests passed on attempt $attempt" - - - name: Run sdk-anchor-test TypeScript tests with V2 - run: | - npx nx build @lightprotocol/sdk-anchor-test - cd sdk-tests/sdk-anchor-test - npm run test-ts + source ./scripts/devenv.sh + npx nx test @lightprotocol/compressed-token - name: Display prover logs on failure if: failure() diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml index a353b4e30e..077ddfa0d0 100644 --- a/.github/workflows/js.yml +++ b/.github/workflows/js.yml @@ -43,54 +43,44 @@ jobs: - name: Checkout sources uses: actions/checkout@v4 + - name: Cache nx + uses: actions/cache@v4 + with: + path: | + .nx/cache + node_modules/.cache/nx + key: nx-js-v1-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'nx.json') }} + restore-keys: | + nx-js-v1-${{ runner.os }}- + - name: Setup and build uses: ./.github/actions/setup-and-build with: - skip-components: "redis,disk-cleanup" - cache-suffix: "js" + skip-components: "redis" - name: Build stateless.js with V1 run: | + source ./scripts/devenv.sh cd js/stateless.js pnpm build:v1 - name: Build compressed-token with V1 run: | + source ./scripts/devenv.sh cd js/compressed-token pnpm build:v1 - name: Build CLI run: | + source ./scripts/devenv.sh npx nx build @lightprotocol/zk-compression-cli - name: Run stateless.js tests with V1 run: | - echo "Running stateless.js tests with retry logic (max 2 attempts)..." - attempt=1 - max_attempts=2 - until npx nx test @lightprotocol/stateless.js; do - attempt=$((attempt + 1)) - if [ $attempt -gt $max_attempts ]; then - echo "Tests failed after $max_attempts attempts" - exit 1 - fi - echo "Attempt $attempt/$max_attempts failed, retrying..." - sleep 5 - done - echo "Tests passed on attempt $attempt" + source ./scripts/devenv.sh + npx nx test @lightprotocol/stateless.js - name: Run compressed-token tests with V1 run: | - echo "Running compressed-token tests with retry logic (max 2 attempts)..." - attempt=1 - max_attempts=2 - until npx nx test @lightprotocol/compressed-token; do - attempt=$((attempt + 1)) - if [ $attempt -gt $max_attempts ]; then - echo "Tests failed after $max_attempts attempts" - exit 1 - fi - echo "Attempt $attempt/$max_attempts failed, retrying..." - sleep 5 - done - echo "Tests passed on attempt $attempt" + source ./scripts/devenv.sh + npx nx test @lightprotocol/compressed-token diff --git a/.github/workflows/sdk-tests.yml b/.github/workflows/light-examples-tests.yml similarity index 52% rename from .github/workflows/sdk-tests.yml rename to .github/workflows/light-examples-tests.yml index d1c573306b..fada8d6fca 100644 --- a/.github/workflows/sdk-tests.yml +++ b/.github/workflows/light-examples-tests.yml @@ -3,19 +3,19 @@ on: branches: - main paths: - - "program-libs/**" - - "programs/**" - - "sdk-tests/**" + - "examples/**" - "sdk-libs/**" pull_request: branches: - "*" paths: - - "programs/**" - - "program-libs/**" - - "sdk-tests/**" + - "examples/**" - "sdk-libs/**" - types: [opened, synchronize, reopened, ready_for_review] + types: + - opened + - synchronize + - reopened + - ready_for_review name: examples-tests @@ -48,19 +48,10 @@ jobs: matrix: include: - program: sdk-test-program - sub-tests: '["cargo-test-sbf -p sdk-native-test", "cargo-test-sbf -p sdk-v1-native-test", "cargo test-sbf -p client-test"]' + sub-tests: '["cargo-test-sbf -p sdk-native-test"]' - program: sdk-anchor-test-program - sub-tests: '["cargo-test-sbf -p sdk-anchor-test", "cargo-test-sbf -p sdk-pinocchio-v1-test", "cargo-test-sbf -p sdk-pinocchio-v2-test"]' - - program: sdk-libs - packages: light-sdk-macros light-sdk light-program-test light-client - test_cmd: | - cargo test -p light-sdk-macros - cargo test -p light-sdk-macros --all-features - cargo test -p light-sdk - cargo test -p light-sdk --all-features - cargo test -p light-program-test - cargo test -p light-client - cargo test -p light-sparse-merkle-tree + sub-tests: '["cargo-test-sbf -p sdk-anchor-test", "cargo-test-sbf -p sdk-pinocchio-test"]' + steps: - name: Checkout sources uses: actions/checkout@v4 @@ -68,25 +59,21 @@ jobs: - name: Setup and build uses: ./.github/actions/setup-and-build with: - skip-components: "redis,disk-cleanup" - cache-suffix: "sdk-tests" + skip-components: "redis" - - name: Build CLI + - name: build-programs run: | - npx nx build @lightprotocol/zk-compression-cli + source ./scripts/devenv.sh + npx nx build @lightprotocol/programs - - name: Run sub-tests for ${{ matrix.program }} - if: matrix.sub-tests != null + - name: ${{ matrix.program }} run: | + source ./scripts/devenv.sh + npx nx build @lightprotocol/zk-compression-cli - IFS=',' read -r -a sub_tests <<< "${{ join(fromJSON(matrix.sub-tests), ', ') }}" + IFS=',' read -r -a sub_tests <<< "${{ join(fromJSON(matrix['sub-tests']), ', ') }}" for subtest in "${sub_tests[@]}" do echo "$subtest" eval "RUSTFLAGS=\"-D warnings\" $subtest" done - - - name: Run tests for ${{ matrix.program }} - if: matrix.test_cmd != null - run: | - ${{ matrix.test_cmd }} diff --git a/.github/workflows/light-system-programs-tests.yml b/.github/workflows/light-system-programs-tests.yml index 44192a04ea..0be5d51a2b 100644 --- a/.github/workflows/light-system-programs-tests.yml +++ b/.github/workflows/light-system-programs-tests.yml @@ -15,7 +15,7 @@ on: paths: - "programs/**" - "program-tests/**" - - "program-libs/**" + - "program-libs/verifier/**" - "merkle-tree/**" - ".github/workflows/light-system-programs-tests.yml" - "test-utils/**" @@ -55,25 +55,24 @@ jobs: strategy: matrix: include: - - program: account-compression-and-registry - sub-tests: '["cargo-test-sbf -p account-compression-test", "cargo-test-sbf -p registry-test"]' - - program: light-system-program-address - sub-tests: '["cargo-test-sbf -p system-test -- test_with_address"]' - - program: light-system-program-compression - sub-tests: '["cargo-test-sbf -p system-test -- test_with_compression", "cargo-test-sbf -p system-test --test test_re_init_cpi_account"]' - - program: compressed-token-and-e2e - sub-tests: '["cargo-test-sbf -p compressed-token-test -- --skip test_transfer_with_photon_and_batched_tree", "cargo-test-sbf -p e2e-test"]' - - program: compressed-token-batched-tree - sub-tests: '["cargo-test-sbf -p compressed-token-test -- test_transfer_with_photon_and_batched_tree"]' + - program: account-compression + sub-tests: '["cargo-test-sbf -p account-compression-test"]' + - program: light-system-program + sub-tests: '["cargo-test-sbf -p system-test"]' + - program: light-registry + sub-tests: '["cargo-test-sbf -p registry-test"]' + - program: light-compressed-token + sub-tests: '["cargo-test-sbf -p compressed-token-test"]' - program: system-cpi-test - sub-tests: - '["cargo-test-sbf -p system-cpi-test", "cargo test -p light-system-program-pinocchio", - "cargo-test-sbf -p system-cpi-v2-test -- --skip functional_ --skip event::parse", "cargo-test-sbf -p system-cpi-v2-test -- event::parse" - ]' - - program: system-cpi-test-v2-functional-read-only - sub-tests: '["cargo-test-sbf -p system-cpi-v2-test -- functional_read_only"]' - - program: system-cpi-test-v2-functional-account-infos - sub-tests: '["cargo-test-sbf -p system-cpi-v2-test -- functional_account_infos"]' + sub-tests: '["cargo-test-sbf -p system-cpi-test"]' + - program: system-cpi-test-v2-event + sub-tests: '["cargo-test-sbf -p system-cpi-v2-test -- event::parse"]' + - program: system-cpi-test-v2-functional + sub-tests: '["cargo-test-sbf -p system-cpi-v2-test -- functional_"]' + - program: system-cpi-test-v2-other + sub-tests: '["cargo-test-sbf -p system-cpi-v2-test -- --skip functional_ --skip event::parse"]' + - program: random-e2e-test + sub-tests: '["cargo-test-sbf -p e2e-test"]' steps: - name: Checkout sources uses: actions/checkout@v4 @@ -81,41 +80,31 @@ jobs: - name: Setup and build uses: ./.github/actions/setup-and-build with: - skip-components: "redis,disk-cleanup" - cache-suffix: "system-programs" + skip-components: "redis" - name: Build CLI run: | + source ./scripts/devenv.sh npx nx build @lightprotocol/zk-compression-cli + - name: build-programs + run: | + source ./scripts/devenv.sh + npx nx build @lightprotocol/programs + npx nx build @lightprotocol/program-tests + - name: ${{ matrix.program }} run: | + source ./scripts/devenv.sh IFS=',' read -r -a sub_tests <<< "${{ join(fromJSON(matrix['sub-tests']), ', ') }}" for subtest in "${sub_tests[@]}" do echo "$subtest" - # Retry logic for flaky batched-tree test - if [[ "$subtest" == *"test_transfer_with_photon_and_batched_tree"* ]]; then - echo "Running flaky test with retry logic (max 3 attempts)..." - attempt=1 - max_attempts=3 - until RUSTFLAGS="-D warnings" eval "$subtest"; do - attempt=$((attempt + 1)) - if [ $attempt -gt $max_attempts ]; then - echo "Test failed after $max_attempts attempts" - exit 1 - fi - echo "Attempt $attempt/$max_attempts failed, retrying..." - sleep 5 - done - echo "Test passed on attempt $attempt" - else - RUSTFLAGS="-D warnings" eval "$subtest" - if [ "$subtest" == "cargo-test-sbf -p e2e-test" ]; then - pnpm --filter @lightprotocol/programs run build-compressed-token-small - RUSTFLAGS="-D warnings" eval "$subtest -- --test test_10_all" - fi + RUSTFLAGS="-D warnings" eval "$subtest" + if [ "$subtest" == "cargo-test-sbf -p e2e-test" ]; then + pnpm --filter @lightprotocol/programs run build-compressed-token-small + RUSTFLAGS="-D warnings" eval "$subtest -- --test test_10_all" fi done diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 88f3d325b1..5657f8c9f1 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -28,12 +28,11 @@ jobs: - name: Setup and build uses: ./.github/actions/setup-and-build - with: - skip-components: "proving-keys,redis,disk-cleanup" - name: Run linters run: | set -euxo pipefail + source ./scripts/devenv.sh rustup install nightly rustup target add x86_64-unknown-linux-gnu --toolchain nightly rustup component add --toolchain nightly rustfmt diff --git a/.github/workflows/prover-release.yml b/.github/workflows/prover-release.yml index 85406325b2..87f6241a98 100644 --- a/.github/workflows/prover-release.yml +++ b/.github/workflows/prover-release.yml @@ -12,25 +12,19 @@ jobs: uses: actions/checkout@v4 - name: Set up Go - uses: actions/setup-go@v6 + uses: actions/setup-go@v5 with: - go-version-file: "./prover/server/go.mod" + go-version: 1.21 - name: Build artifacts run: | cd prover/server - for cfgstr in "darwin amd64" "darwin arm64" "linux amd64" "linux arm64" "windows amd64"; do + for cfgstr in "darwin amd64" "darwin arm64" "linux amd64" "windows amd64"; do IFS=' ' read -r -a cfg <<< "$cfgstr" export GOOS="${cfg[0]}" export GOARCH="${cfg[1]}" export CGO_ENABLED=0 - - ext="" - if [ "$GOOS" = "windows" ]; then - ext=".exe" - fi - - go build -o prover-"$GOOS"-"$GOARCH""$ext" + go build -o prover-"$GOOS"-"$GOARCH" done - name: Create Release @@ -40,5 +34,4 @@ jobs: prover/server/prover-darwin-amd64 prover/server/prover-darwin-arm64 prover/server/prover-linux-amd64 - prover/server/prover-linux-arm64 - prover/server/prover-windows-amd64.exe + prover/server/prover-windows-amd64 diff --git a/.github/workflows/prover-test.yml b/.github/workflows/prover-test.yml index dd09859f61..5c35efa06b 100644 --- a/.github/workflows/prover-test.yml +++ b/.github/workflows/prover-test.yml @@ -1,6 +1,4 @@ name: Test gnark prover -permissions: - contents: read on: push: branches: @@ -24,96 +22,10 @@ on: - ready_for_review jobs: - build: - if: github.event_name == 'push' || github.event.pull_request.draft == false + build-and-test: + if: github.event.pull_request.draft == false runs-on: buildjet-8vcpu-ubuntu-2204 - timeout-minutes: 15 - steps: - - name: Checkout sources - uses: actions/checkout@v4 - - - name: Set up Go - uses: actions/setup-go@v6 - with: - go-version-file: "./prover/server/go.mod" - - - name: Cache Go modules - uses: actions/cache@v4 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('prover/server/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Build Go project - run: | - cd prover/server - go build ./... - go build -o light-prover - - - name: Upload prover binary - uses: actions/upload-artifact@v4 - with: - name: light-prover-binary - retention-days: 1 - path: prover/server/light-prover - - test-no-redis: - needs: build - runs-on: buildjet-8vcpu-ubuntu-2204 - timeout-minutes: 90 - strategy: - fail-fast: false - matrix: - test-suite: - - name: "Unit tests" - command: "go test ./prover/... -timeout 60m" - - name: "Worker selection tests" - command: "go test -v -run TestWorkerSelection -timeout 5m" - - name: "Batch operations queue routing tests" - command: "go test -v -run TestBatchOperations -timeout 5m" - steps: - - name: Checkout sources - uses: actions/checkout@v4 - - - name: Set up Go - uses: actions/setup-go@v6 - with: - go-version-file: "./prover/server/go.mod" - - - name: Restore Go cache - uses: actions/cache@v4 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('prover/server/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Run ${{ matrix.test-suite.name }} - run: | - cd prover/server - ${{ matrix.test-suite.command }} - - test-with-redis: - needs: build - runs-on: buildjet-8vcpu-ubuntu-2204 - timeout-minutes: 30 - strategy: - fail-fast: false - matrix: - test-suite: - - name: "Redis Queue tests" - command: "go test -v -run TestRedis -timeout 10m" - - name: "Queue cleanup tests" - command: "go test -v -run TestCleanup -timeout 5m" - - name: "Queue processing flow tests" - command: "go test -v -run TestJobProcessingFlow -timeout 5m" - - name: "Failed job status tests" - command: "go test -v -run TestFailedJobStatus -timeout 5m" + timeout-minutes: 120 services: redis: image: redis:7-alpine @@ -129,171 +41,100 @@ jobs: uses: actions/checkout@v4 - name: Set up Go - uses: actions/setup-go@v6 + uses: actions/setup-go@v5 with: go-version-file: "./prover/server/go.mod" - - name: Restore Go cache - uses: actions/cache@v4 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('prover/server/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Run ${{ matrix.test-suite.name }} - env: - TEST_REDIS_URL: redis://localhost:6379/15 + - name: Install Elan run: | - cd prover/server - ${{ matrix.test-suite.command }} - - integration-test-lightweight: - needs: build - if: | - github.event_name == 'push' || - (github.event_name == 'pull_request' && - github.event.pull_request.draft == false && - github.event.pull_request.base.ref == 'main') - runs-on: buildjet-8vcpu-ubuntu-2204 - timeout-minutes: 30 - steps: - - name: Checkout sources - uses: actions/checkout@v4 - - - name: Set up Go - uses: actions/setup-go@v6 - with: - go-version-file: "./prover/server/go.mod" + curl https://raw.githubusercontent.com/leanprover/elan/master/elan-init.sh -sSf | sh -s -- -y -v --default-toolchain leanprover/lean4:v4.2.0 + echo "LAKE_VERSION=$(~/.elan/bin/lake --version)" >> "$GITHUB_ENV" - - name: Restore Go cache + - name: Cache dependencies uses: actions/cache@v4 with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('prover/server/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- + path: prover/server/formal-verification/lake-packages + key: "${{ env.LAKE_VERSION }}" - - name: Lightweight integration tests + - name: Download keys for lightweight tests + if: ${{ github.event.pull_request.base.ref == 'main' }} run: | cd prover/server - go test -run TestLightweight -timeout 15m - - integration-test-lightweight-lazy: - needs: build - if: | - github.event_name == 'push' || - (github.event_name == 'pull_request' && - github.event.pull_request.draft == false && - github.event.pull_request.base.ref == 'main') - runs-on: buildjet-8vcpu-ubuntu-2204 - timeout-minutes: 30 - steps: - - name: Checkout sources - uses: actions/checkout@v4 - - - name: Set up Go - uses: actions/setup-go@v6 - with: - go-version-file: "./prover/server/go.mod" - - - name: Restore Go cache - uses: actions/cache@v4 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('prover/server/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- + ./scripts/download_keys.sh light - - name: Lightweight lazy loading integration tests + - name: Download keys for full tests + if: ${{ github.event.pull_request.base.ref == 'release' }} run: | cd prover/server - go test -run TestLightweightLazy -timeout 15m - - integration-test-full: - needs: build - if: | - github.event_name == 'pull_request' && - github.event.pull_request.draft == false && - startsWith(github.event.pull_request.base.ref, 'release') - runs-on: buildjet-8vcpu-ubuntu-2204 - timeout-minutes: 120 - steps: - - name: Checkout sources - uses: actions/checkout@v4 - - - name: Set up Go - uses: actions/setup-go@v6 - with: - go-version-file: "./prover/server/go.mod" + ./scripts/download_keys.sh full - - name: Restore Go cache - uses: actions/cache@v4 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('prover/server/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Full integration tests + - name: Build run: | cd prover/server - go test -run TestFull -timeout 120m + go build - lean-verification: - needs: build - runs-on: buildjet-8vcpu-ubuntu-2204 - timeout-minutes: 30 - steps: - - name: Checkout sources - uses: actions/checkout@v4 + - name: Unit tests + run: | + cd prover/server + go test ./prover -timeout 60m - - name: Set up Go - uses: actions/setup-go@v6 - with: - go-version-file: "./prover/server/go.mod" + - name: Redis Queue tests + env: + TEST_REDIS_URL: redis://localhost:6379/15 + run: | + cd prover/server + go test -v -run TestRedis -timeout 10m - - name: Download prover binary - uses: actions/download-artifact@v4 - with: - name: light-prover-binary - path: prover/server/ + - name: Queue cleanup tests + env: + TEST_REDIS_URL: redis://localhost:6379/15 + run: | + cd prover/server + go test -v -run TestCleanup -timeout 5m - - name: Make binary executable - run: chmod +x prover/server/light-prover + - name: Worker selection tests + run: | + cd prover/server + go test -v -run TestWorkerSelection -timeout 5m - - name: Install Elan + - name: Batch operations queue routing tests run: | - curl https://raw.githubusercontent.com/leanprover/elan/master/elan-init.sh -sSf | sh -s -- -y -v --default-toolchain leanprover/lean4:v4.2.0 + cd prover/server + go test -v -run TestBatchOperations -timeout 5m - - name: Get Lake version for cache key - id: lake-version + - name: Queue processing flow tests + env: + TEST_REDIS_URL: redis://localhost:6379/15 run: | - echo "version=$(~/.elan/bin/lake --version)" >> "$GITHUB_OUTPUT" + cd prover/server + go test -v -run TestJobProcessingFlow -timeout 5m - - name: Cache Lean dependencies - uses: actions/cache@v4 - with: - path: prover/server/formal-verification/lake-packages - key: lean-${{ steps.lake-version.outputs.version }}-${{ hashFiles('prover/server/formal-verification/lakefile.lean') }} - restore-keys: | - lean-${{ steps.lake-version.outputs.version }}- + - name: Failed job status tests + env: + TEST_REDIS_URL: redis://localhost:6379/15 + run: | + cd prover/server + go test -v -run TestFailedJobStatus -timeout 5m - - name: Extract circuit to Lean + - name: Lightweight integration tests + if: ${{ github.event.pull_request.base.ref == 'main' }} run: | cd prover/server - ./light-prover extract-circuit --output formal-verification/FormalVerification/Circuit.lean --address-tree-height 40 --compressed-accounts 8 --state-tree-height 32 + go test -run TestLightweight -timeout 15m - - name: Build Lean project + - name: Full integration tests + if: ${{ github.event.pull_request.base.ref == 'release' }} run: | - cd prover/server/formal-verification - ~/.elan/bin/lake exe cache get - ~/.elan/bin/lake build \ No newline at end of file + cd prover/server + go test -run TestFull -timeout 120m + + # - name: Extract circuit to Lean + # run: | + # cd prover/server + # ./light-prover extract-circuit --output formal-verification/FormalVerification/Circuit.lean --tree-height=26 --compressed-accounts=8 + + # - name: Build lean project + # run: | + # cd prover/server/formal-verification + # ~/.elan/bin/lake exe cache get + # ~/.elan/bin/lake build diff --git a/.github/workflows/release-pr-rust.yml b/.github/workflows/release-pr-rust.yml new file mode 100644 index 0000000000..328ec97f53 --- /dev/null +++ b/.github/workflows/release-pr-rust.yml @@ -0,0 +1,167 @@ +name: Open a Rust release PR +on: + workflow_dispatch: + inputs: + crate: + description: Crate to release + required: true + type: choice + options: + - all + - aligned-sized + - light-client + - light-heap + - light-utils + - light-bounded-vec + - light-hasher + - light-macros + - light-hash-set + - light-merkle-tree-reference + - light-concurrent-merkle-tree + - light-indexed-merkle-tree + - light-prover-client + - light-verifier + - account-compression + - light-registry + - light-system-program + - light-compressed-token + - light-test-utils + - light-wasm-hasher + version: + description: Version to release + required: true + type: choice + options: + - major + - minor + - patch + - release + - rc + - beta + - alpha + +jobs: + make-release-pr: + permissions: + id-token: write + pull-requests: write + contents: write + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v4 + + - uses: chainguard-dev/actions/setup-gitsign@main + + - name: Install Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: stable + + - name: Install cargo-release + shell: bash + run: | + VERSION="$(curl --silent "https://api.github.com/repos/crate-ci/cargo-release/releases/latest" | jq -r .tag_name)" + pushd /tmp + wget https://github.com/crate-ci/cargo-release/releases/download/"$VERSION"/cargo-release-"$VERSION"-x86_64-unknown-linux-gnu.tar.gz + tar -xzvf cargo-release-"$VERSION"-x86_64-unknown-linux-gnu.tar.gz --wildcards '*cargo-release' --strip-components=1 + cp cargo-release "$HOME"/.cargo/bin + popd + + - name: Setup pnpm + uses: pnpm/action-setup@v4.1.0 + with: + run_install: false + + - name: Bump all crate versions + if: inputs.crate == 'all' + run: | + cargo release version --execute --no-confirm \ + "${{ inputs.version }}" + + - name: Create pull request for all crates + if: inputs.crate == 'all' + uses: peter-evans/create-pull-request@v7 + env: + COMMIT_MESSAGE: "chore: Bump version of all Rust projects" + with: + commit-message: ${{ env.COMMIT_MESSAGE }} + title: ${{ env.COMMIT_MESSAGE }} + branch: "bump-all-rust" + labels: "version bump" + + - name: Checkout the PR branch all + if: inputs.crate == 'all' + uses: actions/checkout@v4 + with: + ref: "bump-all-rust" + fetch-depth: 0 + + - name: Pull latest changes all + if: inputs.crate == 'all' + run: git pull + + - name: Show current branch and commit all + if: inputs.crate == 'all' + run: | + echo "Current branch:" + git branch --show-current + echo "Latest commit:" + git log -1 + + - name: Setup and build nocheck all + if: inputs.crate == 'all' + uses: ./.github/actions/setup-and-build-nocheck + with: + branch: "bump-all-rust" + + - name: Bump crate version for single crate + if: inputs.crate != 'all' + run: | + cargo release version --execute --no-confirm \ + -p "${{ inputs.crate }}" "${{ inputs.version }}" + + - name: Create pull request for single crate + if: inputs.crate != 'all' + uses: peter-evans/create-pull-request@v7 + env: + COMMIT_MESSAGE: "chore: Bump version of Rust project ${{ inputs.crate }}" + with: + commit-message: ${{ env.COMMIT_MESSAGE }} + title: ${{ env.COMMIT_MESSAGE }} + branch: "bump-${{ inputs.crate }}" + labels: "version bump" + + - name: Checkout the PR branch for single crate + if: inputs.crate != 'all' + uses: actions/checkout@v4 + with: + ref: "bump-${{ inputs.crate }}" + fetch-depth: 0 + + - name: Pull latest changes for single crate + if: inputs.crate != 'all' + run: git pull + + - name: Show Git Status and Diff for single crate + if: inputs.crate != 'all' + run: | + git status + git diff + + - name: Commit IDL and other changes + run: | + git config user.name "GitHub Actions" + git config user.email "github-actions@github.com" + git add -A + if git diff --staged --quiet; then + echo "No changes to commit." + else + git commit -m "Include IDL and other changes post build" + if [ "${{ github.event.inputs.crate }}" == "all" ]; then + BRANCH_NAME="bump-all-rust" + else + BRANCH_NAME="bump-${{ github.event.inputs.crate }}" + fi + git push origin "$BRANCH_NAME" + fi diff --git a/.github/workflows/release-pr-validation.yml b/.github/workflows/release-pr-validation.yml deleted file mode 100644 index 127d94a137..0000000000 --- a/.github/workflows/release-pr-validation.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Release PR Validation - -permissions: - contents: read - -on: - pull_request: - types: [opened, synchronize, reopened] - branches: - - main - -jobs: - validate-release: - # Only run on release PRs - if: contains(github.event.pull_request.labels.*.name, 'release') - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Set up Rust - uses: actions-rust-lang/setup-rust-toolchain@v1 - with: - toolchain: stable - - - name: Validate packages for publishing - run: ./scripts/release/validate-packages.sh diff --git a/.github/workflows/release-rust.yml b/.github/workflows/release-rust.yml deleted file mode 100644 index 56862ac5ae..0000000000 --- a/.github/workflows/release-rust.yml +++ /dev/null @@ -1,91 +0,0 @@ -name: Publish Rust Release - -on: - pull_request: - types: [closed] - branches: - - main - -jobs: - publish-release: - # Only run on merged release PRs - if: github.event.pull_request.merged == true && contains(github.event.pull_request.labels.*.name, 'release') - runs-on: ubuntu-latest - permissions: - contents: write - - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Fetch PR commits - run: | - git fetch origin ${{ github.event.pull_request.base.sha }} - git fetch origin ${{ github.event.pull_request.head.sha }} - - - name: Set up Rust - uses: actions-rust-lang/setup-rust-toolchain@v1 - with: - toolchain: stable - - - name: Configure git - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - - - name: Validate packages before publishing - env: - BASE_SHA: ${{ github.event.pull_request.base.sha }} - HEAD_SHA: ${{ github.event.pull_request.head.sha }} - run: | - echo "=========================================" - echo "Phase 1: Validation (dry-run)" - echo "=========================================" - ./scripts/release/validate-packages.sh "$BASE_SHA" "$HEAD_SHA" - - - name: Publish packages to crates.io - env: - CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} - BASE_SHA: ${{ github.event.pull_request.base.sha }} - HEAD_SHA: ${{ github.event.pull_request.head.sha }} - run: | - echo "" - echo "=========================================" - echo "Phase 2: Publishing (atomic)" - echo "=========================================" - ./scripts/release/validate-packages.sh --execute "$BASE_SHA" "$HEAD_SHA" - - - name: Create GitHub releases - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BASE_SHA: ${{ github.event.pull_request.base.sha }} - HEAD_SHA: ${{ github.event.pull_request.head.sha }} - run: | - echo "" - echo "=========================================" - echo "Phase 3: Creating GitHub releases" - echo "=========================================" - - # Detect packages that were published - PACKAGES_STRING=$(./scripts/release/detect-version-changes.sh "$BASE_SHA" "$HEAD_SHA") - read -ra PACKAGES <<< "$PACKAGES_STRING" - - for pkg in "${PACKAGES[@]}"; do - echo "----------------------------------------" - # Get the version from Cargo.toml - VERSION=$(cargo metadata --format-version 1 --no-deps | jq -r ".packages[] | select(.name == \"$pkg\") | .version") - TAG="${pkg}-v${VERSION}" - - echo "Creating GitHub release for $TAG.." - if gh release create "$TAG" --generate-notes --title "$TAG"; then - echo "✓ Created release for $TAG" - else - echo "Warning: Failed to create release for $TAG" - fi - done - - echo "" - echo "✓ GitHub releases created" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000000..eec2218324 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,167 @@ +name: Release + +on: + push: + branches: + - main + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v4 + + - name: Setup and build + uses: ./.github/actions/setup-and-build + + - name: Install cargo-workspaces + run: | + source ./scripts/devenv.sh + cargo install cargo-release cargo-workspaces + + - name: Extract project + id: extract-project + shell: bash + run: | + COMMIT_MESSAGE=$(git log -1 --pretty=format:'%s' | sed 's/([^()]*)//g' | head -n 1) + PACKAGE="" + LANGUAGE="" + echo "Commit message: $COMMIT_MESSAGE" + + if [[ "$COMMIT_MESSAGE" == "chore: Bump version of all Rust projects" ]]; then + PACKAGE="all" + LANGUAGE="rust" + elif [[ "$COMMIT_MESSAGE" == *"Bump version of all TypeScript"* ]]; then + PACKAGE="all" + LANGUAGE="ts" + elif [[ "$COMMIT_MESSAGE" == "chore: Bump version of Rust project "* ]]; then + PACKAGE=$(echo "$COMMIT_MESSAGE" | sed -n 's/chore: Bump version of Rust project \(.*\)/\1/p') + LANGUAGE="rust" + elif [[ "$COMMIT_MESSAGE" == *"Bump version of TypeScript project"* ]]; then + PACKAGE=$(echo "$COMMIT_MESSAGE" | grep -o "version of TypeScript project [^ ]*" | cut -d " " -f5) + LANGUAGE="rust" + fi + + # Needed for Anchor. + PACKAGE_SNAKE_CASE=$(echo "$PACKAGE" | tr '-' '_') + + printf "package=%s\package-snake-case=%s\nlanguage=%s\n" "$PACKAGE" "$PACKAGE_SNAKE_CASE" "$LANGUAGE" >> "$GITHUB_OUTPUT" + + - name: Set Git user configuration + if: steps.extract-project.outputs.language != '' + run: | + git config user.name "GitHub Actions" + git config user.email "github-actions@github.com" + + - name: Tag all Rust projects + if: steps.extract-project.outputs.package == 'all' && steps.extract-project.outputs.language == 'rust' + run: | + for PACKAGE in $(cargo ws list); do + VERSION=$(cargo pkgid -p "$PACKAGE" | cut -d "@" -f2) + echo "Creating tag for Rust package: $PACKAGE v$VERSION" + git tag "${PACKAGE}-v${VERSION}" + git push origin "${PACKAGE}-v${VERSION}" + done + + - name: Tag all TypeScript projects + if: steps.extract-project.outputs.package == 'all' && steps.extract-project.outputs.language == 'ts' + run: | + for dir in $(pnpm m ls --depth -1 --porcelain | grep -v examples | grep -v tsconfig | tail -n+2); do + pushd "$dir" + PACKAGE=$(basename "$dir") + VERSION=$(pnpm list --depth 0 --json | jq -r '.[0].version') + echo "Creating tag for TypeScript package: $PACKAGE v$VERSION" + git tag "${PACKAGE}-v${VERSION}" + git push origin "${PACKAGE}-v${VERSION}" + popd + done + + - name: Tag Rust project + id: tag-rust + if: steps.extract-project.outputs.package != 'all' && steps.extract-project.outputs.language == 'rust' + env: + PACKAGE: ${{ steps.extract-project.outputs.version }} + run: | + VERSION=$(cargo pkgid -p "$PACKAGE" | cut -d "@" -f2) + echo "Creating tag for package: $PACKAGE v$VERSION" + git tag "${PACKAGE}-v${VERSION}" + git push origin "${PACKAGE}-v${VERSION}" + + - name: Tag TypeScript project + id: tag-ts + if: steps.extract-project.outputs.package != 'all' && steps.extract-project.outputs.language == 'ts' + env: + PACKAGE: ${{ steps.extract-project.outputs.version }} + run: | + VERSION=$(pnpm list --filter "$1" --depth 0 --json | jq -r '.[0].version') + echo "Creating tag for package: $PACKAGE v$VERSION" + git tag "${PACKAGE}-v${VERSION}" + git push origin "${PACKAGE}-v${VERSION}" + + - name: Log in to crates.io + if: steps.extract-project.outputs.language == 'rust' + run: | + cargo login "${{ secrets.CRATES_IO_TOKEN }}" + + - name: Release all Rust projects + if: steps.extract-project.outputs.package == 'all' && steps.extract-project.outputs.language == 'rust' + shell: bash + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CRATES_IO_TOKEN }} + PACKAGE: ${{ steps.extract-project.outputs.package }} + run: | + source ./scripts/devenv.sh + + npx nx build @lightprotocol/programs + cp -r ./target/deploy/*.so . + + PACKAGES=("aligned-sized" "light-heap" "light-utils" "light-bounded-vec" "light-hasher" "light-macros" "light-hash-set" "light-merkle-tree-reference" "light-concurrent-merkle-tree" "light-indexed-merkle-tree" "light-prover-client" "light-verifier" "account-compression" "light-registry" "light-system-program" "light-compressed-token" "light-test-utils") + for PACKAGE in "${PACKAGES[@]}"; do + for attempt in {1..3}; do + echo "Attempt $attempt: Publishing $PACKAGE..." + cargo release publish --package "$PACKAGE" --execute --no-confirm && break || echo "Attempt $attempt failed, retrying in 60..." + sleep 60 + done + echo "Sleeping for 60 seconds to handle rate limits..." + sleep 60 + done + + - name: Release Rust project + if: steps.extract-project.outputs.package != 'all' && steps.extract-project.outputs.language == 'rust' + shell: bash + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CRATES_IO_TOKEN }} + PACKAGE: ${{ steps.extract-project.outputs.package }} + PACKAGE_SNAKE_CASE: ${{ steps.extract-project.outputs.package-snake-case }} + run: | + source ./scripts/devenv.sh + + # Check whether we are building an on-chain program. + if [[ $(anchor keys list | grep "$PACKAGE_SNAKE_CASE") -eq 0 ]]; then + anchor build -p "$PACKAGE_SNAKE_CASE" + fi + cp -r ./target/deploy/*.so . + + cargo release publish \ + --package "$PACKAGE" + + - name: Release TypeScript + if: steps.extract-project.outputs.package != 'all' && steps.extract-project.outputs.language == 'ts' + shell: bash + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} + NPM_CONFIG_PROVENANCE: true + PACKAGE: ${{ steps.extract-project.outputs.package }} + run: | + SUBDIR=$(grep "$PACKAGE" pnpm-workspace.yaml | awk -F '"' '{gsub("/\\*\\*", "", $2); print $2}') + cd "$SUBDIR" + pnpm publish --access public --no-git-checks + + - name: GitHub release + uses: softprops/action-gh-release@v2 + if: steps.extract-project.outputs.language != '' + with: + token: ${{ secrets.PAT_TOKEN }} + files: | + *.so diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 6eb3b703e6..737037a766 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -4,7 +4,7 @@ on: push: branches: [main] paths: - - "program-libs/**" + - "**/*.rs" - "**/Cargo.*" - ".cargo/**" - "prover/client/**" @@ -12,7 +12,7 @@ on: pull_request: branches: ["*"] paths: - - "program-libs/**" + - "**/*.rs" - "**/Cargo.*" - "prover/client/**" - ".github/workflows/rust.yml" @@ -34,21 +34,23 @@ jobs: strategy: matrix: group: + - name: concurrent-merkle-tree + packages: light-concurrent-merkle-tree + test_cmd: | + cargo test -p light-concurrent-merkle-tree - name: batched-merkle-tree-simulate - packages: light-batched-merkle-tree batched-merkle-tree-test + packages: light-batched-merkle-tree test_cmd: | - cargo test -p light-batched-merkle-tree --features test-only - RUST_LOG=light_prover_client=debug cargo test -p batched-merkle-tree-test -- --test test_simulate_transactions + RUST_LOG=light_prover_client=debug cargo test -p light-batched-merkle-tree --features test-only -- --test test_simulate_transactions - name: program-libs-fast packages: aligned-sized light-hasher light-compressed-account light-account-checks \ - light-verifier light-merkle-tree-metadata light-zero-copy light-hash-set light-concurrent-merkle-tree + light-verifier light-merkle-tree-metadata light-zero-copy light-hash-set test_cmd: | - cargo test -p light-macros cargo test -p aligned-sized cargo test -p light-hasher --all-features cargo test -p light-compressed-account --all-features - cargo test -p light-compressed-account --features new-unique,poseidon + cargo test -p light-compressed-account --features new-unique cargo test -p light-account-checks --all-features cargo test -p light-verifier --all-features cargo test -p light-merkle-tree-metadata --all-features @@ -56,16 +58,23 @@ jobs: cargo test -p light-zero-copy --no-default-features # Test no_std compatibility cargo build -p light-zero-copy --no-default-features # Ensure no_std builds cargo test -p light-zero-copy-derive --all-features - cargo test -p zero-copy-derive-test cargo test -p light-hash-set --all-features - cargo test -p batched-merkle-tree-test -- --skip test_simulate_transactions --skip test_e2e - cargo test -p light-concurrent-merkle-tree - name: program-libs-slow - packages: light-bloom-filter light-indexed-merkle-tree batched-merkle-tree-test + packages: light-bloom-filter light-indexed-merkle-tree light-batched-merkle-tree test_cmd: | cargo test -p light-bloom-filter --all-features cargo test -p light-indexed-merkle-tree --all-features - cargo test -p batched-merkle-tree-test -- --test test_e2e + cargo test -p light-batched-merkle-tree --all-features -- --test test_e2e + - name: sdk-libs + packages: light-macros light-sdk light-program-test light-client light-batched-merkle-tree + test_cmd: | + cargo test -p light-macros + cargo test -p light-sdk + cargo test -p light-program-test + cargo test -p light-client + cargo test -p client-test + cargo test -p light-sparse-merkle-tree + cargo test -p light-batched-merkle-tree --features test-only -- --skip test_simulate_transactions --skip test_e2e name: Test ${{ matrix.group.name }} @@ -89,13 +98,14 @@ jobs: - name: Setup and build uses: ./.github/actions/setup-and-build with: - skip-components: "redis,disk-cleanup" - cache-suffix: "rust" + skip-components: "redis" - name: Build CLI run: | + source ./scripts/devenv.sh npx nx build @lightprotocol/zk-compression-cli - name: Run tests for ${{ matrix.group.name }} run: | + source ./scripts/devenv.sh ${{ matrix.group.test_cmd }} diff --git a/.gitignore b/.gitignore index 191d6aee62..8fa4a89ce0 100644 --- a/.gitignore +++ b/.gitignore @@ -31,7 +31,6 @@ # Rust **/target/ -!sdk-tests/sdk-anchor-test/target/ **/dist/ diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000000..81c903de36 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,105 @@ + + + +# Repository Structure +1. Solana programs (programs/*) +2. crates used in programs (program-libs/) +3. integration tests and test utilities for programs (program-tests) +4. sdks for programs (sdk-libs/) +5. integration tests for sdks (sdk-tests/) +6. circuits used in programs, prover server, and rust prover client crate (prover/) +7. forester server (forester/) + + + + + + +# Testing + +This repository uses a comprehensive two-tier testing strategy: + +- **[Unit Testing Guide](./UNIT_TESTING.md)** - For testing individual functions in isolation using mock account infos. Tests are located in `tests/` directories within each crate. + +- **[Integration Testing Guide](./INTEGRATION_TESTING.md)** - For testing complete program workflows using full SVM simulation. Tests are located in the `program-tests/` directory. + +## Key Testing Requirements + +All tests must follow these mandatory requirements: +- **Functional test for every usage flow** +- **Failing test for every error condition** +- **Complete output verification** with single `assert_eq!` against expected structs +- **1k iteration randomized tests** for complex functions and ZeroCopy structs + +# Debugging with LightProgramTest + +## Transaction Log File + +The light-program-test library automatically creates detailed transaction logs in: +``` +target/light_program_test.log +``` + +### Features + +- **Always enabled**: Logs are written to file regardless of environment variables +- **Clean format**: Plain text without ANSI color codes for easy reading and processing +- **Session-based**: Each test session starts with a timestamp header, transactions append to the same file +- **Comprehensive details**: Includes transaction signatures, fees, compute usage, instruction hierarchies, Light Protocol instruction parsing, and compressed account information + +### Configuration + +Enhanced logging is enabled by default. To disable: +```rust +let mut config = ProgramTestConfig::default(); +config.enhanced_logging.enabled = false; +``` + +Console output requires `RUST_BACKTRACE` environment variable and can be controlled separately from file logging. + +### Log File Location + +The log file is automatically placed in the cargo workspace target directory, making it consistent across different test environments and working directories. + +# Program Performance +- send bump seeds +- avoid deriving addresses +- avoid vectors stack over heap use ArrayVec + +# Program Security + +- every input (instruction data and account infos) must be checked +- inclusion of instruction data in an input compressed account data hash counts as checked + +### Account checks +- ownership is checked +- cpis should use hardcoded + +### Compressed accounts +- the program id is the owner of the compressed account +- data hash must be computed in the owning program +- all data that is in an input compressed account is checked implicitly by inclusion in the data hash, the data hash is part of the compressed account hash that is in the Merkle tree or queue which we prove inclusion in by zkp or index +- input compressed account + - is existing state + - validity is proven by index (zkp is None) or zkp + - no data is sent to the system program + - data hash must be computed in the owning program +- output compressed account + - this is new state, no validity proof + - data hash must be computed in the owning program + - no changes to data after data hash has been computed +- minimize use of instruction data, ie do not send data twice. + 1. example, owner pubkey + if a compressed account has an owner pubkey field which should be a tx signer, send it as signer account info, set it in the custom program, and do not sending it as instruction data. No comparison in the program is required. + 2. example, values from accounts + +- + +- a compressed account the state update is atomic through the cpi to the light system program, writes to the cpi context can produce non atomic transactions if solana accounts are involved and instantly updated for compressed accounts atomicity still applies, in case that a written cpi context account is not executed the state update is never actually applied only prepared. + + +# Zero Copies +- the derive macros ZeroCopy and ZeroCopyMut derive zero copy deserialization methods and should be used in programs +- in client code borsh is preferable +- ZeroCopy is borsh compatible +- Z and Z*Mut structs are derived by the ZeroCopy and ZeroCopyMut macros and cannot be searched with grep or rg, search for the non prefixed struct instead the zero copy struct has the same structure with zero copy types. diff --git a/Cargo.lock b/Cargo.lock index 02dd0a583e..f1e4c62629 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -73,9 +73,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.25.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -122,53 +122,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "agave-feature-set" -version = "2.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c5117ce634f42ce143891c4d7db3536d5054fc19501ef88e21f353b8580c450" -dependencies = [ - "ahash", - "solana-epoch-schedule", - "solana-hash 2.3.0", - "solana-pubkey 2.4.0", - "solana-sha256-hasher 2.3.0", - "solana-svm-feature-set", -] - -[[package]] -name = "agave-precompiles" -version = "2.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47f7f87574ffda3eb5b4385ef328fd6cca81b415c55e106a05bbae72ea5c428e" -dependencies = [ - "agave-feature-set", - "bincode", - "digest 0.10.7", - "ed25519-dalek", - "libsecp256k1", - "openssl", - "sha3", - "solana-ed25519-program", - "solana-message", - "solana-precompile-error", - "solana-pubkey 2.4.0", - "solana-sdk-ids", - "solana-secp256k1-program", - "solana-secp256r1-program", -] - -[[package]] -name = "agave-reserved-account-keys" -version = "2.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "437f99adcce3e30218130d4cefbdb1f5810c43b553eb51b452e01dd3edf2c28c" -dependencies = [ - "agave-feature-set", - "solana-pubkey 2.4.0", - "solana-sdk-ids", -] - [[package]] name = "ahash" version = "0.8.12" @@ -297,6 +250,29 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "anchor-compressed-token" +version = "2.0.0" +dependencies = [ + "account-compression", + "anchor-lang", + "anchor-spl", + "light-compressed-account", + "light-ctoken-types", + "light-hasher", + "light-heap", + "light-system-program-anchor", + "light-zero-copy", + "num-bigint 0.4.6", + "pinocchio-pubkey", + "rand 0.8.5", + "solana-sdk", + "solana-security-txt", + "spl-token", + "spl-token-2022 7.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "zerocopy", +] + [[package]] name = "anchor-derive-accounts" version = "0.31.1" @@ -388,12 +364,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c08cb5d762c0694f74bd02c9a5b04ea53cefc496e2c27b3234acffca5cd076b" dependencies = [ "anchor-lang", - "spl-associated-token-account 6.0.0", + "spl-associated-token-account", "spl-pod", - "spl-token 7.0.0", + "spl-token", "spl-token-2022 6.0.0", - "spl-token-group-interface 0.5.0", - "spl-token-metadata-interface 0.6.0", + "spl-token-group-interface", + "spl-token-metadata-interface", ] [[package]] @@ -435,9 +411,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.21" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", @@ -450,9 +426,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "anstyle-parse" @@ -485,9 +461,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" [[package]] name = "ark-bn254" @@ -801,9 +777,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.32" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" +checksum = "977eb15ea9efd848bb8a4a1a2500347ed7f0bf794edf0dc3ddcf439f43d36b23" dependencies = [ "compression-codecs", "compression-core", @@ -881,9 +857,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" -version = "0.3.76" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -891,7 +867,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-link 0.2.1", + "windows-targets 0.52.6", ] [[package]] @@ -918,26 +894,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "batched-merkle-tree-test" -version = "0.1.0" -dependencies = [ - "light-account-checks", - "light-batched-merkle-tree", - "light-bloom-filter", - "light-compressed-account", - "light-hasher", - "light-merkle-tree-metadata", - "light-merkle-tree-reference", - "light-prover-client", - "light-test-utils", - "light-zero-copy", - "rand 0.8.5", - "serial_test", - "solana-pubkey 2.4.0", - "tokio", -] - [[package]] name = "bb8" version = "0.8.6" @@ -1058,7 +1014,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" dependencies = [ "once_cell", - "proc-macro-crate 3.4.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", "syn 2.0.106", @@ -1140,18 +1096,18 @@ checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" [[package]] name = "bytemuck" -version = "1.24.0" +version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.10.2" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" dependencies = [ "proc-macro2", "quote", @@ -1169,9 +1125,6 @@ name = "bytes" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" -dependencies = [ - "serde", -] [[package]] name = "caps" @@ -1195,9 +1148,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.40" +version = "1.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" +checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44" dependencies = [ "find-msvc-tools", "jobserver", @@ -1245,7 +1198,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-link 0.2.1", + "windows-link 0.2.0", ] [[package]] @@ -1275,9 +1228,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.48" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" +checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" dependencies = [ "clap_builder", "clap_derive", @@ -1285,9 +1238,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.48" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" +checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" dependencies = [ "anstream", "anstyle", @@ -1322,7 +1275,6 @@ dependencies = [ "light-compressed-token", "light-hasher", "light-indexed-array", - "light-macros", "light-merkle-tree-reference", "light-program-test", "light-prover-client", @@ -1340,21 +1292,21 @@ dependencies = [ "solana-commitment-config", "solana-compute-budget-interface", "solana-epoch-info", - "solana-hash 2.3.0", + "solana-hash", "solana-instruction", "solana-keypair", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-program-error", + "solana-pubkey", "solana-rpc-client", "solana-rpc-client-api", "solana-sdk", "solana-signature", "solana-signer", - "solana-system-interface 2.0.0", + "solana-system-interface", "solana-transaction", "solana-transaction-error", "solana-transaction-status-client-types", - "spl-token 7.0.0", + "spl-token", "tokio", ] @@ -1399,25 +1351,32 @@ dependencies = [ "light-client", "light-compressed-account", "light-compressed-token", + "light-compressed-token-sdk", + "light-compressible", + "light-ctoken-types", "light-program-test", "light-prover-client", "light-registry", "light-sdk", "light-system-program-anchor", "light-test-utils", + "light-token-client", "light-verifier", + "light-zero-copy", "rand 0.8.5", "serial_test", "solana-sdk", - "spl-token 7.0.0", + "spl-pod", + "spl-token", + "spl-token-2022 7.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio", ] [[package]] name = "compression-codecs" -version = "0.4.31" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" +checksum = "485abf41ac0c8047c07c87c72c8fb3eb5197f6e9d7ded615dfd1a00ae00a0f64" dependencies = [ "brotli", "compression-core", @@ -1449,7 +1408,7 @@ dependencies = [ "encode_unicode", "libc", "once_cell", - "unicode-width 0.2.2", + "unicode-width 0.2.1", "windows-sys 0.59.0", ] @@ -1650,9 +1609,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.21.3" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", @@ -1660,9 +1619,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.21.3" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", @@ -1674,9 +1633,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.21.3" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", @@ -1732,12 +1691,12 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.4" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" +checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" dependencies = [ "powerfmt", - "serde_core", + "serde", ] [[package]] @@ -1817,7 +1776,7 @@ dependencies = [ "libc", "option-ext", "redox_users 0.5.2", - "windows-sys 0.61.2", + "windows-sys 0.61.0", ] [[package]] @@ -2080,7 +2039,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.61.0", ] [[package]] @@ -2142,18 +2101,9 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "find-msvc-tools" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" - -[[package]] -name = "five8" -version = "0.2.1" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75b8549488b4715defcb0d8a8a1c1c76a80661b5fa106b4ca0e7fce59d7d875" -dependencies = [ - "five8_core", -] +checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" [[package]] name = "five8_const" @@ -2172,9 +2122,9 @@ checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5" [[package]] name = "flate2" -version = "1.1.4" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "miniz_oxide", @@ -2213,7 +2163,7 @@ dependencies = [ "bb8", "borsh 0.10.4", "bs58", - "clap 4.5.48", + "clap 4.5.47", "create-address-test-program", "dashmap 6.1.0", "dotenvy", @@ -2250,7 +2200,7 @@ dependencies = [ "solana-program", "solana-sdk", "solana-transaction-status", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", "tracing-appender", @@ -2276,15 +2226,21 @@ dependencies = [ "light-concurrent-merkle-tree", "light-hash-set", "light-hasher", + "light-indexed-array", "light-indexed-merkle-tree", "light-merkle-tree-metadata", "light-prover-client", "light-registry", "light-sdk", "light-sparse-merkle-tree", + "num-bigint 0.4.6", "num-traits", + "rand 0.8.5", + "reqwest 0.12.23", + "serde", + "serde_json", "solana-sdk", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -2455,15 +2411,15 @@ dependencies = [ "js-sys", "libc", "r-efi", - "wasi 0.14.7+wasi-0.2.4", + "wasi 0.14.5+wasi-0.2.4", "wasm-bindgen", ] [[package]] name = "gimli" -version = "0.32.3" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -2541,7 +2497,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.11.4", + "indexmap 2.11.1", "slab", "tokio", "tokio-util 0.7.16", @@ -2560,7 +2516,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.11.4", + "indexmap 2.11.1", "slab", "tokio", "tokio-util 0.7.16", @@ -2569,9 +2525,9 @@ dependencies = [ [[package]] name = "hash32" -version = "0.3.1" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" dependencies = [ "byteorder", ] @@ -2606,12 +2562,6 @@ dependencies = [ "allocator-api2", ] -[[package]] -name = "hashbrown" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" - [[package]] name = "headers" version = "0.3.9" @@ -2864,10 +2814,10 @@ dependencies = [ "http 1.3.1", "hyper 1.7.0", "hyper-util", - "rustls 0.23.32", + "rustls 0.23.31", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls 0.26.2", "tower-service", "webpki-roots 1.0.2", ] @@ -3077,14 +3027,13 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.4" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.15.5", "serde", - "serde_core", ] [[package]] @@ -3096,7 +3045,7 @@ dependencies = [ "console", "number_prefix", "portable-atomic", - "unicode-width 0.2.2", + "unicode-width 0.2.1", "web-time", ] @@ -3242,9 +3191,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.81" +version = "0.3.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" dependencies = [ "once_cell", "wasm-bindgen", @@ -3265,16 +3214,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "kaigan" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ba15de5aeb137f0f65aa3bf82187647f1285abfe5b20c80c2c37f7007ad519a" -dependencies = [ - "borsh 0.10.4", - "serde", -] - [[package]] name = "keccak" version = "0.1.5" @@ -3292,9 +3231,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.176" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libm" @@ -3362,22 +3301,22 @@ dependencies = [ [[package]] name = "light-account-checks" -version = "0.4.0" +version = "0.3.0" dependencies = [ "borsh 0.10.4", "pinocchio", "rand 0.8.5", "solana-account-info", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-msg", + "solana-program-error", + "solana-pubkey", "solana-sysvar", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "light-batched-merkle-tree" -version = "0.5.0" +version = "0.3.0" dependencies = [ "aligned-sized", "borsh 0.10.4", @@ -3388,22 +3327,26 @@ dependencies = [ "light-macros", "light-merkle-tree-metadata", "light-merkle-tree-reference", + "light-prover-client", + "light-test-utils", "light-verifier", "light-zero-copy", "pinocchio", "rand 0.8.5", + "serial_test", "solana-account-info", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-msg", + "solana-program-error", + "solana-pubkey", "solana-sysvar", - "thiserror 2.0.17", + "thiserror 2.0.16", + "tokio", "zerocopy", ] [[package]] name = "light-bloom-filter" -version = "0.4.0" +version = "0.3.0" dependencies = [ "bitvec", "light-hasher", @@ -3411,8 +3354,8 @@ dependencies = [ "pinocchio", "rand 0.8.5", "solana-nostd-keccak", - "solana-program-error 2.2.2", - "thiserror 2.0.17", + "solana-program-error", + "thiserror 2.0.16", ] [[package]] @@ -3423,13 +3366,13 @@ checksum = "233a69f003522990dadcf923b436094ffcb55326a2c3cef7f67acdbcb6e5b039" dependencies = [ "bytemuck", "memoffset", - "solana-program-error 2.2.2", + "solana-program-error", "thiserror 1.0.69", ] [[package]] name = "light-client" -version = "0.15.0" +version = "0.13.1" dependencies = [ "async-trait", "base64 0.13.1", @@ -3444,7 +3387,6 @@ dependencies = [ "light-merkle-tree-metadata", "light-prover-client", "light-sdk", - "litesvm", "num-bigint 0.4.6", "num-traits", "photon-api", @@ -3457,25 +3399,26 @@ dependencies = [ "solana-commitment-config", "solana-compute-budget-interface", "solana-epoch-info", - "solana-hash 2.3.0", + "solana-hash", "solana-instruction", "solana-keypair", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-program-error", + "solana-pubkey", "solana-rpc-client", "solana-rpc-client-api", "solana-signature", + "solana-signer", "solana-transaction", "solana-transaction-error", "solana-transaction-status-client-types", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] [[package]] name = "light-compressed-account" -version = "0.5.0" +version = "0.3.0" dependencies = [ "anchor-lang", "ark-bn254 0.5.0", @@ -3486,15 +3429,15 @@ dependencies = [ "light-heap", "light-macros", "light-poseidon 0.3.0", - "light-program-profiler", + "light-profiler", "light-zero-copy", "num-bigint 0.4.6", "pinocchio", "rand 0.8.5", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "thiserror 2.0.17", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "thiserror 2.0.16", "zerocopy", ] @@ -3503,25 +3446,108 @@ name = "light-compressed-token" version = "2.0.0" dependencies = [ "account-compression", + "anchor-compressed-token", "anchor-lang", - "anchor-spl", + "arrayvec", + "borsh 0.10.4", + "lazy_static", + "light-account-checks", "light-compressed-account", + "light-compressible", + "light-ctoken-types", "light-hasher", "light-heap", + "light-profiler", + "light-sdk", + "light-sdk-pinocchio", + "light-sdk-types", "light-system-program-anchor", "light-zero-copy", "num-bigint 0.4.6", + "pinocchio", + "pinocchio-pubkey", + "pinocchio-system", "rand 0.8.5", - "solana-sdk", + "solana-pubkey", "solana-security-txt", - "spl-token 7.0.0", - "spl-token-2022 7.0.0", + "spl-pod", + "spl-token", + "spl-token-2022 7.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "spl-token-2022 7.0.0 (git+https://github.com/Lightprotocol/token-2022?rev=06d12f50a06db25d73857d253b9a82857d6f4cdf)", + "zerocopy", +] + +[[package]] +name = "light-compressed-token-sdk" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "arrayvec", + "borsh 0.10.4", + "light-account-checks", + "light-compressed-account", + "light-compressed-token", + "light-compressed-token-types", + "light-ctoken-types", + "light-macros", + "light-profiler", + "light-sdk", + "light-sdk-types", + "light-zero-copy", + "pinocchio", + "solana-account-info", + "solana-cpi", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "spl-pod", + "spl-token-2022 7.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 2.0.16", +] + +[[package]] +name = "light-compressed-token-types" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "borsh 0.10.4", + "light-account-checks", + "light-compressed-account", + "light-macros", + "light-sdk-types", + "solana-msg", + "thiserror 2.0.16", +] + +[[package]] +name = "light-compressible" +version = "0.1.0" +dependencies = [ + "aligned-sized", + "anchor-lang", + "borsh 0.10.4", + "bytemuck", + "light-account-checks", + "light-compressed-account", + "light-hasher", + "light-heap", + "light-macros", + "light-profiler", + "light-zero-copy", + "pinocchio", + "pinocchio-pubkey", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "solana-sysvar", + "thiserror 2.0.16", "zerocopy", ] [[package]] name = "light-concurrent-merkle-tree" -version = "3.0.0" +version = "2.1.0" dependencies = [ "ark-bn254 0.5.0", "ark-ff 0.5.0", @@ -3535,14 +3561,47 @@ dependencies = [ "num-traits", "pinocchio", "rand 0.8.5", - "solana-program-error 2.2.2", - "thiserror 2.0.17", + "solana-program-error", + "thiserror 2.0.16", "tokio", ] +[[package]] +name = "light-ctoken-types" +version = "0.1.0" +dependencies = [ + "aligned-sized", + "anchor-lang", + "arrayvec", + "borsh 0.10.4", + "bytemuck", + "light-account-checks", + "light-compressed-account", + "light-compressible", + "light-hasher", + "light-heap", + "light-macros", + "light-profiler", + "light-zero-copy", + "num-bigint 0.4.6", + "pinocchio", + "pinocchio-pubkey", + "rand 0.8.5", + "solana-account-info", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "solana-sysvar", + "spl-pod", + "spl-token-2022 7.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "spl-token-metadata-interface", + "thiserror 2.0.16", + "zerocopy", +] + [[package]] name = "light-hash-set" -version = "3.0.0" +version = "2.1.0" dependencies = [ "ark-bn254 0.5.0", "ark-ff 0.5.0", @@ -3550,13 +3609,13 @@ dependencies = [ "num-bigint 0.4.6", "num-traits", "rand 0.8.5", - "solana-program-error 2.2.2", - "thiserror 2.0.17", + "solana-program-error", + "thiserror 2.0.16", ] [[package]] name = "light-hasher" -version = "4.0.0" +version = "3.1.0" dependencies = [ "ark-bn254 0.5.0", "ark-ff 0.5.0", @@ -3569,9 +3628,9 @@ dependencies = [ "sha2 0.10.9", "sha3", "solana-nostd-keccak", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "thiserror 2.0.17", + "solana-program-error", + "solana-pubkey", + "thiserror 2.0.16", "zerocopy", ] @@ -3584,18 +3643,18 @@ dependencies = [ [[package]] name = "light-indexed-array" -version = "0.2.0" +version = "0.1.0" dependencies = [ "light-hasher", "num-bigint 0.4.6", "num-traits", "rand 0.8.5", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "light-indexed-merkle-tree" -version = "3.0.0" +version = "2.1.0" dependencies = [ "light-bounded-vec", "light-concurrent-merkle-tree", @@ -3606,8 +3665,8 @@ dependencies = [ "num-traits", "pinocchio", "rand 0.8.5", - "solana-program-error 2.2.2", - "thiserror 2.0.17", + "solana-program-error", + "thiserror 2.0.16", ] [[package]] @@ -3622,30 +3681,30 @@ dependencies = [ [[package]] name = "light-merkle-tree-metadata" -version = "0.5.0" +version = "0.3.0" dependencies = [ "anchor-lang", "borsh 0.10.4", "bytemuck", "light-compressed-account", "pinocchio", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", + "solana-msg", + "solana-program-error", "solana-sysvar", - "thiserror 2.0.17", + "thiserror 2.0.16", "zerocopy", ] [[package]] name = "light-merkle-tree-reference" -version = "3.0.1" +version = "2.0.0" dependencies = [ "light-hasher", "light-indexed-array", "num-bigint 0.4.6", "num-traits", "rand 0.8.5", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] @@ -3673,33 +3732,22 @@ dependencies = [ ] [[package]] -name = "light-profiler-macro" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a8be18fe4de58a6f754caa74a3fbc6d8a758a26f1f3c24d5b0f5b55df5f5408" +name = "light-profiler" +version = "0.1.0" dependencies = [ "proc-macro2", "quote", "syn 2.0.106", -] - -[[package]] -name = "light-program-profiler" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1d345871581aebd8825868a3f08410290aa1cdddcb189ca7f7e588f61d79fcf" -dependencies = [ - "light-profiler-macro", + "tokio", ] [[package]] name = "light-program-test" -version = "0.15.0" +version = "0.13.2" dependencies = [ "account-compression", "anchor-lang", "async-trait", - "base64 0.22.1", "borsh 0.10.4", "bs58", "bytemuck", @@ -3708,7 +3756,10 @@ dependencies = [ "light-client", "light-compressed-account", "light-compressed-token", + "light-compressed-token-sdk", + "light-compressible", "light-concurrent-merkle-tree", + "light-ctoken-types", "light-hasher", "light-indexed-array", "light-indexed-merkle-tree", @@ -3718,6 +3769,7 @@ dependencies = [ "light-registry", "light-sdk", "light-sdk-types", + "light-zero-copy", "litesvm", "log", "num-bigint 0.4.6", @@ -3731,7 +3783,7 @@ dependencies = [ "solana-banks-client", "solana-compute-budget", "solana-instruction", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-rpc-client-api", "solana-sdk", "solana-transaction", @@ -3743,7 +3795,7 @@ dependencies = [ [[package]] name = "light-prover-client" -version = "3.0.0" +version = "2.0.0" dependencies = [ "ark-bn254 0.5.0", "ark-serialize 0.5.0", @@ -3761,7 +3813,7 @@ dependencies = [ "serde_json", "serial_test", "solana-bn254", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -3774,6 +3826,8 @@ dependencies = [ "aligned-sized", "anchor-lang", "light-batched-merkle-tree", + "light-compressed-token-sdk", + "light-compressible", "light-merkle-tree-metadata", "light-system-program-anchor", "solana-sdk", @@ -3782,7 +3836,7 @@ dependencies = [ [[package]] name = "light-sdk" -version = "0.15.0" +version = "0.13.0" dependencies = [ "anchor-lang", "borsh 0.10.4", @@ -3797,18 +3851,17 @@ dependencies = [ "solana-account-info", "solana-cpi", "solana-instruction", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "thiserror 2.0.17", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "thiserror 2.0.16", ] [[package]] name = "light-sdk-macros" -version = "0.15.0" +version = "0.13.0" dependencies = [ "borsh 0.10.4", - "light-account-checks", "light-compressed-account", "light-hasher", "light-macros", @@ -3817,7 +3870,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "solana-pubkey 2.4.0", + "solana-pubkey", "syn 2.0.106", ] @@ -3834,14 +3887,13 @@ dependencies = [ "light-sdk-types", "light-zero-copy", "pinocchio", - "solana-msg 2.2.1", - "solana-pubkey 2.4.0", - "thiserror 2.0.17", + "solana-pubkey", + "thiserror 2.0.16", ] [[package]] name = "light-sdk-types" -version = "0.15.0" +version = "0.13.0" dependencies = [ "anchor-lang", "borsh 0.10.4", @@ -3850,14 +3902,14 @@ dependencies = [ "light-hasher", "light-macros", "light-zero-copy", - "solana-msg 2.2.1", - "solana-pubkey 2.4.0", - "thiserror 2.0.17", + "solana-msg", + "solana-pubkey", + "thiserror 2.0.16", ] [[package]] name = "light-sparse-merkle-tree" -version = "0.2.0" +version = "0.1.0" dependencies = [ "light-hasher", "light-indexed-array", @@ -3865,7 +3917,7 @@ dependencies = [ "num-bigint 0.4.6", "num-traits", "rand 0.8.5", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] @@ -3896,17 +3948,17 @@ dependencies = [ "light-indexed-merkle-tree", "light-macros", "light-merkle-tree-metadata", - "light-program-profiler", + "light-profiler", "light-verifier", "light-zero-copy", "pinocchio", "pinocchio-pubkey", "pinocchio-system", "rand 0.8.5", - "solana-msg 2.2.1", - "solana-pubkey 2.4.0", + "solana-msg", + "solana-pubkey", "solana-security-txt", - "thiserror 2.0.17", + "thiserror 2.0.16", "zerocopy", ] @@ -3925,7 +3977,10 @@ dependencies = [ "light-client", "light-compressed-account", "light-compressed-token", + "light-compressed-token-sdk", + "light-compressible", "light-concurrent-merkle-tree", + "light-ctoken-types", "light-hasher", "light-indexed-array", "light-indexed-merkle-tree", @@ -3937,6 +3992,7 @@ dependencies = [ "light-sdk", "light-sparse-merkle-tree", "light-system-program-anchor", + "light-token-client", "light-zero-copy", "log", "num-bigint 0.4.6", @@ -3945,45 +4001,71 @@ dependencies = [ "reqwest 0.12.23", "solana-banks-client", "solana-sdk", - "spl-token 7.0.0", - "spl-token-2022 7.0.0", - "thiserror 2.0.17", + "spl-token", + "spl-token-2022 7.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 2.0.16", ] [[package]] -name = "light-verifier" -version = "4.0.0" +name = "light-token-client" +version = "0.1.0" dependencies = [ - "groth16-solana", + "borsh 0.10.4", + "light-client", + "light-compressed-account", + "light-compressed-token-sdk", + "light-compressed-token-types", + "light-ctoken-types", + "light-sdk", + "light-zero-copy", + "solana-instruction", + "solana-keypair", + "solana-msg", + "solana-pubkey", + "solana-signature", + "solana-signer", + "spl-pod", + "spl-token-2022 7.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "light-verifier" +version = "2.1.0" +dependencies = [ + "groth16-solana", "light-compressed-account", "pinocchio", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "thiserror 2.0.17", + "solana-msg", + "solana-program-error", + "thiserror 2.0.16", ] [[package]] name = "light-zero-copy" -version = "0.4.0" +version = "0.2.0" dependencies = [ + "arrayvec", "borsh 0.10.4", "light-zero-copy-derive", "pinocchio", "rand 0.8.5", - "solana-program-error 2.2.2", - "trybuild", + "solana-program-error", "zerocopy", ] [[package]] name = "light-zero-copy-derive" -version = "0.4.0" +version = "0.1.0" dependencies = [ + "borsh 0.10.4", "lazy_static", + "light-zero-copy", "proc-macro2", "quote", "rand 0.8.5", "syn 2.0.106", + "trybuild", + "zerocopy", ] [[package]] @@ -4000,16 +4082,12 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "litesvm" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23bca37ac374948b348e29c74b324dc36f18bbbd1ccf80e2046d967521cbd143" +version = "0.6.1" +source = "git+https://github.com/Lightprotocol/litesvm?rev=d4f7ffb0025b73cb75ef2f198121a4e51b725b5d#d4f7ffb0025b73cb75ef2f198121a4e51b725b5d" dependencies = [ - "agave-feature-set", - "agave-precompiles", - "agave-reserved-account-keys", "ansi_term", "bincode", - "indexmap 2.11.4", + "indexmap 2.11.1", "itertools 0.14.0", "log", "solana-account", @@ -4019,11 +4097,13 @@ dependencies = [ "solana-clock", "solana-compute-budget", "solana-compute-budget-instruction", + "solana-config-program", "solana-epoch-rewards", "solana-epoch-schedule", + "solana-feature-set", "solana-fee", "solana-fee-structure", - "solana-hash 2.3.0", + "solana-hash", "solana-instruction", "solana-instructions-sysvar", "solana-keypair", @@ -4031,25 +4111,26 @@ dependencies = [ "solana-loader-v3-interface", "solana-loader-v4-interface", "solana-log-collector", + "solana-measure", "solana-message", - "solana-native-token 3.0.0", + "solana-native-token", "solana-nonce", "solana-nonce-account", - "solana-precompile-error", - "solana-program-error 2.2.2", + "solana-precompiles", + "solana-program-error", "solana-program-runtime", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-rent", + "solana-reserved-account-keys", "solana-sdk-ids", - "solana-sha256-hasher 2.3.0", + "solana-sha256-hasher", "solana-signature", "solana-signer", "solana-slot-hashes", "solana-slot-history", "solana-stake-interface", - "solana-svm-callback", "solana-svm-transaction", - "solana-system-interface 1.0.0", + "solana-system-interface", "solana-system-program", "solana-sysvar", "solana-sysvar-id", @@ -4058,15 +4139,16 @@ dependencies = [ "solana-transaction-context", "solana-transaction-error", "solana-vote-program", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "lock_api" -version = "0.4.14" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ + "autocfg", "scopeguard", ] @@ -4093,9 +4175,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.6" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memmap2" @@ -4156,7 +4238,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", - "simd-adler32", ] [[package]] @@ -4207,9 +4288,9 @@ dependencies = [ [[package]] name = "nix" -version = "0.30.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ "bitflags 2.9.4", "cfg-if", @@ -4380,7 +4461,7 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" dependencies = [ - "proc-macro-crate 3.4.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", "syn 2.0.106", @@ -4394,9 +4475,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.37.3" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -4460,15 +4541,6 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" -[[package]] -name = "openssl-src" -version = "300.5.3+3.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6bad8cd0233b63971e232cc9c5e83039375b8586d2312f31fda85db8f888c2" -dependencies = [ - "cc", -] - [[package]] name = "openssl-sys" version = "0.9.109" @@ -4477,7 +4549,6 @@ checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" dependencies = [ "cc", "libc", - "openssl-src", "pkg-config", "vcpkg", ] @@ -4515,7 +4586,7 @@ checksum = "6978128c8b51d8f4080631ceb2302ab51e32cc6e8615f735ee2f83fd269ae3f1" dependencies = [ "bytecount", "fnv", - "unicode-width 0.2.2", + "unicode-width 0.2.1", ] [[package]] @@ -4526,9 +4597,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.5" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -4536,15 +4607,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.12" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-link 0.2.1", + "windows-targets 0.52.6", ] [[package]] @@ -4597,7 +4668,7 @@ dependencies = [ [[package]] name = "photon-api" -version = "0.52.0" +version = "0.51.0" dependencies = [ "reqwest 0.12.23", "serde", @@ -4751,11 +4822,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "toml_edit 0.23.6", + "toml_edit", ] [[package]] @@ -4857,9 +4928,9 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", - "rustls 0.23.32", + "rustls 0.23.31", "socket2 0.6.0", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tracing", "web-time", @@ -4878,11 +4949,11 @@ dependencies = [ "rand 0.9.2", "ring", "rustc-hash 2.1.1", - "rustls 0.23.32", + "rustls 0.23.31", "rustls-pki-types", "rustls-platform-verifier", "slab", - "thiserror 2.0.17", + "thiserror 2.0.16", "tinyvec", "tracing", "web-time", @@ -4904,9 +4975,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.41" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -5054,9 +5125,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.18" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ "bitflags 2.9.4", ] @@ -5080,23 +5151,23 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "ref-cast" -version = "1.0.25" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.25" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote", @@ -5105,9 +5176,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.3" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", @@ -5117,9 +5188,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.11" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", @@ -5159,6 +5230,7 @@ version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ + "async-compression", "base64 0.21.7", "bytes", "encoding_rs", @@ -5174,6 +5246,7 @@ dependencies = [ "js-sys", "log", "mime", + "mime_guess", "native-tls", "once_cell", "percent-encoding", @@ -5188,6 +5261,7 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-rustls 0.24.1", + "tokio-util 0.7.16", "tower-service", "url", "wasm-bindgen", @@ -5203,7 +5277,6 @@ version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" dependencies = [ - "async-compression", "base64 0.22.1", "bytes", "encoding_rs", @@ -5226,7 +5299,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.32", + "rustls 0.23.31", "rustls-pki-types", "serde", "serde_json", @@ -5234,8 +5307,7 @@ dependencies = [ "sync_wrapper 1.0.2", "tokio", "tokio-native-tls", - "tokio-rustls 0.26.4", - "tokio-util 0.7.16", + "tokio-rustls 0.26.2", "tower", "tower-http", "tower-service", @@ -5248,17 +5320,17 @@ dependencies = [ [[package]] name = "reqwest-middleware" -version = "0.4.2" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57f17d28a6e6acfe1733fe24bcd30774d13bffa4b8a22535b4c8c98423088d4e" +checksum = "5a735987236a8e238bf0296c7e351b999c188ccc11477f311b82b55c93984216" dependencies = [ "anyhow", "async-trait", - "http 1.3.1", - "reqwest 0.12.23", + "http 0.2.12", + "reqwest 0.11.27", "serde", + "task-local-extensions", "thiserror 1.0.69", - "tower-service", ] [[package]] @@ -5342,7 +5414,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.61.0", ] [[package]] @@ -5359,14 +5431,14 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.32" +version = "0.23.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.7", + "rustls-webpki 0.103.6", "subtle", "zeroize", ] @@ -5380,7 +5452,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.5.1", + "security-framework 3.4.0", ] [[package]] @@ -5413,11 +5485,11 @@ dependencies = [ "jni", "log", "once_cell", - "rustls 0.23.32", + "rustls 0.23.31", "rustls-native-certs", "rustls-platform-verifier-android", - "rustls-webpki 0.103.7", - "security-framework 3.5.1", + "rustls-webpki 0.103.6", + "security-framework 3.4.0", "security-framework-sys", "webpki-root-certs", "windows-sys 0.59.0", @@ -5441,9 +5513,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.7" +version = "0.103.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" +checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" dependencies = [ "ring", "rustls-pki-types", @@ -5486,7 +5558,7 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.61.0", ] [[package]] @@ -5554,7 +5626,6 @@ dependencies = [ "light-sdk", "light-sdk-types", "light-test-utils", - "serial_test", "solana-sdk", "tokio", ] @@ -5577,24 +5648,7 @@ dependencies = [ ] [[package]] -name = "sdk-pinocchio-v1-test" -version = "1.0.0" -dependencies = [ - "borsh 0.10.4", - "light-compressed-account", - "light-hasher", - "light-macros", - "light-program-test", - "light-sdk", - "light-sdk-pinocchio", - "light-sdk-types", - "pinocchio", - "solana-sdk", - "tokio", -] - -[[package]] -name = "sdk-pinocchio-v2-test" +name = "sdk-pinocchio-test" version = "1.0.0" dependencies = [ "borsh 0.10.4", @@ -5611,18 +5665,27 @@ dependencies = [ ] [[package]] -name = "sdk-v1-native-test" +name = "sdk-token-test" version = "1.0.0" dependencies = [ - "borsh 0.10.4", + "anchor-lang", + "anchor-spl", + "arrayvec", + "light-batched-merkle-tree", + "light-client", "light-compressed-account", + "light-compressed-token-sdk", + "light-compressible", + "light-ctoken-types", "light-hasher", - "light-macros", + "light-profiler", "light-program-test", "light-sdk", "light-sdk-types", + "light-test-utils", + "light-token-client", "light-zero-copy", - "solana-program", + "serial_test", "solana-sdk", "tokio", ] @@ -5642,9 +5705,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.5.1" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +checksum = "60b369d18893388b345804dc0007963c99b7d665ae71d275812d828c6f089640" dependencies = [ "bitflags 2.9.4", "core-foundation 0.10.1", @@ -5671,9 +5734,9 @@ checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.228" +version = "1.0.223" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "a505d71960adde88e293da5cb5eda57093379f64e61cf77bf0e6a63af07a7bac" dependencies = [ "serde_core", "serde_derive", @@ -5700,18 +5763,18 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.223" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "20f57cbd357666aa7b3ac84a90b4ea328f1d4ddb6772b430caa5d9e1309bb9e9" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.223" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "3d428d07faf17e306e699ec1e91996e5a165ba5d6bce5b5155173e91a8a01a56" dependencies = [ "proc-macro2", "quote", @@ -5742,9 +5805,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5417783452c2be558477e104686f7de5dae53dba813c28435e0e70f82d9b04ee" +checksum = "2789234a13a53fc4be1b51ea1bab45a3c338bdb884862a257d10e5a74ae009e6" dependencies = [ "serde_core", ] @@ -5763,18 +5826,19 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.15.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093cd8c01b25262b84927e0f7151692158fab02d961e04c979d3903eba7ecc5" +checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.11.4", + "indexmap 2.11.1", "schemars 0.9.0", "schemars 1.0.4", - "serde_core", + "serde", + "serde_derive", "serde_json", "serde_with_macros", "time", @@ -5782,9 +5846,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.15.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e6c180db0816026a61afa1cff5344fb7ebded7e4d3062772179f2501481c27" +checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" dependencies = [ "darling", "proc-macro2", @@ -5798,7 +5862,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.11.1", "itoa", "ryu", "serde", @@ -5927,12 +5991,6 @@ version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - [[package]] name = "siphasher" version = "0.3.11" @@ -5990,59 +6048,55 @@ dependencies = [ "solana-account-info", "solana-clock", "solana-instruction", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sdk-ids", "solana-sysvar", ] [[package]] name = "solana-account-decoder" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26815fb228611d6f75908a979bc148127d4c391aecda0ea58144981320250535" +checksum = "e3a8e4aacc7c681419ae63c1de36349d2156d5a4f4ffaea8e507335013e57189" dependencies = [ "Inflector", "base64 0.22.1", "bincode", "bs58", "bv", + "lazy_static", "serde", "serde_derive", "serde_json", "solana-account", "solana-account-decoder-client-types", - "solana-address-lookup-table-interface", "solana-clock", - "solana-config-program-client", + "solana-config-program", "solana-epoch-schedule", "solana-fee-calculator", "solana-instruction", - "solana-loader-v3-interface", "solana-nonce", - "solana-program-option", + "solana-program", "solana-program-pack", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-rent", "solana-sdk-ids", "solana-slot-hashes", "solana-slot-history", - "solana-stake-interface", "solana-sysvar", - "solana-vote-interface", - "spl-generic-token", - "spl-token 8.0.0", - "spl-token-2022 8.0.1", - "spl-token-group-interface 0.6.0", - "spl-token-metadata-interface 0.7.0", - "thiserror 2.0.17", + "spl-token", + "spl-token-2022 7.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "spl-token-group-interface", + "spl-token-metadata-interface", + "thiserror 2.0.16", "zstd", ] [[package]] name = "solana-account-decoder-client-types" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aba51728bba2d7cdb86c92c0e5d3c33e9c98f11defe16d1042861ac732fc99bb" +checksum = "6329c4f360f5173dd6f65022708486cdd24d302841058e2310945a2502284105" dependencies = [ "base64 0.22.1", "bs58", @@ -6050,7 +6104,7 @@ dependencies = [ "serde_derive", "serde_json", "solana-account", - "solana-pubkey 2.4.0", + "solana-pubkey", "zstd", ] @@ -6062,24 +6116,9 @@ checksum = "c8f5152a288ef1912300fc6efa6c2d1f9bb55d9398eb6c72326360b8063987da" dependencies = [ "bincode", "serde", - "solana-program-error 2.2.2", + "solana-program-error", "solana-program-memory", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "solana-address" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a7a457086457ea9db9a5199d719dc8734dc2d0342fad0d8f77633c31eb62f19" -dependencies = [ - "five8", - "five8_const", - "solana-atomic-u64 3.0.0", - "solana-define-syscall 3.0.0", - "solana-program-error 3.0.0", - "solana-sanitize 3.0.1", - "solana-sha256-hasher 3.0.0", + "solana-pubkey", ] [[package]] @@ -6094,75 +6133,71 @@ dependencies = [ "serde_derive", "solana-clock", "solana-instruction", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sdk-ids", "solana-slot-hashes", ] [[package]] -name = "solana-atomic-u64" -version = "2.2.1" +name = "solana-address-lookup-table-program" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52e52720efe60465b052b9e7445a01c17550666beec855cce66f44766697bc2" +checksum = "b87ae97f2d1b91a9790c1e35dba3f90a4d595d105097ad93fa685cbc034ad0f1" dependencies = [ - "parking_lot", + "bincode", + "bytemuck", + "log", + "num-derive", + "num-traits", + "solana-address-lookup-table-interface", + "solana-bincode", + "solana-clock", + "solana-feature-set", + "solana-instruction", + "solana-log-collector", + "solana-packet", + "solana-program-runtime", + "solana-pubkey", + "solana-system-interface", + "solana-transaction-context", + "thiserror 2.0.16", ] [[package]] name = "solana-atomic-u64" -version = "3.0.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a933ff1e50aff72d02173cfcd7511bd8540b027ee720b75f353f594f834216d0" +checksum = "d52e52720efe60465b052b9e7445a01c17550666beec855cce66f44766697bc2" dependencies = [ "parking_lot", ] [[package]] name = "solana-banks-client" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbc80b5030ab5ddd039f08e6122cfc1490a16af5d14a358bbc450c9768a5fb24" +checksum = "71e8b93a73f583fb03c9a43be9185c2e04c8a5df84e3c20fd813f0ff79a12142" dependencies = [ "borsh 1.5.7", "futures", - "solana-account", "solana-banks-interface", - "solana-clock", - "solana-commitment-config", - "solana-hash 2.3.0", - "solana-message", - "solana-program-pack", - "solana-pubkey 2.4.0", - "solana-rent", - "solana-signature", - "solana-sysvar", - "solana-transaction", - "solana-transaction-context", - "solana-transaction-error", + "solana-program", + "solana-sdk", "tarpc", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-serde", ] [[package]] name = "solana-banks-interface" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55363dbae12bc86c5975bf75f317a56d3cff570925b637857785a6e464c05fa" +checksum = "e54bdc2f951d900289a3de58f8fc835fcea67fdaaea390b447e16a8a403a2399" dependencies = [ "serde", "serde_derive", - "solana-account", - "solana-clock", - "solana-commitment-config", - "solana-hash 2.3.0", - "solana-message", - "solana-pubkey 2.4.0", - "solana-signature", - "solana-transaction", - "solana-transaction-context", - "solana-transaction-error", + "solana-sdk", "tarpc", ] @@ -6174,7 +6209,7 @@ checksum = "75db7f2bbac3e62cfd139065d15bcda9e2428883ba61fc8d27ccb251081e7567" dependencies = [ "num-bigint 0.4.6", "num-traits", - "solana-define-syscall 2.3.0", + "solana-define-syscall 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -6195,9 +6230,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a0801e25a1b31a14494fc80882a036be0ffd290efc4c2d640bfcca120a4672" dependencies = [ "blake3", - "solana-define-syscall 2.3.0", - "solana-hash 2.3.0", - "solana-sanitize 2.2.1", + "solana-define-syscall 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-hash", + "solana-sanitize", ] [[package]] @@ -6211,8 +6246,8 @@ dependencies = [ "ark-ff 0.4.2", "ark-serialize 0.4.2", "bytemuck", - "solana-define-syscall 2.3.0", - "thiserror 2.0.17", + "solana-define-syscall 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 2.0.16", ] [[package]] @@ -6227,12 +6262,11 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "2.3.12" -source = "git+https://github.com/Lightprotocol/agave?rev=be34dc76559e14921a2c8610f2fa2402bf0684bb#be34dc76559e14921a2c8610f2fa2402bf0684bb" +version = "2.2.4" +source = "git+https://github.com/Lightprotocol/agave?rev=580e29f03e4176a4a5525abc188a948c6595c47f#580e29f03e4176a4a5525abc188a948c6595c47f" dependencies = [ "bincode", "libsecp256k1", - "num-traits", "qualifier_attr", "scopeguard", "solana-account", @@ -6242,9 +6276,11 @@ dependencies = [ "solana-blake3-hasher", "solana-bn254", "solana-clock", + "solana-compute-budget", "solana-cpi", "solana-curve25519", - "solana-hash 2.3.0", + "solana-feature-set", + "solana-hash", "solana-instruction", "solana-keccak-hasher", "solana-loader-v3-interface", @@ -6253,37 +6289,39 @@ dependencies = [ "solana-measure", "solana-packet", "solana-poseidon", + "solana-precompiles", "solana-program-entrypoint", + "solana-program-memory", "solana-program-runtime", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sbpf", "solana-sdk-ids", "solana-secp256k1-recover", - "solana-sha256-hasher 2.3.0", + "solana-sha256-hasher", "solana-stable-layout", - "solana-svm-feature-set", - "solana-system-interface 1.0.0", + "solana-system-interface", "solana-sysvar", "solana-sysvar-id", "solana-timings", "solana-transaction-context", "solana-type-overrides", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "solana-builtins" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba8eeb2e5a0f05893ea913b69c1e9e005c4cae7c757314b0a19a2d0581b49f10" +checksum = "b9240641f944ece59e097c9981bdc33b2f519cbd91b9764ff5f62c307d986a3d" dependencies = [ - "agave-feature-set", + "solana-address-lookup-table-program", "solana-bpf-loader-program", "solana-compute-budget-program", - "solana-hash 2.3.0", + "solana-config-program", + "solana-feature-set", "solana-loader-v4-program", "solana-program-runtime", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sdk-ids", "solana-stake-program", "solana-system-program", @@ -6294,17 +6332,21 @@ dependencies = [ [[package]] name = "solana-builtins-default-costs" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "423fb2fe743e5be484e8a3b0be698313d3830733c9b84c3587682179ea745450" +checksum = "1fb6728141dc45bdde9d68b67bb914013be28f94a2aea8bb7131ea8c6161c30e" dependencies = [ - "agave-feature-set", "ahash", + "lazy_static", "log", + "qualifier_attr", + "solana-address-lookup-table-program", "solana-bpf-loader-program", "solana-compute-budget-program", + "solana-config-program", + "solana-feature-set", "solana-loader-v4-program", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sdk-ids", "solana-stake-program", "solana-system-program", @@ -6313,9 +6355,9 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "041cc2e459cd3796f52e7e4fc23ff59153ee111e71b177081d8e032c5fb214cd" +checksum = "3c3c8414401ef96e9276e8c74238628a6faa531185ddc11f6a7bd644cdb8782e" dependencies = [ "chrono", "clap 2.34.0", @@ -6324,17 +6366,17 @@ dependencies = [ "solana-cluster-type", "solana-commitment-config", "solana-derivation-path", - "solana-hash 2.3.0", + "solana-hash", "solana-keypair", "solana-message", - "solana-native-token 2.3.0", + "solana-native-token", "solana-presigner", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-remote-wallet", "solana-seed-phrase", "solana-signature", "solana-signer", - "thiserror 2.0.17", + "thiserror 2.0.16", "tiny-bip39", "uriparse", "url", @@ -6342,11 +6384,12 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c238fe3a3b3016181cbbc6da9d337a10d5cd2e97d5bd2098b95f4f1e79536cf" +checksum = "6a13234fa9ea96d6cf1dad79dfd9d63f482f1ce0e8decb6f8d13a3686f5c8ec8" dependencies = [ "dirs-next", + "lazy_static", "serde", "serde_derive", "serde_yaml", @@ -6357,12 +6400,11 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0aebbc8b952e685e1cccce300b1e8b2a244cc708311e2d69ce752231161cad6" +checksum = "bc18bc6310155d40b29853c649c141c1b0658832eeccc7a171e977f6bde514ae" dependencies = [ "Inflector", - "agave-reserved-account-keys", "base64 0.22.1", "chrono", "clap 2.34.0", @@ -6380,16 +6422,17 @@ dependencies = [ "solana-cli-config", "solana-clock", "solana-epoch-info", - "solana-hash 2.3.0", + "solana-hash", "solana-message", - "solana-native-token 2.3.0", + "solana-native-token", "solana-packet", - "solana-pubkey 2.4.0", + "solana-program", + "solana-pubkey", + "solana-reserved-account-keys", "solana-rpc-client-api", "solana-sdk-ids", "solana-signature", - "solana-stake-interface", - "solana-system-interface 1.0.0", + "solana-system-interface", "solana-sysvar", "solana-transaction", "solana-transaction-error", @@ -6400,16 +6443,16 @@ dependencies = [ [[package]] name = "solana-client" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7488cc84ebf8bb809dd019d84f069a0b709666ae5b155230e9089bd59ce1d908" +checksum = "5e827416867d988cbba327b6e448ad0bfb85ba44f080c6a02a00aa498c2249c4" dependencies = [ "async-trait", "bincode", "dashmap 5.5.3", "futures", "futures-util", - "indexmap 2.11.4", + "indexmap 2.11.1", "indicatif", "log", "quinn", @@ -6419,12 +6462,12 @@ dependencies = [ "solana-commitment-config", "solana-connection-cache", "solana-epoch-info", - "solana-hash 2.3.0", + "solana-hash", "solana-instruction", "solana-keypair", "solana-measure", "solana-message", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-pubsub-client", "solana-quic-client", "solana-quic-definitions", @@ -6440,7 +6483,7 @@ dependencies = [ "solana-transaction", "solana-transaction-error", "solana-udp-client", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", ] @@ -6453,23 +6496,23 @@ dependencies = [ "solana-account", "solana-commitment-config", "solana-epoch-info", - "solana-hash 2.3.0", + "solana-hash", "solana-instruction", "solana-keypair", "solana-message", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-signature", "solana-signer", - "solana-system-interface 1.0.0", + "solana-system-interface", "solana-transaction", "solana-transaction-error", ] [[package]] name = "solana-clock" -version = "2.2.2" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bb482ab70fced82ad3d7d3d87be33d466a3498eb8aa856434ff3c0dfc2e2e31" +checksum = "67c2177a1b9fe8326004f1151a5acd124420b737811080b1035df31349e4d892" dependencies = [ "serde", "serde_derive", @@ -6486,7 +6529,7 @@ checksum = "7ace9fea2daa28354d107ea879cff107181d85cd4e0f78a2bedb10e1a428c97e" dependencies = [ "serde", "serde_derive", - "solana-hash 2.3.0", + "solana-hash", ] [[package]] @@ -6501,40 +6544,40 @@ dependencies = [ [[package]] name = "solana-compute-budget" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69b145d19103c186d49a4f98d63d5aff90dfefcf133c4d798578200f0b0dd3b3" +checksum = "46e593ce26764fa3366b6d125b9f2455f6cd8d557f86b4f3c7b7c517db6d8f5f" dependencies = [ "solana-fee-structure", - "solana-program-runtime", + "solana-program-entrypoint", ] [[package]] name = "solana-compute-budget-instruction" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16fc1045d32601a27176cd4d9a2bc6656fbddaa741d08934db7965b2a59b0ef6" +checksum = "240e28cf764d1468f2388fb0d10b70278a64d47277ff552379116ba45d609cd1" dependencies = [ - "agave-feature-set", "log", "solana-borsh", "solana-builtins-default-costs", "solana-compute-budget", "solana-compute-budget-interface", + "solana-feature-set", "solana-instruction", "solana-packet", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sdk-ids", "solana-svm-transaction", "solana-transaction-error", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "solana-compute-budget-interface" -version = "2.2.2" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8432d2c4c22d0499aa06d62e4f7e333f81777b3d7c96050ae9e5cb71a8c3aee4" +checksum = "3a5df17b195d312b66dccdde9beec6709766d8230cb4718c4c08854f780d0309" dependencies = [ "borsh 1.5.7", "serde", @@ -6545,46 +6588,59 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86c999e047aa7bd4cc022006978fda099aec621660c1cc26597545982b23381" +checksum = "bfc6b8ea70ed5123412655ed15e7e0e29f06a7d5b82eb2572bee608d7755afb7" dependencies = [ + "qualifier_attr", "solana-program-runtime", ] [[package]] -name = "solana-config-program-client" -version = "0.0.2" +name = "solana-config-program" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53aceac36f105fd4922e29b4f0c1f785b69d7b3e7e387e384b8985c8e0c3595e" +checksum = "2417094a8c5c2d60812a5bd6f0bd31bdefc49479826c10347a85d217e088c964" dependencies = [ "bincode", - "borsh 0.10.4", - "kaigan", + "chrono", "serde", - "solana-program", + "serde_derive", + "solana-account", + "solana-bincode", + "solana-instruction", + "solana-log-collector", + "solana-packet", + "solana-program-runtime", + "solana-pubkey", + "solana-sdk-ids", + "solana-short-vec", + "solana-stake-interface", + "solana-system-interface", + "solana-transaction-context", ] [[package]] name = "solana-connection-cache" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "354714af37a6d26d93416a6b91d95f2a906e21a22d65033ac08cb40e18ef26a7" +checksum = "55ad0b507b4044e2690915c9aa69eacfd51b1fa55e4deeca662ee5cff7d7d1f4" dependencies = [ "async-trait", "bincode", "crossbeam-channel", "futures-util", - "indexmap 2.11.4", + "indexmap 2.11.1", "log", "rand 0.8.5", "rayon", "solana-keypair", "solana-measure", "solana-metrics", + "solana-net-utils", "solana-time-utils", "solana-transaction-error", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", ] @@ -6595,25 +6651,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8dc71126edddc2ba014622fc32d0f5e2e78ec6c5a1e0eb511b85618c09e9ea11" dependencies = [ "solana-account-info", - "solana-define-syscall 2.3.0", + "solana-define-syscall 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "solana-instruction", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-program-error", + "solana-pubkey", "solana-stable-layout", ] [[package]] name = "solana-curve25519" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa77936de1910002e7ad5817e38c3990402c2d8e92517cdd736df51485c76d88" +checksum = "9b3d15f1a893ced38529d44d7fe0d4348dc38c28fea13b6d6be5d13d438a441f" dependencies = [ "bytemuck", "bytemuck_derive", "curve25519-dalek 4.1.3", - "solana-define-syscall 2.3.0", + "solana-define-syscall 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "subtle", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] @@ -6628,19 +6684,13 @@ dependencies = [ [[package]] name = "solana-define-syscall" version = "2.2.1" -source = "git+https://github.com/anza-xyz/solana-sdk?rev=1c1d667f161666f12f5a43ebef8eda9470a8c6ee#1c1d667f161666f12f5a43ebef8eda9470a8c6ee" - -[[package]] -name = "solana-define-syscall" -version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ae3e2abcf541c8122eafe9a625d4d194b4023c20adde1e251f94e056bb1aee2" +checksum = "cf784bb2cb3e02cac9801813c30187344228d2ae952534902108f6150573a33d" [[package]] name = "solana-define-syscall" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9697086a4e102d28a156b8d6b521730335d6951bd39a5e766512bbe09007cee" +version = "2.2.1" +source = "git+https://github.com/anza-xyz/solana-sdk?rev=1c1d667f161666f12f5a43ebef8eda9470a8c6ee#1c1d667f161666f12f5a43ebef8eda9470a8c6ee" [[package]] name = "solana-derivation-path" @@ -6686,7 +6736,7 @@ checksum = "86b575d3dd323b9ea10bb6fe89bf6bf93e249b215ba8ed7f68f1a3633f384db7" dependencies = [ "serde", "serde_derive", - "solana-hash 2.3.0", + "solana-hash", "solana-sdk-ids", "solana-sdk-macro", "solana-sysvar-id", @@ -6699,8 +6749,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c5fd2662ae7574810904585fd443545ed2b568dbd304b25a31e79ccc76e81b" dependencies = [ "siphasher 0.3.11", - "solana-hash 2.3.0", - "solana-pubkey 2.4.0", + "solana-hash", + "solana-pubkey", ] [[package]] @@ -6726,22 +6776,22 @@ dependencies = [ "serde_derive", "solana-address-lookup-table-interface", "solana-clock", - "solana-hash 2.3.0", + "solana-hash", "solana-instruction", "solana-keccak-hasher", "solana-message", "solana-nonce", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sdk-ids", - "solana-system-interface 1.0.0", - "thiserror 2.0.17", + "solana-system-interface", + "thiserror 2.0.16", ] [[package]] name = "solana-feature-gate-interface" -version = "2.2.2" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f5c5382b449e8e4e3016fb05e418c53d57782d8b5c30aa372fc265654b956d" +checksum = "0f9c7fbf3e58b64a667c5f35e90af580538a95daea7001ff7806c0662d301bdf" dependencies = [ "bincode", "serde", @@ -6749,34 +6799,34 @@ dependencies = [ "solana-account", "solana-account-info", "solana-instruction", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-program-error", + "solana-pubkey", "solana-rent", "solana-sdk-ids", - "solana-system-interface 1.0.0", + "solana-system-interface", ] [[package]] name = "solana-feature-set" -version = "2.2.5" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93b93971e289d6425f88e6e3cb6668c4b05df78b3c518c249be55ced8efd6b6d" +checksum = "89e1d3b52b4a014efeaaab67f14e40af3972a4be61c523d612860db8e3145529" dependencies = [ "ahash", "lazy_static", "solana-epoch-schedule", - "solana-hash 2.3.0", - "solana-pubkey 2.4.0", - "solana-sha256-hasher 2.3.0", + "solana-hash", + "solana-pubkey", + "solana-sha256-hasher", ] [[package]] name = "solana-fee" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae6442836fd012fb35a9fec72f0c32487102a07012982110c9522149fbb4c22" +checksum = "8c14eaaa9d099e4510c9105522d97778cd66c3d401f0d68eebcf43179a1bf094" dependencies = [ - "agave-feature-set", + "solana-feature-set", "solana-fee-structure", "solana-svm-transaction", ] @@ -6794,21 +6844,21 @@ dependencies = [ [[package]] name = "solana-fee-structure" -version = "2.3.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33adf673581c38e810bf618f745bf31b683a0a4a4377682e6aaac5d9a058dd4e" +checksum = "f45f94a88efdb512805563181dfa1c85c60a21b6e6d602bf24a2ea88f9399d6e" dependencies = [ "serde", "serde_derive", "solana-message", - "solana-native-token 2.3.0", + "solana-native-token", ] [[package]] name = "solana-genesis-config" -version = "2.3.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3725085d47b96d37fef07a29d78d2787fc89a0b9004c66eed7753d1e554989f" +checksum = "968dabd2b92d57131473eddbd475339da530e14f54397386abf303de3a2595a2" dependencies = [ "bincode", "chrono", @@ -6820,15 +6870,16 @@ dependencies = [ "solana-cluster-type", "solana-epoch-schedule", "solana-fee-calculator", - "solana-hash 2.3.0", + "solana-hash", "solana-inflation", "solana-keypair", "solana-logger", + "solana-native-token", "solana-poh-config", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-rent", "solana-sdk-ids", - "solana-sha256-hasher 2.3.0", + "solana-sha256-hasher", "solana-shred-version", "solana-signer", "solana-time-utils", @@ -6846,33 +6897,22 @@ dependencies = [ [[package]] name = "solana-hash" -version = "2.3.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b96e9f0300fa287b545613f007dfe20043d7812bee255f418c1eb649c93b63" +checksum = "cf7bcb14392900fe02e4e34e90234fbf0c673d4e327888410ba99fa2ba0f4e99" dependencies = [ "borsh 1.5.7", + "bs58", "bytemuck", "bytemuck_derive", - "five8", "js-sys", "serde", "serde_derive", - "solana-atomic-u64 2.2.1", - "solana-sanitize 2.2.1", + "solana-atomic-u64", + "solana-sanitize", "wasm-bindgen", ] -[[package]] -name = "solana-hash" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a063723b9e84c14d8c0d2cdf0268207dc7adecf546e31251f9e07c7b00b566c" -dependencies = [ - "five8", - "solana-atomic-u64 3.0.0", - "solana-sanitize 3.0.1", -] - [[package]] name = "solana-inflation" version = "2.2.1" @@ -6883,11 +6923,21 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "solana-inline-spl" +version = "2.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed78e6709851bb3fa8a0acb1ee40fbffa888049d042ca132d6ccb8e0b313ac72" +dependencies = [ + "bytemuck", + "solana-pubkey", +] + [[package]] name = "solana-instruction" -version = "2.3.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47298e2ce82876b64f71e9d13a46bc4b9056194e7f9937ad3084385befa50885" +checksum = "9ce496a475e5062ba5de97215ab39d9c358f9c9df4bb7f3a45a1f1a8bd9065ed" dependencies = [ "bincode", "borsh 1.5.7", @@ -6896,8 +6946,8 @@ dependencies = [ "num-traits", "serde", "serde_derive", - "solana-define-syscall 2.3.0", - "solana-pubkey 2.4.0", + "solana-define-syscall 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-pubkey", "wasm-bindgen", ] @@ -6910,9 +6960,9 @@ dependencies = [ "bitflags 2.9.4", "solana-account-info", "solana-instruction", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-sanitize 2.2.1", + "solana-program-error", + "solana-pubkey", + "solana-sanitize", "solana-sdk-ids", "solana-serialize-utils", "solana-sysvar-id", @@ -6925,23 +6975,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7aeb957fbd42a451b99235df4942d96db7ef678e8d5061ef34c9b34cae12f79" dependencies = [ "sha3", - "solana-define-syscall 2.3.0", - "solana-hash 2.3.0", - "solana-sanitize 2.2.1", + "solana-define-syscall 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-hash", + "solana-sanitize", ] [[package]] name = "solana-keypair" -version = "2.2.3" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd3f04aa1a05c535e93e121a95f66e7dcccf57e007282e8255535d24bf1e98bb" +checksum = "3dbb7042c2e0c561afa07242b2099d55c57bd1b1da3b6476932197d84e15e3e4" dependencies = [ + "bs58", "ed25519-dalek", "ed25519-dalek-bip32", - "five8", "rand 0.7.3", "solana-derivation-path", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-seed-derivable", "solana-seed-phrase", "solana-signature", @@ -6972,23 +7022,23 @@ dependencies = [ "serde_bytes", "serde_derive", "solana-instruction", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sdk-ids", ] [[package]] name = "solana-loader-v3-interface" -version = "5.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f7162a05b8b0773156b443bccd674ea78bb9aa406325b467ea78c06c99a63a2" +checksum = "fa4be76cfa9afd84ca2f35ebc09f0da0f0092935ccdac0595d98447f259538c2" dependencies = [ "serde", "serde_bytes", "serde_derive", "solana-instruction", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sdk-ids", - "solana-system-interface 1.0.0", + "solana-system-interface", ] [[package]] @@ -7001,22 +7051,23 @@ dependencies = [ "serde_bytes", "serde_derive", "solana-instruction", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sdk-ids", - "solana-system-interface 1.0.0", + "solana-system-interface", ] [[package]] name = "solana-loader-v4-program" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc0b1ebb9c2b24423e0d265a5f858b150f669499a63362f44425ff37a0157bd" +checksum = "7b0298bf161e18b146230b15e8fa57bd170a05342ab9c1fd996b0241c0f016c2" dependencies = [ "log", "qualifier_attr", "solana-account", "solana-bincode", "solana-bpf-loader-program", + "solana-compute-budget", "solana-instruction", "solana-loader-v3-interface", "solana-loader-v4-interface", @@ -7024,7 +7075,7 @@ dependencies = [ "solana-measure", "solana-packet", "solana-program-runtime", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sbpf", "solana-sdk-ids", "solana-transaction-context", @@ -7033,9 +7084,9 @@ dependencies = [ [[package]] name = "solana-log-collector" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "621d265d37dbe119e28d481f6db3883294e75966b79293a6edaa8deeac2dfc3d" +checksum = "4d03bf4c676117575be755296e8f21233d74cd28dca227c42e97e86219a27193" dependencies = [ "log", ] @@ -7055,15 +7106,15 @@ dependencies = [ [[package]] name = "solana-measure" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98d3c9827ce044863fc67b7cbc15c341c27bf6fa9c1070deccd2a4aa7cb801d" +checksum = "0b17ee553110d2bfc454b8784840a4b75867e123d3816e13046989463fed2c6b" [[package]] name = "solana-message" -version = "2.4.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1796aabce376ff74bf89b78d268fa5e683d7d7a96a0a4e4813ec34de49d5314b" +checksum = "268486ba8a294ed22a4d7c1ec05f540c3dbe71cfa7c6c54b6d4d13668d895678" dependencies = [ "bincode", "blake3", @@ -7071,31 +7122,33 @@ dependencies = [ "serde", "serde_derive", "solana-bincode", - "solana-hash 2.3.0", + "solana-hash", "solana-instruction", - "solana-pubkey 2.4.0", - "solana-sanitize 2.2.1", + "solana-pubkey", + "solana-sanitize", "solana-sdk-ids", "solana-short-vec", - "solana-system-interface 1.0.0", + "solana-system-interface", "solana-transaction-error", "wasm-bindgen", ] [[package]] name = "solana-metrics" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062baa36c40a08f413b1f84c8b739649609883af47e1624a85eaf9f90075441e" +checksum = "98b79bd642efa8388791fef7a900bfeb48865669148d523fba041fa7e407312f" dependencies = [ "crossbeam-channel", "gethostname", + "lazy_static", "log", - "reqwest 0.12.23", + "reqwest 0.11.27", + "solana-clock", "solana-cluster-type", - "solana-sha256-hasher 2.3.0", + "solana-sha256-hasher", "solana-time-utils", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] @@ -7104,39 +7157,25 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36a1a14399afaabc2781a1db09cb14ee4cc4ee5c7a5a3cfcc601811379a8092" dependencies = [ - "solana-define-syscall 2.3.0", + "solana-define-syscall 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "solana-msg" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "264275c556ea7e22b9d3f87d56305546a38d4eee8ec884f3b126236cb7dcbbb4" -dependencies = [ - "solana-define-syscall 3.0.0", -] - -[[package]] -name = "solana-native-token" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61515b880c36974053dd499c0510066783f0cc6ac17def0c7ef2a244874cf4a9" - [[package]] name = "solana-native-token" -version = "3.0.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8dd4c280dca9d046139eb5b7a5ac9ad10403fbd64964c7d7571214950d758f" +checksum = "33e9de00960197412e4be3902a6cd35e60817c511137aca6c34c66cd5d4017ec" [[package]] name = "solana-net-utils" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32867badc4fc61a156bf11373740ce611c1c171c790eda221f3b82d0d0947e9b" +checksum = "ef9db57e121ca1577fb5578d916bed549632be0e54a2098e8325980ac724d283" dependencies = [ "anyhow", "bincode", "bytes", + "crossbeam-channel", "itertools 0.12.1", "log", "nix", @@ -7158,9 +7197,9 @@ dependencies = [ "serde", "serde_derive", "solana-fee-calculator", - "solana-hash 2.3.0", - "solana-pubkey 2.4.0", - "solana-sha256-hasher 2.3.0", + "solana-hash", + "solana-pubkey", + "solana-sha256-hasher", ] [[package]] @@ -7170,7 +7209,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cde971a20b8dbf60144d6a84439dda86b5466e00e2843091fe731083cda614da" dependencies = [ "solana-account", - "solana-hash 2.3.0", + "solana-hash", "solana-nonce", "solana-sdk-ids", ] @@ -7191,11 +7230,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b526398ade5dea37f1f147ce55dae49aa017a5d7326606359b0445ca8d946581" dependencies = [ "num_enum", - "solana-hash 2.3.0", + "solana-hash", "solana-packet", - "solana-pubkey 2.4.0", - "solana-sanitize 2.2.1", - "solana-sha256-hasher 2.3.0", + "solana-pubkey", + "solana-sanitize", + "solana-sha256-hasher", "solana-signature", "solana-signer", ] @@ -7216,29 +7255,29 @@ dependencies = [ [[package]] name = "solana-perf" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c7b6e57afcee6a5e2aaa0ec66d539148d6fc4c672927479ef1a2685d9976d8a" +checksum = "7b87939c18937f8bfad6028779a02fa123b27e986fb2c55fbbf683952a0e4932" dependencies = [ "ahash", "bincode", "bv", - "bytes", "caps", "curve25519-dalek 4.1.3", "dlopen2", "fnv", + "lazy_static", "libc", "log", "nix", "rand 0.8.5", "rayon", "serde", - "solana-hash 2.3.0", + "solana-hash", "solana-message", "solana-metrics", "solana-packet", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-rayon-threadlimit", "solana-sdk-ids", "solana-short-vec", @@ -7258,14 +7297,14 @@ dependencies = [ [[package]] name = "solana-poseidon" -version = "2.3.12" +version = "2.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0438136b52589ae8e6c3764edc186455b420693c3e83838d5ae40a3dba9c102" +checksum = "230110ef64d44bc5f261249e45dde64cc176598c5c05728a118b8979e0c865ff" dependencies = [ "ark-bn254 0.4.0", "light-poseidon 0.2.0", - "solana-define-syscall 2.3.0", - "thiserror 2.0.17", + "solana-define-syscall 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 2.0.16", ] [[package]] @@ -7289,7 +7328,7 @@ dependencies = [ "solana-feature-set", "solana-message", "solana-precompile-error", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sdk-ids", "solana-secp256k1-program", "solana-secp256r1-program", @@ -7301,16 +7340,16 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81a57a24e6a4125fc69510b6774cd93402b943191b6cddad05de7281491c90fe" dependencies = [ - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-signature", "solana-signer", ] [[package]] name = "solana-program" -version = "2.3.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98eca145bd3545e2fbb07166e895370576e47a00a7d824e325390d33bf467210" +checksum = "586469467e93ceb79048f8d8e3a619bf61d05396ee7de95cb40280301a589d05" dependencies = [ "bincode", "blake3", @@ -7333,7 +7372,7 @@ dependencies = [ "serde_derive", "solana-account-info", "solana-address-lookup-table-interface", - "solana-atomic-u64 2.2.1", + "solana-atomic-u64", "solana-big-mod-exp", "solana-bincode", "solana-blake3-hasher", @@ -7341,13 +7380,13 @@ dependencies = [ "solana-clock", "solana-cpi", "solana-decode-error", - "solana-define-syscall 2.3.0", + "solana-define-syscall 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "solana-epoch-rewards", "solana-epoch-schedule", "solana-example-mocks", "solana-feature-gate-interface", "solana-fee-calculator", - "solana-hash 2.3.0", + "solana-hash", "solana-instruction", "solana-instructions-sysvar", "solana-keccak-hasher", @@ -7356,46 +7395,46 @@ dependencies = [ "solana-loader-v3-interface", "solana-loader-v4-interface", "solana-message", - "solana-msg 2.2.1", - "solana-native-token 2.3.0", + "solana-msg", + "solana-native-token", "solana-nonce", "solana-program-entrypoint", - "solana-program-error 2.2.2", + "solana-program-error", "solana-program-memory", "solana-program-option", "solana-program-pack", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-rent", - "solana-sanitize 2.2.1", + "solana-sanitize", "solana-sdk-ids", "solana-sdk-macro", "solana-secp256k1-recover", "solana-serde-varint", "solana-serialize-utils", - "solana-sha256-hasher 2.3.0", + "solana-sha256-hasher", "solana-short-vec", "solana-slot-hashes", "solana-slot-history", "solana-stable-layout", "solana-stake-interface", - "solana-system-interface 1.0.0", + "solana-system-interface", "solana-sysvar", "solana-sysvar-id", "solana-vote-interface", - "thiserror 2.0.17", + "thiserror 2.0.16", "wasm-bindgen", ] [[package]] name = "solana-program-entrypoint" -version = "2.3.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ce041b1a0ed275290a5008ee1a4a6c48f5054c8a3d78d313c08958a06aedbd" +checksum = "473ffe73c68d93e9f2aa726ad2985fe52760052709aaab188100a42c618060ec" dependencies = [ "solana-account-info", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-msg", + "solana-program-error", + "solana-pubkey", ] [[package]] @@ -7410,23 +7449,17 @@ dependencies = [ "serde_derive", "solana-decode-error", "solana-instruction", - "solana-msg 2.2.1", - "solana-pubkey 2.4.0", + "solana-msg", + "solana-pubkey", ] -[[package]] -name = "solana-program-error" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1af32c995a7b692a915bb7414d5f8e838450cf7c70414e763d8abcae7b51f28" - [[package]] name = "solana-program-memory" version = "2.2.1" source = "git+https://github.com/anza-xyz/solana-sdk?rev=1c1d667f161666f12f5a43ebef8eda9470a8c6ee#1c1d667f161666f12f5a43ebef8eda9470a8c6ee" dependencies = [ "num-traits", - "solana-define-syscall 2.2.1", + "solana-define-syscall 2.2.1 (git+https://github.com/anza-xyz/solana-sdk?rev=1c1d667f161666f12f5a43ebef8eda9470a8c6ee)", ] [[package]] @@ -7441,13 +7474,13 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "319f0ef15e6e12dc37c597faccb7d62525a509fec5f6975ecb9419efddeb277b" dependencies = [ - "solana-program-error 2.2.2", + "solana-program-error", ] [[package]] name = "solana-program-runtime" -version = "2.3.12" -source = "git+https://github.com/Lightprotocol/agave?rev=be34dc76559e14921a2c8610f2fa2402bf0684bb#be34dc76559e14921a2c8610f2fa2402bf0684bb" +version = "2.2.4" +source = "git+https://github.com/Lightprotocol/agave?rev=580e29f03e4176a4a5525abc188a948c6595c47f#580e29f03e4176a4a5525abc188a948c6595c47f" dependencies = [ "base64 0.22.1", "bincode", @@ -7459,47 +7492,43 @@ dependencies = [ "serde", "solana-account", "solana-clock", + "solana-compute-budget", "solana-epoch-rewards", "solana-epoch-schedule", "solana-feature-set", - "solana-fee-structure", - "solana-hash 2.3.0", + "solana-hash", "solana-instruction", "solana-last-restart-slot", "solana-log-collector", "solana-measure", "solana-metrics", "solana-precompiles", - "solana-program-entrypoint", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-rent", "solana-sbpf", "solana-sdk-ids", "solana-slot-hashes", "solana-stable-layout", - "solana-svm-callback", - "solana-svm-feature-set", - "solana-system-interface 2.0.0", "solana-sysvar", "solana-sysvar-id", "solana-timings", "solana-transaction-context", "solana-type-overrides", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "solana-pubkey" -version = "2.4.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b62adb9c3261a052ca1f999398c388f1daf558a1b492f60a6d9e64857db4ff1" +checksum = "40db1ff5a0f8aea2c158d78ab5f2cf897848964251d1df42fef78efd3c85b863" dependencies = [ "borsh 0.10.4", "borsh 1.5.7", + "bs58", "bytemuck", "bytemuck_derive", "curve25519-dalek 4.1.3", - "five8", "five8_const", "getrandom 0.2.16", "js-sys", @@ -7507,43 +7536,34 @@ dependencies = [ "rand 0.8.5", "serde", "serde_derive", - "solana-atomic-u64 2.2.1", + "solana-atomic-u64", "solana-decode-error", - "solana-define-syscall 2.3.0", - "solana-sanitize 2.2.1", - "solana-sha256-hasher 2.3.0", + "solana-define-syscall 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-sanitize", + "solana-sha256-hasher", "wasm-bindgen", ] -[[package]] -name = "solana-pubkey" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8909d399deb0851aa524420beeb5646b115fd253ef446e35fe4504c904da3941" -dependencies = [ - "solana-address", -] - [[package]] name = "solana-pubsub-client" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b1fa505f2c24107525b3d1b49a2fbe78f9430cb97e3a0e9957dd215f4b2bdf" +checksum = "52d219147fd3a6753dc4819578fb6830c082a7c26b1559fab0f240fcf11f4e39" dependencies = [ "crossbeam-channel", "futures-util", - "http 0.2.12", "log", + "reqwest 0.11.27", "semver", "serde", "serde_derive", "serde_json", "solana-account-decoder-client-types", "solana-clock", - "solana-pubkey 2.4.0", - "solana-rpc-client-types", + "solana-pubkey", + "solana-rpc-client-api", "solana-signature", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-stream", "tokio-tungstenite 0.20.1", @@ -7553,57 +7573,59 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4dff89c984bb7d1dd0db254c4717fc0364f13c0d54a9c84b389359e60a4475f" +checksum = "769d66df4ab445ab689ab2c4f10135dfe80576859b4fea1cae7d9bdd7985e4e2" dependencies = [ "async-lock", "async-trait", "futures", "itertools 0.12.1", + "lazy_static", "log", "quinn", "quinn-proto", - "rustls 0.23.32", + "rustls 0.23.31", "solana-connection-cache", "solana-keypair", "solana-measure", "solana-metrics", "solana-net-utils", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-quic-definitions", "solana-rpc-client-api", "solana-signer", "solana-streamer", "solana-tls-utils", "solana-transaction-error", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", ] [[package]] name = "solana-quic-definitions" -version = "2.3.1" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf0d4d5b049eb1d0c35f7b18f305a27c8986fc5c0c9b383e97adaa35334379e" +checksum = "e606feac5110eb5d8afaa43ccaeea3ec49ccec36773387930b5ba545e745aea2" dependencies = [ "solana-keypair", ] [[package]] name = "solana-rayon-threadlimit" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b95e07583c317e5a56681932bb9d05f2b4f1c679d44c36550f32095677e8779f" +checksum = "7bf3ad7091b26c9bd0ebabff6ac4d825c88ecf2eafdb83de30dffda80ffc2f17" dependencies = [ + "lazy_static", "num_cpus", ] [[package]] name = "solana-remote-wallet" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ce1a936359340d4bc784e6068d3e01ebcbb2efd953b1deddc0a7d5998e0608e" +checksum = "4f6c8a74ea5e4c430ca41cae7da03ba7c7c6da0b8c1513aeef16f18b86c5cb30" dependencies = [ "console", "dialoguer", @@ -7616,10 +7638,10 @@ dependencies = [ "semver", "solana-derivation-path", "solana-offchain-message", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-signature", "solana-signer", - "thiserror 2.0.17", + "thiserror 2.0.16", "uriparse", ] @@ -7648,7 +7670,7 @@ dependencies = [ "solana-clock", "solana-epoch-schedule", "solana-genesis-config", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-rent", "solana-sdk-ids", ] @@ -7659,19 +7681,19 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f6f9113c6003492e74438d1288e30cffa8ccfdc2ef7b49b9e816d8034da18cd" dependencies = [ - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-reward-info", ] [[package]] name = "solana-reserved-account-keys" -version = "2.2.2" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4b22ea19ca2a3f28af7cd047c914abf833486bf7a7c4a10fc652fff09b385b1" +checksum = "2b293f4246626c0e0a991531f08848a713ada965612e99dc510963f04d12cae7" dependencies = [ "lazy_static", "solana-feature-set", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sdk-ids", ] @@ -7687,18 +7709,17 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7529f262a01dc4ceb0444bcc2103603be071a66d55554690b184ea87bd57d4e" +checksum = "44f1809a424bb8d90aa40990451593cde7e734a060fb52b35e475db585450578" dependencies = [ "async-trait", "base64 0.22.1", "bincode", "bs58", - "futures", "indicatif", "log", - "reqwest 0.12.23", + "reqwest 0.11.27", "reqwest-middleware", "semver", "serde", @@ -7711,83 +7732,65 @@ dependencies = [ "solana-epoch-info", "solana-epoch-schedule", "solana-feature-gate-interface", - "solana-hash 2.3.0", + "solana-hash", "solana-instruction", "solana-message", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-rpc-client-api", "solana-signature", "solana-transaction", "solana-transaction-error", "solana-transaction-status-client-types", "solana-version", - "solana-vote-interface", "tokio", ] [[package]] name = "solana-rpc-client-api" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21751b079e5fd6726aaae3788472d5a3f036a627dc8b6d4ffcfde1d6459102c3" +checksum = "aa2eb4fe573cd2d59d8672f0d8ac65f64e70c948b36cf97218b9aeb80dca3329" dependencies = [ "anyhow", + "base64 0.22.1", + "bs58", "jsonrpc-core", - "reqwest 0.12.23", + "reqwest 0.11.27", "reqwest-middleware", + "semver", "serde", "serde_derive", "serde_json", + "solana-account", "solana-account-decoder-client-types", "solana-clock", - "solana-rpc-client-types", + "solana-commitment-config", + "solana-fee-calculator", + "solana-inflation", + "solana-inline-spl", + "solana-pubkey", "solana-signer", "solana-transaction-error", "solana-transaction-status-client-types", - "thiserror 2.0.17", + "solana-version", + "thiserror 2.0.16", ] [[package]] name = "solana-rpc-client-nonce-utils" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09da559a19ee6b6bd5ff1f23cd936acbc9e0f92387935235a10dee4d3a13bd71" +checksum = "2712d22c58616762ad8e02fc18556eaf7be4104d5e56b11a2b8aa892c7de2a08" dependencies = [ "solana-account", "solana-commitment-config", - "solana-hash 2.3.0", + "solana-hash", "solana-message", "solana-nonce", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-rpc-client", "solana-sdk-ids", - "thiserror 2.0.17", -] - -[[package]] -name = "solana-rpc-client-types" -version = "2.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0e1d4088b578c253a412725888333f776de0b52de61cbe1178c43308107e071" -dependencies = [ - "base64 0.22.1", - "bs58", - "semver", - "serde", - "serde_derive", - "serde_json", - "solana-account", - "solana-account-decoder-client-types", - "solana-clock", - "solana-commitment-config", - "solana-fee-calculator", - "solana-inflation", - "solana-pubkey 2.4.0", - "solana-transaction-error", - "solana-transaction-status-client-types", - "solana-version", - "spl-generic-token", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] @@ -7796,17 +7799,11 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61f1bc1357b8188d9c4a3af3fc55276e56987265eb7ad073ae6f8180ee54cecf" -[[package]] -name = "solana-sanitize" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf09694a0fc14e5ffb18f9b7b7c0f15ecb6eac5b5610bf76a1853459d19daf9" - [[package]] name = "solana-sbpf" -version = "0.11.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "474a2d95dc819898ded08d24f29642d02189d3e1497bbb442a92a3997b7eb55f" +checksum = "66a3ce7a0f4d6830124ceb2c263c36d1ee39444ec70146eb49b939e557e72b96" dependencies = [ "byteorder", "combine 3.8.1", @@ -7815,15 +7812,15 @@ dependencies = [ "log", "rand 0.8.5", "rustc-demangle", - "thiserror 2.0.17", + "thiserror 1.0.69", "winapi", ] [[package]] name = "solana-sdk" -version = "2.3.1" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cc0e4a7635b902791c44b6581bfb82f3ada32c5bc0929a64f39fe4bb384c86a" +checksum = "4808e8d7f3c931657e615042d4176b423e66f64dc99e3dc3c735a197e512029b" dependencies = [ "bincode", "bs58", @@ -7850,7 +7847,7 @@ dependencies = [ "solana-instruction", "solana-keypair", "solana-message", - "solana-native-token 2.3.0", + "solana-native-token", "solana-nonce-account", "solana-offchain-message", "solana-packet", @@ -7860,13 +7857,13 @@ dependencies = [ "solana-presigner", "solana-program", "solana-program-memory", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-quic-definitions", "solana-rent-collector", "solana-rent-debits", "solana-reserved-account-keys", "solana-reward-info", - "solana-sanitize 2.2.1", + "solana-sanitize", "solana-sdk-ids", "solana-sdk-macro", "solana-secp256k1-program", @@ -7886,7 +7883,7 @@ dependencies = [ "solana-transaction-context", "solana-transaction-error", "solana-validator-exit", - "thiserror 2.0.17", + "thiserror 2.0.16", "wasm-bindgen", ] @@ -7896,7 +7893,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c5d8b9cc68d5c88b062a33e23a6466722467dde0035152d8fb1afbcdf350a5f" dependencies = [ - "solana-pubkey 2.4.0", + "solana-pubkey", ] [[package]] @@ -7913,9 +7910,9 @@ dependencies = [ [[package]] name = "solana-secp256k1-program" -version = "2.2.3" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f19833e4bc21558fe9ec61f239553abe7d05224347b57d65c2218aeeb82d6149" +checksum = "a0a1caa972414cc78122c32bdae65ac5fe89df7db598585a5cde19d16a20280a" dependencies = [ "bincode", "digest 0.10.7", @@ -7927,7 +7924,6 @@ dependencies = [ "solana-instruction", "solana-precompile-error", "solana-sdk-ids", - "solana-signature", ] [[package]] @@ -7938,15 +7934,15 @@ checksum = "baa3120b6cdaa270f39444f5093a90a7b03d296d362878f7a6991d6de3bbe496" dependencies = [ "borsh 1.5.7", "libsecp256k1", - "solana-define-syscall 2.3.0", - "thiserror 2.0.17", + "solana-define-syscall 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 2.0.16", ] [[package]] name = "solana-secp256r1-program" -version = "2.2.4" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce0ae46da3071a900f02d367d99b2f3058fe2e90c5062ac50c4f20cfedad8f0f" +checksum = "cf903cbdc36a161533812f90acfccdb434ed48982bd5dd71f3217930572c4a80" dependencies = [ "bytemuck", "openssl", @@ -7993,9 +7989,9 @@ dependencies = [ [[package]] name = "solana-serde-varint" -version = "2.2.2" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a7e155eba458ecfb0107b98236088c3764a09ddf0201ec29e52a0be40857113" +checksum = "bcc07d00200d82e6def2f7f7a45738e3406b17fe54a18adcf0defa16a97ccadb" dependencies = [ "serde", ] @@ -8007,30 +8003,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "817a284b63197d2b27afdba829c5ab34231da4a9b4e763466a003c40ca4f535e" dependencies = [ "solana-instruction", - "solana-pubkey 2.4.0", - "solana-sanitize 2.2.1", -] - -[[package]] -name = "solana-sha256-hasher" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa3feb32c28765f6aa1ce8f3feac30936f16c5c3f7eb73d63a5b8f6f8ecdc44" -dependencies = [ - "sha2 0.10.9", - "solana-define-syscall 2.3.0", - "solana-hash 2.3.0", + "solana-pubkey", + "solana-sanitize", ] [[package]] name = "solana-sha256-hasher" -version = "3.0.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b912ba6f71cb202c0c3773ec77bf898fa9fe0c78691a2d6859b3b5b8954719" +checksum = "0037386961c0d633421f53560ad7c80675c0447cba4d1bb66d60974dd486c7ea" dependencies = [ "sha2 0.10.9", - "solana-define-syscall 3.0.0", - "solana-hash 3.0.0", + "solana-define-syscall 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-hash", ] [[package]] @@ -8049,23 +8034,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afd3db0461089d1ad1a78d9ba3f15b563899ca2386351d38428faa5350c60a98" dependencies = [ "solana-hard-forks", - "solana-hash 2.3.0", - "solana-sha256-hasher 2.3.0", + "solana-hash", + "solana-sha256-hasher", ] [[package]] name = "solana-signature" -version = "2.3.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c8ec8e657aecfc187522fc67495142c12f35e55ddeca8698edbb738b8dbd8c" +checksum = "47d251c8f3dc015f320b4161daac7f108156c837428e5a8cc61136d25beb11d6" dependencies = [ + "bs58", "ed25519-dalek", - "five8", "rand 0.8.5", "serde", "serde-big-array", "serde_derive", - "solana-sanitize 2.2.1", + "solana-sanitize", ] [[package]] @@ -8074,7 +8059,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c41991508a4b02f021c1342ba00bcfa098630b213726ceadc7cb032e051975b" dependencies = [ - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-signature", "solana-transaction-error", ] @@ -8087,7 +8072,7 @@ checksum = "0c8691982114513763e88d04094c9caa0376b867a29577939011331134c301ce" dependencies = [ "serde", "serde_derive", - "solana-hash 2.3.0", + "solana-hash", "solana-sdk-ids", "solana-sysvar-id", ] @@ -8112,7 +8097,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f14f7d02af8f2bc1b5efeeae71bc1c2b7f0f65cd75bcc7d8180f2c762a57f54" dependencies = [ "solana-instruction", - "solana-pubkey 2.4.0", + "solana-pubkey", ] [[package]] @@ -8130,32 +8115,32 @@ dependencies = [ "solana-cpi", "solana-decode-error", "solana-instruction", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-system-interface 1.0.0", + "solana-program-error", + "solana-pubkey", + "solana-system-interface", "solana-sysvar-id", ] [[package]] name = "solana-stake-program" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa80b70118a5f7b5b6bd6256127f0497c636b51f48aa9401afc211874a48f54" +checksum = "2b140dad8a60e40c381a0a359a350d37d51827d02ceb623acf8b942c04f3f3e6" dependencies = [ - "agave-feature-set", "bincode", "log", "solana-account", "solana-bincode", "solana-clock", - "solana-config-program-client", + "solana-config-program", + "solana-feature-set", "solana-genesis-config", "solana-instruction", "solana-log-collector", - "solana-native-token 2.3.0", + "solana-native-token", "solana-packet", "solana-program-runtime", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-rent", "solana-sdk-ids", "solana-stake-interface", @@ -8167,9 +8152,9 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d04674440673451ce3cd7a9f8d82b4de657b9317791df93ddff414a34244c50d" +checksum = "c8251a832b9f849e32266e2ebc14dba374c6c58d64e8b1ea9e9d95e836a53fe6" dependencies = [ "async-channel", "bytes", @@ -8179,7 +8164,7 @@ dependencies = [ "futures-util", "governor 0.6.3", "histogram", - "indexmap 2.11.4", + "indexmap 2.11.1", "itertools 0.12.1", "libc", "log", @@ -8189,7 +8174,7 @@ dependencies = [ "quinn", "quinn-proto", "rand 0.8.5", - "rustls 0.23.32", + "rustls 0.23.31", "smallvec", "socket2 0.5.10", "solana-keypair", @@ -8198,7 +8183,7 @@ dependencies = [ "solana-net-utils", "solana-packet", "solana-perf", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-quic-definitions", "solana-signature", "solana-signer", @@ -8206,38 +8191,21 @@ dependencies = [ "solana-tls-utils", "solana-transaction-error", "solana-transaction-metrics-tracker", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", "tokio-util 0.7.16", "x509-parser", ] -[[package]] -name = "solana-svm-callback" -version = "2.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc71d742f57c922a66dfc786f9158b85a3a46bc7d230ebd8a92724ec9bcef641" -dependencies = [ - "solana-account", - "solana-precompile-error", - "solana-pubkey 2.4.0", -] - -[[package]] -name = "solana-svm-feature-set" -version = "2.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7fe5a6e173eec22c54806b413f5e383b8b82ca13b1767fa53fd40ec8512e6ee" - [[package]] name = "solana-svm-transaction" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a5acb9fccd0b5d58dc46e8767e93eb65bff5916bf89069f3fabea877ecb3327" +checksum = "1da9eb37e6ced0215a5e44df4ed1f3b885cf349156cbbf99197680cb7eaccf5f" dependencies = [ - "solana-hash 2.3.0", + "solana-hash", "solana-message", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sdk-ids", "solana-signature", "solana-transaction", @@ -8255,27 +8223,15 @@ dependencies = [ "serde_derive", "solana-decode-error", "solana-instruction", - "solana-pubkey 2.4.0", + "solana-pubkey", "wasm-bindgen", ] -[[package]] -name = "solana-system-interface" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e1790547bfc3061f1ee68ea9d8dc6c973c02a163697b24263a8e9f2e6d4afa2" -dependencies = [ - "num-traits", - "solana-msg 3.0.0", - "solana-program-error 3.0.0", - "solana-pubkey 3.0.0", -] - [[package]] name = "solana-system-program" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62286f3c6b6cdaaa66be54bb7e2a1acbd7462b435fa05f31f78ec690772e4d11" +checksum = "6321fd5380961387ef4633a98c109ac7f978667ceab2a38d0a699d6ddb2fc57a" dependencies = [ "bincode", "log", @@ -8283,16 +8239,15 @@ dependencies = [ "serde_derive", "solana-account", "solana-bincode", - "solana-fee-calculator", "solana-instruction", "solana-log-collector", "solana-nonce", "solana-nonce-account", "solana-packet", "solana-program-runtime", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sdk-ids", - "solana-system-interface 1.0.0", + "solana-system-interface", "solana-sysvar", "solana-transaction-context", "solana-type-overrides", @@ -8304,20 +8259,20 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5bd98a25e5bcba8b6be8bcbb7b84b24c2a6a8178d7fb0e3077a916855ceba91a" dependencies = [ - "solana-hash 2.3.0", + "solana-hash", "solana-keypair", "solana-message", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-signer", - "solana-system-interface 1.0.0", + "solana-system-interface", "solana-transaction", ] [[package]] name = "solana-sysvar" -version = "2.3.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8c3595f95069f3d90f275bb9bd235a1973c4d059028b0a7f81baca2703815db" +checksum = "bf6b44740d7f0c9f375d045c165bc0aab4a90658f92d6835aeb0649afaeaff9a" dependencies = [ "base64 0.22.1", "bincode", @@ -8328,20 +8283,20 @@ dependencies = [ "serde_derive", "solana-account-info", "solana-clock", - "solana-define-syscall 2.3.0", + "solana-define-syscall 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "solana-epoch-rewards", "solana-epoch-schedule", "solana-fee-calculator", - "solana-hash 2.3.0", + "solana-hash", "solana-instruction", "solana-instructions-sysvar", "solana-last-restart-slot", "solana-program-entrypoint", - "solana-program-error 2.2.2", + "solana-program-error", "solana-program-memory", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-rent", - "solana-sanitize 2.2.1", + "solana-sanitize", "solana-sdk-ids", "solana-sdk-macro", "solana-slot-hashes", @@ -8356,15 +8311,15 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5762b273d3325b047cfda250787f8d796d781746860d5d0a746ee29f3e8812c1" dependencies = [ - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sdk-ids", ] [[package]] name = "solana-thin-client" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dda0eb4b4f000fe757da47da51c3e709a606425ac1d17434ea7b7929c20ae67" +checksum = "61f6e417c23af670d7861ef74feae3c556d47ea9e5f64c664cfcf6d254f43e1a" dependencies = [ "bincode", "log", @@ -8375,16 +8330,16 @@ dependencies = [ "solana-commitment-config", "solana-connection-cache", "solana-epoch-info", - "solana-hash 2.3.0", + "solana-hash", "solana-instruction", "solana-keypair", "solana-message", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-rpc-client", "solana-rpc-client-api", "solana-signature", "solana-signer", - "solana-system-interface 1.0.0", + "solana-system-interface", "solana-transaction", "solana-transaction-error", ] @@ -8397,38 +8352,38 @@ checksum = "6af261afb0e8c39252a04d026e3ea9c405342b08c871a2ad8aa5448e068c784c" [[package]] name = "solana-timings" -version = "2.3.12" +version = "2.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c693612dde6208558c03b81e51b17477ced8cc592d43f57649b18afe19d1250" +checksum = "1939a33d02905beaa4d657e9ade9cfcac6f9676a4a6178829a617503d45ab3b8" dependencies = [ "eager", "enum-iterator", - "solana-pubkey 2.4.0", + "solana-pubkey", ] [[package]] name = "solana-tls-utils" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d4f5bebbd0e005fa76427db2630f4558128d1a6c8cff616a3587c8519b14f3" +checksum = "ec21c6c242ee93642aa50b829f5727470cdbdf6b461fb7323fe4bc31d1b54c08" dependencies = [ - "rustls 0.23.32", + "rustls 0.23.31", "solana-keypair", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-signer", "x509-parser", ] [[package]] name = "solana-tpu-client" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22fd3202b4e07e8877179b63fe33c7028aa40e8d9ad63273349b24fe6cc00c65" +checksum = "637e3ff3c8ece22043d96758f980d95558d50792d827d1457c2e06d9daaa7ff5" dependencies = [ "async-trait", "bincode", "futures-util", - "indexmap 2.11.4", + "indexmap 2.11.1", "indicatif", "log", "rayon", @@ -8436,11 +8391,11 @@ dependencies = [ "solana-clock", "solana-commitment-config", "solana-connection-cache", - "solana-epoch-schedule", + "solana-epoch-info", "solana-measure", "solana-message", "solana-net-utils", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-pubsub-client", "solana-quic-definitions", "solana-rpc-client", @@ -8449,52 +8404,52 @@ dependencies = [ "solana-signer", "solana-transaction", "solana-transaction-error", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", ] [[package]] name = "solana-transaction" -version = "2.2.3" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80657d6088f721148f5d889c828ca60c7daeedac9a8679f9ec215e0c42bcbf41" +checksum = "753b3e9afed170e4cfc0ea1e87b5dfdc6d4a50270869414edd24c6ea1f529b29" dependencies = [ "bincode", "serde", "serde_derive", "solana-bincode", "solana-feature-set", - "solana-hash 2.3.0", + "solana-hash", "solana-instruction", "solana-keypair", "solana-message", "solana-precompiles", - "solana-pubkey 2.4.0", - "solana-sanitize 2.2.1", + "solana-pubkey", + "solana-reserved-account-keys", + "solana-sanitize", "solana-sdk-ids", "solana-short-vec", "solana-signature", "solana-signer", - "solana-system-interface 1.0.0", + "solana-system-interface", "solana-transaction-error", "wasm-bindgen", ] [[package]] name = "solana-transaction-context" -version = "2.3.12" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b02e4d84d75dc196689f0256234b31a11e3cc97abc22ac71c945e930d1fea1" +checksum = "5022de04cbba05377f68bf848c8c1322ead733f88a657bf792bb40f3257b8218" dependencies = [ "bincode", "serde", "serde_derive", "solana-account", "solana-instruction", - "solana-instructions-sysvar", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-rent", - "solana-sdk-ids", + "solana-signature", ] [[package]] @@ -8506,17 +8461,18 @@ dependencies = [ "serde", "serde_derive", "solana-instruction", - "solana-sanitize 2.2.1", + "solana-sanitize", ] [[package]] name = "solana-transaction-metrics-tracker" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05dd69d3052940dba222063553717462e043c03b81838e286c4ea30250abf66b" +checksum = "58e40670c0780af24e73551be1fadf2306f61ed13f538ff3933846dab813b06d" dependencies = [ "base64 0.22.1", "bincode", + "lazy_static", "log", "rand 0.8.5", "solana-packet", @@ -8527,53 +8483,50 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83755842872c791da19cb05b1f6f021345359edd34320db900612b41ea4c2e2b" +checksum = "e05fc20dd8feb089562b113a80115dab32b22fc64d63ca45c14d7b71e5e98d67" dependencies = [ "Inflector", - "agave-reserved-account-keys", "base64 0.22.1", "bincode", "borsh 1.5.7", "bs58", + "lazy_static", "log", "serde", "serde_derive", "serde_json", "solana-account-decoder", - "solana-address-lookup-table-interface", "solana-clock", - "solana-hash 2.3.0", + "solana-hash", "solana-instruction", "solana-loader-v2-interface", - "solana-loader-v3-interface", "solana-message", - "solana-program-option", - "solana-pubkey 2.4.0", + "solana-program", + "solana-pubkey", + "solana-reserved-account-keys", "solana-reward-info", "solana-sdk-ids", "solana-signature", - "solana-stake-interface", - "solana-system-interface 1.0.0", + "solana-system-interface", "solana-transaction", "solana-transaction-error", "solana-transaction-status-client-types", - "solana-vote-interface", - "spl-associated-token-account 7.0.0", + "spl-associated-token-account", "spl-memo", - "spl-token 8.0.0", - "spl-token-2022 8.0.1", - "spl-token-group-interface 0.6.0", - "spl-token-metadata-interface 0.7.0", - "thiserror 2.0.17", + "spl-token", + "spl-token-2022 7.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "spl-token-group-interface", + "spl-token-metadata-interface", + "thiserror 2.0.16", ] [[package]] name = "solana-transaction-status-client-types" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7000081550c6b23cd6c7d18dfa54f06793b7906d28a038eac46e1d6b72da4750" +checksum = "1458fc750d0df4439bb4c1b418a4fe61afbd2e83963e452256eca99dc0c1cf76" dependencies = [ "base64 0.22.1", "bincode", @@ -8589,23 +8542,24 @@ dependencies = [ "solana-transaction", "solana-transaction-context", "solana-transaction-error", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "solana-type-overrides" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a545d312699b2874b1452344d114bb84f843452d8396e7e7bf71686d04141d62" +checksum = "d26d927bf3ed2f2b6b06a0f409dd8d6b1ad1af73cbba337e9471d05d42f026c9" dependencies = [ + "lazy_static", "rand 0.8.5", ] [[package]] name = "solana-udp-client" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84e3da9310584355ef7bf797f24f1b40cc7e0c271585b5de1edae1202abaab7e" +checksum = "c37955cc627be2745e29ce326fd1b51739e499445b5e2b5fec687ed8ec581e34" dependencies = [ "async-trait", "solana-connection-cache", @@ -8613,7 +8567,7 @@ dependencies = [ "solana-net-utils", "solana-streamer", "solana-transaction-error", - "thiserror 2.0.17", + "thiserror 2.0.16", "tokio", ] @@ -8625,24 +8579,23 @@ checksum = "7bbf6d7a3c0b28dd5335c52c0e9eae49d0ae489a8f324917faf0ded65a812c1d" [[package]] name = "solana-version" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a2c757ffbd2cae2b5486715fde6fe675ce7f98197ccdafd896096dfafc8a680" +checksum = "374dea09855d46655c776256dda9cc3c854cc70fd923ef22ba0805bc83ca7bfd" dependencies = [ - "agave-feature-set", - "rand 0.8.5", "semver", "serde", "serde_derive", - "solana-sanitize 2.2.1", + "solana-feature-set", + "solana-sanitize", "solana-serde-varint", ] [[package]] name = "solana-vote-interface" -version = "2.2.6" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b80d57478d6599d30acc31cc5ae7f93ec2361a06aefe8ea79bc81739a08af4c3" +checksum = "d4507bb9d071fb81cfcf676f12fba3db4098f764524ef0b5567d671a81d41f3e" dependencies = [ "bincode", "num-derive", @@ -8651,24 +8604,23 @@ dependencies = [ "serde_derive", "solana-clock", "solana-decode-error", - "solana-hash 2.3.0", + "solana-hash", "solana-instruction", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-rent", "solana-sdk-ids", "solana-serde-varint", "solana-serialize-utils", "solana-short-vec", - "solana-system-interface 1.0.0", + "solana-system-interface", ] [[package]] name = "solana-vote-program" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55194bcfededc3fb67be683b3163caca2de4b4b0b0ca02edcb309c52770ca3b" +checksum = "e0289c18977992907d361ca94c86cf45fd24cb41169fa03eb84947779e22933f" dependencies = [ - "agave-feature-set", "bincode", "log", "num-derive", @@ -8679,13 +8631,14 @@ dependencies = [ "solana-bincode", "solana-clock", "solana-epoch-schedule", - "solana-hash 2.3.0", + "solana-feature-set", + "solana-hash", "solana-instruction", "solana-keypair", "solana-metrics", "solana-packet", "solana-program-runtime", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-rent", "solana-sdk-ids", "solana-signer", @@ -8693,16 +8646,15 @@ dependencies = [ "solana-transaction", "solana-transaction-context", "solana-vote-interface", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "solana-zk-elgamal-proof-program" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b89ebed127f13b2a17dbf67d74005feb33ff4ff91477d24ab486f1810fd213e2" +checksum = "0a96b0ad864cc4d2156dbf0c4d7cadac4140ae13ebf7e856241500f74eca46f4" dependencies = [ - "agave-feature-set", "bytemuck", "num-derive", "num-traits", @@ -8715,9 +8667,9 @@ dependencies = [ [[package]] name = "solana-zk-sdk" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffc4ca8e3e26a8f80eb0026adf8af1732863f42739cd2201c40c568ccae360c" +checksum = "71db02a2e496c58840077c96dd4ede61894a4e6053853cca6dcddbb73200fb77" dependencies = [ "aes-gcm-siv", "base64 0.22.1", @@ -8727,6 +8679,7 @@ dependencies = [ "curve25519-dalek 4.1.3", "itertools 0.12.1", "js-sys", + "lazy_static", "merlin", "num-derive", "num-traits", @@ -8737,28 +8690,28 @@ dependencies = [ "sha3", "solana-derivation-path", "solana-instruction", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sdk-ids", "solana-seed-derivable", "solana-seed-phrase", "solana-signature", "solana-signer", "subtle", - "thiserror 2.0.17", + "thiserror 2.0.16", "wasm-bindgen", "zeroize", ] [[package]] name = "solana-zk-token-proof-program" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8d5cfcc2497030ab740819d9a7f56a8b7506ec1fb4f948b70f5291ce79f4e1" +checksum = "c540a4f7df1300dc6087f0cbb271b620dd55e131ea26075bb52ba999be3105f0" dependencies = [ - "agave-feature-set", "bytemuck", "num-derive", "num-traits", + "solana-feature-set", "solana-instruction", "solana-log-collector", "solana-program-runtime", @@ -8768,9 +8721,9 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "2.3.12" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c69a1fc0b2f061d5f2930a0c15f3d74ecd3bd9e2ea1b391cb985a91a1c772984" +checksum = "2c4debebedfebfd4a188a7ac3dd0a56e86368417c35891d6f3c35550b46bfbc0" dependencies = [ "aes-gcm-siv", "base64 0.22.1", @@ -8779,6 +8732,7 @@ dependencies = [ "bytemuck_derive", "curve25519-dalek 4.1.3", "itertools 0.12.1", + "lazy_static", "merlin", "num-derive", "num-traits", @@ -8790,14 +8744,14 @@ dependencies = [ "solana-curve25519", "solana-derivation-path", "solana-instruction", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-sdk-ids", "solana-seed-derivable", "solana-seed-phrase", "solana-signature", "solana-signer", "subtle", - "thiserror 2.0.17", + "thiserror 2.0.16", "zeroize", ] @@ -8827,27 +8781,11 @@ dependencies = [ "num-traits", "solana-program", "spl-associated-token-account-client", - "spl-token 7.0.0", + "spl-token", "spl-token-2022 6.0.0", "thiserror 1.0.69", ] -[[package]] -name = "spl-associated-token-account" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae179d4a26b3c7a20c839898e6aed84cb4477adf108a366c95532f058aea041b" -dependencies = [ - "borsh 1.5.7", - "num-derive", - "num-traits", - "solana-program", - "spl-associated-token-account-client", - "spl-token 8.0.0", - "spl-token-2022 8.0.1", - "thiserror 2.0.17", -] - [[package]] name = "spl-associated-token-account-client" version = "2.0.0" @@ -8855,7 +8793,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6f8349dbcbe575f354f9a533a21f272f3eb3808a49e2fdc1c34393b88ba76cb" dependencies = [ "solana-instruction", - "solana-pubkey 2.4.0", + "solana-pubkey", ] [[package]] @@ -8865,8 +8803,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7398da23554a31660f17718164e31d31900956054f54f52d5ec1be51cb4f4b3" dependencies = [ "bytemuck", - "solana-program-error 2.2.2", - "solana-sha256-hasher 2.3.0", + "solana-program-error", + "solana-sha256-hasher", "spl-discriminator-derive", ] @@ -8904,40 +8842,19 @@ dependencies = [ "solana-program", "solana-zk-sdk", "spl-pod", - "spl-token-confidential-transfer-proof-extraction 0.2.1", + "spl-token-confidential-transfer-proof-extraction 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "spl-elgamal-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65edfeed09cd4231e595616aa96022214f9c9d2be02dea62c2b30d5695a6833a" +version = "0.1.1" +source = "git+https://github.com/Lightprotocol/token-2022?rev=06d12f50a06db25d73857d253b9a82857d6f4cdf#06d12f50a06db25d73857d253b9a82857d6f4cdf" dependencies = [ "bytemuck", - "solana-account-info", - "solana-cpi", - "solana-instruction", - "solana-msg 2.2.1", - "solana-program-entrypoint", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-rent", - "solana-sdk-ids", - "solana-system-interface 1.0.0", - "solana-sysvar", + "solana-program", "solana-zk-sdk", "spl-pod", - "spl-token-confidential-transfer-proof-extraction 0.3.0", -] - -[[package]] -name = "spl-generic-token" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "741a62a566d97c58d33f9ed32337ceedd4e35109a686e31b1866c5dfa56abddc" -dependencies = [ - "bytemuck", - "solana-pubkey 2.4.0", + "spl-token-confidential-transfer-proof-extraction 0.2.1 (git+https://github.com/Lightprotocol/token-2022?rev=06d12f50a06db25d73857d253b9a82857d6f4cdf)", ] [[package]] @@ -8948,10 +8865,10 @@ checksum = "9f09647c0974e33366efeb83b8e2daebb329f0420149e74d3a4bd2c08cf9f7cb" dependencies = [ "solana-account-info", "solana-instruction", - "solana-msg 2.2.1", + "solana-msg", "solana-program-entrypoint", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-program-error", + "solana-pubkey", ] [[package]] @@ -8966,12 +8883,12 @@ dependencies = [ "num-derive", "num-traits", "solana-decode-error", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", + "solana-msg", + "solana-program-error", "solana-program-option", - "solana-pubkey 2.4.0", + "solana-pubkey", "solana-zk-sdk", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] @@ -8983,25 +8900,10 @@ dependencies = [ "num-derive", "num-traits", "solana-program", - "spl-program-error-derive 0.4.1", + "spl-program-error-derive", "thiserror 1.0.69", ] -[[package]] -name = "spl-program-error" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdebc8b42553070b75aa5106f071fef2eb798c64a7ec63375da4b1f058688c6" -dependencies = [ - "num-derive", - "num-traits", - "solana-decode-error", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "spl-program-error-derive 0.5.0", - "thiserror 2.0.17", -] - [[package]] name = "spl-program-error-derive" version = "0.4.1" @@ -9014,18 +8916,6 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "spl-program-error-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2539e259c66910d78593475540e8072f0b10f0f61d7607bbf7593899ed52d0" -dependencies = [ - "proc-macro2", - "quote", - "sha2 0.10.9", - "syn 2.0.106", -] - [[package]] name = "spl-tlv-account-resolution" version = "0.9.0" @@ -9038,38 +8928,16 @@ dependencies = [ "solana-account-info", "solana-decode-error", "solana-instruction", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-msg", + "solana-program-error", + "solana-pubkey", "spl-discriminator", "spl-pod", - "spl-program-error 0.6.0", - "spl-type-length-value 0.7.0", + "spl-program-error", + "spl-type-length-value", "thiserror 1.0.69", ] -[[package]] -name = "spl-tlv-account-resolution" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1408e961215688715d5a1063cbdcf982de225c45f99c82b4f7d7e1dd22b998d7" -dependencies = [ - "bytemuck", - "num-derive", - "num-traits", - "solana-account-info", - "solana-decode-error", - "solana-instruction", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "spl-discriminator", - "spl-pod", - "spl-program-error 0.7.0", - "spl-type-length-value 0.8.0", - "thiserror 2.0.17", -] - [[package]] name = "spl-token" version = "7.0.0" @@ -9085,34 +8953,6 @@ dependencies = [ "thiserror 1.0.69", ] -[[package]] -name = "spl-token" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053067c6a82c705004f91dae058b11b4780407e9ccd6799dc9e7d0fab5f242da" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive", - "num-traits", - "num_enum", - "solana-account-info", - "solana-cpi", - "solana-decode-error", - "solana-instruction", - "solana-msg 2.2.1", - "solana-program-entrypoint", - "solana-program-error 2.2.2", - "solana-program-memory", - "solana-program-option", - "solana-program-pack", - "solana-pubkey 2.4.0", - "solana-rent", - "solana-sdk-ids", - "solana-sysvar", - "thiserror 2.0.17", -] - [[package]] name = "spl-token-2022" version = "6.0.0" @@ -9127,17 +8967,17 @@ dependencies = [ "solana-program", "solana-security-txt", "solana-zk-sdk", - "spl-elgamal-registry 0.1.1", + "spl-elgamal-registry 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "spl-memo", "spl-pod", - "spl-token 7.0.0", - "spl-token-confidential-transfer-ciphertext-arithmetic 0.2.1", - "spl-token-confidential-transfer-proof-extraction 0.2.1", + "spl-token", + "spl-token-confidential-transfer-ciphertext-arithmetic 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "spl-token-confidential-transfer-proof-extraction 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "spl-token-confidential-transfer-proof-generation 0.2.0", - "spl-token-group-interface 0.5.0", - "spl-token-metadata-interface 0.6.0", - "spl-transfer-hook-interface 0.9.0", - "spl-type-length-value 0.7.0", + "spl-token-group-interface", + "spl-token-metadata-interface", + "spl-transfer-hook-interface", + "spl-type-length-value", "thiserror 1.0.69", ] @@ -9155,62 +8995,45 @@ dependencies = [ "solana-program", "solana-security-txt", "solana-zk-sdk", - "spl-elgamal-registry 0.1.1", + "spl-elgamal-registry 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "spl-memo", "spl-pod", - "spl-token 7.0.0", - "spl-token-confidential-transfer-ciphertext-arithmetic 0.2.1", - "spl-token-confidential-transfer-proof-extraction 0.2.1", - "spl-token-confidential-transfer-proof-generation 0.3.0", - "spl-token-group-interface 0.5.0", - "spl-token-metadata-interface 0.6.0", - "spl-transfer-hook-interface 0.9.0", - "spl-type-length-value 0.7.0", - "thiserror 2.0.17", + "spl-token", + "spl-token-confidential-transfer-ciphertext-arithmetic 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "spl-token-confidential-transfer-proof-extraction 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "spl-token-confidential-transfer-proof-generation 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "spl-token-group-interface", + "spl-token-metadata-interface", + "spl-transfer-hook-interface", + "spl-type-length-value", + "thiserror 2.0.16", ] [[package]] name = "spl-token-2022" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f0dfbb079eebaee55e793e92ca5f433744f4b71ee04880bfd6beefba5973e5" +version = "7.0.0" +source = "git+https://github.com/Lightprotocol/token-2022?rev=06d12f50a06db25d73857d253b9a82857d6f4cdf#06d12f50a06db25d73857d253b9a82857d6f4cdf" dependencies = [ "arrayref", "bytemuck", "num-derive", "num-traits", "num_enum", - "solana-account-info", - "solana-clock", - "solana-cpi", - "solana-decode-error", - "solana-instruction", - "solana-msg 2.2.1", - "solana-native-token 2.3.0", - "solana-program-entrypoint", - "solana-program-error 2.2.2", - "solana-program-memory", - "solana-program-option", - "solana-program-pack", - "solana-pubkey 2.4.0", - "solana-rent", - "solana-sdk-ids", + "solana-program", "solana-security-txt", - "solana-system-interface 1.0.0", - "solana-sysvar", "solana-zk-sdk", - "spl-elgamal-registry 0.2.0", + "spl-elgamal-registry 0.1.1 (git+https://github.com/Lightprotocol/token-2022?rev=06d12f50a06db25d73857d253b9a82857d6f4cdf)", "spl-memo", "spl-pod", - "spl-token 8.0.0", - "spl-token-confidential-transfer-ciphertext-arithmetic 0.3.1", - "spl-token-confidential-transfer-proof-extraction 0.3.0", - "spl-token-confidential-transfer-proof-generation 0.4.1", - "spl-token-group-interface 0.6.0", - "spl-token-metadata-interface 0.7.0", - "spl-transfer-hook-interface 0.10.0", - "spl-type-length-value 0.8.0", - "thiserror 2.0.17", + "spl-token", + "spl-token-confidential-transfer-ciphertext-arithmetic 0.2.1 (git+https://github.com/Lightprotocol/token-2022?rev=06d12f50a06db25d73857d253b9a82857d6f4cdf)", + "spl-token-confidential-transfer-proof-extraction 0.2.1 (git+https://github.com/Lightprotocol/token-2022?rev=06d12f50a06db25d73857d253b9a82857d6f4cdf)", + "spl-token-confidential-transfer-proof-generation 0.3.0 (git+https://github.com/Lightprotocol/token-2022?rev=06d12f50a06db25d73857d253b9a82857d6f4cdf)", + "spl-token-group-interface", + "spl-token-metadata-interface", + "spl-transfer-hook-interface", + "spl-type-length-value", + "thiserror 2.0.16", ] [[package]] @@ -9227,9 +9050,8 @@ dependencies = [ [[package]] name = "spl-token-confidential-transfer-ciphertext-arithmetic" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cddd52bfc0f1c677b41493dafa3f2dbbb4b47cf0990f08905429e19dc8289b35" +version = "0.2.1" +source = "git+https://github.com/Lightprotocol/token-2022?rev=06d12f50a06db25d73857d253b9a82857d6f4cdf#06d12f50a06db25d73857d253b9a82857d6f4cdf" dependencies = [ "base64 0.22.1", "bytemuck", @@ -9248,27 +9070,20 @@ dependencies = [ "solana-program", "solana-zk-sdk", "spl-pod", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "spl-token-confidential-transfer-proof-extraction" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe2629860ff04c17bafa9ba4bed8850a404ecac81074113e1f840dbd0ebb7bd6" +version = "0.2.1" +source = "git+https://github.com/Lightprotocol/token-2022?rev=06d12f50a06db25d73857d253b9a82857d6f4cdf#06d12f50a06db25d73857d253b9a82857d6f4cdf" dependencies = [ "bytemuck", - "solana-account-info", "solana-curve25519", - "solana-instruction", - "solana-instructions-sysvar", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "solana-sdk-ids", + "solana-program", "solana-zk-sdk", "spl-pod", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] @@ -9290,18 +9105,17 @@ checksum = "0e3597628b0d2fe94e7900fd17cdb4cfbb31ee35c66f82809d27d86e44b2848b" dependencies = [ "curve25519-dalek 4.1.3", "solana-zk-sdk", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] name = "spl-token-confidential-transfer-proof-generation" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa27b9174bea869a7ebf31e0be6890bce90b1a4288bc2bbf24bd413f80ae3fde" +version = "0.3.0" +source = "git+https://github.com/Lightprotocol/token-2022?rev=06d12f50a06db25d73857d253b9a82857d6f4cdf#06d12f50a06db25d73857d253b9a82857d6f4cdf" dependencies = [ "curve25519-dalek 4.1.3", "solana-zk-sdk", - "thiserror 2.0.17", + "thiserror 2.0.16", ] [[package]] @@ -9315,33 +9129,14 @@ dependencies = [ "num-traits", "solana-decode-error", "solana-instruction", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-msg", + "solana-program-error", + "solana-pubkey", "spl-discriminator", "spl-pod", "thiserror 1.0.69", ] -[[package]] -name = "spl-token-group-interface" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5597b4cd76f85ce7cd206045b7dc22da8c25516573d42d267c8d1fd128db5129" -dependencies = [ - "bytemuck", - "num-derive", - "num-traits", - "solana-decode-error", - "solana-instruction", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "spl-discriminator", - "spl-pod", - "thiserror 2.0.17", -] - [[package]] name = "spl-token-metadata-interface" version = "0.6.0" @@ -9354,36 +9149,15 @@ dependencies = [ "solana-borsh", "solana-decode-error", "solana-instruction", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-msg", + "solana-program-error", + "solana-pubkey", "spl-discriminator", "spl-pod", - "spl-type-length-value 0.7.0", + "spl-type-length-value", "thiserror 1.0.69", ] -[[package]] -name = "spl-token-metadata-interface" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "304d6e06f0de0c13a621464b1fd5d4b1bebf60d15ca71a44d3839958e0da16ee" -dependencies = [ - "borsh 1.5.7", - "num-derive", - "num-traits", - "solana-borsh", - "solana-decode-error", - "solana-instruction", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "spl-discriminator", - "spl-pod", - "spl-type-length-value 0.8.0", - "thiserror 2.0.17", -] - [[package]] name = "spl-transfer-hook-interface" version = "0.9.0" @@ -9398,42 +9172,17 @@ dependencies = [ "solana-cpi", "solana-decode-error", "solana-instruction", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", + "solana-msg", + "solana-program-error", + "solana-pubkey", "spl-discriminator", "spl-pod", - "spl-program-error 0.6.0", - "spl-tlv-account-resolution 0.9.0", - "spl-type-length-value 0.7.0", + "spl-program-error", + "spl-tlv-account-resolution", + "spl-type-length-value", "thiserror 1.0.69", ] -[[package]] -name = "spl-transfer-hook-interface" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e905b849b6aba63bde8c4badac944ebb6c8e6e14817029cbe1bc16829133bd" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive", - "num-traits", - "solana-account-info", - "solana-cpi", - "solana-decode-error", - "solana-instruction", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "solana-pubkey 2.4.0", - "spl-discriminator", - "spl-pod", - "spl-program-error 0.7.0", - "spl-tlv-account-resolution 0.10.0", - "spl-type-length-value 0.8.0", - "thiserror 2.0.17", -] - [[package]] name = "spl-type-length-value" version = "0.7.0" @@ -9445,31 +9194,13 @@ dependencies = [ "num-traits", "solana-account-info", "solana-decode-error", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", + "solana-msg", + "solana-program-error", "spl-discriminator", "spl-pod", "thiserror 1.0.69", ] -[[package]] -name = "spl-type-length-value" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d417eb548214fa822d93f84444024b4e57c13ed6719d4dcc68eec24fb481e9f5" -dependencies = [ - "bytemuck", - "num-derive", - "num-traits", - "solana-account-info", - "solana-decode-error", - "solana-msg 2.2.1", - "solana-program-error 2.2.2", - "spl-discriminator", - "spl-pod", - "thiserror 2.0.17", -] - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -9761,17 +9492,26 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "task-local-extensions" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba323866e5d033818e3240feeb9f7db2c4296674e4d9e16b97b7bf8f490434e8" +dependencies = [ + "pin-utils", +] + [[package]] name = "tempfile" -version = "3.23.0" +version = "3.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.61.0", ] [[package]] @@ -9789,7 +9529,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f8daae29995a24f65619e19d8d31dea5b389f3d853d8bf297bbf607cd0014cc" dependencies = [ - "unicode-width 0.2.2", + "unicode-width 0.2.1", ] [[package]] @@ -9812,11 +9552,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl 2.0.16", ] [[package]] @@ -9832,9 +9572,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", @@ -9852,12 +9592,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.44" +version = "0.3.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" dependencies = [ "deranged", - "itoa", "num-conv", "powerfmt", "serde", @@ -9978,11 +9717,11 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.4" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.32", + "rustls 0.23.31", "tokio", ] @@ -10086,19 +9825,19 @@ dependencies = [ "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", - "toml_edit 0.22.27", + "toml_edit", ] [[package]] name = "toml" -version = "0.9.7" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0" +checksum = "ae2a4cf385da23d1d53bc15cdfa5c2109e93d8d362393c801e87da2f72f0e201" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.11.1", "serde_core", - "serde_spanned 1.0.2", - "toml_datetime 0.7.2", + "serde_spanned 1.0.1", + "toml_datetime 0.7.1", "toml_parser", "toml_writer", "winnow", @@ -10115,9 +9854,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" +checksum = "a197c0ec7d131bfc6f7e82c8442ba1595aeab35da7adbf05b6b73cd06a16b6be" dependencies = [ "serde_core", ] @@ -10128,7 +9867,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.11.1", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", @@ -10136,23 +9875,11 @@ dependencies = [ "winnow", ] -[[package]] -name = "toml_edit" -version = "0.23.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3effe7c0e86fdff4f69cdd2ccc1b96f933e24811c5441d44904e8683e27184b" -dependencies = [ - "indexmap 2.11.4", - "toml_datetime 0.7.2", - "toml_parser", - "winnow", -] - [[package]] name = "toml_parser" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" +checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10" dependencies = [ "winnow", ] @@ -10165,9 +9892,9 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "toml_writer" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d163a63c116ce562a22cda521fcc4d79152e7aba014456fb5eb442f6d6a10109" +checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" [[package]] name = "tower" @@ -10332,7 +10059,7 @@ dependencies = [ "serde_json", "target-triple", "termcolor", - "toml 0.9.7", + "toml 0.9.6", ] [[package]] @@ -10377,9 +10104,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.19.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unicase" @@ -10416,9 +10143,9 @@ checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-width" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" +checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" [[package]] name = "unicode-xid" @@ -10601,27 +10328,27 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.7+wasi-0.2.4" +version = "0.14.5+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +checksum = "a4494f6290a82f5fe584817a676a34b9d6763e8d9d18204009fb31dceca98fd4" dependencies = [ "wasip2", ] [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.0+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "03fa2761397e5bd52002cd7e73110c71af2109aca4e521a9f40473fe685b0a24" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.104" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" dependencies = [ "cfg-if", "once_cell", @@ -10632,9 +10359,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.104" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" dependencies = [ "bumpalo", "log", @@ -10646,9 +10373,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.54" +version = "0.4.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" +checksum = "0ca85039a9b469b38336411d6d6ced91f3fc87109a2a27b0c197663f5144dffe" dependencies = [ "cfg-if", "js-sys", @@ -10659,9 +10386,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.104" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -10669,9 +10396,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.104" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" dependencies = [ "proc-macro2", "quote", @@ -10682,18 +10409,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.104" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.81" +version = "0.3.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12" dependencies = [ "js-sys", "wasm-bindgen", @@ -10764,7 +10491,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.61.0", ] [[package]] @@ -10775,22 +10502,22 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.62.2" +version = "0.62.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", + "windows-link 0.2.0", + "windows-result 0.4.0", + "windows-strings 0.5.0", ] [[package]] name = "windows-implement" -version = "0.60.2" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", @@ -10799,9 +10526,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.59.3" +version = "0.59.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", @@ -10816,9 +10543,9 @@ checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-link" -version = "0.2.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" [[package]] name = "windows-registry" @@ -10842,11 +10569,11 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.4.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" dependencies = [ - "windows-link 0.2.1", + "windows-link 0.2.0", ] [[package]] @@ -10860,11 +10587,11 @@ dependencies = [ [[package]] name = "windows-strings" -version = "0.5.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" dependencies = [ - "windows-link 0.2.1", + "windows-link 0.2.0", ] [[package]] @@ -10909,16 +10636,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.5", + "windows-targets 0.53.3", ] [[package]] name = "windows-sys" -version = "0.61.2" +version = "0.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" dependencies = [ - "windows-link 0.2.1", + "windows-link 0.2.0", ] [[package]] @@ -10969,19 +10696,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.5" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ - "windows-link 0.2.1", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", + "windows-link 0.1.3", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", ] [[package]] @@ -11004,9 +10731,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" [[package]] name = "windows_aarch64_msvc" @@ -11028,9 +10755,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" [[package]] name = "windows_i686_gnu" @@ -11052,9 +10779,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" [[package]] name = "windows_i686_gnullvm" @@ -11064,9 +10791,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" [[package]] name = "windows_i686_msvc" @@ -11088,9 +10815,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" [[package]] name = "windows_x86_64_gnu" @@ -11112,9 +10839,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" [[package]] name = "windows_x86_64_gnullvm" @@ -11136,9 +10863,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" [[package]] name = "windows_x86_64_msvc" @@ -11160,9 +10887,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" @@ -11185,9 +10912,9 @@ dependencies = [ [[package]] name = "wit-bindgen" -version = "0.46.0" +version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" [[package]] name = "writeable" @@ -11230,7 +10957,7 @@ dependencies = [ "anyhow", "ark-bn254 0.5.0", "ark-ff 0.5.0", - "clap 4.5.48", + "clap 4.5.47", "dirs", "groth16-solana", "light-batched-merkle-tree", @@ -11281,18 +11008,6 @@ dependencies = [ "synstructure 0.13.2", ] -[[package]] -name = "zero-copy-derive-test" -version = "0.1.0" -dependencies = [ - "borsh 0.10.4", - "light-zero-copy", - "light-zero-copy-derive", - "rand 0.8.5", - "trybuild", - "zerocopy", -] - [[package]] name = "zerocopy" version = "0.8.27" @@ -11336,9 +11051,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.2" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] diff --git a/Cargo.toml b/Cargo.toml index 3641c22599..58e1156372 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ members = [ "program-libs/aligned-sized", "program-libs/batched-merkle-tree", "program-libs/bloom-filter", + "program-libs/compressible", "program-libs/hasher", "program-libs/verifier", "program-libs/merkle-tree-metadata", @@ -14,9 +15,11 @@ members = [ "program-libs/indexed-merkle-tree", "program-libs/indexed-array", "program-libs/zero-copy-derive", + "program-libs/ctoken-types", "programs/account-compression", "programs/system", - "programs/compressed-token", + "programs/compressed-token/program", + "programs/compressed-token/anchor", "programs/registry", "anchor-programs/system", "sdk-libs/client", @@ -26,9 +29,11 @@ members = [ "sdk-libs/sdk-types", "sdk-libs/photon-api", "sdk-libs/program-test", + "sdk-libs/compressed-token-types", + "sdk-libs/compressed-token-sdk", + "sdk-libs/token-client", "xtask", "program-tests/account-compression-test", - "program-tests/batched-merkle-tree-test", "program-tests/compressed-token-test", "program-tests/e2e-test", "program-tests/registry-test", @@ -38,13 +43,12 @@ members = [ "program-tests/create-address-test-program", "program-tests/utils", "program-tests/merkle-tree", - "program-tests/zero-copy-derive-test", + "program-tests/profile", "sdk-tests/client-test", "sdk-tests/sdk-anchor-test/programs/sdk-anchor-test", - "sdk-tests/sdk-pinocchio-v1-test", - "sdk-tests/sdk-pinocchio-v2-test", + "sdk-tests/sdk-pinocchio-test", "sdk-tests/sdk-native-test", - "sdk-tests/sdk-v1-native-test", + "sdk-tests/sdk-token-test", "forester-utils", "forester", "sparse-merkle-tree", @@ -65,56 +69,58 @@ version = "0.1.0" edition = "2021" [workspace.dependencies] -solana-banks-client = { version = "2.3" } -solana-banks-interface = { version = "2.3" } -solana-program = "2.3" -solana-pubkey = "2.4.0" -solana-sdk = "2.3" +solana-banks-client = { version = "2.2" } +solana-banks-interface = { version = "2.2" } +solana-program = "2.2" +solana-pubkey = "2.2" +solana-sdk = "2.2" solana-cpi = "2.2" -solana-client = "2.3" -solana-cli-output = "2.3" -solana-transaction-status = "2.3" -solana-account-decoder = "2.3" -solana-account-decoder-client-types = "2.3" -solana-transaction-status-client-types = "2.3" -solana-rpc = "2.3" -solana-rpc-client-api = "2.3" -solana-transaction-context = "2.3" -solana-frozen-abi = "2.3" -solana-frozen-abi-macro = "2.3" +solana-client = "2.2" +solana-cli-output = "2.2" +solana-transaction-status = "2.2" +solana-account-decoder = "2.2" +solana-account-decoder-client-types = "2.2" +solana-transaction-status-client-types = "2.2" +solana-rpc = "2.2" +solana-rpc-client-api = "2.2" +solana-transaction-context = "2.2" +solana-frozen-abi = "2.2" +solana-frozen-abi-macro = "2.2" solana-msg = { version = "2.2" } -solana-zk-token-sdk = "2.3" -solana-logger = "2.3" +solana-zk-token-sdk = "2.2" +solana-logger = "2.2" +solana-bpf-loader-program = "2.2" solana-bn254 = "2.2" -solana-sysvar = { version = "2.2" } -solana-program-error = { version = "2.2" } -solana-account-info = { version = "2.2" } +solana-sysvar = { version = "2.1.1" } +solana-program-error = { version = "2.1.1" } +solana-account-info = { version = "2.1.1" } solana-transaction = { version = "2.2" } solana-transaction-error = { version = "2.2" } -solana-hash = { version = "2.3" } +solana-hash = { version = "2.2" } solana-clock = { version = "2.2" } -solana-signature = { version = "2.3" } +solana-signature = { version = "2.2" } solana-commitment-config = { version = "2.2" } solana-account = { version = "2.2" } solana-epoch-info = { version = "2.2" } solana-keypair = { version = "2.2" } solana-compute-budget-interface = { version = "2.2" } solana-signer = { version = "2.2" } -solana-instruction = "2.3" -solana-rpc-client = "2.3" -solana-compute-budget = { version = "2.3" } +solana-instruction = "2.2" +solana-rpc-client = "2.2" +solana-compute-budget = { version = "2.2" } -solana-system-interface = { version = "2" } +solana-system-interface = { version = "1" } solana-security-txt = "1.1.1" spl-token = "7.0.0" spl-token-2022 = { version = "7.0.0", features = ["no-entrypoint"] } spl-pod = "0.5.1" -pinocchio = { version = "0.9" } +pinocchio = { version = "0.9.2" } +pinocchio-system = { version = "0.3.0" } pinocchio-pubkey = { version = "0.3.0" } bs58 = "^0.5.1" -litesvm = "0.7" +litesvm = "0.6.1" # Anchor -anchor-lang = { version = "=0.31.1" } +anchor-lang = { version = "=0.31.1", features = ["idl-build"] } anchor-spl = "=0.31.1" # Anchor compatibility @@ -154,34 +160,38 @@ ark-std = "0.5" # Light Protocol -light-hash-set = { version = "3.0.0", path = "program-libs/hash-set" } -light-indexed-merkle-tree = { version = "3.0.0", path = "program-libs/indexed-merkle-tree" } -light-concurrent-merkle-tree = { version = "3.0.0", path = "program-libs/concurrent-merkle-tree" } -light-sparse-merkle-tree = { version = "0.2.0", path = "sparse-merkle-tree" } -light-client = { path = "sdk-libs/client", version = "0.15.0" } -light-hasher = { path = "program-libs/hasher", version = "4.0.0" } +light-hash-set = { version = "2.1.0", path = "program-libs/hash-set" } +light-indexed-merkle-tree = { version = "2.1.0", path = "program-libs/indexed-merkle-tree" } +light-concurrent-merkle-tree = { version = "2.1.0", path = "program-libs/concurrent-merkle-tree" } +light-sparse-merkle-tree = { version = "0.1.0", path = "sparse-merkle-tree" } +light-client = { path = "sdk-libs/client", version = "0.13.1" } +light-hasher = { path = "program-libs/hasher", version = "3.1.0" } light-macros = { path = "program-libs/macros", version = "2.1.0" } -light-merkle-tree-reference = { path = "program-tests/merkle-tree", version = "3.0.1" } +light-merkle-tree-reference = { path = "program-tests/merkle-tree", version = "2.0.0" } light-heap = { path = "program-libs/heap", version = "2.0.0" } -light-prover-client = { path = "prover/client", version = "3.0.0" } -light-sdk = { path = "sdk-libs/sdk", version = "0.15.0" } +light-prover-client = { path = "prover/client", version = "2.0.0" } +light-sdk = { path = "sdk-libs/sdk", version = "0.13.0" } light-sdk-pinocchio = { path = "sdk-libs/sdk-pinocchio", version = "0.13.0" } -light-sdk-macros = { path = "sdk-libs/macros", version = "0.15.0" } -light-sdk-types = { path = "sdk-libs/sdk-types", version = "0.15.0" } -light-compressed-account = { path = "program-libs/compressed-account", version = "0.5.0" } -light-account-checks = { path = "program-libs/account-checks", version = "0.4.0" } -light-verifier = { path = "program-libs/verifier", version = "4.0.0" } -light-zero-copy = { path = "program-libs/zero-copy", version = "0.4.0" } -light-zero-copy-derive = { path = "program-libs/zero-copy-derive", version = "0.4.0" } -photon-api = { path = "sdk-libs/photon-api", version = "0.52.0" } +light-sdk-macros = { path = "sdk-libs/macros", version = "0.13.0" } +light-sdk-types = { path = "sdk-libs/sdk-types", version = "0.13.0" } +light-compressed-account = { path = "program-libs/compressed-account", version = "0.3.0" } +light-account-checks = { path = "program-libs/account-checks", version = "0.3.0" } +light-compressible = { path = "program-libs/compressible", version = "0.1.0" } +light-verifier = { path = "program-libs/verifier", version = "2.1.0" } +light-zero-copy = { path = "program-libs/zero-copy", version = "0.2.0" } +light-zero-copy-derive = { path = "program-libs/zero-copy-derive", version = "0.1.0" } +light-ctoken-types = { path = "program-libs/ctoken-types", version = "0.1.0" } +photon-api = { path = "sdk-libs/photon-api", version = "0.51.0" } forester-utils = { path = "forester-utils", version = "2.0.0" } account-compression = { path = "programs/account-compression", version = "2.0.0", features = [ "cpi", ] } -light-compressed-token = { path = "programs/compressed-token", version = "2.0.0", features = [ +light-compressed-token = { path = "programs/compressed-token/program", version = "2.0.0", features = [ "cpi", ] } light-compressed-token-types = { path = "sdk-libs/compressed-token-types", version = "0.1.0" } +light-compressed-token-sdk = { path = "sdk-libs/compressed-token-sdk", version = "0.1.0" } +light-token-client = { path = "sdk-libs/token-client", version = "0.1.0" } light-system-program-anchor = { path = "anchor-programs/system", version = "2.0.0", features = [ "cpi", ] } @@ -191,16 +201,16 @@ light-registry = { path = "programs/registry", version = "2.0.0", features = [ create-address-test-program = { path = "program-tests/create-address-test-program", version = "1.0.0", features = [ "cpi", ] } -light-program-test = { path = "sdk-libs/program-test", version = "0.15.0" } -light-batched-merkle-tree = { path = "program-libs/batched-merkle-tree", version = "0.5.0" } -light-merkle-tree-metadata = { path = "program-libs/merkle-tree-metadata", version = "0.5.0" } +light-program-test = { path = "sdk-libs/program-test", version = "0.13.2" } +light-batched-merkle-tree = { path = "program-libs/batched-merkle-tree", version = "0.3.0" } +light-merkle-tree-metadata = { path = "program-libs/merkle-tree-metadata", version = "0.3.0" } aligned-sized = { path = "program-libs/aligned-sized", version = "1.1.0" } -light-bloom-filter = { path = "program-libs/bloom-filter", version = "0.4.0" } +light-bloom-filter = { path = "program-libs/bloom-filter", version = "0.3.0" } light-bounded-vec = { version = "2.0.0" } light-poseidon = { version = "0.3.0" } light-test-utils = { path = "program-tests/utils", version = "1.2.1" } -light-indexed-array = { path = "program-libs/indexed-array", version = "0.2.0" } -light-program-profiler = { version = "0.1.0" } +light-indexed-array = { path = "program-libs/indexed-array", version = "0.1.0" } +light-profiler = { path = "program-tests/profile", version = "0.1.0" } create-address-program-test = { path = "program-tests/create-address-test-program", version = "1.0.0" } groth16-solana = { version = "0.2.0" } bytemuck = { version = "1.19.0" } @@ -228,8 +238,9 @@ rand = "0.8.5" [patch.crates-io] # Profiling logs and state is handled here -solana-program-runtime = { git = "https://github.com/Lightprotocol/agave", rev = "be34dc76559e14921a2c8610f2fa2402bf0684bb" } +solana-program-runtime = { git = "https://github.com/Lightprotocol/agave", rev = "580e29f03e4176a4a5525abc188a948c6595c47f" } # Profiling syscalls are defined here -solana-bpf-loader-program = { git = "https://github.com/Lightprotocol/agave", rev = "be34dc76559e14921a2c8610f2fa2402bf0684bb" } +solana-bpf-loader-program = { git = "https://github.com/Lightprotocol/agave", rev = "580e29f03e4176a4a5525abc188a948c6595c47f" } # Patch solana-program-memory to use older version where is_nonoverlapping is public solana-program-memory = { git = "https://github.com/anza-xyz/solana-sdk", rev = "1c1d667f161666f12f5a43ebef8eda9470a8c6ee" } +litesvm = { git = "https://github.com/Lightprotocol/litesvm", rev = "d4f7ffb0025b73cb75ef2f198121a4e51b725b5d" } diff --git a/DOCS.md b/DOCS.md new file mode 100644 index 0000000000..8e9167006e --- /dev/null +++ b/DOCS.md @@ -0,0 +1,227 @@ +# Documentation Guidelines + +## 1. Crate Documentation Structure + +### 1.1 Root CLAUDE.md File +Every crate must have a `CLAUDE.md` file containing: + +**Required sections:** +- **Summary** - 2-5 bullet points describing crate functionality and purpose +- **Used in** - List of crates/programs that use this crate with one-liner descriptions +- **Navigation** - Instructions for navigating the documentation structure +- **High-level sections** - Major components organized by type: + - For Solana programs: Accounts, Instructions, Source Code Structure + - For libraries: Core Types, Public APIs, Utilities + - For SDKs: Client Functions, Instruction Builders, Types + - For test utilities: Test Helpers, Mock Accounts, Fixtures + +**Optional sections:** +- **Config Requirements** - For programs with configuration state +- **Security Considerations** - Critical security notes + +**Source Code Structure:** +Document the `src/` directory organization based on crate type: + +For programs: +- **Core Instructions** - Main program operations +- **Account State** - Account structures and data layouts +- **Shared Components** - Utilities and helpers + +For libraries: +- **Core Types** - Main data structures and traits + +For SDKs: +- **Client Functions** - Public API methods +- **Instruction Builders** - Transaction construction +- **Types** - Shared data structures + +For each module include: +- File/directory name +- Brief description of functionality +- Related features or dependencies + +Example: See `programs/compressed-token/program/CLAUDE.md` Source Code Structure section + +### 1.2 docs/ Directory +When documentation is extensive, create a `docs/` directory with: +- `CLAUDE.md` - Navigation guide for the docs folder +- Subdirectories for major sections (e.g., `instructions/`, `accounts/`) +- Individual `.md` files for detailed documentation + +## 2. Topic-Specific Documentation + +### 2.1 Account Documentation + +Every account must include: + +**Required fields:** +- **description** - What the account represents and its role in the program. Key concepts should be integrated here, NOT in a separate section +- **state layout** - Path to struct definition and field descriptions +- **associated instructions** - List of instructions that create/read/update/delete this account with discriminators + +**For Solana accounts:** +- **discriminator** - The 8-byte discriminator value if applicable +- **size** - Account data size in bytes +- **ownership** - Expected program owner +- **serialization** - Zero-copy (programs) and Borsh (clients) examples with code snippets + +**For PDAs:** +- **derivation** - Seeds used to derive the account (e.g., `[owner, program_id, mint]`) +- **bump** - Whether bump is stored or derived + +**For compressed accounts:** +- **version** - Versioning scheme for data format changes +- **hashing** - Hash method (Poseidon/SHA256) and discriminator encoding +- **data layout** - Compressed data structure + +**Optional fields:** +- **extensions** - Supported extension types and their layouts +- **security notes** - Critical validation requirements + +**Methods/Implementations:** +For accounts with associated methods, add a Methods section with: +- Group methods by purpose (Validation, Constructors, PDA Derivation, etc.) +- Use concise parameter names in signatures +- One-line action-oriented descriptions +- Include concrete values where helpful (constants, defaults) + +**Examples:** +- `programs/compressed-token/program/docs/ACCOUNTS.md` +- `program-libs/compressible/docs/CONFIG_ACCOUNT.md` + +### 2.2 Instruction Documentation + +Every instruction must include: + +**Required sections:** +- **discriminator** - The instruction discriminator value (e.g., `18`) +- **enum** - The instruction enum variant (e.g., `CTokenInstruction::CreateTokenAccount`) +- **path** - Path to instruction processor code in the program +- **description** - High-level overview including key concepts integrated within (NOT as separate section): + - What the instruction does + - Key state changes + - Usage scenarios + - Config validation requirements (if applicable) + - Any important notes or considerations (do NOT add a separate "Notes" section) + +- **instruction_data** - Path to instruction data struct with field descriptions + +- **Accounts** - Ordered list with for each account: + - Name and type + - Signer/writable requirements + - Validation checks performed + - Purpose in the instruction + +- **instruction logic and checks** - Step-by-step processing: + 1. Input validation + 2. State deserialization + 3. Business logic + 4. State updates + 5. CPIs (if any) + +- **Errors** - Comprehensive error list: + - Use format: `ErrorType::Variant` (error code: N) - Description + - Include actual numeric codes that appear in transaction logs + - Group related errors together for clarity + +**Optional sections:** +- **CPIs** - Cross-program invocations with target programs and data +- **Events** - Emitted events and their data +- **Security considerations** - Attack vectors and mitigations + +**Anti-patterns to avoid:** +- Generic performance optimization comments (e.g., "uses X for performance") +- Implementation details that don't affect usage +- Internal optimizations unless they have security implications + +**Examples:** +- `programs/compressed-token/program/docs/instructions/` + +### 2.3 Error Documentation + +Document all error codes that can be returned: + +**Error format in instruction docs:** +- Use bullet list format: `ErrorType::Variant` (error code: N) - Triggering condition +- For standard Solana ProgramError variants, use their actual codes: + - InvalidInstructionData = 3 + - InvalidAccountData = 4 + - InsufficientFunds = 6 + - MissingRequiredSignature = 8 + - NotEnoughAccountKeys = 11 + - InvalidSeeds = 14 + - (See Solana documentation for complete list) +- For custom error enums, show the u32 value that appears in transaction logs +- For errors from external crates, show them directly (e.g., `CompressibleError::InvalidState` not `ProgramError::Custom`) +- To find error codes for your program, create a test like: `programs/compressed-token/program/tests/print_error_codes.rs` + +**Required for custom error documentation:** +- **Error name** - The error variant name +- **Error code** - Numeric code that appears in logs +- **Description** - What the error indicates +- **Common causes** - Typical scenarios that trigger this error +- **Resolution** - How to fix or avoid the error +- **Location** - Where error enum is defined (e.g., `anchor_compressed_token::ErrorCode`, `light_ctoken_types::CTokenError`) + +**Common error crate locations in Light Protocol:** +- `anchor_compressed_token::ErrorCode` - Compressed token program errors +- `light_ctoken_types::CTokenError` - CToken type errors (18001-18037 range) +- `light_compressible::CompressibleError` - Compressible account errors (19001-19002 range) +- `light_account_checks::AccountError` - Account validation errors (12006-12021 range) +- `light_hasher::HasherError` - Hasher operation errors +- `light_compressed_account::CompressedAccountError` - Compressed account errors + +**Note:** All `light-*` crates implement automatic error conversions to `ProgramError::Custom(u32)` for both pinocchio and solana_program, allowing seamless error propagation across the codebase. + +**DON'Ts:** +- **DON'T document external crate errors in detail** - For errors from other crates (e.g., HasherError from light-hasher), only note the conversion exists and reference the source crate's documentation +- **DON'T include generic "best practices" sections** - Avoid preachy or overly general advice. Focus on specific, actionable information for each error +- **DON'T document ProgramError::Custom conversions** - Show the original error type directly with its code + +### 2.4 Serialization Documentation + +When documenting serialization: + +**Zero-copy (for programs):** +```rust +use light_zero_copy::traits::{ZeroCopyAt, ZeroCopyAtMut}; +let (data, _) = DataType::zero_copy_at(&bytes)?; +``` + +**Borsh (for clients):** +```rust +use borsh::BorshDeserialize; +let data = DataType::deserialize(&mut &bytes[..])?; +``` + +**Note:** Always specify which method to use in which context + +### 2.5 CPI Documentation + +For wrapper programs and CPI patterns: + +**Required elements:** +- **Target program** - Program being called +- **PDA signer** - Seeds and bump for CPI authority +- **Account mapping** - How accounts are passed through +- **Data passthrough** - Instruction data handling +- **Example code** - Complete CPI invocation + +## 3. Documentation Standards +- be concise and precise + +### 3.1 Path References +- Always use absolute paths from repository root +- Example: `program-libs/ctoken-types/src/state/solana_ctoken.rs` + +### 3.2 Code Examples +- Include working code snippets +- Show both correct usage and common mistakes +- Add inline comments explaining key points +- DON'T include print/log statements unless essential to the demonstrated functionality +- Focus on the core logic without debugging output + +### 3.3 Cross-References +- Link to related documentation +- Reference source files with specific line numbers when relevant +- Use relative links within the same crate diff --git a/README.md b/README.md index fbf1ff99c9..15a0b6bb74 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ [![Twitter](https://img.shields.io/twitter/follow/LightProtocol)](https://x.com/lightprotocol) [![Discord](https://img.shields.io/discord/892771619687268383?label=discord&logo=discord)](https://discord.gg/WDAAaX6je2) [![Workflow Status](https://github.com/Lightprotocol/light-protocol/actions/workflows/rust.yml/badge.svg)](https://github.com/Lightprotocol/light-protocol/actions?query=workflow) -[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/Lightprotocol/light-protocol) **The ZK Compression Protocol for Solana** diff --git a/anchor-programs/system/Cargo.toml b/anchor-programs/system/Cargo.toml index f6934a0909..3519fd65a1 100644 --- a/anchor-programs/system/Cargo.toml +++ b/anchor-programs/system/Cargo.toml @@ -5,7 +5,6 @@ description = "ZK Compression on Solana" repository = "https://github.com/Lightprotocol/light-protocol" license = "Apache-2.0" edition = "2021" -publish = false [lib] crate-type = ["cdylib", "lib"] @@ -13,7 +12,7 @@ name = "light_system_program" [features] no-entrypoint = [] cpi = ["no-entrypoint"] -default = [] +default = ["idl-build"] idl-build = ["anchor-lang/idl-build"] test-sbf = [] diff --git a/anchor-programs/system/src/cpi_context_account.rs b/anchor-programs/system/src/cpi_context_account.rs index 737d90065c..804c980d77 100644 --- a/anchor-programs/system/src/cpi_context_account.rs +++ b/anchor-programs/system/src/cpi_context_account.rs @@ -41,7 +41,7 @@ impl CpiContextAccount { } } -pub struct ZCpiContextAccount2<'a> { +pub struct ZCpiContextAccount<'a> { pub fee_payer: Ref<&'a mut [u8], light_compressed_account::pubkey::Pubkey>, pub associated_merkle_tree: Ref<&'a mut [u8], light_compressed_account::pubkey::Pubkey>, pub context: Vec>, @@ -49,7 +49,7 @@ pub struct ZCpiContextAccount2<'a> { pub fn deserialize_cpi_context_account<'info, 'a>( account_info: &AccountInfo<'info>, -) -> std::result::Result, ZeroCopyError> { +) -> std::result::Result, ZeroCopyError> { let mut account_data = account_info.try_borrow_mut_data().unwrap(); let data = unsafe { slice::from_raw_parts_mut(account_data.as_mut_ptr(), account_data.len()) }; let (fee_payer, data) = @@ -64,7 +64,7 @@ pub fn deserialize_cpi_context_account<'info, 'a>( context.push(context_item); data = new_data; } - Ok(ZCpiContextAccount2 { + Ok(ZCpiContextAccount { fee_payer, associated_merkle_tree, context, diff --git a/anchor-programs/system/src/lib.rs b/anchor-programs/system/src/lib.rs index 0d196ffc8a..91b80cf794 100644 --- a/anchor-programs/system/src/lib.rs +++ b/anchor-programs/system/src/lib.rs @@ -1,4 +1,7 @@ +// Allow deprecated to suppress warnings from anchor_lang::AccountInfo::realloc +// which is used in the #[program] macro but we don't directly control #![allow(deprecated)] + use anchor_lang::prelude::*; pub mod account_traits; diff --git a/audits/accretion-pinocchio-audit-06-2025.pdf b/audits/accretion-pinocchio-audit-06-2025.pdf deleted file mode 100644 index 440813ed7ee786414990ec809455d767498c47cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140112 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 MAGzFMG5q8I0>16lC;$Ke diff --git a/audits/ottersec_refactor_audit_final_06-2025.pdf b/audits/ottersec_refactor_audit_final_06-2025.pdf deleted file mode 100644 index 5b65bc4a3ae1e5f696d681aa6c9397630549f26d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1015640 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