├── .dockerignore ├── .github ├── pull_request_template.md └── workflows │ ├── ci.yml │ ├── publish_crate.yaml │ └── publish_dockerfile.yaml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── Dockerfile ├── LICENSE ├── README.md ├── generate_api.sh ├── openapitools.json ├── src ├── api │ ├── api.rs │ ├── error.rs │ ├── method │ │ ├── get_batch_address_update_info.rs │ │ ├── get_compressed_account.rs │ │ ├── get_compressed_account_balance.rs │ │ ├── get_compressed_account_proof │ │ │ ├── mod.rs │ │ │ ├── v1.rs │ │ │ └── v2.rs │ │ ├── get_compressed_accounts_by_owner │ │ │ ├── common.rs │ │ │ ├── indexed_accounts.rs │ │ │ ├── mod.rs │ │ │ ├── v1.rs │ │ │ └── v2.rs │ │ ├── get_compressed_balance_by_owner.rs │ │ ├── get_compressed_mint_token_holders.rs │ │ ├── get_compressed_token_account_balance.rs │ │ ├── get_compressed_token_accounts_by_delegate.rs │ │ ├── get_compressed_token_accounts_by_owner.rs │ │ ├── get_compressed_token_balances_by_owner.rs │ │ ├── get_compression_signatures_for_account.rs │ │ ├── get_compression_signatures_for_address.rs │ │ ├── get_compression_signatures_for_owner.rs │ │ ├── get_compression_signatures_for_token_owner.rs │ │ ├── get_indexer_health.rs │ │ ├── get_indexer_slot.rs │ │ ├── get_latest_compression_signatures.rs │ │ ├── get_latest_non_voting_signatures.rs │ │ ├── get_multiple_compressed_account_proofs │ │ │ ├── mod.rs │ │ │ └── v2.rs │ │ ├── get_multiple_compressed_accounts.rs │ │ ├── get_multiple_new_address_proofs.rs │ │ ├── get_queue_elements.rs │ │ ├── get_transaction_with_compression_info.rs │ │ ├── get_validity_proof │ │ │ ├── mod.rs │ │ │ ├── prover │ │ │ │ ├── gnark.rs │ │ │ │ ├── helpers.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── prove.rs │ │ │ │ └── structs.rs │ │ │ ├── v1.rs │ │ │ └── v2.rs │ │ ├── mod.rs │ │ └── utils.rs │ ├── mod.rs │ └── rpc_server.rs ├── common │ ├── mod.rs │ └── typedefs │ │ ├── account │ │ ├── context.rs │ │ ├── mod.rs │ │ ├── v1.rs │ │ └── v2.rs │ │ ├── bs58_string.rs │ │ ├── bs64_string.rs │ │ ├── context.rs │ │ ├── hash.rs │ │ ├── limit.rs │ │ ├── mod.rs │ │ ├── serializable_pubkey.rs │ │ ├── serializable_signature.rs │ │ ├── token_data.rs │ │ ├── unix_timestamp.rs │ │ └── unsigned_integer.rs ├── dao │ ├── generated │ │ ├── account_transactions.rs │ │ ├── accounts.rs │ │ ├── address_queue.rs │ │ ├── blocks.rs │ │ ├── indexed_trees.rs │ │ ├── mod.rs │ │ ├── owner_balances.rs │ │ ├── prelude.rs │ │ ├── state_tree_histories.rs │ │ ├── state_trees.rs │ │ ├── token_accounts.rs │ │ ├── token_owner_balances.rs │ │ └── transactions.rs │ └── mod.rs ├── ingester │ ├── error.rs │ ├── fetchers │ │ ├── grpc.rs │ │ ├── mod.rs │ │ └── poller.rs │ ├── indexer │ │ └── mod.rs │ ├── mod.rs │ ├── parser │ │ ├── indexer_events.rs │ │ ├── merkle_tree_events_parser.rs │ │ ├── mod.rs │ │ ├── state_update.rs │ │ ├── tree_info.rs │ │ ├── tx_event_parser.rs │ │ └── tx_event_parser_v2.rs │ ├── persist │ │ ├── leaf_node.rs │ │ ├── leaf_node_proof.rs │ │ ├── merkle_proof_with_context.rs │ │ ├── mod.rs │ │ ├── persisted_batch_event.rs │ │ ├── persisted_indexed_merkle_tree.rs │ │ ├── persisted_state_tree.rs │ │ └── spend.rs │ └── typedefs │ │ ├── block_info.rs │ │ └── mod.rs ├── lib.rs ├── main.rs ├── migration │ ├── README.md │ ├── main.rs │ ├── migrations │ │ ├── custom │ │ │ ├── custom20250211_000002_solayer2.rs │ │ │ ├── custom20252201_000001_init.rs │ │ │ └── mod.rs │ │ ├── mod.rs │ │ └── standard │ │ │ ├── m20220101_000001_init.rs │ │ │ ├── m20240623_000002_init.rs │ │ │ ├── m20240624_000003_init.rs │ │ │ ├── m20240807_000004_init.rs │ │ │ ├── m20240914_000005_init.rs │ │ │ ├── m20241008_000006_init.rs │ │ │ ├── m20250206_000007_init.rs │ │ │ ├── m20250314_000008_init.rs │ │ │ └── mod.rs │ ├── mod.rs │ └── model │ │ ├── mod.rs │ │ └── table.rs ├── monitor │ └── mod.rs ├── openapi │ ├── main.rs │ ├── mod.rs │ └── specs │ │ ├── api.yaml │ │ ├── getCompressedAccount.yaml │ │ ├── getCompressedAccountBalance.yaml │ │ ├── getCompressedAccountProof.yaml │ │ ├── getCompressedAccountsByOwner.yaml │ │ ├── getCompressedBalanceByOwner.yaml │ │ ├── getCompressedMintTokenHolders.yaml │ │ ├── getCompressedTokenAccountBalance.yaml │ │ ├── getCompressedTokenAccountsByDelegate.yaml │ │ ├── getCompressedTokenAccountsByOwner.yaml │ │ ├── getCompressedTokenBalancesByOwner.yaml │ │ ├── getCompressedTokenBalancesByOwnerV2.yaml │ │ ├── getCompressionSignaturesForAccount.yaml │ │ ├── getCompressionSignaturesForAddress.yaml │ │ ├── getCompressionSignaturesForOwner.yaml │ │ ├── getCompressionSignaturesForTokenOwner.yaml │ │ ├── getIndexerHealth.yaml │ │ ├── getIndexerSlot.yaml │ │ ├── getLatestCompressionSignatures.yaml │ │ ├── getLatestNonVotingSignatures.yaml │ │ ├── getMultipleCompressedAccountProofs.yaml │ │ ├── getMultipleCompressedAccounts.yaml │ │ ├── getMultipleNewAddressProofs.yaml │ │ ├── getMultipleNewAddressProofsV2.yaml │ │ ├── getQueueElements.yaml │ │ ├── getTransactionWithCompressionInfo.yaml │ │ ├── getValidityProof.yaml │ │ └── openapitools.json ├── snapshot │ ├── loader │ │ └── main.rs │ ├── mod.rs │ ├── s3_utils │ │ ├── mod.rs │ │ └── multipart_upload.rs │ └── snapshotter │ │ └── main.rs └── tools │ └── tree_validator │ ├── README.md │ └── main.rs └── tests ├── data ├── blocks │ ├── get_lanon_voting_signatures │ │ └── 270893658 │ ├── get_lanon_voting_signatures_with_failures │ │ ├── 279620356 │ │ └── 314167369 │ └── index_block_metadata │ │ ├── 254170887 │ │ ├── 254170888 │ │ └── 380876342 └── transactions │ ├── address_with_nullifiers │ ├── 3TEXdBWMdMt676EdSHfPKoP2tVWrenpQpQYuD4Cziufm6LMQ5ABsPSYix77ox9U6Vc1CtcgUSciZhsxpKCFHw9JT │ └── 5n531J7yLGAykHPtX12E4sXPr6GMzvZJFmxyJd9z9ZpS965nGmBCM3nthRJ3LpXSVsgc4Rxgr55tLPo5w6dpW18y │ ├── batched_address_2_transactions │ ├── 216FhX7NHcoe85ftwL7QdiRpT9vz6pJK3NqGGW1bDy5mPFg7UvXsKxZgMmwXjN2iexsXzXdvqS33aL65jjwWyeTU │ ├── 26zcjw7nMDsX4UpdwqFnzDsrnEVV2tFSQuSRLR85ShpTsd5iNqpGBBXVh6Gb26LcA9gLoci9R7upc6jqWkvmSH4E │ ├── 29QDyrBHUYsJoJFGbef9YE7tytMaZuhVreC1j2keoaqMwRjjKjXgWzoqWoH6QkWxBraKfgqxXCpPDWjZvZdFAiNs │ ├── 2CbhsgcB5pqk4wXyX1FQiW2pGGiDJVf3nH8LAsPQ3ubjMn9KWtXivA1idShp11rEym6vwAZBQmmUrrC8xKUdpU8f │ ├── 2GCTjTtDtbc1gtFtxxTafFEvdR4XqHEjgLK1JWxiTT1fHooD8o73ug6UzD6fqEWKZPwMUvXXpq3W4wjS2SLMt8F2 │ ├── 2N4oZfEJo9SPV5vgUCutUFYDFfEu1mzRRnGhKmzY7PzaRHX3YufGU9zjRd3U6Z7ggwkwGoAQf1ZjJiwCNPwFQxmb │ ├── 2VTeevyuREQW7CPYJh5WPDtNb8e1T1YdTNBa1y2qC8Xk1BQPaRTRehP7MKpm9sebw8TiTU3nrPMa1fneVCuAk8Vn │ ├── 37gEu5455AYpvX4yvY6EXS7XiMW9dNgZapiwyNe2fNpcrzWS9S4w38qrjpEw9CyFq9VyQVAtUYbj1VAfWuJxAb2E │ ├── 3NedZ2zui6oWA6W5jx3k3RMBW6Gc85Dkwxhen9p9ZHst4DxZ6YNVPTzWnbc2aXb324ryGiFGzWmSMDV4b9ztU3pH │ ├── 3bKBmcXQGSuYZtwZsASMaUFshcedaGzASzL6W3oq71aMAdnNm9SmpWgn6ahRnJFnsg8eEaeUEpg6Ncowsnf5UFVz │ ├── 3fUMjpGtK2bjZNxW9tGzkUHSghsMaCQE9Khw4PqT6eD9G3osgffBAR112PCqpEhZBn38VboYgPSyNNuhNPiqg3mC │ ├── 3ghwzxeaEi4mCgMgwNzCmYmkgpCJxJfBYb74P3aAz91YZDyixeyYuNCXbVZ8ndzSZ9f9UUeDA8BpygTUFsb3ASKg │ ├── 3ikLuwcdkrSiVihgHa57VtKSWJ2awMt5mWA8UEHzghj91VSdyD4KTd1S7T6amJMHSdpEqVZ6qgU9mMhVgmQ5Lcm7 │ ├── 47GL2cvq7ajtWL4HCfXqxbSCfg7sVzQE67KVKVUsj3P8qUaWrHAHLahhCLJooF72uNdWLPKwaJo5oUbthKPaF36Z │ ├── 4GCtza8BdyVqjwXsRtdvtDSCvnmwfHSeu1MbCJA6BLSP7xRhgsqvLdqjkvg9MrGSyemqtauBhTH1N5A3HVcQ9Exp │ ├── 4HFaGpkAwXy1CC2xjrWn2NJ2hH6J1qJnrYbFq4yGJLpLmyHNxPdnNiLPfRmfzBNt1HzZCz71exf2c1GN2xRXjkUv │ ├── 4HiNVuTUYyQscgNJirxmTarfBWe8uhpFJucyMPMN3zDQDK4eqpu76Nk88ufXJ8jxivMJgpfjtNNnNPdsJU8zZBsX │ ├── 4QJyURr7vPzW3WATrUMcdzX7G1UVothZmA6fPGm6RxabVRA97A4mwjtWQv7mhrnqaCYUpvfWSv4xayrBtu89fYBR │ ├── 4gAUzeerimSzD8tvNmVZbaBtzVgn1vgRaWRjTGGpxtMXQjN2hm1asN4dPGLSXVMiJ8ARJ3xpaaSYWs3Z4oxkbstL │ ├── 5BMYX2YFEyAwjwTv1sFGbQqMxRgbVgSC4HNKLn923ohShyjJYtJrYKwhQibg2vKRT6bFMUeTb54PSr9V8pAeL4eH │ ├── 5G7HF2woR6pq8C9SukrY5ALfCBxsWYFGUNhTYwYaYNEC3uZ3UB2nksaCSda8UEZiNmAmZ93yvZD9b4NfQzkkb12p │ ├── 5HwiW34rLdK5RX4K2b2dqvHQ4mH3fc4KJexeuSiPMzti9t9CQwCJnmJ8YBf5WWu38To2cqkwZ98H5K7BtYPd2kRi │ ├── 5KguVEPgBfCfRFic9F7rVzG5QFtdBaB6qGJzuyTEXAcfD3FHpQJZ3ciUDtrWc2LXvn8YiR1mkUTbHu5pMkAdQonh │ ├── 5jvkP9EfdrikMQw42bSb5k4mqs7bNR7EYPvFDbAmyBETCGoZcSYWxCHuwAYtXzct3aSgT82GmyY137ej83y6u9a3 │ ├── 67SXHRDytNSCLrgyrieGGw2WvszVmtYXYhA3FT4iLZdFiLRZiQwV7RcCtDnhw5x3p7ELR28QEyusCnB2694v4DUB │ ├── AsT27sgRWJojJVF5i2KFbUQdK4VUouymLdz3jnkDFqpEZbf8gapqVch5UhGwnnY4X22HpepEYfT9F919mRFHa9t │ ├── HtJzPJ6KtR6SVfhw7qZkP6H28yXfQfFcjPtW37LxcsWBkB6i6v51jSECbjqwqVXK5zRKG32R2VyEk4y4uKkvBT3 │ ├── eyCHfX86Ctcx66XvAm9qypvnpdbBAkAdXvVEo94piCTwtX5ibeMFSEiFVwbasWJhmM1jxSoAd6wgjyTBeP5DsXP │ ├── kKZuzAAY1AD4kSiGy7ruPRNs3bNnfNRqKKpn3cN4tdX43EdfRm1RJvuLFmd31rqxjXtpUHZQUybG7wPc9b8veiJ │ └── pJXQJhLigSiSYHPeefXgPoPZJLjEQaVJNk4h9yXKAGbZFaD86yZdx2DLL9REPmYAkkCiUCvoPdKAE8Nihd66QpL │ ├── batched_address_transactions │ ├── 28UoL7q1FTXsRsbnEWg9sxL6B19UTLcqCPd4LdgLhLkepm5JLZaadNC3rAttgrVSU9WeFKz5AbkYGti6KLRMQzww │ ├── 2DTQAnLmg9cNpae1NWMbWzzfDxJumNN5YyJ5wDa7MDvjqoNarpv3QRYPmgF5HJX6wkFk7Yu3vH8mN8NBCRqP8xZT │ ├── 2RDkEEm8gkWDWh2EhoCkK46tJXzFbKiC79hooQ2R8azkvwL1ebyWEsxVxNt87fBq2DoY8DDLNfpjTRTpAWqJX3Z3 │ ├── 2V5rvhHpHYE1Sdn8LFRE8Poq1WSc6D9xFcfSLg2AKRgcFU4BXrSshJAETcZAqiFu2Yv4YN5NgxHZQzBvqD5jtWps │ ├── 2VLkAZf3Py8mhRKG9CBXNfemspfvqdC6d65NpvJ5g6aPHvaDdodDvoqgCQZQ5G1j2uRWXfgUaqTroggY6DmwMCv1 │ ├── 2ZSHQwJcMmJ7cKyDzwdeySnTRpvdBiGKPtcLnRmgXA72EJJ3Gtef9n2Gsa4VSFQmWAYipECUssDpsJgYQ7marv2T │ ├── 2bMJGMSBMCRUndTtXTn9WUfLppqeu7FY2ajyyZmnn7fi2UWRgzaACfGAzB7h9oUBeQZ4Rhfrf7mHPYL5Vy69LPdx │ ├── 2de7214YovQxkVgLRT6LZKLwYvsymHzdaAvv5pcyqXcGwNxhLDNdHcYaTTPGkHbPAPLyQ2XiYfCWg1CDc6VCQyjX │ ├── 2yhWgU4uttKkTJubKWyzxEoRWUybSS9tQrFHk8nsi51c9dizMLcGWkxYWMKNANWejtSxf88Sm6byQbAqLnyLpDES │ ├── 34BwwXKuxGrEvq83QuCxyeVjkXVNWMKv43m4fkEp1WdhgQJP1LDUBbMmSaCWGN884K6PERCKXcLAmWfg4sm5dVHT │ ├── 393ck7o6AJhrbZknSoAw8EmnCNHZBmqkjijpmhbYtt2CaNSm2TADuXoCYZaUgRna1e75QxfAhghUR1bUZX4nqiVz │ ├── 3BLYcDdcHVTS1vLFRum61foE1yNmzX8pJQNjnEvV5m4j1v1hkesZgYS5RFfKF8pxUptEStYkVwjq52AdtmY67sSp │ ├── 3JAwERZpZkx26yykujeKNtxtNhGBLoWoUFjyUgMVp8657DT8VgcVu12rMMAbA4XRAELq5TkLsqL9GHDY253Tq6oG │ ├── 3X5fVCUxsDW6CaM6j9fAQezeXyJv9f4TgpfSWQEEtVfEniSqXzCtYyiDN8fRnKBQgQAfXgoapGR6Vm89kTcoD7aU │ ├── 3cURDZ4xXm6mA43NAYdX7xzrpTF57wnXzkTdAWCcQQVuCgYv32gF9hDBezx2R7bLvS4uAufwcmbuUp4DJZErfGrn │ ├── 3h9nsd3ibtxTAHTThZq9hM6UnVxNKXwaNrfTfpaZPQ8v5c42v2KQR5i4CEY4fRF1V5UZEZKkUYjEeBnXcKTYVaHs │ ├── 3nTh5T3eZ9ba99b1uqeu5rxJNLSTLWPhRw1fouLENhirCvD93woygJnNGDWMVVo6uzrvqBVSmrXnJL62PanfnJbe │ ├── 3qHnYhVPpji3jjhoXQAvhgyupJfuvx2J8TWFsWwVfSrxDdGywoDcE38PdxtWEVChgfDLzgMwDAXHus1hH7AfqjEt │ ├── 3yRtxsSJZCsXvKJpkGaDYWxYwCQysssLtg9XY9Qftftui2QNesjguatfG9QXhTHA4frtXYoGiiyMF5Jahqn5hAAR │ ├── 41EavvJ594A3j8Do8N7jJLmhGw544zGBje9Yx4vaDcXxLaMPM9rodjjvAL6SNB1rFyDfzZjguRUpsS4wjdBugAd1 │ ├── 44G4mh8T6WGCAuvufKLa8NUsiWffWuhDF5LiR3iJ8DNDatAZhzAufCz74DEYqLZfddVVSPR6Wh69ndEJbG2nSRVv │ ├── 4D3KVZTjrAtBR9gebtXgxrz3ERhgyBErM6rXzZMCKegCY915it7bmUxbpCpFxrXRSupZBWSYrVf5Kg521CdrKBip │ ├── 4DwVHAw91bDyCJnWcuGEqax3wJCmKaKgmhzFbAZ6y3k19SHHWsy1fvHkthunZ1dXcmiSgWArfEcJxuYEde2JdAdJ │ ├── 4JSfGv49Ltusd2AFYsiHi9nq1coLXy9qyLtwEhj53YTrbTQXH7DgrJtmnqwjjTex2E9fJZoCrSTaMofgLtqD8w2T │ ├── 4RncggqXKm85BWe6WviCBape2nbQZzCaFHTeqZKiYstWF9quFWv1xQoqZw3zZjHg3zjkQER3uidujFCDdMzd8mq6 │ ├── 4i72rF1xYCn1GNqJfBaLd27dno31b2TBGcTpies9fMTowcvyKoE6y458CLW7q5MRyA4vvHG9wfwbhM4tqkQW4XVN │ ├── 4nzEKjYGGbuV5LqJ7Ewk3diBTfDu6PEV6Ts1dicC3GzwYAk67rwTx74DYiVV2fD9vpkiGxfJLvkvV84Loeu554EG │ ├── 4o6BQVTmYBWxVqqzF1mb1bJ83aMfMH1QBgnj2HsqPhj9AHDXMnVeMxNq8AeSWNdedbPDYHrVdUnXm6LvTgmYBPAg │ ├── 4up8YnW3J7eBvtiUykPftyDTrn6MhEQuPWRxQZFrs6RqSgzegXKsuJcFp1g8XGDs1svgfC65UsWTJ6vQ1sjhDqYd │ ├── 4xtjise6WXFFmUmetxQRpZiaF1Rbu8dkoTEJgVFmFAuQor4Capyo5crP5zvUAWzWQybxvgJQihJBZGQ3CjreREGP │ ├── 4z7wWPXwbKduPieGnHPLyRDMhzPRoSNiJAyYHw6gLyWogiZwDWrB29fVFcYYMRq62HtcZZjrbLZ2BezzpQj9yXv9 │ ├── 55hjNcSP1pud2VrdYhsdoDdc3PHsfATsxQkZnJTP4UY4gn4a5E1f7Rh3cUNhZAgsix6SkLbPWxrQiz8QwXvqQ65r │ ├── 58wDzwBQFz2V2LKADdB7GW1vHBE4rtRCKDEj4R5e5vZm1v2ri3LfiDwqMyp1GiLxGE5sJyxL81iHgEXbasqsuYR2 │ ├── 5Ak2sBnv3srfpmLa7quZ9n3GPUR6zSPGVtAHn1KbMJTpNyukczwv7pawHYvxF4NfgeAHRG7hWcS2dECJugyf6EZ8 │ ├── 5D1E7HWdUjjjRd2Yv37xrhRV8tziAYbH5dMVTogY54rzZontXEFx7qTUFJd4nPy6m4teKLAcBMb6qGKAYdCsZEfR │ ├── 5QiaGFFLVCbGjLgWvFeUqJCjZWy7vG9ZvYcFUAqsQxbo7wt8z8MNnYi9J19yh8pFTVW7s3XkNVWLx2Jr2rBgVEiX │ ├── 5SbDvA29FQhi1Av7Lmi4zjE1LLLMu28pQMAAuHYaLbdwLEHdA12xeVe6CU815p1spp4mnyaQALvuWcAXkMD3ZwL5 │ ├── 5VoX5LcTKACd8bkuLvu4yCszs2RNQkY75c7gHr97c6Bj5KXwyVxw8CFe1hBtmmv6zePjh83qUmwEfJP8MKvDvBzB │ ├── 5VtMW9jpKqzWesQF6hEzdmgDJvNJcG2JCVMr3FHP46QgSVrEzFyXni7wbzsWmvFGUcJTqvTMCoMPJjb79jmXs3cU │ ├── 5aV4e9vkYeARVoHWHrMZLoQiK4gxCACvDtsf42PL6AvdNUBkYjq9mMCB95HjMFhKriMyLaWDxBDQiv3jjjz8At9N │ ├── 5bJoMRz2zCJ6ZhaUUVK4eNGWUjFuHiwHBDtDu142eoJcZ96xKnaXVmNHqBDkbd1LEzsR5fC2JX7LAqud6vuMEBqs │ ├── 5byb8WTZQYAwT3UF6q7X19KQiisLFRKrSvGnH1euro2CutmGDcWiAWosmDAkLkCX2Nr4UMGELQoXT6NsvU1tR4wo │ ├── 5gicCEJ1DwiAM8GD9SwPtyFFJ4mpLUx5LcCe1fvcDRqvbnenEWCrAZ1EA1anAoySP4wgEhfwBrXaU3ssgbBaEwTv │ ├── 5iMsuCdLU3dBuVzAtRu1jZoVZP7Zp1GodV3aWaGaia8sZV7VRhWjCHumAh3WXqqaEdWDYwPbNoVnWkwW2Gq2b6Ms │ ├── 5icgw5bqFvPL44YzFhmps46EwsHBdqZxSHTdmSaZ4eANyboDcp3mmKnr5L8LyWVBmDi1d9eLXb6MnwgJGKAczDRv │ ├── 5yshbjucroxowGBiEp2fuPDM674UZUSmhYx1GhqWBwT2TU1Rw6tcfRWtusxeH1wXyVy5X1iojJKvxVuXHUxh3GTR │ ├── 65LymNk2ipP9e4XDZSSH9ikAd7q9TGcbeStt5x2EBnz11VBgoHjagAhZ9bFU4Kau2a86qU1hePpEPEm1tggD3o9G │ ├── PFp2Nba6UE7TZ7ZSzCfGFskeCeibYS8yZTH1UR8VQq49b5FcLRqM54hA1BX5APqNLwELPuFxBpGiDjiinoEHtvJ │ ├── ThDdJpiKP3o5f2YGZAqqHXYj3nhFQpW1Sq8RLLNsvwLeSDz4xacaB8bsiFZkWVzvMjBVzw65gQrMfdWSEbWwMTR │ ├── ThV9PGpdpX9eFuXYKsncwnfCPr2J4k8JgUxaP3M4nF5Ab2yPxHPmtm8LfsqUKyfxwKc45EATjSt6ZmgBpjAYhzR │ ├── VnUYEWYsZTHgahy152W4Dojbo8URz2ZGypTrmN3Ssw3R1mAxWnmpzynJu6aioXhC7STePyiLxa56Pg4pHkV2vUo │ ├── YuVNeH1RWKZbRu5qk3AF75nWGR5ehpM4WDTw4jeMZxr8QRreLZkg8NtsZPWn9oMymTU3nrs9gquaM2UMohxB6uK │ ├── aaGxqtYEDKbWuo2JkmmwiVmWer7wMPAs3KGbfyGCNiKRtt9yprJS5hMbBY49cJYPCiuCahmCQKN7qzSrbZaR86Q │ ├── cvET1U2LFURfu7PaVkrKSt7WjnN9JnJg81mNEkzzqSwxVz3LYmiyUuBSBAMnHN9uh6CUjDaTLHgjhK43UQxbBHR │ └── pTUW9ytome5y5cFoG2fTs9qgTYysMkL7nVkrJeT2NV8yGpotwA68FitHwpqmp4vvW2j5xhAYsiQpJp5aKThdT9w │ ├── batched_tree_token_transactions │ ├── 2aywxHHakkzp7XUbH5y2pgBe85AQXYGFxnRSJNnrFcHmEMa9nqCND2ZxB5mU2ip9pKzDC323whQPQ6GznXhJSzh2 │ └── 479JQtTnp7yrqUUMA4daPK1MVXEkvrK3rsfzKi1bYBcGnkMHf7L9CrzDZxinU91uTBtjZ5xnmAYW83ZG9xkvTAff │ ├── batched_tree_transactions │ ├── 221TsAnBdx5jFhSfALmXFfSs1KSPPaPcTdyYkxm1CzVsmHDPNS6mhEEb4ZiLQ4r9EQzRYbetcXaAhAnn9yF2pQWH │ ├── 23qV8imre4HV96mn4x45age9F4GG9cYU5y5FNoxaaHPprUwnAvtocPX4UsfogzEPKqavqEMBhoVR5fDcpp2wsrmW │ ├── 2BkBJEMgJQZ5mKqQQDMhPaA7cXUF9PYCDTN4YeJPSKrJNwgUPbprpveSDMN147KpURjdTBprMYHxKAvcpPjbayMH │ ├── 2DPRhvXPzyDjn8qDfwHuBChQ3dmbmowEfC7dWJ7cUYZteHoDSWQfUpTG8pR9E5YCm7JexF5PZJ812hGmp9CNU3yg │ ├── 2DkZrkz5iXEPenPAmDGD8P9t9ZiPCJdkgn8sxBoq9tNptgXz6cxsy4ruyLATjf5FY2Jtb8y54aASUsUDT21Kckcy │ ├── 2GbaUHwnFoXi5SdwRpuTgm2yDU8n4qn2DN4azkqToGVqEHJUcwWELj3XMTJubugaA1JCXZVz6iJw1KXf7GEd2Cvy │ ├── 2LMkyhXszbwy1msEo2oKGx1hcTkGFzQ32hRREarKqJAT9wWNabpN9yWBSPYfVDg5qeJAxpLcoYPP9ka1iyPdFNe9 │ ├── 2Pf5VXFcs923yU2mQipBJJ26FQn6DLTTHyN7J4nkoFKQU41U1dFEZSUQPGV1wxnug2YWxtwQz4YPWMU844nnRzK2 │ ├── 2VdNCqLtrJSxcYRSZYYeDw3EcWsyD9E4Kb1UugbtruKKQLP35vQFeoS7oPUajsKFy9YN2rBxTKuznT3Ve4RLA4N7 │ ├── 2WQyM33SrYwyytBDhzEVD553JANk3oFJCLEBYvTCxEmAWbdwxmTLxAr2iVaN8iSYL1HzKoKyYxVqmxMwYpxdAYBb │ ├── 2Wy4nNvRG6g49QH7ZZkNouhocMdaqXFg2kGbL9N4XV2gBy9purj4k8PwGvfrRizqMBetq64Xny2yP7uKzFCfhRrE │ ├── 2Z46trc328DmXFwqEsKn2z9cmKeNymKEd5ND96KsP5UGZBAZ3AibTUWnSbFocRi1z3D6zfDq7ZJrWJ1AupGisAdW │ ├── 2ZZuqLgu6jYfwx78h8bHREpBuxEgwpM62gJh6sjMUna41XGqDJkMe9w2d6NnPJPwvUxS2qv59yFwjKoCRgdMt3i │ ├── 2bAqyNCEdZyJzmAzyX6j4MqiFw3ur2GYCEKJon7wigGnYxvw1A9b4ZE4JDWbtcbR5DyfcgkNLZuCwofqP24fbh3i │ ├── 2biuf7Qw1gKVfE2WQ8LwhQv1jvfTGxYBc2JxeqYbCqvSrE7n5Fz8KprcLwci6NcfY3h2jNK5XmBiMsmuE4cqwrej │ ├── 2cn9SkNFaMFunpe9B6P4JYHEZTsUHpmkV8wpHYfmcgbHgbujwRT7pk9QPeTmeouXD7MPbpPqkKDm9boZsRFv2gnh │ ├── 2cum9GDi9wGjQyohhiJnNCejW5YvQrxBVT5AYXFpYQceb27JTJFQutHZfBDY8F8w6euVV9h1PGXCUWoLQpr7QrQR │ ├── 2dRJHeED1UG9fVmwjND5PvncGbG4JpGKJCa663QDyQ1rd4bJdPW9Wtt3YthYGKkwGC4xXnYViex2412saadLrv7W │ ├── 2gQzy2K4GVKgpTyVrfPMkUzQZ9M56EtFkdwvi7vXwBeBB2dvqcWkoVc4HdGYGfUAjW8R89MFrnLJkhSfNvgYbwYC │ ├── 2gzWSVSqFCfa4bU2PDKcHdtMfZ7M1864ci12A5uW9MCHcjCEm8eCq2HufWtvqNiSnpkjcK16Ewc8LAZKjYwZjqn3 │ ├── 2hRiDRdvBkoRApZmQckH7ftjNbqkRHahKMgMLV1Do3aVCcjEaXCr6uA6v7fZJ7cjhKc4vaz5YjHMKYcigTRsoGMK │ ├── 2jWYcewUY6hyULzYuNE66XBrhzk3iv45qbcF9ZBFVw4iPaFNZ6zD7ja5Ho91yzmAyCPNytWPzxtaNQyzyjwmWSE7 │ ├── 2n9Aq5oFsEH1J5Ly5jFoJ7Uteof69SmXTher34mwb1cxGdYiYsY5Tfb3nXFW12BhtDJmAjUYGNVRfmvBisxWBSjy │ ├── 2umtizbCVFnUkVHTEwWjGExN2Ti6hy1bEvEqXPyGZD89qXFEHDFm7ZJqnuzXiLG5edLwYUDnRgXLttVrBSGcz7Bo │ ├── 2x9WnDdwdzFcc2qpLfxBiwt3VApEffFzTtv38Ra7Vv6ti9nA7aBu1tPob86zVqfQji8ytqTmkMSPaYrjmLFSqjGp │ ├── 2zDFdEjeaQqxFniYAjzBXaGBHEFhCPCZktevv1GWMkP7XUZyA5uwkM1wKUmvtubzDUdaFvVh6ZiS4TsTZXCbtHUk │ ├── 31zKmbENG6BKk8CE7MxvZgwif8BWagfNfMZMtyJoU1nQNHtKYSBfwAini5GFbjav54cwJwPtFudGwmGPZfYTYS1d │ ├── 33NBwzE7jK1AFhNjkjaKkTSQXo2CmcmjHnwYpoiJKE1qJRDshNhr1RT1xzjoGCY91Mdc6WmoZ6SQfQqCzCoCUDG8 │ ├── 3AQS4L9XTszaVLbbqurwewbe4dkhUquJb88d3FKLs7T9JWg1cesLyCLbevretqsSDdSGPo3Zt1hkLSJitESdXBiA │ ├── 3AbHNNSW5QL6w9Mde9iD5TSMAKnM9p395U99XniAXRcwcTmeD19ZmBjw89kkXzgovyf2K7uc23eNFYQxzGSC3B4D │ ├── 3CwP72AUSjabpvc8fP9DB2zLyDaci8gZL9AATziXio1X3hTNxYChJs63x4BtPbL2DvQJdMVEWyxsc2Y3Veh4NjQq │ ├── 3DMzvMkcWdQbftwkLYoCfU3pKt5MfzUiUDQTvCGmuJLkL5KUXAvZDf2XMPAtCxkDY2E3iXVhhfa3s1duDhj6WX8Y │ ├── 3DzZbfyueZJsjhZRjTwFuHXkezes9hi7p9zgZEZXtuXESB5hQMkgSJABZfktuqH12djJ5f3q4VS7cdLc6RDXjuZ5 │ ├── 3MMCEADBBLPCgsD8eoUfczBcwBoGeTL2oNyQhNs4CL5fci6LTqGwqYwUvaNVPAdWEA9WSw2TNyiiSLv6EGVuMHp1 │ ├── 3P6wATSr8sBmjLrn8Bdg5u81vMy51WEDVbESHN8J3QWnEbVSL3LnGN7436msZSmpoMwxteid1sPTJU3KYbjbiAP8 │ ├── 3PLPUFnwPZi7iXJx1t2b38qooLnZj3VSzR4ZRnr7cXXA3s4rLjouTN73NGB36ov95918bUtNVMBD2mXqhD3xSs2q │ ├── 3RFVGEq2HvBFxQTuDqnZWtMecxFp29dYtgRE3hRL8g2zvHPjD36H2wKj5NWMyN8KSqHdCrmo8NCQAcXdXQ68PatL │ ├── 3UctLaStu1Z7qe39aUN41PLgycHgQGGUHSSBe6deBWwoY5pkXRH6XaKQSFueXy1zWomrPjrqTeGQbnE9gTFXQs8x │ ├── 3WNRHTsjMsspYdJAH4yewZMQN79UUXZwhXmMcvzjyV39GaybSBFgH4fLTyvEZKgxfqxrSjQNpnzNJmYPhi55W83E │ ├── 3YRkTBQKCcoybyS6bdXp9JMef8yhn8mCodaTiC2mEo4xUP4kYiVXkgahHN5bkcrZPuT6M4e2wkZdWPhZfBuhWM6N │ ├── 3aTv6fDqR4nm8yMXXpJSVMYYsvuc47gY6bCGxxQc5HwkrxruHkiddc9WP1B67VU4AK1ySvsNgRtH4wpzWrxxvX5B │ ├── 3bGS8YgaqgQPrX567h8ZCBjUieefcQcpeLRbEdWZNYzXmnX8isZ5HsEr3S291yCdQzCJgzCyVV4S5LBM4PT5iJHc │ ├── 3cQxvJN6KmWCpPgyiFoXYVdhC46xnwXg4dbswLMcw33fuS4B7qad2HBvyL4XkPPpQq1ksmdf3wK1ZvExJiAoFAnT │ ├── 3fKB6wfFJSJASKu77rPYfQ6rCfFF4s72jUi7acdTEakATZhwzSuiJhoa5DoauPuG4ty2gm8D9CECoAMVGBJEdFP8 │ ├── 3h6HRZpniWXqxcv7ESiSJpscfsw2aAiNbjNFKqm5N6kMwRZ7DMpq3rWcWGaLWbdf9FCVqjjKyTtEEmvWcTQPdAZi │ ├── 3iWopQbkHU3f2pV5oZL5YhXv5q4eqJRP2qxoZadQQXuaATgECKr1RFKstUcwFk6aoV6NqKVRn1bZSf21bQZjhoTA │ ├── 3mB68BnFgvhmEwpMjc9v8s944hicnihHL1ubeJF2McMuu6occP8Es88gtQ8LLKMrbai47L7KAgwyB1yn5KbF3KGq │ ├── 3nme8fxRMhHSZT7nwLvtEDALyRyXYTDvukJpEU1jXNngVqqLG4wWsy5VQ5EgrDLMeDE5jEMuzZh2PJzv9ecgbegY │ ├── 3tqYcMN33dfyjzxSQAexrn8nf8qTmk5i6fhZNUXtzL77hsiXHUKScqdbdhU1ocxp2LTSr2XLgWxC1g29eRGT9yLS │ ├── 3vrXwi9rnZCyHa61jiCn5saGc3itWDHJtWpG1RW5XAtYgN1deYQoni9F81g6fQG2mQf9YeNnurQxZguAK7NpXCrY │ ├── 3wopCfeCCPebgC78Ls59DaD5t5sxH8kFus1EDPNYj2QGMUPBGmJC1GXCRngx5wXDMWxDr1j7M3q12mHSBW3wEZac │ ├── 3zXKv6JKMpRFACYncCLfkQoWrXuZzqtWdfz7tzjzPLes3JAnyX3kUgbse3Rg6CEL6RctaZpaH3foGwu5dLDhrGea │ ├── 45K7KVx1Q599EoFh1HD6QZ3yAGvNTDSM9iJ9AW1haEseYXokFrm3xrYonfV5x92BkzjGK4WPcU7TCVHTieMjwBwK │ ├── 46rsm8mRKHcdzDBgMqjSD5BP1j3N7REdEDo2H6xwBdRQ9uWpvPxNwrze3YjcjSZ3nK2uSgFaZFB5sVmF9PbuQXvv │ ├── 4AutMciq37aJtRQMGnqLxFxPEcj26hgENrx9X6RrayKWery8xcAm2G5Q5uhXG3mXpy8HYjWg9kU9mD6d5w4U4qb6 │ ├── 4B5UtDZsgXNuzPCMJGkbnLyb3QgR9aUCETuFi4813LgQYEE6Vgd3pRrWkHq1q8hmDAscsw5pNwM8tNfyfKU9g2q9 │ ├── 4D2kGBaNLmCSX1VnArKK4y2vHNKC26zzjJXwCaAgikrys5MH9nafcRHs96oNjCnd914kruT8pcu8uQqsnaQHqoNo │ ├── 4Gf4C8Mnih6x7MHH8s2Xp5tgPUEeNqA7qLvrGDsQ9npe5Z71J7XgpZ9uUeTtpGmK1utT4aXWipcwa5HZs1Du1JuM │ ├── 4HYxoMs3weRQ6BSe79x1RYkzWukrZqSXAEU1DaJNARp2XYx1wrxDFteS3RoC54b6hHnkTrSnt5mhXC5aWK3PQBFy │ ├── 4J6qJyw9nncbDRG9CNeTtXKzSWr9xnd5BDyH1jejug8oWMrKWi5PCa7NBVaobTyMXjdcWaLUuVtAf9LqkEbn86eG │ ├── 4KxzEHVmDrrfSCd4V6hsjyTzENRDevUDoLMSHr98SEGyBWabzLrjxXW7efeNkFnRNaDwWwpzVF25k8T83bk5iP56 │ ├── 4L473o7RBaYs9gz2x8bvfeEiBfXygVoFjMp6Du2yqwHyk7F7LMbXUG72GV5qP128ZYZzHD6B4MYs29WTBVwH172p │ ├── 4M9weXLpW1SVuyfYuMSmr3FNGCbBsCQwugduWTj4JU71HQjPQ3tYcvv1G6nywRGuyKiviFHzgv3jXmtAdLAGRujY │ ├── 4MgEiWt2CFcRGQxei9edEa3xavqZVzoAqoJybDbmZ61JokyouAcb8PRpyopYoCKrj8r7KvrMT4im4Rzk4YdyBEFt │ ├── 4PCFsFFwckMxuZUoHst2nTPtbMk89deEgxg9FtE4xENXXPgcxJAsSDCuZU9dLBF4uRbndyRbpiV9kRT8ikf5NJzu │ ├── 4PnJHE6X2hihqEKZZA2MzeWnYY1g8tePixBawR8FkeookFztKRk9JcBjVwAUJ5Xw688kqpqNQ3HbZkug5fqL3MYw │ ├── 4UeHCmYD1Zf2V4aePYyDQHSackkzvASuZkt2qrujWcBrVTWUFdhAsduvTeYzevPoxd4R99aDNKo4V5oetBRFGjT1 │ ├── 4Vyv6DJkbFcSbCgr69s7pUTVFetH3EVBaGRipoKnsacaraQnPx3VNCbgFcZd8YBkZjzK15Q6vKKH4EcTKL6EF76o │ ├── 4XMY3pAfYtSBdYpjJGzKjDmhnQc8rx2vhKZzqHEHzATtJfGqnB3XToFACKuJg6Z9sADMh8eo8XGNGU7SBbxDpDwY │ ├── 4arAS2BMnUSbARMWRfKJRzGpLLnaANxwj9pxqmsAzDSgYTA7P6ynkFzFGWJmCdawnn3joR9JTmDwAZm99YpnKknB │ ├── 4gY59VESWLoj8JpRqdSnsszy2Xb5ScLTUxtNRpHshhLN9uWTpDCqvMjDChTcxJVqhwapH5SzdLHzrPs4pkbRyGF4 │ ├── 4ji7HxV2jD6UpU7dbKUtW3cCz75jE5t9cQ4LcFGgHQWUd83tmzBikxy8PnHgaSQhJvqJUhBP1NL7swdgqfFj57xs │ ├── 4jpp8LkphZP5EyBMj82QRimagjYYrxSMeN1uVCAx4Au5odP4kPDSbcnPvAL1TF7xUxynsE8eVgRh35a81PfDoneY │ ├── 4q1SasAEAJtPzZYGhLzqWpq6wgicJiW1rnMHKEypJasnUMNMU8MKpYhrYQNBmYjk2HqeZ1FVqSQzniHwKktzU5zn │ ├── 4yMU4gWnXfoLWoubDgUR4YZnjrEBw8umEFcYZKFvBqo5ynQDWqK6JvQBkDtKj5XRHQ5WA174LSW7JPgg1M62ws7C │ ├── 4ziAGiDaJYa7VKk8mKD1ohKM8xXKvTCV7Q4kuHwdYGUVDVsuqNxuxtYeSrHea7Z87jezRSEw4oaHegWJbjEjsACz │ ├── 54VRPEe3MaTAkF6aGFPJniFcFK8MXnn2wAaUSRYqRTPhSyBgAeQYenBhhD5Zaa1Lm9FatzcSBPaSEjR7BHtJwSU7 │ ├── 54g4aEKgEuaocPs2Eh8ipsviR67asWFnkPHSmaxBBMfreZZ4mzK6ZBSeqfMKt7MwPTqysYZVNof3rNfJPJtwdWNQ │ ├── 59GGVQ6TsSVqbo64UBcvMiRFWE4aRVJ2aGWRMik95gENQhQ1ghEF391j7BAg1TnhxKih2MrRbsxDzD65hZt1ugog │ ├── 5BVxnCFLrjLUgXT9bouibZJtnpoBiUFcMSMvtPLWhvVDWP7pVG9RUBMPZfZaTos7jbgJXjm8rVpmo8CxvPb9UNYV │ ├── 5BumH2T9ZVMmzA5S8NZtwcHtuW6nXaZKuZBeA3GGiE7UzfJNPS39hAxj5NqJ5Kv51Wiuo7NhAtuaiVEtq2g6ZGgn │ ├── 5H9EjeV2UzmxU75VQLLnfe6XosLy2jUP7F9q5bz7j3LmrMGw2TZSgy3rjTeZD9S86bVx2rxvPnT1RoNBgnmjEbni │ ├── 5RUEfgGp77ith9BY6pmbi8cJ8vhzusdQcyayiYu5dEE9Xhs9uDSDh6vncw2cPF34fiQqe518neLpCWpdiA3whG2D │ ├── 5T7cokcLawUu2NmqtupD96axnMUdVGU3aBHprJjcnMa6fv1xZ6mUky3hYVg4eWWisMZc6YHMcHahHxrHMSHoPCNe │ ├── 5Z32rKAgkoQm9SuTGgMKRaHPoQrciJHDr2nVEo7hosnBCuXQSyo9V1f1MD9KPpri2Y2rCpfCcGLN4BpsCJ55by2V │ ├── 5aEpoHM1WLxCKb1Bzsbg56hsLd7W6TNJarC5tf5tjjutgLfd6yLzRbu9ceYcx9Ps5KzrVfAMsQDs3NPkZzPV9WTM │ ├── 5bvTAWNbP4YEjXz3GRzQnWKkEq9FffP3uqS7EHFhsjjrSZ3mMaJWuvThZv1Q2toPPSAWTmXHS9cNutkAEfnb7Fbi │ ├── 5gwPZZUz2YdQAShf3NDPYja37VsXatxnjkiBsRkXptQzV1cnYYrBa5n9SZqFDen7W1YYyPLEF831gRZJXoQfgUyz │ ├── 5hZkoNnDvWcnw56bGsF8enQVTgrszXdJA4ALA3hXV2L2d89GK5Yc8yfvfkFAuobhpeGznTM61nFcTSRvdQwB128m │ ├── 5i18KvLpdTcu5sUHAqYiEJ4hkroV4vexJ5SuJmfW1fvrCqaXZm5qbczmXF6ax3v3tJ4KPfer7jrBeabq2cZ44p39 │ ├── 5kJXtZvkGPZQeTmAtHQV3CbGHAxcjD38NfPrvLwyXtbxgVTQmKK65EHaesWXtFkNxgwHeLpQMAkJFhPZ5WVsBiXC │ ├── 5omrVidybz4ZaWKmjdKruNE3Wp3KKZ8ZtU6FMQPTLW9SBZA7W1Dxk3DJfqy9CCz1qmtBgkAEWjpymVnjnmnF8xb6 │ ├── 5pB3ndfTA9RdNrva16hZW6LSgLamzEQEBsKqVmX9KY8cU1mYyVrEoeoKmNziHpLMEVmoecvgYxmvYe9xWHmysrpi │ ├── 5q7auVbKz4KKbU6yJMZx9jiZTGMRwsnSFhBLzC8pQVMYvNxvCswJjhLieTUqbkABHc6r8oY1KDFTbd3jfuxs4Z3c │ ├── 5uAuqSJ1v8FL8LyTH8BtsPiZvsjAb5Q31FUoF4KRJQAbrVfsnkrgbNKZfAWECkvFq4EysCy9m5JmUEQp978mKJdJ │ ├── 5uBQXkkfNrt7CZa11r71RLmWkfakiefGQxhuDyanQV5PEBc2h2EonmuN9mgeb6zTvdYBtrsTGzw8PG4EUn9CzHif │ ├── 5wRSTZ8nUnahHpPbFT18Dyna7BzU1XrTAHqNB7A3NpzDCvU39q3aGn4XNyCNpgDsXhT7fpWTUqBDDjyeBvKhSZMP │ ├── 5yfxKKWUUyzRYhTcbtL3Gm6T1rmZ1ERdEEdRSjH3JBwpsYSUM6a5dc2Vc9dqBu8hDqB3bWCTHMKtYct57GhJuADT │ ├── 61sk1ZtUk1pRN6tku4fi3YQb4ufaeHZai7HzjEVGdbjw4g1qMiYHsrW8ab584UoQpnajLh1MFTABujsVyjri6kGb │ ├── 62J4yReV3iQ4MfL8ziwBnrynb6HZvTCv6gZQKZ7ur6QfGQ2p83kdggXG4MphuBUUmNJqRkDFNP7j1mzqnEKU5ZQ2 │ ├── 65hAPBDfAvEUuCnrYpucFj7vPXJoQNS7fntaYrTNMLJbHJMPndhqPUe6cn9foKsX7s4XB4ugbyjwEJNvXDsJdZMM │ ├── 65hPpSyz8KjoKGWqjBNJv6A8c5z4fgx86SxN8rJXy8XugLwj4xRSauH1eJx5xAUosGFustkzoUSfPPGFi6DN7zj7 │ ├── 66oWMgiERunTE3RkxDGKpGZTcS8LheLjnYGtN3Hdqa6a9HPxtRtgTAU6divY1MvUtCbE33AUyTs4YoQtrrQRt3cz │ ├── 67Yv7sR6varZAq3a17M64miBtnqXt29YYeh558YQDjwY8nR3NmRoaGX9Hnw9qkyPdmu8agkR8zDMpf5K5LP8ShGj │ ├── 74XoswLbsBESKoTJD5Mxit2joCJgLCYri9epVmfpUczXt6DHdLEh7TTQ4S6JGzk7P7zTRegwi6Fjxgy2FPjVRXM │ ├── 8FhHByhBRdoosYkVCwk5B7oqNYPhUze4hYwTP51y1PgfPK6Tfvf2gg2PFMSN6MUmDhNsSEZ195p6czpgvZFwYWB │ ├── KEDxBy4WN28XgH9AXvfukkZRohwaCybdTHeYuEaVXEb1hfm6rXSsJ2hxBckAjH3EDNMUpFnzTqo7oKsC6SXHtAC │ ├── MAJxdpo6YpXKbLve9CqYZpEBTWDmtPxUaLpjmkD7duCESnzH2uW6jvPZzsBZLchkbtW1E2wtniwqnUETCgYf488 │ ├── PYjvxszV4ZGnRdTWNmvyB3PxCuFyr8rs8zNKgtmmFwotgxdtXqzaCuSNpDJxmofZ5wsP7f4dd32UfBtNsnQxdbM │ ├── SZf4xqeJQKirbgpC6EiJKeKMHJDfTEyyxurqNM1PR8SW2u8fvDy7Ui94cZ3W5FjjThAaCoiugqyER5S89nsDXAb │ ├── UCcga7ob38iFzPtpjYN7Ka7TwvwV9kDx5sVUfEVmKZv1mSaBdcneHupV4qcvpfDNq3HbWvzbnKZScBinHQimnny │ ├── atVddsJJmxhSJ1Bp6n9RV6MBmRsmmd3xEJusfiyXZ9p9DN4Uq8UDBt1seTASvEWggNXjmxdf4QzsPd9wknfdH9V │ ├── ghDKvW7ogsGLGZ7SPnutvRouNjhiK7zQE6cUtXZtNiPnLE95zPREEvoEn12sTuoQuLGEDi79tsi95Au2eL8s9zU │ ├── nV6bdjyKntG6wyQFRs6jGHKNkmoSPP5gbt8mgCegmjXKCu6LMEdhwXAPJxNLPVYRh4YyCWkZpqJXBt8X3NYmsW3 │ └── z8q9idnkZYE8XwNxGSgfzFX3JuibNL6stoBLLntwMhBArqWQ2zn2WwasLL3g3En21RA6PaNtyBBKqE6PpCrPqYV │ ├── compress_lamports │ ├── 2UPacdoWFmiQovJf2BDamiLSpE9tcLHUFfWrymE7y84n66qUPiN5apQ7hFV4UkRkRYmRgz9oDUetSBttyg4wkGvt │ └── jyBWSng9SMwsZ4n7S3jEEhCzBPN8gExhSuZ2yzN7No3RsfUAPefgcGVdJVBBs8fLEuQ3amqAEs9XNjYiQLqz1EC │ ├── debug_incorrect_root │ ├── 25AB4R2YwmRz4S4u455wYWbZBEH45MWsnmKJZpbdgfGnutZMu53eYq4kefU3AYK2tmLbXXBFy6LchxYqUQP9kL1k │ └── 53YSD72HvhH2imD2N2FqdUwknEp8gYzPbtKzUjMCkR9AbDMdG4zvmpKMuXuJLaQ8oPrbLfT2TdddzsREw2PCVUYe │ ├── debug_incorrect_root_v2 │ ├── 4D2tDE2Sjv5vpccDQdQnDZztgwvvD6RUMHUCk7u3ov5NY9QrUjCMpcjAXcKQfTRr4G9yN9T8DaLRXeFV6wwYAQtX │ └── 4iwrzL2gexZSTAxyiGMDwhMwS3eHrUXgtFjRFeYD2RnUWg5uh2LhCJQdRLh1ieioBFGuhWtBbC1mv7xAjySGSVf2 │ ├── e2e_lamport_transfer │ └── 4iXfgDbgAEQU8hcto67feZsNHxFGm3JKKo97zDgnT84VAUTTjiSCEyi1ZSMFdiybS5XmRHy3nW1qDtKkTPEBpsV9 │ ├── e2e_mint_and_transfer_legacy_transactions │ ├── 27pxT3ndnCXhbUXdT2k6riDw7Y22xnRjVRmUHseXpFi7mTziNiEegxFAmgNBoYPKtQrx7N66tCCcGwFKt4RniqXA │ ├── 2DcgLz1KwPaMoiRAAmYAirx4213swLbaSM1YYuCkbgzngq61XSWaFCRGuFoMgqW5htsEZRKBm6uQQPAPCXUVL8eH │ ├── 2FrvajC55EwHptaGyuBTjBUm4XkE2c5KHo6AVez2qy8jXbH1m7gRUXaEVh9NJjBkpugU6QPHweQHkdiq6NP2eu2f │ ├── 2QN6Z3AiG73zWw8KgLH9mL1emTHD1cKypzD62SBSDZzLH2UhuHsPsmzeDB9uXyR2qhxbNS6WFCF11TPFgTUux6H2 │ ├── 2pGQ7MgWuhrKpeSAzs58CXttKDiws33X68hQv4tRm6NUH6JCsCBk5uteNcjt2fXdToYhC6s8b6SDzoXV9CLJTo94 │ ├── 3H2R6UT3Pw9ejNmYTphb27jNoRdXmuLXjjxDaSs87uyuq25YJZtLQgACG9ANsvzfZN1s9d6UPZMabAYYsMoZ6GsG │ ├── 3JeUPwyeXzf8FQ59C2j2uHkWunykPncoDj9AvkjmESkbWbkHWbCc4tfD4SpCVL4vCNcpEjvdkHSFNYfBrqdDxiDx │ ├── 41rBbMrNtZveMdPXPrHJLaoEzZ9WvJdgTbvcDhLM39THw7v51FjbCdUyWYFNswr1k3pRYbKvAcYb84bft2NbWgP2 │ ├── 46VP2T7zPwcFJzU3HDjCh5PWwxKP9LahgGbPQcsePXUwhFrFa2wHCEh4kDu4KCv18BtCw5RxauJt832DmbF4dUPt │ ├── 4Ld9WjbPxzhDsiTfiPfkw1v9xoAXwEUHWLxnKR9sazxRxWeGCeWHgQHpvABwssQUb8srwdFfgFF2sUxn8Toq8hCM │ ├── 4baKPsjwU4zR3yskhrfM63LwiiYpaKtbq2r3GzpvK9ATb4rANhWFfRdn26UiH7kzYmAtUWFmmMzpKLSHwMiSP3Tx │ ├── 4enuRCWyq1aXXGxBDYFN4ad5PzHpp6XE8mfJkBipT8SSRgMQyEWhfiJWtwcLYnqxjdesFQL15GkMMjDN3pbH5t2A │ ├── 4uLjV2xNmD6LD76XeSfDZoqxnjfY7bzcnpj7cqG4ZDAhVKqtUbAxajuvs4qSdJxLxbxcAjStvUnY5DhhSPgKQFcB │ ├── 5Ea6iQQZ1JYfiDq8H6qMKYdFcut1cUfd9pstCGc3BsQztTbgKA4LhsEx6XKQ1bMhKp5KMyyw5BuuooxEcpGLyHFB │ ├── 5FDV6xrPRyfEUP2Kg7mwZVj34LVEfq9gsrquyFkvmmdPiiEn3Bhd8sTJTe6UhszNHLgwWfV6j9X4rsceL9mNNyRZ │ ├── 5jGUVMbUx2qxRF5u94f5KNmds8if3mHraKg36Xx9NqBQ6azCST3EwzXmj5xXcN2xiTMRg7oNXqUD4ygXybsDfRAn │ ├── 61nLwpJcf143PhYz9AVqeUv9ePNWNW9TAWkrDoMynhSAh3TPsmprMW2cDhjJakrZa8APmNPFLYsrx5CEgZdVgYpm │ ├── 62LLe2o1pSdcmos5NH2A1L7LAXU6FnRRHRJ224ZcN1kT5bWuiEYf3DgyS2DxytSm7RkDN6f24n1XCZJudZKQT6MC │ ├── 67P7sjss5EV1eTzeRSFEejwohTGYvtxgrReAURrEnQJ1JiKzofFt7HdQX8zzyDqymxuggeK31DQRCDLxffc2fHwr │ ├── 6qytR34uYwpa4kb52WAwsGwKaEQsZgPkeWnAoVX5xMq2q5mvsbZWyica6ypLSPqTZ1NYHqfTzGrdbTEUvH8FyDN │ ├── DFE7shhwCWd5P14NfA1ELSpd96FaJhBkjSet2Y7t7CtM4oLhP17AYKtyMBjZWi4hgFKvqET8zcAQUDuAC6sARfk │ ├── G6ZcxS2HkHh521JjHXvxkpuYC2qu2fa3cdGZvKF9NVAM3oPEBZ8tNa4ghVXVo9uc4UzWPwXGAFrGqg8TdeYoTPW │ ├── Mu8x9eh2ByH3ui6wq5UNCNnm9rgxygoD57WvhRYshubLBkT5eJCu2uVB4rMHU9zZxFhC2qL1d791ZTeejq87Ae8 │ ├── SzCjq8kMxAnvBW9pL74mJWDZFAv9jEvJeYZkWBGZyMVr3ow4NgfRZtk9J5a7VXbk1VxFWdBJj8saptpX4LZuHA5 │ ├── ZcKpgqWMJWuUCVha28UPTjydkDCRdTVmnb4sHE1AQU45juetmT6BcuPVmPg4ecepqMBEyu3UpGxg9n4N4ryAe9x │ └── kFTMfQ23PCrhfrFgoyyLC961DTAQ3kmUzx82i7kxW8dgEjPmk5Uv4qLeiyiHdVBmX881FXsrNTKriGdJ4yifPUF │ ├── e2e_mint_and_transfer_new_transactions │ ├── 2M63FRn8tYUCDxuxo4fJLkwQfu7FQp5RecNVPK42TMdAbq45BiWjuz1P9nNy6uRrcMpXph63eAUW71GzQE1HmEGs │ ├── 3xB9XfSrNHov4FDtgQdJMZtKvbDcqvhkpyXN72ZurXvRTKbGXpw4XbUGAnbtCuNiHixf7qoSDQskTcXdA6n412yW │ ├── 5MqYh45rQf1x8D1EpeiWh4XXM7WBeDsE3MCpqvstTaCMQVBXuk3wMiUoQGY9Y2t83oGhBKoFG8zWUFoHpEB77C1g │ └── P3NmVFAosVot31wa7oyJ3e4s4zFPeUwGnm6HhFmPukjXQ14xUQvrxJSuEy2VS8gutuejoRFzPPoga3ZeBRxDJFa │ ├── e2e_mint_and_transfer_transactions │ ├── 2J9pSeLvXnyawUPKdks98ZibQWU8v38AEhmZp9g9P3WzY9dJSMQ3RmoUaGN1zVCF3tTQy6q2YbD94jq8uzSZsay7 │ ├── 5UZuijpSnqBpgMpqnggxZ58bzZ8aJtqqVjtvzx2Pg2C58jXph1rdrXyHdTxJfsHawNJyr8syU4U1MEYccDUQeTSV │ ├── 5oTNJvc5WWJacEdpZLimVjGu1uGkXoMth8dNKaAymVKA7arwhccxeJPRWDuYEvQHNkGnkRNJcwUbtV4KnwebCKj5 │ └── 64jFxW4xxife8UqpEQyYdA589rzFKWx8rT4vun6soCpWXmDermr588UKX2261YYZ8ZSzcu2NUJY2aCfee64FvTW4 │ ├── e2e_mint_bug_missing_token_accounts │ ├── 3Hri4S7sVMaUSAhegWoLHvUsFtYo7RAPTDYuEWFKFgYDEE3Bs5HswMFYnpgHCsXVivaKDTLhn3wYGwVib5U56Son │ └── 4uXwPQVGZ1RGqCPEZKsa8ZDphPLNRfH8H9iW54Yos5Q5WaC9XZC493saiiv2vpxuMTFFqP3z9RhJvKJZQACs6oJo │ ├── four_cpi_events │ └── AxJEkZHRgs4QdppdzRWKNBvxX3yjPhRR17CJ8EYe6ooneNe4Yiziggn6hs3iNezXeuMM8VtUZ2as7ZTZfcbQ4GR │ ├── incorrect_root_bug │ ├── 24RpsqyjBaWUVnpUKcQW8Yp4bsw2XGGEunGTLJAd3qeys8yCV42bF6vZihVBR817WAfxJY5LxjRPcs749cFoH1vm │ ├── 24sss1cU9KtZfsp3ozPPP6xUNV3ChmJZBMCLuMx1HosXwoUnf5UiKHHrGJXS6GipYCdzZdjviT3qC93ZKTYP2M8z │ ├── 28goaMo5NfVWEUu8GM5z4amAeERWnLL7tnrFnWftSmsabf8nnMRa8qTMqzut4r5fRpS2LX8qYFcZRHwMWjMQAaEK │ ├── 294buie2YDS29NJN2xEcp6ePBJ1dEQYW72PJEhkdpxnvxkGxacfKQrZzV44Z7k9ZiE4R5R79L7W7VqDPHkFdDCJ5 │ ├── 29YzVupE6gr8bQLLqvHrnbxt6WVb4qXcREbyrWnFTiVKeXw47gianzMyCF3UhLye7ZQ6SmF614szVRfpB8Y8Y9Zy │ ├── 2FiBHVWnfLzEjaL52Eer5HLYQrNgYeSXdK9BPS1tD8pUnJJn5AHBmamELw3jJ1k5hppuGS5b9dYk58aXasXaJt2n │ ├── 2JtwhbU1W3edkKSxLuk1tjZ4ynASDRzmzXiHtPjsa1zU9oD2XXeZzVn44KN5kXLPn1eZAEb8cLczMnGjeqNxqQAm │ ├── 2NGoVxBB7cxLLeatSC2QmXCyLmbL3Na19er4YLVMxMgv8Kp24v3AzkYKnJySU9EC2eLb57xGFmPmykGekSDSpiYU │ ├── 2NjLnJ1HVL5XWAN54bwRazFtDBtvFWU3kK9y6qWkSLX5puw4AxCirJcW8kXwkiQAx6cUqvjQTaYDpwG49uHDsmw9 │ ├── 2StTKCsDZg7PZNqbYDi9gqzC4RsFARtjS3wbGqQ533oYdkRvqzkkL1nTcMSUgQoxPTcxZ1u72TfUsSwgt8eG2uZ8 │ ├── 2Yk8JqfmhUrCfTh8RmGqwf8WM3NELB9bQwmtvL88fCNwbkoYaecVSh3WjpZ4Zdb5hPw46rk3o1gjTazt9e9nTGtw │ ├── 2YuacnqzeDPiV8FzyGg4bW2yhGxvTkk5exdj6YoQN4EZvGXE3Ye52Sdy9VGXbMSrQmJDhQZ68Qcm9ddj2bi79rNi │ ├── 2aH34rQKnmetoWcUEYjumGCYCre4mEMh1zWbswBYLHm1JUVD6FrgH5XsBoxStEYK8eTPTyLy2rW4DmQx3FypW1qr │ ├── 2gvi8g8EbZNaCGffxyQrBgCpUkmX2rv3jUcebHq1c2qzW6HBq1bcKCEGad9yaHJLU3scnL5T6w58wpUWRL6u2gZ5 │ ├── 2iQG1vhbkgHL3dgT2kJiH2hkzByiuL1guXtxufcaBa8PwriMT48R88bpoEZjAhCV1P8LMUGFjxS9QGjMtnVm4i8x │ ├── 2p31FBJRzg5nxy6Ma4Ge1DTcfSZSmo7XWbM1A2dAUWLZhUpK6ZzEfdxHGoXfM9PPNeN8nhkSz8tx5ycCfP1YU1dw │ ├── 2patHk5iRDMAF7BEKCHaQfBZVNR6bPK176WWCZQzziwc11u678FL1NcycgwTEGQZ3jyQoDWkFD9H5bPyWdeF3ajJ │ ├── 2rFKQDye3Bp6jQheTLz1RnwQtXGcSJTfkwxaZQWL1wuJ43SEFgoT5bLUpc9yPrecWS8EkMLViEWwwBpmLiynrPS7 │ ├── 2yTJ7DaV2EitApo5RAA5etncyfA1dyNfN8D3Cqxm6Lo4HaJYcokCy3rRfr9fnTLgR9WWQjVXRPpoKgcAB7F4CiTq │ ├── 31WLMpNQ9sT4V6thBL6GYsA9BvMCXeCgg4vT4dnkCf7n29qXL7AovZ8Q3UvCXJhF8Gn293BLJdtyBMXv89GafxiV │ ├── 3716yqdPef6UQRVyp7GXNt4aH4pSgCaSs2Fp3sJq9PJZFLpnoBhNGjkmGXFZdZ5SNw37fexwuLDPNikfLuFvYXBj │ ├── 3CUuzYnW3jG4omdFA1PJGsUghb6QZfEkNzzVSWM4o6aDhvEDQ58XD9SCBp8GTe68NJLT8TEAuqnDbxBYPsVNbKuQ │ ├── 3Hd1CmzFrAsbsN2oMEpo2JHnaPSXe9fPYrDjVqfPNi5xbghjszKoAyeSXxZzr773MShiL5Hi3GncmxzMwEa47XbS │ ├── 3KL5bWDdmQoXTDxRoEEAoW2V6TByrDtD2m1hTWvbXJfHH5Q6q1eSxtstTH91K2TPh2AWuX1mm1qc9uH8j3ZAJgbc │ ├── 3L2UvanoiqyiqxLHStiGQJJ1ZEYZQHJ9SiUhJJGXZ82ChMbGBDZHewq6HLfXKjeVNicfXdwQ9o3Xz94AstpmADY7 │ ├── 3QeTD3qAuRcyvZU373HnnVai2Dm9JtvRFfwqJKj3aab31EmbtFthJeYzqA4EmoFfBLmuXwwZSovKha3sE9wzt2hC │ ├── 3WdEsvK3UNGyGj6muAu7jiDnR6PCVkJfjUub6HNDR4ropTw96AQKBqZaTqTrGyy5cyGNFiiJcEHbZLaAH1dbxUzN │ ├── 3bCfoWaqgzD4FVYkcDsCNrfG8XcdqSwwrGfy7RnMrozrLvPyivPsCqyqz3TrKJY3QVoHN8VgGwmAsqeVsxkkUQFR │ ├── 3c8F42J1ecx1vzryqj89VX5Nm6Z4FoFcovA3wH1c43wCxygXi7K5MSCviX4hqUNDpSRzoreWzUX8sPSZ42W2QDu3 │ ├── 3eeoYJVuTjQdcc1t3bwf8LaXHqj5o5KTiKS1JTiSvAt9QAjwjHzQJAe5kXabjdb2ErzKK4PCKHWtS9JJWRgf7Fbj │ ├── 3f3bD97BsLEB9zMLWkvnmxC8rVkweztoCTYVHGdhAdFk6vZ3235f1yPTy5DAJ4RWjR1cK5jWL628zuYBuBCKYVk8 │ ├── 3hHjqDq5QoXPeBfoVnzeXEeu8RKQLdRWcxYHkVns5ARrNimd8jmTVrxC2CWtvWza6NCy3X3hsuWDFYTfr63Y6JuY │ ├── 3hgGYirD2wFuZSeXRkPQXCEPVrhLev56yCApCma4rzxwnGRqaer26wnfXJauRce85PtHCBpZAAgtcMoSgNqafDt8 │ ├── 3nihaVF1ZxdR7TkMKjEHpcvweXo6x87L9Ym5JJFd31a7eaRKC5nKk3CkowCbiJzPE6QwUh2RHcNekSNX5rTwgWgY │ ├── 3p3zUzF8VJDgFHCpr4U8EXFYzK43C2GQWiV8b41utRN9FhLEUog2s9R2ZnnNpBzcKZYcqfX893MQfQUW1apBzWX3 │ ├── 3pphyJuDF1Ayd4t7DgW8ki86itSHmgo1fJj1sc7LbydBAHUANzq9yoRk4mdGDruvePXKbcop8s4vJ1DX1zKEgDyy │ ├── 3sZQggmHEpWa1FbSPmCvW8kRKRySZ6KP1poq3ZFDZSEZWDPGZexUXqUcsspV4VoZmZu6tZdVL5evrrHorGHHW7G9 │ ├── 3wt4B72cdDHM6xoL5VUmLXVkR5yH1bgWXfHNdgh2S6kQxip6uzn1H41R1utU88WdQKHpzwFDsBXwbwExf72tx6eJ │ ├── 42N7iCEszYeKrUgV24ownJY2RPZkqihj4JWTRxEJLAcWwx2TYYhtTH5sRH9EfM2q9ayDgw9kNc4wXBKfYzn8cJ4g │ ├── 49EmtNmpbsZxVmfMTqG492VZ4bFuFMH1TtM38P65aZX9r6dptCjz7ByU9SUQTybAECX5HMabCyKYqQJzzWQo86Ki │ ├── 4BzX12Ff27gWbaCKtgMY23FtJ45nLrNGQZ69twZX5e261iigFcWYRUPwq5NkxJ3gDJfkLYy6zCumoAtnarhw7dXW │ ├── 4JoZkvZ4kMFZmLEXftZ5Acxs6suFvZeJSnoLPW5xph3iah4iWEwuu3VCienZKHM894LYxVojN1gnfMhWUH2B7Qzz │ ├── 4Kx68zwsP1YXqV4UX7rHhx6EQjFZkuCSZCWFV3Qz2mKQFNeyXEZfrzRpmvkJDZURtHXqHte15iLC5ukyW42qej7R │ ├── 4LaHj2tMasEib3Y31hJdTo5C16CqXcy234XqYg29yFuXEHHkzqDaSVyexMMQGgSz66twLpzixhT1FJ4rgGHew9z1 │ ├── 4Q4mQq32MP1grwoXpjVdVqE8kcRamygDaSrVqCUPNWBajNGuTFb9942a1ZAxxnzBhx7zAdWfc3Tx1WoC7BqcSpXA │ ├── 4XmHfRPLBaESyFgt4EeYU4rnwr2rovR4tnpMaTacMzw2SFSbW9JnBn2DNbKPW8Rg3a8EpsQjdEWNVpPtL48KhADE │ ├── 4YVnwhip4KAFki1c1VUJMTgLQrTfPGSfA9EE6ikmEidCeQNryznEv3Gpf4wj3kPrMUfniwhpm2o7JCFdZAVv9ZUT │ ├── 4YdcND5fq2FkMdiNt4Xw7YaTWHRD5PwETbVLfbXks21BVmFo3LS4HrpFfzz4Qfa6hoygnQV6xZ1Xc4oT5J7d4D8J │ ├── 4c9jwfQubqnoyGUmPGVRrPkAqrAe5oW7NodH6H8C1DW52jJLeKiS9SYwrZqeN5v8ajnKc54rEGhpAVQ5E1SDnwRQ │ ├── 4dBUd9A6dxUMVGB6rgqsp8F4YdbtAQkW3DQEQ8Nm2G6TurhmAcoLLS1SH3J6SyMgcqqXuNLq8EKJQiSn8VvLXGsU │ ├── 4dQoP7kDJLUYy9fP5uW4vVpEmKXZ7EYCLkiYYnfM8sqw2Bv7gXbFKFNv4qgdXz52qVzQcD4aiT2VNnzYb6x7LekS │ ├── 4dyQwHqTVjbbUZdLzzH1KKDcK4cwCJusahTQgNmqoHKhFfJ9pZFsza9tnwbtpfojoqdGJkcJ2ejNuLLBukyj17Hp │ ├── 4eZ1ajFSD49csd8yUe2xfn4iDkL98k2AZimjzHqEd6w7J8829KCYVz4QvsEbCC3inwC1niUGLENQa1a1ENbKthi8 │ ├── 4f1ugyiP6TRbmHhy1dk4LSrgETgQxZoBaL7YhD69rKFNUpFtxQCLbzy6sPWY3bVgvuruRSue8ZEsgabwVYf3Dw58 │ ├── 4fy19Cr6nkeZX1MguQnjauANdmsUzwebCipLgG7VMpfRw85JwwmrmuVEo5R2MSS22G91rruncMAb6CgMJ1RsyiJA │ ├── 4jjk54gd3oGpRkDUfMmHEcggZCUDRELdsYTSzBtVhuAxZ5aJkHSBK6jpCppFwMp5CcZgx6zA8sYDj6KWVVizKkcE │ ├── 4nXuF2eCcuZMUKYbHDCKCMMGxkLLvF5grAwDbmBNEumA3TWNMirL1pKaGb6LjEN6XDQpdkTYpdqZ5XcT5T1NBnde │ ├── 4o8A5YetwySh1BNE34qiD9x6NgGW2q7RKhogiLojwqPH1sWwcnRFNm914z849yFYCtXpP2e1gZuUA3WCEzXs7XQJ │ ├── 4oGFgRjktmuy8GC4kcbozXGEKqSFaKDot4cDRh1igNSiH7ZBL6sjBqc7jgJr1MvJzSxXzdGArhneC7kWTirzxSoF │ ├── 4vxu3kBVy23ARu51GUsi4vuH1ymEjn3t4w8QzSc66P1R5g2ypw5kTSaFkF8HEZaG3Y4gw8LzzokSSYC43dszm26D │ ├── 4wnfyuuVnimdYmWUxp8k5EGEKGxpoKWFWcm2JdrQWQ2xBYi8T95MKN53Gn4kzhrYNtJX5wXJ1KuKU95DbHoVwM6i │ ├── 55vvdot6vt6iSyftZWbuFkwNMpKVUKJ6zyN9QEABbvCJ4aqbkvJC3rryF7TNqaBrJHfdgXBTrwhm5MJkj6mLUoZk │ ├── 58om3QkVKSojZH8oRne3krCpPS3iCxscW2hEPy6V9keBXw1KfKQfwi7exYhxDwQiKvaqEoWyNTHy3Q8myJ4VWEDP │ ├── 58ruG16yoc9xWnMBDkRvNkHcHbT9W9h2Eh1k8YHp43D2DskHszToVRnCiPbzzoUT1MHsWecxUx8T253ihr6LzwNs │ ├── 5AydHwwsA9ejKgjz4Av3Zgkz5gygzbWcfMuZ4uQj3TyzVAh6aVzrV862975dbCakszWLrh7cETcmQ4do2cap2dJb │ ├── 5C8Ls8fUU2UJhQq22smkmYkhvhcYHQzK84FtQY37Quu482pL5xskckEXqpRkH1sKNvMNQQMfxmuSDhQNy1uPx6NW │ ├── 5FfLbcuNMZgf21fQ9WsSQKZjup3TqENDskdnWo1o9ArSKmhVPfSNbqxp8G5R7r7r8ruZfJFFrn2Vn5V1JyGsGm7f │ ├── 5Ft1TCqaseZTmbsnBSt5uCKQ4QpNrWANZAmdAo5wcPrcZvYj2wBQYMEdwhSGcQyfD7uQeib2y3gFphi3kNzFTxv1 │ ├── 5GrNcZSREsgkfdyMJqJXQ3xTjuM5auAbSL3xEnzHxWejSxkt4aM2JrKjtANKkufdT2bMTHXC7dvk1QbieU7av7fv │ ├── 5NyCZWB6n4fE9JpJkgAMzv5UB2SWzPD8fszaaPgVgebb8Z4wcDRf7kzcSC3WirDeemZBsSJnbYgGMnL5vaEg9bti │ ├── 5RBQwKCQexcujaKwMVb6UM1EYhcewtmedCxn8MS1d5V14MmHjECJN39PL3SYSUGrJj3Y2z5ZvU5uuHf4WYsuB3sW │ ├── 5UfbEcTgB6pbTGkxeuU82q8RNUrSQ61ZjXgiG1fQidoSNrNGvyWMVWFggTJWJH2YcvzNxH4GCBKWj5QSkax1LJxU │ ├── 5UySiXNjD7SCWEEmyn1Mni5g483W826aLQM1yDXJkk2MgWTGcSz5T3G7k92zvDUjExmw535cvzECkmpSDSXYJBES │ ├── 5a6wJXuLMnytkLwqenXvre1cy9SvphHVfTng15pfjERPpn3NN8H4ZpTfdxd71mP7ABCE9urQhRhjU744bhYSTuMj │ ├── 5antkEwkSt7NvbQHQVCJMtXvDisci4Ked4krrNJqWi3W9jeJm51mECKuNKa15Yc4dFgArejU5hkbSxAzWa5tmEbn │ ├── 5bCTEcFeTuby7uThRQLxkVFj97BzSTjnqwwtbWuEoR5jzk5Di91DUAHCgFn3SheY3hwXSjKi2iW9og8fVYWqSJpo │ ├── 5bnfbzPp16gXcGeMTV6aMLMAAaP6z27q1veHEbWoMy5n3mtV5T4tkv4TxvrZaF5LjiMZJXmQGH9Mp2GJ4dF6Vtua │ ├── 5brf3BKanQrX1RHTFNiv7Ypviao4kq5Awi1DAthqReGiiC37RUDee1j57qyC4bToE93sEco9TJCfaAFBcaA3eNHi │ ├── 5dF9uNisiJdSywe74TGKLmk9x9CzGYkqbJd1JCYGKTCGogkNhMPKirdQJfFrk4jzQhbK1SwZaqe9vzAKPL6dD4xh │ ├── 5fbstoh4WXmrAgwX6EXm1P22EQqDVrCbmJiqQcDYdCCZvDi41oMJFUKvVjFm6zeM18fHpkakpTz3vYFT33h7Jqtz │ ├── 5jfh7LCgvgF6bxq2wB4Cj7sNXkPCD9ixja5jv7Z7V6rvnBGc96nsDGkMPr4DPM8vuCcXwZ7Yx5TT7ANhXKZLBCFN │ ├── 5m9bawfCDCD95MFqU6TMiiDb56mLcyxjeVNsRkKJMMQNRdAjGX7xwpGdQbh1KJg2UsuHnQxni8ALgXR7Aq9sEiWC │ ├── 5q2zcDf3u2TtnK8QFd4EyfzeoTWq9ufZWyzBs4igRr7tJ322zizG37qusFzLrv9ZeP22cb1owfM6kgWtAgA1QhDy │ ├── 5rXmDVWyEHPGenzpVBH9bkf5jo8SArmmYv5f9v9zmWbBhXtbeukTX2yxAZCHqHqubbpjGFaiFp9zAHvSvp5834Pf │ ├── 5vG2u4Ksk9oBCUVXtVZaCC3DF17dmTSr4NixuY8xHMphKc4WGbuF9VQKA4xkFyqoKv11SNcHUNweCaM8F6zYuqBQ │ ├── 5xRUJGVAfX9hAKUu7skCPFmP6GGUvxtkvrttQs6uDygyih6ZU8cTscsaj1B6GemgpP9WtgA6ekziH6LVFQzEVQnH │ ├── 61Gcfd3PiX73ox3GPJGVMKG8pDY9d7nCDicyFHTrKUiDc8pGBHza3BC5DNpySDB9GXVKV1LcJYYectYDbHBjqNpD │ ├── 62NJLJbKoGT9YnTu3zUfPJ4wrSynMVwXigypc8va7rDDPMaTrxX1jGzoJCHLXyxzk1m5MK5XR2yFxqhjvXjqUVRu │ ├── 64fPH2uy5YQAv2jp3kADgEZp254SUU69udoHsyYP2yFDnfzL4ZNcRRXMQqbNrv3rkciEDy3FqQb6dypt61v6W32A │ ├── 64thTyDzN9BZhsQqnMTpMwxXNbvq5JkaCqBLtVdDz1qjyHnh7yJh61rSSPRcKgmJiozJGCfQV7c5vUDgbFqg5bHM │ ├── DdEc56ybSwAz8gHjdJ3wQC9Fz2yQuHHxzswBYFUXwDwJkhYLUGNyB5xivfreZ3vCaeVVYzAZELER4bBtuVw9KuJ │ ├── FWAN6WFdhL63uhCLZ2wan6i7Gi7WZgDxLHbnYvsyevwovRW8UdaVU1R1X5eG55w5SXZtxmqAGKqpYBCyWRs7xkz │ ├── JSZ2HZDjPjesvTvYYs7Kjz2nAPYhaQy7venhEFX2LWVABnmqANMbsBhjoh6ohHvhV3FAALLYA8boGCa6i8vvWn7 │ ├── KCjYBJqjGFyWLxwjt7k2i3ZXmUJxSz1uQ7wTVj4h6kS2TQhL87rXpnaBico6exSmgxgMoLFHLULLp9ke4CFPZqx │ ├── LfsZXdWmedRAREYidPMJtzUndjH1XUTB4pyv1HyFpRaDA7fku3tyH8B1sE23oRbPWPdokRvx29H7zcEZi7ery6D │ ├── M9PqkgQ33ondh6dCjd3kSJw9GfjvJhTawcEcJrygxwYauyVH9xxrdSxmWpuUNeBWFGfCuj5JKrjngXNktA3yMRA │ ├── Nz4bf1F6EqLr8kmqb1UYv9h6rLtKUxxKowJAZSAVkJnKy7kvq6YAQb7aeDFwSvgzdq9KDsTKWhAa2ynKWyeeYQP │ ├── QYVdkhAQWRqwy9MVDQH8vkC1xfteGqDZKNYC9Qn9qD6PDxGTRWx2n4ZxQR9r6LRjxipNGF6bNcPQ1QoRh9PiVUn │ ├── RcEHt3bHzx5kygiF6rHnD9fFWdnwWaUZ91kCyMQ9czT5QAE6kXs8NuuwTYtmVMKDtFttAarDCHc7iQ6gsFwbzt1 │ ├── SKWNpBVCDewubKppBwPgmKyNdLxE95mjHzDvQpy1JDR4Kg12yrvvgwx2qcYfiKHAv28JnP6cBbYnm2noyiUqXP2 │ ├── SXSi4WKx4L3Hgo3zvCBVimSBQSL5g57z6FDAQaNKnQ2VUp3b1QpAxNuKdMSWos5P8uSJLn5RuVB3mZcMHiL2WJb │ ├── YQRUxgEzm4QPiNy3iuDRWGpVjb1DRbKc9hy8VRD7PTQPfK3VMoghdVMvYvmxzfeyeTVuXdJ7jzoow6XMxcoXfx3 │ ├── b2QJwTJdjyPhra9Do6tw266eLXnRYeZV9DuUrvKhTHq3H4TWNu5yXbNfgLNqxRkJuyG8rQjjsEhHnmNkvksSQTy │ ├── bq13FZWrcMAWgzhyGuW7qQv8s8J3pGyNwJTXeaemytHavPCKHjXtb1vSnhs3PZ7A1Q65aPTuELMPJ11UwUpzZX3 │ ├── bzjsUa5BQHqJksNmBsFspt8yMJsdEXaEv9i62NyCc9i74LMjVbxciRbi6RjjK6BmTneGYApnxdBSwpGV7jJJBcx │ ├── kRqiqhXP6wXDDA2VNu6P7C8sBCY4S1dgiV9j8w1QgvaHCwifBpa7u7MidqEaomNSweEHZk9d7rwgEzrK2LnQvTh │ ├── ngiovx9uWoyGrtwqUndkdp2kLvbhmFJ5zzuMmLd4DF439jKB9gk6tJNjp18FUyf3Qo231S3unduo78aR8tRDWTE │ ├── oVX5yjhU5LshbEzqQTHZvDQ8b1517yAH1aN5zaiN3uZthP6oNVXtMKE7N5vGcYKRYF2VQeZ8HRySpZBLjmQYD3V │ ├── sE8x5og3wY8Mrs9BnL6zmNP5g7721R2e74B4QCSLDAEh8JKYSwxNkfNpKkcv6TCvNN2hQPmUVmU2AE1Yc6JNHmJ │ └── uJjJ4djt6xQ1tiP8LQiFfoMyMEjgiC39ckoDLrzjLVUNAGszDJytxSoznpdQk2QXAP1RELaDpmEnWWdW4dFCfL9 │ ├── index_transaction │ └── 2cBtegqLxQztcngNF4qWGZYEuGiwFvmSpak4dqNaGHHQRDBGuYg24ZSG54BpRaWS5Cr4v6AWLV42FWvEjQk2ESWy │ ├── index_transaction_with_multiple_system_program_instructions_in_between │ └── 2cBtegqLxQztcngNF4qWGZYEuGiwFvmSpak4dqNaGHHQRDBGuYg24ZSG54BpRaWS5Cr4v6AWLV42FWvEjQk2ESWy │ ├── indexing_bug │ ├── 53HtJ3XiztjuKAJtY2cX8pRavaw7MGnwsvihcNtXDiSfrAghhj8YhSMwgzRbkPftYY7cQGDcm8W1PA8D2fr4H3wo │ ├── 53gmfc1VU1VHXURRyj6zwv8kvhggkwcMofTKXGJ1UFEris79mMYHppom3p3wwcnEqWciDrhVDVRAU1hcqmsPfDk7 │ ├── 5UEYDJUmBZKxNfGTBrnVCZVbjGPA2XLw3ezTQg88zVCJePTbXXpu7s9ncpA7HwfGFxqCNz14HkQqEZwfVtbW3SLK │ ├── 5wXw7jheUt9zWQKmhyhS8DaopKGjaFTda47FrBQXVhqyeDfwGVD8hfeJcpVyPzEmmb45FJtLxo2xydKPJFAtJ1j6 │ ├── 65c2R7qGU1HqRm3n6n5WWPT4jKojRv4jkVb5zjKGUPCFyMcDrJWVVVZbi2ZZJAE2m8YXUkmhb6sN4vaHdqxWhiyk │ └── Y9FZwudKniSE8ycCbMzTkmU8bzQHRSyv6v67FFbY37yxhrU1Jsyd2RE1XKnf9wrPXCYQ1682bVTdKTLA9125rc6 │ ├── lamport_transfers │ ├── 2jLuZajWysScmEeuW7egrnDLK5m15dxECAvFGVqy9B8LNxsQES4Qn2MRykjXrf1SKU9sg9cyUzsCYPcd9GdjqND2 │ ├── 3DGUfF1qnMcXE8er6U6Yaqh83punr2FBK2oW2v6MVpdPRVzPF6K67Z298LiPeech4kBb677HFnYpxqSX3y8PmqtU │ ├── 3XEuyoLXyxbaeoSFZmMDPN8Ua3gciDRny3tMVw3vmvrsF5aAda6WVWBN21Hnq6jE2wRvv1mMoPWy97uAEUue2prS │ ├── 3ZmBETHr8tHPr7iKdgW4NjTzcUCUHtSBFQD2JwSniShBV9fix6xb6FxRyR1cMRW83WerRYU5b1uxDLM3GqomCkYx │ ├── 3gaVKwzBSXoqQdjLocgtmEup98iLWb3mjX7tRu8J2tqXYte99jKRaVLrhXxPR5ZePRKgqdjxnTxHPh89nWC3Aa1w │ ├── 4TFBPyvatWgjTdNesfaTo3YkbP2spvGmgZgLn6CvTeqRZSi1ZuPCkK7fLaDbPKskMSF4Azge6QPvtZt9VUV7KBF8 │ ├── 4dqYnWSm8qKxCyeADsc1eqQBSQQ7BneXbeNxmw8P6Fu5TVv26Roud4UwtvBfy4bV7NLFe1NK97ytqwPqwyGRGVT3 │ ├── 4fNZoVnaJ5DYjJGjFLkaUtoeyeNV4CTVeyTzAT8GsxLu3J29pS6AUR6QphaDszLoFFMZXLGqmWhN5ox5iiqtjqSW │ ├── 4hyshcVVLqy7AtnB2CdLixvHTEwHARNwZ69gqd2ij7u6bmPvK9nbR4CeYTCLDyXZJ8DPmH6GmZ26MpqiLSxkorEz │ ├── 5Mi1rJzJskdDqnyXS1k8rw91Gm9qsnFuAEmF5G2f21PFXGuoDHpdV4iLjvo9VjDp2kWBBxFnugLAdioyeHRcz5JA │ ├── 5NLdbqznXqmTPTN8JBLquriDggb9qaRszVGLSvt6t5esy2Q8Z1iqAuXF4qoLK7HM6oGLySUNUkzhnSocwArpAqmV │ ├── 5gJtG7XNSuNWAKbMnUj8xaJgSDDVy7AdduHNXxxMXSNrPFPZSkwnseMBhPGrQNBfwE9vZ2VNVhXfDcqbt1WMXvJe │ ├── 5j7ZADFa91AW3BhHCJdqu5Hbaqe9tH4MM9wHYobQ1CqrrA2xRQgrtVXDxwQnPyHHAgL9h6VNBGLBTMT1Q3cU5241 │ ├── 64tDNpAnQHZsuiH8UG8vXDzXbwGHdghfLYerPdaVdgkQ2kSTE65kDT7ajzzhd2ZDW8nVoKYztnjxCaV8bWJxNCXR │ ├── QBrbAZFq12LCbnv5dByn8vB8Znam4ieGQVzybapgPL5LCa9KHfuYZKV6Nah6UGsa6FUptmT6tSpexWZDrbp82iP │ ├── akFrcAJwhAeK6AyrMvtcMXF13Cd451NLmCmGteL3WbZnzCrW25GUr7Ku5thfwCT28M8TJbRa5p854gVr1cVvDgN │ ├── kNXkK3aXPDurmMfPbcfPNwNEWbtqdmFLcE8ZrH3oV7tbHBdH3xzUYso7icJZ4sT7MNjemsH8MdK9WW5CTHaUM59 │ └── yK3j6TkABz2SVBtvsVwJV5ZoLv1tJBrBR8Z8JsosHQGbeizt7yx8Qx1Nva1ytcKa7hAXsT7R6WyQUiCH43Cwtk5 │ ├── nullfiier_and_address_queue_transactions │ ├── 35zJYUMreV5BRzuzSSfqSVWzLtMqPtWtLBkkH2CP24gFWijju46Vi3ARawzxs22GqZPbXo6uzSosaUXGLgRA9Hth │ ├── 3pmqSXTSzdbbgmp63v1Dz1NGM5Z187wisdsonL8gDcPAimfFdnCB3H5agtcHg1fmhkkWk4PgGTjS2GjzQPknuGcg │ ├── 3qSTxmtPen9HtjEhKGpzYdLvRqEQaxSeLaGeav2GC5c2PU8ZEVq84HSeMCxN3jrt6NWB5ZoWPAGn1dv27y3zyG75 │ ├── 5cVDo2gGEcE7Dci3NKfWkkrnCFy7yUucXeseyvmtcnZ4V181vuBhuxd9CPD1AXV47yZfv1Nbk7C3Cfzz1L7QN7Xf │ └── gXhNzuJHcVz6k625LkeLB9qLU7D56WnHXH6hHBCQfdv7eYPbZPqWpqEjpz86qWa23megQofz8PPBYtPqEHCicbF │ ├── nullifier_queue │ ├── 2xf6hAKP6vBCj3tHd6yqiZyq47jzt5LfdtpkJvi71J3fJzkHSCStnFLY6KagCKsvrASLJuSn7xkUxAbXJdi3THR7 │ ├── 3z5aGksRbQCFvNvutWcz1qAnC1fzTAsa6Mz6NpbveKZfVcAuQ1xE1vkoFYoJLwEjRbgv5CwLrDPEP1KmVTpJ9skD │ ├── 5q9BukwnKaathmUBu1WvhnUSyKRqqGWQfoj8WNCL6QNLWAXcxMH1oCuBU899mxYq2QhJAz9StX5wLtr6k5c2zEXM │ ├── 9LWs9tHoLNPpEVhJojECoDtVEHkmtNJ2VTb2fAEjE6Jqk51pJ5icqgneajXZ128F6isYyrAunu3FxMfvT8AMYt7 │ ├── qE2LpzJaLQygiQUwa2TQhVeRohA9mYq6fsifb2ujvsBuFbyau5SkQn5mURGQH2MHV6r4gGXh2vQDrKqNTruM6ru │ └── wRPnjQc4ydZJWNVQ1ws9fSWCyPNJaYgVWmbJch64HgbbjPey1B5mPRQzqMF46dqphtjoyeuzL9pWKj9kvwGX1kr │ ├── transaction_with_tree_rollover_fee │ └── 2cBtegqLxQztcngNF4qWGZYEuGiwFvmSpak4dqNaGHHQRDBGuYg24ZSG54BpRaWS5Cr4v6AWLV42FWvEjQk2ESWy │ └── validity_proof │ ├── 4ETLuGztX78vTrqxV5gucpQeD6ayEYrpA7bfMA9RJ1rKto2Hd6eBBRvYETrwLW5KQf7N8egGBo1mP5PLUAX7T3pm │ ├── 5YJgpi1BePKtFVQjcAqwgbFL4pMGjBpLbnuaXE3kJe2yRJHeEZkFVXQYHk56d5EjPvhkJ6U3F3bryxjbtbD7ZBpL │ └── N955JL3hSckkfpaB8r2W6vpMQCGXfuzcsYVdkj15zxUxSNUGnArM8KQyjirY1xxfK8QF9tdS79ANdjFfHCDmdR7 └── integration_tests ├── batched_address_tree_tests.rs ├── batched_state_tree_tests.rs ├── e2e_tests.rs ├── main.rs ├── mock_tests.rs ├── open_api_tests.rs ├── prod_tests.rs ├── snapshot_tests.rs ├── snapshots ├── integration_tests__e2e_tests__address_with_nullifiers-proof.snap ├── integration_tests__e2e_tests__address_with_nullifiers-transactions.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer-bob-accounts.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer-bob-proofs.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer-bob-token-balances.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer-bob-token-signatures.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer-bob-validity-proof.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer-charles-accounts.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer-charles-proofs.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer-charles-token-balances.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer-charles-token-signatures.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer-charles-validity-proof.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer-latest-signatures.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer-mint-transaction.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer-transfer-transaction.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-bob-accounts.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-bob-proofs.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-bob-token-balances.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-bob-token-signatures.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-bob-validity-proof.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-charles-accounts.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-charles-proofs.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-charles-token-balances.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-charles-token-signatures.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-charles-validity-proof.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-latest-signatures.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-mint-transaction.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-transfer-transaction.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-bob-accounts.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-bob-proofs.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-bob-token-balances.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-bob-token-signatures.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-bob-validity-proof.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-charles-accounts.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-charles-proofs.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-charles-token-balances.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-charles-token-signatures.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-charles-validity-proof.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-latest-signatures.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-mint-transaction.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-transfer-transaction.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-bob-accounts-v2.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-bob-accounts.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-bob-proofs.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-bob-token-balances.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-bob-token-signatures.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-bob-validity-proof-v2.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-bob-validity-proof.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-charles-accounts-v2.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-charles-accounts.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-charles-proofs.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-charles-token-balances.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-charles-token-signatures.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-charles-validity-proof-v2.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-charles-validity-proof.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-latest-signatures.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-mint-transaction-v2.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-mint-transaction.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-transfer-transaction-v2.snap ├── integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-transfer-transaction.snap ├── integration_tests__e2e_tests__get_lanon_voting_signatures-non-voting-transactions.snap ├── integration_tests__e2e_tests__get_lanon_voting_signatures_with_failures-non-voting-transactions.snap ├── integration_tests__e2e_tests__indexing_bug-proof.snap ├── integration_tests__e2e_tests__lamport_transfers-payer-accounts.snap ├── integration_tests__e2e_tests__lamport_transfers-payer-proofs.snap ├── integration_tests__e2e_tests__lamport_transfers-payer-validity-proof.snap ├── integration_tests__e2e_tests__lamport_transfers-receiver-accounts.snap ├── integration_tests__e2e_tests__lamport_transfers-receiver-proofs.snap ├── integration_tests__e2e_tests__lamport_transfers-receiver-validity-proof.snap ├── integration_tests__e2e_tests__nullfiier_and_address_queue_transactions-accounts.snap ├── integration_tests__e2e_tests__nullfiier_and_address_queue_transactions-proof-address.snap ├── integration_tests__e2e_tests__nullfiier_and_address_queue_transactions-proofs.snap ├── integration_tests__e2e_tests__nullifier_queue-accounts.snap ├── integration_tests__e2e_tests__nullifier_queue-proofs.snap ├── integration_tests__e2e_tests__payer-lamport_transfers-signatures.snap ├── integration_tests__e2e_tests__receiver-lamport_transfers-signatures.snap ├── integration_tests__mock_tests__get_multiple_new_address_proofs.snap ├── integration_tests__mock_tests__get_multiple_new_address_proofs_interop-validity-proof-v2.snap ├── integration_tests__mock_tests__get_multiple_new_address_proofs_interop-validity-proof.snap ├── integration_tests__mock_tests__get_multiple_new_address_proofs_interop.snap └── integration_tests__prod_tests__incorrect_root_bug.snap └── utils.rs /.dockerignore: -------------------------------------------------------------------------------- 1 | target/ 2 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## Overview 2 | 3 | - Summary of changes 4 | 5 | ## Testing 6 | 7 | - Testing performed to validate the changes 8 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | branches: [main] 8 | 9 | jobs: 10 | test: 11 | name: Run tests 12 | runs-on: ubuntu-latest 13 | services: 14 | postgres: 15 | image: postgres:16 16 | env: 17 | POSTGRES_PASSWORD: postgres 18 | POSTGRES_USER: postgres 19 | POSTGRES_DB: postgres 20 | ports: 21 | - 5432:5432 22 | options: >- 23 | --health-cmd pg_isready 24 | --health-interval 10s 25 | --health-timeout 5s 26 | --health-retries 5 27 | 28 | steps: 29 | - uses: actions/checkout@v3 30 | 31 | - name: Install Rust 32 | uses: actions-rs/toolchain@v1 33 | with: 34 | profile: minimal 35 | toolchain: stable 36 | override: true 37 | 38 | - name: Cache dependencies 39 | uses: actions/cache@v3 40 | with: 41 | path: | 42 | ~/.cargo/registry 43 | ~/.cargo/git 44 | target 45 | key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} 46 | 47 | - name: Install additional tools 48 | run: | 49 | npm install -g @apidevtools/swagger-cli 50 | wget https://dl.min.io/server/minio/release/linux-amd64/minio 51 | chmod +x minio 52 | 53 | - name: Start light-prover container 54 | run: | 55 | docker run -d -p 3001:3001 docker.io/sergeytimoshin/prover:latest 56 | 57 | - name: Set environment variables 58 | run: | 59 | echo "MAINNET_RPC_URL=https://api.mainnet-beta.solana.com" >> $GITHUB_ENV 60 | echo "DEVNET_RPC_URL=https://api.devnet.solana.com" >> $GITHUB_ENV 61 | echo "TEST_DATABASE_URL=postgres://postgres:postgres@localhost:5432/postgres" >> $GITHUB_ENV 62 | echo "DATABASE_URL=postgres://postgres:postgres@localhost:5432/postgres" >> $GITHUB_ENV 63 | 64 | - name: Run migrations 65 | run: cargo run --bin photon-migration up 66 | 67 | - name: Run tests 68 | run: cargo test 69 | -------------------------------------------------------------------------------- /.github/workflows/publish_crate.yaml: -------------------------------------------------------------------------------- 1 | name: Publish Photon Crate 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | manual-job: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Check out repository code 11 | uses: actions/checkout@v4 12 | 13 | - name: Setup Rust environment 14 | uses: actions-rs/toolchain@v1 15 | with: 16 | toolchain: stable 17 | default: true 18 | profile: minimal 19 | 20 | - name: Publish to crates.io 21 | uses: actions-rs/cargo@v1 22 | with: 23 | command: publish 24 | args: --token ${{ secrets.CRATES_IO_TOKEN }} 25 | env: 26 | CARGO_REGISTRY_TOKEN: ${{ secrets.CRATES_IO_TOKEN }} 27 | -------------------------------------------------------------------------------- /.github/workflows/publish_dockerfile.yaml: -------------------------------------------------------------------------------- 1 | name: Publish Dockerfile 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | build: 10 | runs-on: buildjet-16vcpu-ubuntu-2204 11 | steps: 12 | - uses: actions/checkout@v3 13 | # Count the number of commits on the current branch 14 | - name: Count commits 15 | run: echo "COMMIT_COUNT=$(git rev-list --count HEAD)" >> $GITHUB_ENV 16 | 17 | # Grab the short SHA from Git to use in tagging 18 | - name: Grab Github short SHA 19 | run: | 20 | echo "SHORT_SHA=$(git rev-parse --short "$GITHUB_SHA")" >> $GITHUB_ENV 21 | 22 | # Set up AWS CLI with credentials 23 | - name: Set up AWS CLI 24 | uses: aws-actions/configure-aws-credentials@v1 25 | with: 26 | aws-access-key-id: ${{ secrets.ECR_HELIUS_PROD_AWS_ACCESS_KEY_ID }} 27 | aws-secret-access-key: ${{ secrets.ECR_HELIUS_PROD_AWS_SECRET_ACCESS_KEY }} 28 | aws-region: us-east-2 29 | 30 | - name: Login to Amazon Public ECR 31 | run: | 32 | aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws 33 | 34 | # Build and push Docker image using matrix for different Dockerfiles 35 | - name: Build and Push Docker image 36 | run: | 37 | IMAGE_TAG=${{ github.run_number }}-${{ env.SHORT_SHA }} 38 | IMAGE_LOCATION=public.ecr.aws/f7o9l7p1/photon 39 | IMAGE_URI=$IMAGE_LOCATION:$IMAGE_TAG 40 | docker build . -t $IMAGE_URI -t $IMAGE_LOCATION:latest 41 | docker push $IMAGE_URI 42 | docker push $IMAGE_LOCATION:latest 43 | echo "Image pushed: $IMAGE_URI" -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env* 2 | .idea 3 | 4 | test-ledger/ 5 | 6 | # Added by cargo 7 | 8 | /target 9 | /.cargo 10 | 11 | .DS_Store 12 | 13 | minio 14 | test.db 15 | docker-compose.yml 16 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM rust:1.81-slim-bullseye 2 | RUN apt update && apt install -y build-essential pkg-config libssl-dev 3 | 4 | # Copy the project files 5 | COPY . . 6 | 7 | # Build the project 8 | RUN cargo build --release 9 | 10 | RUN mv target/release/photon . 11 | RUN mv target/release/photon-snapshotter . 12 | RUN mv target/release/photon-migration . 13 | 14 | RUN rm -rf target 15 | 16 | -------------------------------------------------------------------------------- /generate_api.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | rm -rf ../light-protocol/sdk-libs/photon-api 4 | 5 | npx @openapitools/openapi-generator-cli generate \ 6 | -i src/openapi/specs/api.yaml \ 7 | -g rust \ 8 | -o ../light-protocol/sdk-libs/photon-api \ 9 | --additional-properties=preferUnsignedInt=true,packageName=photon-api 10 | -------------------------------------------------------------------------------- /openapitools.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", 3 | "spaces": 2, 4 | "generator-cli": { 5 | "version": "7.5.0" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/api/method/get_compressed_account.rs: -------------------------------------------------------------------------------- 1 | use crate::common::typedefs::account::{Account, AccountV2}; 2 | use crate::dao::generated::accounts; 3 | 4 | use super::super::error::PhotonApiError; 5 | use super::utils::{AccountDataTable, CompressedAccountRequest}; 6 | use crate::common::typedefs::context::Context; 7 | use sea_orm::{DatabaseConnection, EntityTrait, QueryFilter}; 8 | use serde::Serialize; 9 | use utoipa::ToSchema; 10 | 11 | // We do not use generics to simply documentation generation. 12 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, ToSchema)] 13 | #[serde(deny_unknown_fields, rename_all = "camelCase")] 14 | pub struct AccountResponse { 15 | pub context: Context, 16 | pub value: Option, 17 | } 18 | 19 | pub async fn get_compressed_account( 20 | conn: &DatabaseConnection, 21 | request: CompressedAccountRequest, 22 | ) -> Result { 23 | let context = Context::extract(conn).await?; 24 | let id = request.parse_id()?; 25 | let account_model = accounts::Entity::find() 26 | .filter(id.filter(AccountDataTable::Accounts)) 27 | .one(conn) 28 | .await?; 29 | 30 | let account = account_model.map(TryFrom::try_from).transpose()?; 31 | 32 | Ok(AccountResponse { 33 | value: { account }, 34 | context, 35 | }) 36 | } 37 | 38 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, ToSchema)] 39 | #[serde(deny_unknown_fields, rename_all = "camelCase")] 40 | pub struct AccountResponseV2 { 41 | pub context: Context, 42 | pub value: Option, 43 | } 44 | 45 | pub async fn get_compressed_account_v2( 46 | conn: &DatabaseConnection, 47 | request: CompressedAccountRequest, 48 | ) -> Result { 49 | let context = Context::extract(conn).await?; 50 | let id = request.parse_id()?; 51 | let account_model = accounts::Entity::find() 52 | .filter(id.filter(AccountDataTable::Accounts)) 53 | .one(conn) 54 | .await?; 55 | 56 | let account = account_model.map(TryFrom::try_from).transpose()?; 57 | 58 | Ok(AccountResponseV2 { 59 | value: { account }, 60 | context, 61 | }) 62 | } 63 | -------------------------------------------------------------------------------- /src/api/method/get_compressed_account_balance.rs: -------------------------------------------------------------------------------- 1 | use super::super::error::PhotonApiError; 2 | use super::utils::CompressedAccountRequest; 3 | use super::utils::{parse_decimal, AccountBalanceResponse, AccountDataTable, LamportModel}; 4 | use crate::common::typedefs::context::Context; 5 | use crate::common::typedefs::unsigned_integer::UnsignedInteger; 6 | use crate::dao::generated::accounts; 7 | use sea_orm::{DatabaseConnection, EntityTrait, QueryFilter, QuerySelect}; 8 | use sqlx::types::Decimal; 9 | 10 | pub async fn get_compressed_account_balance( 11 | conn: &DatabaseConnection, 12 | request: CompressedAccountRequest, 13 | ) -> Result { 14 | let context = Context::extract(conn).await?; 15 | let id = request.parse_id()?; 16 | 17 | let balance = accounts::Entity::find() 18 | .select_only() 19 | .column(accounts::Column::Lamports) 20 | .filter(id.filter(AccountDataTable::Accounts)) 21 | .into_model::() 22 | .one(conn) 23 | .await? 24 | .map(|x| x.lamports) 25 | .unwrap_or(Decimal::from(0)); 26 | 27 | Ok(AccountBalanceResponse { 28 | value: UnsignedInteger(parse_decimal(balance)?), 29 | context, 30 | }) 31 | } 32 | -------------------------------------------------------------------------------- /src/api/method/get_compressed_account_proof/mod.rs: -------------------------------------------------------------------------------- 1 | mod v1; 2 | mod v2; 3 | 4 | pub use v1::{ 5 | get_compressed_account_proof, GetCompressedAccountProofResponse, 6 | GetCompressedAccountProofResponseValue, 7 | }; 8 | pub use v2::{ 9 | get_compressed_account_proof_v2, GetCompressedAccountProofResponseV2, 10 | GetCompressedAccountProofResponseValueV2, 11 | }; 12 | -------------------------------------------------------------------------------- /src/api/method/get_compressed_account_proof/v1.rs: -------------------------------------------------------------------------------- 1 | use crate::api::error::PhotonApiError; 2 | use crate::api::method::utils::HashRequest; 3 | use crate::common::typedefs::context::Context; 4 | use crate::common::typedefs::hash::Hash; 5 | use crate::common::typedefs::serializable_pubkey::SerializablePubkey; 6 | use crate::ingester::persist::{get_multiple_compressed_leaf_proofs, MerkleProofWithContext}; 7 | use sea_orm::{ConnectionTrait, DatabaseBackend, DatabaseConnection, Statement, TransactionTrait}; 8 | use serde::{Deserialize, Serialize}; 9 | use utoipa::ToSchema; 10 | 11 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)] 12 | #[serde(deny_unknown_fields, rename_all = "camelCase")] 13 | pub struct GetCompressedAccountProofResponse { 14 | pub context: Context, 15 | pub value: GetCompressedAccountProofResponseValue, 16 | } 17 | 18 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)] 19 | #[serde(deny_unknown_fields, rename_all = "camelCase")] 20 | #[allow(non_snake_case)] 21 | pub struct GetCompressedAccountProofResponseValue { 22 | pub proof: Vec, 23 | pub root: Hash, 24 | pub leaf_index: u32, 25 | pub hash: Hash, 26 | pub merkle_tree: SerializablePubkey, 27 | pub root_seq: u64, 28 | } 29 | 30 | impl From for GetCompressedAccountProofResponseValue { 31 | fn from(proof: MerkleProofWithContext) -> Self { 32 | GetCompressedAccountProofResponseValue { 33 | proof: proof.proof, 34 | root: proof.root, 35 | leaf_index: proof.leaf_index, 36 | hash: proof.hash, 37 | merkle_tree: proof.merkle_tree, 38 | root_seq: proof.root_seq, 39 | } 40 | } 41 | } 42 | 43 | pub async fn get_compressed_account_proof( 44 | conn: &DatabaseConnection, 45 | request: HashRequest, 46 | ) -> Result { 47 | let context = Context::extract(conn).await?; 48 | let hash = request.hash; 49 | let tx = conn.begin().await?; 50 | if tx.get_database_backend() == DatabaseBackend::Postgres { 51 | tx.execute(Statement::from_string( 52 | tx.get_database_backend(), 53 | "SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;".to_string(), 54 | )) 55 | .await?; 56 | } 57 | let res = get_multiple_compressed_leaf_proofs(&tx, vec![hash]) 58 | .await? 59 | .into_iter() 60 | .next() 61 | .map(|account| GetCompressedAccountProofResponse { 62 | value: account.into(), 63 | context, 64 | }) 65 | .ok_or(PhotonApiError::RecordNotFound( 66 | "Account not found".to_string(), 67 | )); 68 | tx.commit().await?; 69 | res 70 | } 71 | -------------------------------------------------------------------------------- /src/api/method/get_compressed_accounts_by_owner/indexed_accounts.rs: -------------------------------------------------------------------------------- 1 | pub trait IndexedAccounts { 2 | fn get_accounts() -> &'static [&'static str]; 3 | fn is_indexed_account(account: &str) -> bool { 4 | Self::get_accounts().contains(&account) 5 | } 6 | } 7 | 8 | pub struct Solayer; 9 | impl IndexedAccounts for Solayer { 10 | fn get_accounts() -> &'static [&'static str] { 11 | &[ 12 | "S1ay5sk6FVkvsNFZShMw2YK3nfgJZ8tpBBGuHWDZ266", 13 | "2sYfW81EENCMe415CPhE2XzBA5iQf4TXRs31W1KP63YT", 14 | "ARDPkhymCbfdan375FCgPnBJQvUfHeb7nHVdBfwWSxrp", 15 | "2sYfW81EENCMe415CPhE2XzBA5iQf4TXRs31W1KP63YT", 16 | ] 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/api/method/get_compressed_accounts_by_owner/mod.rs: -------------------------------------------------------------------------------- 1 | mod common; 2 | mod indexed_accounts; 3 | mod v1; 4 | mod v2; 5 | 6 | pub use common::{DataSlice, FilterSelector, GetCompressedAccountsByOwnerRequest, Memcmp}; 7 | pub use v1::{ 8 | get_compressed_accounts_by_owner, GetCompressedAccountsByOwnerResponse, PaginatedAccountList, 9 | }; 10 | pub use v2::{ 11 | get_compressed_accounts_by_owner_v2, GetCompressedAccountsByOwnerResponseV2, 12 | PaginatedAccountListV2, 13 | }; 14 | -------------------------------------------------------------------------------- /src/api/method/get_compressed_accounts_by_owner/v1.rs: -------------------------------------------------------------------------------- 1 | use crate::api::error::PhotonApiError; 2 | use crate::api::method::get_compressed_accounts_by_owner::common::{ 3 | validate_filters, GetCompressedAccountsByOwnerRequest, QueryBuilder, 4 | }; 5 | use crate::api::method::get_compressed_accounts_by_owner::indexed_accounts::Solayer; 6 | use crate::common::typedefs::context::Context; 7 | use crate::common::typedefs::hash::Hash; 8 | use crate::{common::typedefs::account::Account, dao::generated::accounts}; 9 | use sea_orm::{ConnectionTrait, DatabaseConnection, FromQueryResult, Statement}; 10 | use serde::Serialize; 11 | use utoipa::ToSchema; 12 | 13 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, ToSchema, Default)] 14 | #[serde(deny_unknown_fields, rename_all = "camelCase")] 15 | pub struct PaginatedAccountList { 16 | pub items: Vec, 17 | pub cursor: Option, 18 | } 19 | 20 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, ToSchema)] 21 | #[serde(deny_unknown_fields, rename_all = "camelCase")] 22 | pub struct GetCompressedAccountsByOwnerResponse { 23 | pub context: Context, 24 | pub value: PaginatedAccountList, 25 | } 26 | 27 | pub async fn get_compressed_accounts_by_owner( 28 | conn: &DatabaseConnection, 29 | request: GetCompressedAccountsByOwnerRequest, 30 | ) -> Result { 31 | let context = Context::extract(conn).await?; 32 | validate_filters(&request.filters)?; 33 | 34 | let owner_str = request.owner.to_string(); 35 | QueryBuilder::check_account_limits::(conn, &owner_str, !request.filters.is_empty()) 36 | .await?; 37 | 38 | let mut query_builder = QueryBuilder::new(); 39 | query_builder.build_base_query(conn, &request)?; 40 | 41 | let columns = format!( 42 | "hash, {}, data_hash, address, owner, tree, leaf_index, seq, slot_created, spent, prev_spent, lamports, discriminator, queue, in_output_queue, nullifier_queue_index, nullified_in_tree, nullifier, tx_hash, tree_type", 43 | query_builder.data_column 44 | ); 45 | 46 | let raw_sql = query_builder.get_query(&columns); 47 | 48 | let result: Vec = accounts::Model::find_by_statement(Statement::from_string( 49 | conn.get_database_backend(), 50 | raw_sql, 51 | )) 52 | .all(conn) 53 | .await?; 54 | 55 | let items = result 56 | .into_iter() 57 | .map(TryFrom::try_from) 58 | .collect::, PhotonApiError>>()?; 59 | 60 | let mut cursor = items.last().map(|u| u.hash.clone()); 61 | if items.len() < query_builder.query_limit as usize { 62 | cursor = None; 63 | } 64 | 65 | Ok(GetCompressedAccountsByOwnerResponse { 66 | context, 67 | value: PaginatedAccountList { items, cursor }, 68 | }) 69 | } 70 | -------------------------------------------------------------------------------- /src/api/method/get_compressed_accounts_by_owner/v2.rs: -------------------------------------------------------------------------------- 1 | use crate::api::error::PhotonApiError; 2 | use crate::api::method::get_compressed_accounts_by_owner::common::{ 3 | validate_filters, GetCompressedAccountsByOwnerRequest, QueryBuilder, 4 | }; 5 | use crate::api::method::get_compressed_accounts_by_owner::indexed_accounts::Solayer; 6 | use crate::common::typedefs::account::AccountV2; 7 | use crate::common::typedefs::context::Context; 8 | use crate::common::typedefs::hash::Hash; 9 | use crate::dao::generated::accounts; 10 | use sea_orm::{ConnectionTrait, DatabaseConnection, FromQueryResult, Statement}; 11 | use serde::Serialize; 12 | use utoipa::ToSchema; 13 | 14 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, ToSchema, Default)] 15 | #[serde(deny_unknown_fields, rename_all = "camelCase")] 16 | pub struct PaginatedAccountListV2 { 17 | pub items: Vec, 18 | pub cursor: Option, 19 | } 20 | 21 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, ToSchema)] 22 | #[serde(deny_unknown_fields, rename_all = "camelCase")] 23 | pub struct GetCompressedAccountsByOwnerResponseV2 { 24 | pub context: Context, 25 | pub value: PaginatedAccountListV2, 26 | } 27 | 28 | pub async fn get_compressed_accounts_by_owner_v2( 29 | conn: &DatabaseConnection, 30 | request: GetCompressedAccountsByOwnerRequest, 31 | ) -> Result { 32 | let context = Context::extract(conn).await?; 33 | 34 | validate_filters(&request.filters)?; 35 | 36 | let owner_str = request.owner.to_string(); 37 | QueryBuilder::check_account_limits::(conn, &owner_str, !request.filters.is_empty()) 38 | .await?; 39 | 40 | let mut query_builder = QueryBuilder::new(); 41 | query_builder.build_base_query(conn, &request)?; 42 | 43 | let columns = format!( 44 | "hash, {}, data_hash, address, owner, tree, queue, in_output_queue, nullifier_queue_index, tx_hash, nullifier, leaf_index, seq, slot_created, spent, prev_spent, lamports, discriminator, nullified_in_tree, tree_type", 45 | query_builder.data_column 46 | ); 47 | 48 | let raw_sql = query_builder.get_query(&columns); 49 | 50 | let result: Vec = accounts::Model::find_by_statement(Statement::from_string( 51 | conn.get_database_backend(), 52 | raw_sql, 53 | )) 54 | .all(conn) 55 | .await?; 56 | let items = result 57 | .into_iter() 58 | .map(TryFrom::try_from) 59 | .collect::, PhotonApiError>>()?; 60 | 61 | let mut cursor = items.last().map(|u| u.hash.clone()); 62 | if items.len() < query_builder.query_limit as usize { 63 | cursor = None; 64 | } 65 | 66 | Ok(GetCompressedAccountsByOwnerResponseV2 { 67 | context, 68 | value: PaginatedAccountListV2 { items, cursor }, 69 | }) 70 | } 71 | -------------------------------------------------------------------------------- /src/api/method/get_compressed_balance_by_owner.rs: -------------------------------------------------------------------------------- 1 | use super::super::error::PhotonApiError; 2 | use super::utils::{parse_decimal, AccountBalanceResponse, LamportModel}; 3 | use crate::common::typedefs::context::Context; 4 | use crate::common::typedefs::serializable_pubkey::SerializablePubkey; 5 | use crate::common::typedefs::unsigned_integer::UnsignedInteger; 6 | use crate::dao::generated::owner_balances; 7 | use sea_orm::{ColumnTrait, DatabaseConnection, EntityTrait, QueryFilter, QuerySelect}; 8 | use serde::{Deserialize, Serialize}; 9 | use utoipa::ToSchema; 10 | 11 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, Default)] 12 | #[serde(rename_all = "camelCase")] 13 | pub struct GetCompressedBalanceByOwnerRequest { 14 | pub owner: SerializablePubkey, 15 | } 16 | 17 | pub async fn get_compressed_balance_by_owner( 18 | conn: &DatabaseConnection, 19 | request: GetCompressedBalanceByOwnerRequest, 20 | ) -> Result { 21 | let context = Context::extract(conn).await?; 22 | let owner = request.owner; 23 | 24 | let balances = owner_balances::Entity::find() 25 | .select_only() 26 | .column(owner_balances::Column::Lamports) 27 | .filter(owner_balances::Column::Owner.eq::>(owner.into())) 28 | .into_model::() 29 | .all(conn) 30 | .await? 31 | .iter() 32 | .map(|x| parse_decimal(x.lamports)) 33 | .collect::, PhotonApiError>>()?; 34 | 35 | let total_balance = balances.iter().sum::(); 36 | 37 | Ok(AccountBalanceResponse { 38 | value: UnsignedInteger(total_balance), 39 | context, 40 | }) 41 | } 42 | -------------------------------------------------------------------------------- /src/api/method/get_compressed_token_account_balance.rs: -------------------------------------------------------------------------------- 1 | use crate::common::typedefs::unsigned_integer::UnsignedInteger; 2 | use crate::dao::generated::token_accounts; 3 | use sea_orm::{DatabaseConnection, EntityTrait, QueryFilter, QuerySelect}; 4 | use serde::{Deserialize, Serialize}; 5 | 6 | use super::super::error::PhotonApiError; 7 | use super::utils::{parse_decimal, AccountDataTable}; 8 | use super::utils::{BalanceModel, CompressedAccountRequest}; 9 | use crate::common::typedefs::context::Context; 10 | use sqlx::types::Decimal; 11 | use utoipa::ToSchema; 12 | 13 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)] 14 | #[serde(deny_unknown_fields, rename_all = "camelCase")] 15 | // This is a struct because in the future we might add other fields here like decimals or uiAmount, 16 | // which is a string representation with decimals in the form of "10.00" 17 | pub struct TokenAccountBalance { 18 | pub amount: UnsignedInteger, 19 | } 20 | 21 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)] 22 | #[serde(deny_unknown_fields, rename_all = "camelCase")] 23 | // We do not use generics to simplify documentation generation. 24 | pub struct GetCompressedTokenAccountBalanceResponse { 25 | pub context: Context, 26 | pub value: TokenAccountBalance, 27 | } 28 | 29 | pub async fn get_compressed_token_account_balance( 30 | conn: &DatabaseConnection, 31 | request: CompressedAccountRequest, 32 | ) -> Result { 33 | let context = Context::extract(conn).await?; 34 | let id = request.parse_id()?; 35 | let balance = token_accounts::Entity::find() 36 | .select_only() 37 | .column(token_accounts::Column::Amount) 38 | .filter(id.filter(AccountDataTable::TokenAccounts)) 39 | .into_model::() 40 | .one(conn) 41 | .await? 42 | .map(|x| x.amount) 43 | .unwrap_or(Decimal::from(0)); 44 | 45 | Ok(GetCompressedTokenAccountBalanceResponse { 46 | value: TokenAccountBalance { 47 | amount: UnsignedInteger(parse_decimal(balance)?), 48 | }, 49 | context, 50 | }) 51 | } 52 | -------------------------------------------------------------------------------- /src/api/method/get_compressed_token_accounts_by_delegate.rs: -------------------------------------------------------------------------------- 1 | use sea_orm::DatabaseConnection; 2 | 3 | use super::{ 4 | super::error::PhotonApiError, 5 | utils::{ 6 | fetch_token_accounts, fetch_token_accounts_v2, Authority, 7 | GetCompressedTokenAccountsByAuthorityOptions, GetCompressedTokenAccountsByDelegate, 8 | TokenAccountListResponse, TokenAccountListResponseV2, 9 | }, 10 | }; 11 | 12 | pub async fn get_compressed_account_token_accounts_by_delegate( 13 | conn: &DatabaseConnection, 14 | request: GetCompressedTokenAccountsByDelegate, 15 | ) -> Result { 16 | let GetCompressedTokenAccountsByDelegate { 17 | delegate, 18 | mint, 19 | cursor, 20 | limit, 21 | } = request; 22 | let options = GetCompressedTokenAccountsByAuthorityOptions { 23 | mint, 24 | cursor, 25 | limit, 26 | }; 27 | fetch_token_accounts(conn, Authority::Delegate(delegate), options).await 28 | } 29 | 30 | pub async fn get_compressed_account_token_accounts_by_delegate_v2( 31 | conn: &DatabaseConnection, 32 | request: GetCompressedTokenAccountsByDelegate, 33 | ) -> Result { 34 | let GetCompressedTokenAccountsByDelegate { 35 | delegate, 36 | mint, 37 | cursor, 38 | limit, 39 | } = request; 40 | let options = GetCompressedTokenAccountsByAuthorityOptions { 41 | mint, 42 | cursor, 43 | limit, 44 | }; 45 | fetch_token_accounts_v2(conn, Authority::Delegate(delegate), options).await 46 | } 47 | -------------------------------------------------------------------------------- /src/api/method/get_compressed_token_accounts_by_owner.rs: -------------------------------------------------------------------------------- 1 | use sea_orm::DatabaseConnection; 2 | 3 | use super::utils::{ 4 | fetch_token_accounts_v2, Authority, GetCompressedTokenAccountsByAuthorityOptions, 5 | GetCompressedTokenAccountsByOwner, TokenAccountListResponse, TokenAccountListResponseV2, 6 | }; 7 | use super::{super::error::PhotonApiError, utils::fetch_token_accounts}; 8 | 9 | pub async fn get_compressed_token_accounts_by_owner( 10 | conn: &DatabaseConnection, 11 | request: GetCompressedTokenAccountsByOwner, 12 | ) -> Result { 13 | let GetCompressedTokenAccountsByOwner { 14 | owner, 15 | mint, 16 | cursor, 17 | limit, 18 | } = request; 19 | let options = GetCompressedTokenAccountsByAuthorityOptions { 20 | mint, 21 | cursor, 22 | limit, 23 | }; 24 | fetch_token_accounts(conn, Authority::Owner(owner), options).await 25 | } 26 | 27 | pub async fn get_compressed_token_accounts_by_owner_v2( 28 | conn: &DatabaseConnection, 29 | request: GetCompressedTokenAccountsByOwner, 30 | ) -> Result { 31 | let GetCompressedTokenAccountsByOwner { 32 | owner, 33 | mint, 34 | cursor, 35 | limit, 36 | } = request; 37 | let options = GetCompressedTokenAccountsByAuthorityOptions { 38 | mint, 39 | cursor, 40 | limit, 41 | }; 42 | fetch_token_accounts_v2(conn, Authority::Owner(owner), options).await 43 | } 44 | -------------------------------------------------------------------------------- /src/api/method/get_compression_signatures_for_account.rs: -------------------------------------------------------------------------------- 1 | use super::{ 2 | super::error::PhotonApiError, 3 | utils::{ 4 | search_for_signatures, GetNonPaginatedSignaturesResponse, HashRequest, SignatureFilter, 5 | SignatureInfoList, SignatureSearchType, 6 | }, 7 | }; 8 | use crate::common::typedefs::context::Context; 9 | use sea_orm::DatabaseConnection; 10 | 11 | pub async fn get_compression_signatures_for_account( 12 | conn: &DatabaseConnection, 13 | request: HashRequest, 14 | ) -> Result { 15 | let context = Context::extract(conn).await?; 16 | let hash = request.hash; 17 | 18 | let signatures = search_for_signatures( 19 | conn, 20 | SignatureSearchType::Standard, 21 | Some(SignatureFilter::Account(hash)), 22 | true, 23 | None, 24 | None, 25 | ) 26 | .await? 27 | .items; 28 | 29 | if signatures.len() > 2 { 30 | return Err(PhotonApiError::UnexpectedError( 31 | "Got too many transactions. This is a bug. An account can be modified at most twice." 32 | .to_string(), 33 | )); 34 | } 35 | 36 | if signatures.is_empty() { 37 | return Err(PhotonApiError::RecordNotFound( 38 | "Account not found".to_string(), 39 | )); 40 | } 41 | 42 | Ok(GetNonPaginatedSignaturesResponse { 43 | value: SignatureInfoList { 44 | items: signatures.into_iter().map(|s| s.into()).collect(), 45 | }, 46 | context, 47 | }) 48 | } 49 | -------------------------------------------------------------------------------- /src/api/method/get_compression_signatures_for_address.rs: -------------------------------------------------------------------------------- 1 | use super::{ 2 | super::error::PhotonApiError, 3 | utils::{ 4 | search_for_signatures, GetPaginatedSignaturesResponse, SignatureFilter, SignatureSearchType, 5 | }, 6 | }; 7 | use crate::common::typedefs::context::Context; 8 | use crate::common::typedefs::limit::Limit; 9 | use crate::common::typedefs::serializable_pubkey::SerializablePubkey; 10 | use sea_orm::DatabaseConnection; 11 | use serde::{Deserialize, Serialize}; 12 | use utoipa::ToSchema; 13 | 14 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, Default)] 15 | #[serde(deny_unknown_fields, rename_all = "camelCase")] 16 | pub struct GetCompressionSignaturesForAddressRequest { 17 | pub address: SerializablePubkey, 18 | #[serde(default)] 19 | pub limit: Option, 20 | #[serde(default)] 21 | pub cursor: Option, 22 | } 23 | 24 | pub async fn get_compression_signatures_for_address( 25 | conn: &DatabaseConnection, 26 | request: GetCompressionSignaturesForAddressRequest, 27 | ) -> Result { 28 | let context = Context::extract(conn).await?; 29 | 30 | let signatures = search_for_signatures( 31 | conn, 32 | SignatureSearchType::Standard, 33 | Some(SignatureFilter::Address(request.address)), 34 | true, 35 | request.cursor, 36 | request.limit, 37 | ) 38 | .await?; 39 | 40 | Ok(GetPaginatedSignaturesResponse { 41 | value: signatures.into(), 42 | context, 43 | }) 44 | } 45 | -------------------------------------------------------------------------------- /src/api/method/get_compression_signatures_for_owner.rs: -------------------------------------------------------------------------------- 1 | use super::{ 2 | super::error::PhotonApiError, 3 | utils::{ 4 | search_for_signatures, GetPaginatedSignaturesResponse, SignatureFilter, SignatureSearchType, 5 | }, 6 | }; 7 | use crate::common::typedefs::context::Context; 8 | use crate::common::typedefs::limit::Limit; 9 | use crate::common::typedefs::serializable_pubkey::SerializablePubkey; 10 | use sea_orm::DatabaseConnection; 11 | use serde::{Deserialize, Serialize}; 12 | use utoipa::ToSchema; 13 | 14 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, Default)] 15 | #[serde(deny_unknown_fields, rename_all = "camelCase")] 16 | pub struct GetCompressionSignaturesForOwnerRequest { 17 | pub owner: SerializablePubkey, 18 | #[serde(default)] 19 | pub limit: Option, 20 | #[serde(default)] 21 | pub cursor: Option, 22 | } 23 | 24 | pub async fn get_compression_signatures_for_owner( 25 | conn: &DatabaseConnection, 26 | request: GetCompressionSignaturesForOwnerRequest, 27 | ) -> Result { 28 | let context = Context::extract(conn).await?; 29 | 30 | let signatures = search_for_signatures( 31 | conn, 32 | SignatureSearchType::Standard, 33 | Some(SignatureFilter::Owner(request.owner)), 34 | true, 35 | request.cursor, 36 | request.limit, 37 | ) 38 | .await?; 39 | 40 | Ok(GetPaginatedSignaturesResponse { 41 | value: signatures.into(), 42 | context, 43 | }) 44 | } 45 | -------------------------------------------------------------------------------- /src/api/method/get_compression_signatures_for_token_owner.rs: -------------------------------------------------------------------------------- 1 | use super::{ 2 | super::error::PhotonApiError, 3 | utils::{ 4 | search_for_signatures, GetPaginatedSignaturesResponse, SignatureFilter, SignatureSearchType, 5 | }, 6 | }; 7 | use crate::common::typedefs::context::Context; 8 | use crate::common::typedefs::limit::Limit; 9 | use crate::common::typedefs::serializable_pubkey::SerializablePubkey; 10 | use sea_orm::DatabaseConnection; 11 | use serde::{Deserialize, Serialize}; 12 | use utoipa::ToSchema; 13 | 14 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)] 15 | #[serde(deny_unknown_fields, rename_all = "camelCase")] 16 | pub struct GetCompressionSignaturesForTokenOwnerRequest { 17 | pub owner: SerializablePubkey, 18 | #[serde(default)] 19 | pub limit: Option, 20 | #[serde(default)] 21 | pub cursor: Option, 22 | } 23 | 24 | pub async fn get_compression_signatures_for_token_owner( 25 | conn: &DatabaseConnection, 26 | request: GetCompressionSignaturesForTokenOwnerRequest, 27 | ) -> Result { 28 | let context = Context::extract(conn).await?; 29 | 30 | let signatures = search_for_signatures( 31 | conn, 32 | SignatureSearchType::Token, 33 | Some(SignatureFilter::Owner(request.owner)), 34 | true, 35 | request.cursor, 36 | request.limit, 37 | ) 38 | .await?; 39 | Ok(GetPaginatedSignaturesResponse { 40 | value: signatures.into(), 41 | context, 42 | }) 43 | } 44 | -------------------------------------------------------------------------------- /src/api/method/get_indexer_health.rs: -------------------------------------------------------------------------------- 1 | use sea_orm::DatabaseConnection; 2 | 3 | use super::super::error::PhotonApiError; 4 | use crate::common::typedefs::context::Context; 5 | use solana_client::nonblocking::rpc_client::RpcClient; 6 | 7 | // TODO: Make this an environment variable. 8 | pub const HEALTH_CHECK_SLOT_DISTANCE: i64 = 20; 9 | 10 | // TODO: Make sure that get_indexer_health formatting matches the Solana RPC formatting. 11 | pub async fn get_indexer_health( 12 | conn: &DatabaseConnection, 13 | rpc: &RpcClient, 14 | ) -> Result { 15 | let context = Context::extract(conn).await?; 16 | let slot = rpc 17 | .get_slot() 18 | .await 19 | .map_err(|e| PhotonApiError::UnexpectedError(format!("RPC error: {}", e)))?; 20 | 21 | let slots_behind = slot as i64 - context.slot as i64; 22 | if slots_behind > HEALTH_CHECK_SLOT_DISTANCE { 23 | return Err(PhotonApiError::StaleSlot(slots_behind as u64)); 24 | } 25 | Ok("ok".to_string()) 26 | } 27 | -------------------------------------------------------------------------------- /src/api/method/get_indexer_slot.rs: -------------------------------------------------------------------------------- 1 | use crate::common::typedefs::context::Context; 2 | use crate::common::typedefs::unsigned_integer::UnsignedInteger; 3 | use sea_orm::DatabaseConnection; 4 | 5 | use super::super::error::PhotonApiError; 6 | 7 | pub async fn get_indexer_slot( 8 | conn: &DatabaseConnection, 9 | ) -> Result { 10 | let slot = Context::extract(conn).await?.slot; 11 | 12 | Ok(UnsignedInteger(slot)) 13 | } 14 | -------------------------------------------------------------------------------- /src/api/method/get_latest_compression_signatures.rs: -------------------------------------------------------------------------------- 1 | use super::utils::{GetLatestSignaturesRequest, GetPaginatedSignaturesResponse}; 2 | use super::{ 3 | super::error::PhotonApiError, 4 | utils::{search_for_signatures, SignatureSearchType}, 5 | }; 6 | use crate::common::typedefs::context::Context; 7 | use sea_orm::DatabaseConnection; 8 | 9 | pub async fn get_latest_compression_signatures( 10 | conn: &DatabaseConnection, 11 | request: GetLatestSignaturesRequest, 12 | ) -> Result { 13 | let context = Context::extract(conn).await?; 14 | 15 | let signatures = search_for_signatures( 16 | conn, 17 | SignatureSearchType::Standard, 18 | None, 19 | true, 20 | request.cursor, 21 | request.limit, 22 | ) 23 | .await?; 24 | 25 | Ok(GetPaginatedSignaturesResponse { 26 | value: signatures.into(), 27 | context, 28 | }) 29 | } 30 | -------------------------------------------------------------------------------- /src/api/method/get_latest_non_voting_signatures.rs: -------------------------------------------------------------------------------- 1 | use super::utils::{ 2 | GetLatestSignaturesRequest, GetNonPaginatedSignaturesResponseWithError, 3 | SignatureInfoListWithError, 4 | }; 5 | use super::{ 6 | super::error::PhotonApiError, 7 | utils::{search_for_signatures, SignatureSearchType}, 8 | }; 9 | use crate::common::typedefs::context::Context; 10 | use sea_orm::DatabaseConnection; 11 | 12 | pub async fn get_latest_non_voting_signatures( 13 | conn: &DatabaseConnection, 14 | request: GetLatestSignaturesRequest, 15 | ) -> Result { 16 | let context = Context::extract(conn).await?; 17 | 18 | let signatures = search_for_signatures( 19 | conn, 20 | SignatureSearchType::Standard, 21 | None, 22 | false, 23 | request.cursor, 24 | request.limit, 25 | ) 26 | .await?; 27 | 28 | Ok(GetNonPaginatedSignaturesResponseWithError { 29 | value: SignatureInfoListWithError { 30 | items: signatures.items, 31 | }, 32 | context, 33 | }) 34 | } 35 | -------------------------------------------------------------------------------- /src/api/method/get_multiple_compressed_account_proofs/mod.rs: -------------------------------------------------------------------------------- 1 | mod v2; 2 | pub use v2::{ 3 | get_multiple_compressed_account_proofs_v2, GetMultipleCompressedAccountProofsResponseV2, 4 | }; 5 | 6 | use super::get_compressed_account_proof::GetCompressedAccountProofResponseValue; 7 | use super::{super::error::PhotonApiError, utils::PAGE_LIMIT}; 8 | use crate::common::typedefs::context::Context; 9 | use crate::common::typedefs::hash::Hash; 10 | use crate::ingester::persist::get_multiple_compressed_leaf_proofs; 11 | use sea_orm::{ConnectionTrait, DatabaseBackend, DatabaseConnection, Statement, TransactionTrait}; 12 | use serde::{Deserialize, Serialize}; 13 | use utoipa::ToSchema; 14 | 15 | // We do not use generics to simplify documentation generation. 16 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)] 17 | #[serde(deny_unknown_fields, rename_all = "camelCase")] 18 | pub struct GetMultipleCompressedAccountProofsResponse { 19 | pub context: Context, 20 | pub value: Vec, 21 | } 22 | 23 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)] 24 | pub struct HashList(pub Vec); 25 | 26 | pub async fn get_multiple_compressed_account_proofs( 27 | conn: &DatabaseConnection, 28 | request: HashList, 29 | ) -> Result { 30 | let request = request.0; 31 | if request.len() > PAGE_LIMIT as usize { 32 | return Err(PhotonApiError::ValidationError(format!( 33 | "Too many hashes requested {}. Maximum allowed: {}", 34 | request.len(), 35 | PAGE_LIMIT 36 | ))); 37 | } 38 | let context = Context::extract(conn).await?; 39 | let tx = conn.begin().await?; 40 | if tx.get_database_backend() == DatabaseBackend::Postgres { 41 | tx.execute(Statement::from_string( 42 | tx.get_database_backend(), 43 | "SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;".to_string(), 44 | )) 45 | .await?; 46 | } 47 | let proofs = get_multiple_compressed_leaf_proofs(&tx, request).await?; 48 | tx.commit().await?; 49 | Ok(GetMultipleCompressedAccountProofsResponse { 50 | value: proofs.into_iter().map(Into::into).collect(), 51 | context, 52 | }) 53 | } 54 | -------------------------------------------------------------------------------- /src/api/method/get_validity_proof/mod.rs: -------------------------------------------------------------------------------- 1 | mod prover; 2 | mod v1; 3 | mod v2; 4 | 5 | pub use prover::CompressedProof; 6 | pub use v1::{ 7 | get_validity_proof, CompressedProofWithContext, GetValidityProofRequest, 8 | GetValidityProofRequestDocumentation, GetValidityProofResponse, 9 | }; 10 | pub use v2::{ 11 | get_validity_proof_v2, AccountProofInputs, AddressProofInputs, CompressedProofWithContextV2, 12 | GetValidityProofRequestV2, GetValidityProofResponseV2, MerkleContextV2, RootIndex, 13 | TreeContextInfo, 14 | }; 15 | -------------------------------------------------------------------------------- /src/api/method/get_validity_proof/prover/gnark.rs: -------------------------------------------------------------------------------- 1 | use crate::api::error::PhotonApiError; 2 | use crate::api::method::get_validity_proof::prover::structs::{CompressedProof, ProofABC}; 3 | use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, Compress, Validate}; 4 | use solana_program::alt_bn128::compression::prelude::{ 5 | alt_bn128_g1_compress, alt_bn128_g2_compress, convert_endianness, 6 | }; 7 | use std::ops::Neg; 8 | 9 | type G1 = ark_bn254::g1::G1Affine; 10 | 11 | pub fn negate_g1(g1_be: &[u8; 64]) -> Result<[u8; 64], PhotonApiError> { 12 | let g1_le = convert_endianness::<32, 64>(g1_be); 13 | let g1: G1 = G1::deserialize_with_mode(g1_le.as_slice(), Compress::No, Validate::No).unwrap(); 14 | 15 | let g1_neg = g1.neg(); 16 | let mut g1_neg_be = [0u8; 64]; 17 | g1_neg 18 | .x 19 | .serialize_with_mode(&mut g1_neg_be[..32], Compress::No) 20 | .map_err(|_| { 21 | PhotonApiError::UnexpectedError("Failed to serialize G1 x coordinate".to_string()) 22 | })?; 23 | g1_neg 24 | .y 25 | .serialize_with_mode(&mut g1_neg_be[32..], Compress::No) 26 | .map_err(|_| { 27 | PhotonApiError::UnexpectedError("Failed to serialize G1 y coordinate".to_string()) 28 | })?; 29 | let g1_neg_be: [u8; 64] = convert_endianness::<32, 64>(&g1_neg_be); 30 | Ok(g1_neg_be) 31 | } 32 | 33 | pub fn compress_proof(proof: &ProofABC) -> Result { 34 | let proof_a = alt_bn128_g1_compress(&proof.a) 35 | .map_err(|_| PhotonApiError::UnexpectedError("Failed to compress G1 proof".to_string()))?; 36 | let proof_b = alt_bn128_g2_compress(&proof.b) 37 | .map_err(|_| PhotonApiError::UnexpectedError("Failed to compress G2 proof".to_string()))?; 38 | let proof_c = alt_bn128_g1_compress(&proof.c) 39 | .map_err(|_| PhotonApiError::UnexpectedError("Failed to compress G1 proof".to_string()))?; 40 | 41 | Ok(CompressedProof { 42 | a: Vec::from(proof_a), 43 | b: Vec::from(proof_b), 44 | c: Vec::from(proof_c), 45 | }) 46 | } 47 | -------------------------------------------------------------------------------- /src/api/method/get_validity_proof/prover/mod.rs: -------------------------------------------------------------------------------- 1 | mod gnark; 2 | mod helpers; 3 | pub mod prove; 4 | mod structs; 5 | 6 | pub use structs::CompressedProof; 7 | -------------------------------------------------------------------------------- /src/api/method/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod get_compressed_account; 2 | pub mod get_compressed_account_balance; 3 | pub mod get_compressed_account_proof; 4 | pub mod get_compressed_accounts_by_owner; 5 | pub mod get_compressed_balance_by_owner; 6 | pub mod get_compressed_mint_token_holders; 7 | pub mod get_compressed_token_account_balance; 8 | pub mod get_compressed_token_accounts_by_delegate; 9 | pub mod get_compressed_token_accounts_by_owner; 10 | pub mod get_compressed_token_balances_by_owner; 11 | pub mod get_compression_signatures_for_account; 12 | pub mod get_compression_signatures_for_address; 13 | pub mod get_compression_signatures_for_owner; 14 | pub mod get_compression_signatures_for_token_owner; 15 | pub mod get_indexer_health; 16 | pub mod get_indexer_slot; 17 | pub mod get_latest_compression_signatures; 18 | pub mod get_latest_non_voting_signatures; 19 | pub mod get_multiple_compressed_account_proofs; 20 | pub mod get_multiple_compressed_accounts; 21 | 22 | pub mod get_multiple_new_address_proofs; 23 | pub mod get_queue_elements; 24 | pub mod get_transaction_with_compression_info; 25 | pub mod get_validity_proof; 26 | 27 | pub mod get_batch_address_update_info; 28 | 29 | pub mod utils; 30 | -------------------------------------------------------------------------------- /src/api/mod.rs: -------------------------------------------------------------------------------- 1 | #[allow(clippy::module_inception)] 2 | pub mod api; 3 | pub mod error; 4 | pub mod method; 5 | pub mod rpc_server; 6 | -------------------------------------------------------------------------------- /src/common/typedefs/account/mod.rs: -------------------------------------------------------------------------------- 1 | mod context; 2 | mod v1; 3 | mod v2; 4 | 5 | pub use context::{AccountContext, AccountWithContext}; 6 | pub use v1::{Account, AccountData}; 7 | pub use v2::AccountV2; 8 | -------------------------------------------------------------------------------- /src/common/typedefs/bs58_string.rs: -------------------------------------------------------------------------------- 1 | use bs58; 2 | use serde::{Deserialize, Deserializer, Serialize, Serializer}; 3 | use utoipa::{ 4 | openapi::{ObjectBuilder, RefOr, Schema, SchemaType}, 5 | ToSchema, 6 | }; 7 | 8 | #[derive(Default, Debug, Clone, PartialEq, Eq)] 9 | pub struct Base58String(pub Vec); 10 | 11 | impl Serialize for Base58String { 12 | fn serialize(&self, serializer: S) -> Result 13 | where 14 | S: Serializer, 15 | { 16 | let base58_str = bs58::encode(&self.0).into_string(); 17 | serializer.serialize_str(&base58_str) 18 | } 19 | } 20 | 21 | impl<'de> Deserialize<'de> for Base58String { 22 | fn deserialize(deserializer: D) -> Result 23 | where 24 | D: Deserializer<'de>, 25 | { 26 | let s: String = Deserialize::deserialize(deserializer)?; 27 | let bytes = bs58::decode(&s) 28 | .into_vec() 29 | .map_err(serde::de::Error::custom)?; 30 | Ok(Base58String(bytes)) 31 | } 32 | } 33 | 34 | impl<'__s> ToSchema<'__s> for Base58String { 35 | fn schema() -> (&'__s str, RefOr) { 36 | let example = Some(serde_json::Value::String("3J98t1WpEZ73CNm".to_string())); 37 | let schema = Schema::Object( 38 | ObjectBuilder::new() 39 | .schema_type(SchemaType::String) 40 | .description(Some("A base 58 encoded string.")) 41 | .example(example.clone()) 42 | .default(example) 43 | .build(), 44 | ); 45 | 46 | ("Base58String", RefOr::T(schema)) 47 | } 48 | 49 | fn aliases() -> Vec<(&'static str, utoipa::openapi::schema::Schema)> { 50 | Vec::new() 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/common/typedefs/bs64_string.rs: -------------------------------------------------------------------------------- 1 | use borsh::{BorshDeserialize, BorshSerialize}; 2 | use serde::Serialize; 3 | use utoipa::{ 4 | openapi::{ObjectBuilder, RefOr, Schema, SchemaType}, 5 | ToSchema, 6 | }; 7 | 8 | use serde::Serializer; 9 | 10 | #[derive(Default, Debug, Clone, PartialEq, Eq, BorshDeserialize, BorshSerialize)] 11 | pub struct Base64String(pub Vec); 12 | 13 | impl Serialize for Base64String { 14 | fn serialize(&self, serializer: S) -> Result 15 | where 16 | S: Serializer, 17 | { 18 | #[allow(deprecated)] 19 | let base64_encoded = base64::encode(&self.0); 20 | serializer.serialize_str(&base64_encoded) 21 | } 22 | } 23 | 24 | impl<'__s> ToSchema<'__s> for Base64String { 25 | fn schema() -> (&'__s str, RefOr) { 26 | let example = Some(serde_json::Value::String( 27 | "SGVsbG8sIFdvcmxkIQ==".to_string(), 28 | )); 29 | let schema = Schema::Object( 30 | ObjectBuilder::new() 31 | .schema_type(SchemaType::String) 32 | .description(Some("A base 64 encoded string.")) 33 | .example(example.clone()) 34 | .default(example) 35 | .build(), 36 | ); 37 | 38 | ("Base64String", RefOr::T(schema)) 39 | } 40 | 41 | fn aliases() -> Vec<(&'static str, utoipa::openapi::schema::Schema)> { 42 | Vec::new() 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/common/typedefs/context.rs: -------------------------------------------------------------------------------- 1 | use crate::api::error::PhotonApiError; 2 | use crate::common::typedefs::unsigned_integer::UnsignedInteger; 3 | use crate::dao::generated::blocks; 4 | use crate::migration::Expr; 5 | use jsonrpsee_core::Serialize; 6 | use sea_orm::{DatabaseConnection, EntityTrait, FromQueryResult, QuerySelect}; 7 | use serde::Deserialize; 8 | use utoipa::openapi::{ObjectBuilder, RefOr, Schema, SchemaType}; 9 | use utoipa::ToSchema; 10 | 11 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, FromQueryResult, Default)] 12 | #[serde(deny_unknown_fields, rename_all = "camelCase")] 13 | pub struct Context { 14 | pub slot: u64, 15 | } 16 | 17 | impl<'__s> ToSchema<'__s> for Context { 18 | fn schema() -> (&'__s str, RefOr) { 19 | let schema = Schema::Object( 20 | ObjectBuilder::new() 21 | .schema_type(SchemaType::Object) 22 | .property("slot", UnsignedInteger::schema().1) 23 | .required("slot") 24 | .build(), 25 | ); 26 | ("Context", RefOr::T(schema)) 27 | } 28 | 29 | fn aliases() -> Vec<(&'static str, Schema)> { 30 | Vec::new() 31 | } 32 | } 33 | 34 | #[derive(FromQueryResult)] 35 | pub struct ContextModel { 36 | // Postgres and SQLlite do not support u64 as return type. We need to use i64 and cast it to u64. 37 | pub slot: i64, 38 | } 39 | 40 | impl Context { 41 | pub async fn extract(db: &DatabaseConnection) -> Result { 42 | let context = blocks::Entity::find() 43 | .select_only() 44 | .column_as(Expr::col(blocks::Column::Slot).max(), "slot") 45 | .into_model::() 46 | .one(db) 47 | .await? 48 | .ok_or(PhotonApiError::RecordNotFound( 49 | "No data has been indexed".to_string(), 50 | ))?; 51 | Ok(Context { 52 | slot: context.slot as u64, 53 | }) 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/common/typedefs/limit.rs: -------------------------------------------------------------------------------- 1 | use crate::api::method::utils::PAGE_LIMIT; 2 | use jsonrpsee_core::Serialize; 3 | use serde::{de, Deserialize, Deserializer}; 4 | use utoipa::ToSchema; 5 | 6 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, ToSchema)] 7 | pub struct Limit(pub(crate) u64); 8 | 9 | impl Limit { 10 | pub fn new(value: u64) -> Result { 11 | if value > PAGE_LIMIT { 12 | Err("Value must be less than or equal to 1000") 13 | } else { 14 | Ok(Limit(value)) 15 | } 16 | } 17 | 18 | pub fn value(&self) -> u64 { 19 | self.0 20 | } 21 | } 22 | 23 | impl Default for Limit { 24 | fn default() -> Self { 25 | Limit(PAGE_LIMIT) 26 | } 27 | } 28 | 29 | impl<'de> Deserialize<'de> for Limit { 30 | fn deserialize(deserializer: D) -> Result 31 | where 32 | D: Deserializer<'de>, 33 | { 34 | let value = u64::deserialize(deserializer)?; 35 | if value > PAGE_LIMIT { 36 | Err(de::Error::invalid_value( 37 | de::Unexpected::Unsigned(value), 38 | &"a value less than or equal to 1000", 39 | )) 40 | } else { 41 | Ok(Limit(value)) 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/common/typedefs/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod account; 2 | pub mod bs58_string; 3 | pub mod bs64_string; 4 | pub mod context; 5 | pub mod hash; 6 | pub mod limit; 7 | pub mod serializable_pubkey; 8 | pub mod serializable_signature; 9 | pub mod token_data; 10 | pub mod unix_timestamp; 11 | pub mod unsigned_integer; 12 | -------------------------------------------------------------------------------- /src/common/typedefs/serializable_signature.rs: -------------------------------------------------------------------------------- 1 | use std::str::FromStr; 2 | 3 | use serde::{ 4 | de::{self, Visitor}, 5 | Deserialize, Deserializer, Serialize, Serializer, 6 | }; 7 | use solana_sdk::signature::Signature; 8 | use utoipa::{ 9 | openapi::{ObjectBuilder, RefOr, Schema, SchemaType}, 10 | ToSchema, 11 | }; 12 | 13 | #[derive(Default, Debug, Clone, PartialEq, Eq)] 14 | pub struct SerializableSignature(pub Signature); 15 | 16 | struct Base58Visitor; 17 | 18 | impl<'de> Visitor<'de> for Base58Visitor { 19 | type Value = SerializableSignature; 20 | 21 | fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { 22 | formatter.write_str("a base58 encoded string") 23 | } 24 | 25 | fn visit_str(self, value: &str) -> Result { 26 | Signature::from_str(value) 27 | .map_err(|e| E::custom(e.to_string())) 28 | .map(SerializableSignature) 29 | } 30 | } 31 | 32 | impl<'de> Deserialize<'de> for SerializableSignature { 33 | fn deserialize>(deserializer: D) -> Result { 34 | deserializer.deserialize_str(Base58Visitor) 35 | } 36 | } 37 | 38 | impl Serialize for SerializableSignature { 39 | fn serialize(&self, serializer: S) -> Result { 40 | let base58_string = bs58::encode(self.0).into_string(); 41 | serializer.serialize_str(&base58_string) 42 | } 43 | } 44 | 45 | impl<'__s> ToSchema<'__s> for SerializableSignature { 46 | fn schema() -> (&'__s str, RefOr) { 47 | let example = Some(serde_json::Value::String( 48 | "5J8H5sTvEhnGcB4R8K1n7mfoiWUD9RzPVGES7e3WxC7c".to_string(), 49 | )); 50 | let schema = Schema::Object( 51 | ObjectBuilder::new() 52 | .schema_type(SchemaType::String) 53 | .description(Some("A Solana transaction signature.")) 54 | .example(example.clone()) 55 | .default(example) 56 | .build(), 57 | ); 58 | 59 | ("SerializableSignature", RefOr::T(schema)) 60 | } 61 | 62 | fn aliases() -> Vec<(&'static str, utoipa::openapi::schema::Schema)> { 63 | Vec::new() 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/common/typedefs/token_data.rs: -------------------------------------------------------------------------------- 1 | use anchor_lang::{AnchorDeserialize, AnchorSerialize}; 2 | use num_enum::TryFromPrimitive; 3 | use serde::Serialize; 4 | use utoipa::ToSchema; 5 | 6 | use super::{ 7 | bs64_string::Base64String, serializable_pubkey::SerializablePubkey, 8 | unsigned_integer::UnsignedInteger, 9 | }; 10 | 11 | #[derive( 12 | Clone, 13 | Copy, 14 | Debug, 15 | PartialEq, 16 | Eq, 17 | AnchorSerialize, 18 | AnchorDeserialize, 19 | TryFromPrimitive, 20 | ToSchema, 21 | Serialize, 22 | )] 23 | #[repr(u8)] 24 | #[derive(Default)] 25 | pub enum AccountState { 26 | #[allow(non_camel_case_types)] 27 | #[default] 28 | initialized, 29 | #[allow(non_camel_case_types)] 30 | frozen, 31 | } 32 | 33 | #[derive( 34 | Debug, PartialEq, Eq, AnchorDeserialize, AnchorSerialize, Clone, ToSchema, Serialize, Default, 35 | )] 36 | #[serde(rename_all = "camelCase")] 37 | pub struct TokenData { 38 | /// The mint associated with this account 39 | pub mint: SerializablePubkey, 40 | /// The owner of this account. 41 | pub owner: SerializablePubkey, 42 | /// The amount of tokens this account holds. 43 | pub amount: UnsignedInteger, 44 | /// If `delegate` is `Some` then `delegated_amount` represents 45 | /// the amount authorized by the delegate 46 | pub delegate: Option, 47 | /// The account's state 48 | pub state: AccountState, 49 | /// Placeholder for TokenExtension tlv data (unimplemented) 50 | pub tlv: Option, 51 | } 52 | -------------------------------------------------------------------------------- /src/common/typedefs/unix_timestamp.rs: -------------------------------------------------------------------------------- 1 | use std::str::FromStr; 2 | 3 | use serde::{Deserialize, Serialize}; 4 | use serde_json::Number; 5 | use utoipa::{ 6 | openapi::{ObjectBuilder, RefOr, Schema, SchemaType}, 7 | ToSchema, 8 | }; 9 | 10 | #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] 11 | #[serde(transparent)] 12 | pub struct UnixTimestamp(pub u64); 13 | 14 | impl<'__s> ToSchema<'__s> for UnixTimestamp { 15 | fn schema() -> (&'__s str, RefOr) { 16 | let default = Some(serde_json::Value::Number( 17 | Number::from_str("1714081554").unwrap(), 18 | )); 19 | let schema = Schema::Object( 20 | ObjectBuilder::new() 21 | .schema_type(SchemaType::Integer) 22 | .description(Some("An Unix timestamp (seconds)".to_string())) 23 | .default(default.clone()) 24 | .example(default) 25 | .build(), 26 | ); 27 | ("UnixTimestamp", RefOr::T(schema)) 28 | } 29 | 30 | fn aliases() -> Vec<(&'static str, utoipa::openapi::schema::Schema)> { 31 | Vec::new() 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/dao/generated/account_transactions.rs: -------------------------------------------------------------------------------- 1 | //! `SeaORM` Entity. Generated by sea-orm-codegen 0.10.6 2 | 3 | use sea_orm::entity::prelude::*; 4 | 5 | #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] 6 | #[sea_orm(table_name = "account_transactions")] 7 | pub struct Model { 8 | #[sea_orm(primary_key, auto_increment = false)] 9 | pub hash: Vec, 10 | #[sea_orm(primary_key, auto_increment = false)] 11 | pub signature: Vec, 12 | } 13 | 14 | #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] 15 | pub enum Relation { 16 | #[sea_orm( 17 | belongs_to = "super::accounts::Entity", 18 | from = "Column::Hash", 19 | to = "super::accounts::Column::Hash", 20 | on_update = "NoAction", 21 | on_delete = "Cascade" 22 | )] 23 | Accounts, 24 | #[sea_orm( 25 | belongs_to = "super::transactions::Entity", 26 | from = "Column::Signature", 27 | to = "super::transactions::Column::Signature", 28 | on_update = "NoAction", 29 | on_delete = "Cascade" 30 | )] 31 | Transactions, 32 | } 33 | 34 | impl Related for Entity { 35 | fn to() -> RelationDef { 36 | Relation::Accounts.def() 37 | } 38 | } 39 | 40 | impl Related for Entity { 41 | fn to() -> RelationDef { 42 | Relation::Transactions.def() 43 | } 44 | } 45 | 46 | impl ActiveModelBehavior for ActiveModel {} 47 | -------------------------------------------------------------------------------- /src/dao/generated/accounts.rs: -------------------------------------------------------------------------------- 1 | //! `SeaORM` Entity. Generated by sea-orm-codegen 0.10.6 2 | 3 | use sea_orm::entity::prelude::*; 4 | 5 | #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] 6 | #[sea_orm(table_name = "accounts")] 7 | pub struct Model { 8 | #[sea_orm(primary_key, auto_increment = false)] 9 | pub hash: Vec, 10 | pub data: Option>, 11 | pub data_hash: Option>, 12 | pub address: Option>, 13 | pub owner: Vec, 14 | pub tree: Vec, 15 | /// Queue pubkey, for batched trees output queue pubkey 16 | pub queue: Vec, 17 | pub leaf_index: i64, 18 | pub in_output_queue: bool, 19 | pub nullifier_queue_index: Option, 20 | pub nullified_in_tree: bool, 21 | pub tree_type: i32, 22 | pub nullifier: Option>, 23 | pub tx_hash: Option>, 24 | pub seq: Option, 25 | pub slot_created: i64, 26 | pub spent: bool, 27 | pub prev_spent: Option, 28 | #[sea_orm(column_type = "Decimal(Some((20, 0)))")] 29 | pub lamports: Decimal, 30 | #[sea_orm(column_type = "Decimal(Some((20, 0)))", nullable)] 31 | pub discriminator: Option, 32 | } 33 | 34 | #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] 35 | pub enum Relation { 36 | #[sea_orm(has_many = "super::token_accounts::Entity")] 37 | TokenAccounts, 38 | } 39 | 40 | impl Related for Entity { 41 | fn to() -> RelationDef { 42 | Relation::TokenAccounts.def() 43 | } 44 | } 45 | 46 | impl Related for Entity { 47 | fn to() -> RelationDef { 48 | super::account_transactions::Relation::Transactions.def() 49 | } 50 | fn via() -> Option { 51 | Some(super::account_transactions::Relation::Accounts.def().rev()) 52 | } 53 | } 54 | 55 | impl ActiveModelBehavior for ActiveModel {} 56 | -------------------------------------------------------------------------------- /src/dao/generated/address_queue.rs: -------------------------------------------------------------------------------- 1 | //! `SeaORM` Entity. Generated by sea-orm-codegen 0.10.6 2 | 3 | use sea_orm::entity::prelude::*; 4 | 5 | #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] 6 | #[sea_orm(table_name = "address_queues")] 7 | pub struct Model { 8 | #[sea_orm(primary_key, auto_increment = false)] 9 | pub address: Vec, 10 | pub tree: Vec, 11 | pub queue_index: i64, 12 | } 13 | 14 | #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] 15 | pub enum Relation {} 16 | 17 | impl ActiveModelBehavior for ActiveModel {} 18 | -------------------------------------------------------------------------------- /src/dao/generated/blocks.rs: -------------------------------------------------------------------------------- 1 | //! `SeaORM` Entity. Generated by sea-orm-codegen 0.10.6 2 | 3 | use sea_orm::entity::prelude::*; 4 | 5 | #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] 6 | #[sea_orm(table_name = "blocks")] 7 | pub struct Model { 8 | #[sea_orm(primary_key, auto_increment = false)] 9 | pub slot: i64, 10 | pub parent_slot: i64, 11 | pub parent_blockhash: Vec, 12 | pub blockhash: Vec, 13 | pub block_height: i64, 14 | pub block_time: i64, 15 | } 16 | 17 | #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] 18 | pub enum Relation { 19 | #[sea_orm(has_many = "super::transactions::Entity")] 20 | Transactions, 21 | } 22 | 23 | impl Related for Entity { 24 | fn to() -> RelationDef { 25 | Relation::Transactions.def() 26 | } 27 | } 28 | 29 | impl ActiveModelBehavior for ActiveModel {} 30 | -------------------------------------------------------------------------------- /src/dao/generated/indexed_trees.rs: -------------------------------------------------------------------------------- 1 | //! `SeaORM` Entity. Generated by sea-orm-codegen 0.10.6 2 | 3 | use sea_orm::entity::prelude::*; 4 | 5 | #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] 6 | #[sea_orm(table_name = "indexed_trees")] 7 | pub struct Model { 8 | #[sea_orm(primary_key, auto_increment = false)] 9 | pub tree: Vec, 10 | #[sea_orm(primary_key, auto_increment = false)] 11 | pub leaf_index: i64, 12 | pub value: Vec, 13 | pub next_index: i64, 14 | pub next_value: Vec, 15 | pub seq: Option, 16 | } 17 | 18 | #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] 19 | pub enum Relation {} 20 | 21 | impl ActiveModelBehavior for ActiveModel {} 22 | -------------------------------------------------------------------------------- /src/dao/generated/mod.rs: -------------------------------------------------------------------------------- 1 | //! `SeaORM` Entity. Generated by sea-orm-codegen 0.10.6 2 | 3 | pub mod prelude; 4 | 5 | pub mod account_transactions; 6 | pub mod accounts; 7 | pub mod address_queue; 8 | pub mod blocks; 9 | pub mod indexed_trees; 10 | pub mod owner_balances; 11 | pub mod state_tree_histories; 12 | pub mod state_trees; 13 | pub mod token_accounts; 14 | pub mod token_owner_balances; 15 | pub mod transactions; 16 | -------------------------------------------------------------------------------- /src/dao/generated/owner_balances.rs: -------------------------------------------------------------------------------- 1 | //! `SeaORM` Entity. Generated by sea-orm-codegen 0.10.6 2 | 3 | use sea_orm::entity::prelude::*; 4 | 5 | #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] 6 | #[sea_orm(table_name = "owner_balances")] 7 | pub struct Model { 8 | #[sea_orm(primary_key, auto_increment = false)] 9 | pub owner: Vec, 10 | #[sea_orm(column_type = "Decimal(Some((20, 0)))")] 11 | pub lamports: Decimal, 12 | } 13 | 14 | #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] 15 | pub enum Relation {} 16 | 17 | impl ActiveModelBehavior for ActiveModel {} 18 | -------------------------------------------------------------------------------- /src/dao/generated/prelude.rs: -------------------------------------------------------------------------------- 1 | //! `SeaORM` Entity. Generated by sea-orm-codegen 0.10.6 2 | 3 | pub use super::account_transactions::Entity as AccountTransactions; 4 | pub use super::accounts::Entity as Accounts; 5 | pub use super::blocks::Entity as Blocks; 6 | pub use super::indexed_trees::Entity as IndexedTrees; 7 | pub use super::owner_balances::Entity as OwnerBalances; 8 | pub use super::state_tree_histories::Entity as StateTreeHistories; 9 | pub use super::state_trees::Entity as StateTrees; 10 | pub use super::token_accounts::Entity as TokenAccounts; 11 | pub use super::token_owner_balances::Entity as TokenOwnerBalances; 12 | pub use super::transactions::Entity as Transactions; 13 | -------------------------------------------------------------------------------- /src/dao/generated/state_tree_histories.rs: -------------------------------------------------------------------------------- 1 | //! `SeaORM` Entity. Generated by sea-orm-codegen 0.10.6 2 | 3 | use sea_orm::entity::prelude::*; 4 | 5 | #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] 6 | #[sea_orm(table_name = "state_tree_histories")] 7 | pub struct Model { 8 | #[sea_orm(primary_key, auto_increment = false)] 9 | pub tree: Vec, 10 | #[sea_orm(primary_key, auto_increment = false)] 11 | pub seq: i64, 12 | pub leaf_idx: i64, 13 | pub transaction_signature: Vec, 14 | } 15 | 16 | #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] 17 | pub enum Relation {} 18 | 19 | impl ActiveModelBehavior for ActiveModel {} 20 | -------------------------------------------------------------------------------- /src/dao/generated/state_trees.rs: -------------------------------------------------------------------------------- 1 | //! `SeaORM` Entity. Generated by sea-orm-codegen 0.10.6 2 | 3 | use sea_orm::entity::prelude::*; 4 | 5 | #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] 6 | #[sea_orm(table_name = "state_trees")] 7 | pub struct Model { 8 | #[sea_orm(primary_key, auto_increment = false)] 9 | pub tree: Vec, 10 | #[sea_orm(primary_key, auto_increment = false)] 11 | pub node_idx: i64, 12 | pub leaf_idx: Option, 13 | pub level: i64, 14 | pub hash: Vec, 15 | pub seq: Option, 16 | } 17 | 18 | #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] 19 | pub enum Relation {} 20 | 21 | impl ActiveModelBehavior for ActiveModel {} 22 | -------------------------------------------------------------------------------- /src/dao/generated/token_accounts.rs: -------------------------------------------------------------------------------- 1 | //! `SeaORM` Entity. Generated by sea-orm-codegen 0.10.6 2 | 3 | use sea_orm::entity::prelude::*; 4 | 5 | #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] 6 | #[sea_orm(table_name = "token_accounts")] 7 | pub struct Model { 8 | #[sea_orm(primary_key, auto_increment = false)] 9 | pub hash: Vec, 10 | pub owner: Vec, 11 | pub mint: Vec, 12 | pub delegate: Option>, 13 | pub state: i32, 14 | pub spent: bool, 15 | pub prev_spent: Option, 16 | #[sea_orm(column_type = "Decimal(Some((20, 0)))")] 17 | pub amount: Decimal, 18 | pub tlv: Option>, 19 | } 20 | 21 | #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] 22 | pub enum Relation { 23 | #[sea_orm( 24 | belongs_to = "super::accounts::Entity", 25 | from = "Column::Hash", 26 | to = "super::accounts::Column::Hash", 27 | on_update = "NoAction", 28 | on_delete = "Cascade" 29 | )] 30 | Accounts, 31 | } 32 | 33 | impl Related for Entity { 34 | fn to() -> RelationDef { 35 | Relation::Accounts.def() 36 | } 37 | } 38 | 39 | impl ActiveModelBehavior for ActiveModel {} 40 | -------------------------------------------------------------------------------- /src/dao/generated/token_owner_balances.rs: -------------------------------------------------------------------------------- 1 | //! `SeaORM` Entity. Generated by sea-orm-codegen 0.10.6 2 | 3 | use sea_orm::entity::prelude::*; 4 | 5 | #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] 6 | #[sea_orm(table_name = "token_owner_balances")] 7 | pub struct Model { 8 | #[sea_orm(primary_key, auto_increment = false)] 9 | pub owner: Vec, 10 | #[sea_orm(primary_key, auto_increment = false)] 11 | pub mint: Vec, 12 | #[sea_orm(column_type = "Decimal(Some((20, 0)))")] 13 | pub amount: Decimal, 14 | } 15 | 16 | #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] 17 | pub enum Relation {} 18 | 19 | impl ActiveModelBehavior for ActiveModel {} 20 | -------------------------------------------------------------------------------- /src/dao/generated/transactions.rs: -------------------------------------------------------------------------------- 1 | //! `SeaORM` Entity. Generated by sea-orm-codegen 0.10.6 2 | 3 | use sea_orm::entity::prelude::*; 4 | 5 | #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] 6 | #[sea_orm(table_name = "transactions")] 7 | pub struct Model { 8 | #[sea_orm(primary_key, auto_increment = false)] 9 | pub signature: Vec, 10 | pub slot: i64, 11 | pub uses_compression: bool, 12 | #[sea_orm(column_type = "Text", nullable)] 13 | pub error: Option, 14 | } 15 | 16 | #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] 17 | pub enum Relation { 18 | #[sea_orm( 19 | belongs_to = "super::blocks::Entity", 20 | from = "Column::Slot", 21 | to = "super::blocks::Column::Slot", 22 | on_update = "NoAction", 23 | on_delete = "Cascade" 24 | )] 25 | Blocks, 26 | } 27 | 28 | impl Related for Entity { 29 | fn to() -> RelationDef { 30 | Relation::Blocks.def() 31 | } 32 | } 33 | 34 | impl Related for Entity { 35 | fn to() -> RelationDef { 36 | super::account_transactions::Relation::Accounts.def() 37 | } 38 | fn via() -> Option { 39 | Some( 40 | super::account_transactions::Relation::Transactions 41 | .def() 42 | .rev(), 43 | ) 44 | } 45 | } 46 | 47 | impl ActiveModelBehavior for ActiveModel {} 48 | -------------------------------------------------------------------------------- /src/dao/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod generated; 2 | -------------------------------------------------------------------------------- /src/ingester/error.rs: -------------------------------------------------------------------------------- 1 | use thiserror::Error; 2 | 3 | #[derive(Error, Debug, PartialEq, Eq)] 4 | pub enum IngesterError { 5 | #[error("Persist logic for {event_type} has not yet been implemented")] 6 | EventNotImplemented { event_type: String }, 7 | #[error("Malformed event: {msg}")] 8 | MalformedEvent { msg: String }, 9 | #[error("Database error: {0}")] 10 | DatabaseError(String), 11 | #[error("Parser error: {0}")] 12 | ParserError(String), 13 | #[error("Empty batch event.")] 14 | EmptyBatchEvent, 15 | #[error("Invalid event.")] 16 | InvalidEvent, 17 | } 18 | 19 | impl From for IngesterError { 20 | fn from(err: sea_orm::error::DbErr) -> Self { 21 | IngesterError::DatabaseError(format!("DatabaseError: {}", err)) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/ingester/fetchers/mod.rs: -------------------------------------------------------------------------------- 1 | use std::sync::Arc; 2 | 3 | use async_stream::stream; 4 | use futures::{pin_mut, Stream, StreamExt}; 5 | use solana_client::nonblocking::rpc_client::RpcClient; 6 | 7 | use super::typedefs::block_info::BlockInfo; 8 | 9 | pub mod grpc; 10 | pub mod poller; 11 | 12 | use grpc::get_grpc_stream_with_rpc_fallback; 13 | use poller::get_block_poller_stream; 14 | 15 | pub struct BlockStreamConfig { 16 | pub rpc_client: Arc, 17 | pub geyser_url: Option, 18 | pub max_concurrent_block_fetches: usize, 19 | pub last_indexed_slot: u64, 20 | } 21 | 22 | impl BlockStreamConfig { 23 | pub fn load_block_stream(&self) -> impl Stream> { 24 | let grpc_stream = self.geyser_url.as_ref().map(|geyser_url| { 25 | let auth_header = std::env::var("GRPC_X_TOKEN").unwrap(); 26 | get_grpc_stream_with_rpc_fallback( 27 | geyser_url.clone(), 28 | auth_header, 29 | self.rpc_client.clone(), 30 | self.last_indexed_slot, 31 | self.max_concurrent_block_fetches, 32 | ) 33 | }); 34 | 35 | let poller_stream = if self.geyser_url.is_none() { 36 | Some(get_block_poller_stream( 37 | self.rpc_client.clone(), 38 | self.last_indexed_slot, 39 | self.max_concurrent_block_fetches, 40 | )) 41 | } else { 42 | None 43 | }; 44 | 45 | stream! { 46 | if let Some(grpc_stream) = grpc_stream { 47 | pin_mut!(grpc_stream); 48 | loop { 49 | match grpc_stream.next().await { 50 | Some(blocks) => yield blocks, 51 | None => break, 52 | } 53 | } 54 | } 55 | 56 | if let Some(poller_stream) = poller_stream { 57 | pin_mut!(poller_stream); 58 | loop { 59 | match poller_stream.next().await { 60 | Some(blocks) => yield blocks, 61 | None => break, 62 | } 63 | } 64 | } 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/ingester/persist/merkle_proof_with_context.rs: -------------------------------------------------------------------------------- 1 | use crate::api::error::PhotonApiError; 2 | use crate::common::typedefs::hash::Hash; 3 | use crate::common::typedefs::serializable_pubkey::SerializablePubkey; 4 | use crate::ingester::persist::compute_parent_hash; 5 | use crate::ingester::persist::leaf_node::leaf_index_to_node_index; 6 | use crate::metric; 7 | use cadence_macros::statsd_count; 8 | use log::info; 9 | 10 | #[derive(Debug, Clone)] 11 | pub struct MerkleProofWithContext { 12 | pub proof: Vec, 13 | pub root: Hash, 14 | pub leaf_index: u32, 15 | pub hash: Hash, 16 | pub merkle_tree: SerializablePubkey, 17 | pub root_seq: u64, 18 | } 19 | 20 | impl MerkleProofWithContext { 21 | pub fn validate(&self) -> Result<(), PhotonApiError> { 22 | info!( 23 | "Validating proof for leaf index: {} tree: {}", 24 | self.leaf_index, self.merkle_tree 25 | ); 26 | let leaf_index = self.leaf_index; 27 | let tree_height = (self.proof.len() + 1) as u32; 28 | let node_index = leaf_index_to_node_index(leaf_index, tree_height); 29 | let mut computed_root = self.hash.to_vec(); 30 | info!("leaf_index: {}, node_index: {}", leaf_index, node_index); 31 | 32 | for (idx, node) in self.proof.iter().enumerate() { 33 | let is_left = (node_index >> idx) & 1 == 0; 34 | computed_root = compute_parent_hash( 35 | if is_left { 36 | computed_root.clone() 37 | } else { 38 | node.to_vec() 39 | }, 40 | if is_left { 41 | node.to_vec() 42 | } else { 43 | computed_root.clone() 44 | }, 45 | ) 46 | .map_err(|e| { 47 | PhotonApiError::UnexpectedError(format!( 48 | "Failed to compute parent hash for proof: {}", 49 | e 50 | )) 51 | })?; 52 | } 53 | if computed_root != self.root.to_vec() { 54 | metric! { 55 | statsd_count!("invalid_proof", 1); 56 | } 57 | return Err(PhotonApiError::UnexpectedError(format!( 58 | "Computed root does not match the provided root. Proof; {:?}", 59 | self 60 | ))); 61 | } 62 | 63 | Ok(()) 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/ingester/typedefs/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod block_info; 2 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | // Required for capturing backtraces 2 | pub mod api; 3 | pub mod common; 4 | pub mod dao; 5 | pub mod ingester; 6 | pub mod migration; 7 | pub mod monitor; 8 | pub mod openapi; 9 | pub mod snapshot; 10 | -------------------------------------------------------------------------------- /src/migration/README.md: -------------------------------------------------------------------------------- 1 | # Running Migrator CLI 2 | 3 | - Generate a new migration file 4 | ```sh 5 | cargo run -- generate MIGRATION_NAME 6 | ``` 7 | - Apply all pending migrations 8 | ```sh 9 | cargo run 10 | ``` 11 | ```sh 12 | cargo run -- up 13 | ``` 14 | - Apply first 10 pending migrations 15 | ```sh 16 | cargo run -- up -n 10 17 | ``` 18 | - Rollback last applied migrations 19 | ```sh 20 | cargo run -- down 21 | ``` 22 | - Rollback last 10 applied migrations 23 | ```sh 24 | cargo run -- down -n 10 25 | ``` 26 | - Drop all tables from the database, then reapply all migrations 27 | ```sh 28 | cargo run -- fresh 29 | ``` 30 | - Rollback all applied migrations, then reapply all migrations 31 | ```sh 32 | cargo run -- refresh 33 | ``` 34 | - Rollback all applied migrations 35 | ```sh 36 | cargo run -- reset 37 | ``` 38 | - Check the status of all migrations 39 | ```sh 40 | cargo run -- status 41 | ``` 42 | -------------------------------------------------------------------------------- /src/migration/main.rs: -------------------------------------------------------------------------------- 1 | use photon_indexer::migration::{MigractorWithCustomMigrations, Migrator}; 2 | use sea_orm_migration::prelude::*; 3 | 4 | #[async_std::main] 5 | async fn main() { 6 | let custom_indexes_enabled = std::env::var("ENABLE_CUSTOM_INDEXES") 7 | .unwrap_or("false".to_string()) 8 | .to_lowercase() 9 | == "true"; 10 | if custom_indexes_enabled { 11 | cli::run_cli(MigractorWithCustomMigrations).await; 12 | } else { 13 | cli::run_cli(Migrator).await; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/migration/migrations/custom/custom20250211_000002_solayer2.rs: -------------------------------------------------------------------------------- 1 | use sea_orm_migration::prelude::*; 2 | use sea_orm_migration::sea_orm::{ConnectionTrait, DatabaseBackend, Statement}; 3 | use solana_program::pubkey::Pubkey; 4 | use std::str::FromStr; 5 | 6 | use crate::migration::model::table::Accounts; 7 | 8 | #[derive(DeriveMigrationName)] 9 | pub struct Migration; 10 | 11 | async fn execute_sql<'a>(manager: &SchemaManager<'_>, sql: &str) -> Result<(), DbErr> { 12 | manager 13 | .get_connection() 14 | .execute(Statement::from_string( 15 | manager.get_database_backend(), 16 | sql.to_string(), 17 | )) 18 | .await?; 19 | Ok(()) 20 | } 21 | 22 | #[async_trait::async_trait] 23 | impl MigrationTrait for Migration { 24 | async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { 25 | let solayer_accounts = vec![ 26 | "ARDPkhymCbfdan375FCgPnBJQvUfHeb7nHVdBfwWSxrp", 27 | "2sYfW81EENCMe415CPhE2XzBA5iQf4TXRs31W1KP63YT", 28 | ]; 29 | // Encode the accounts as hex strings 30 | let encoded_accounts = solayer_accounts 31 | .iter() 32 | .map(|account| { 33 | let pubkey = Pubkey::from_str(account).unwrap(); 34 | format!("\\x{}", hex::encode(pubkey.to_bytes())) 35 | }) 36 | .collect::>() 37 | .join("', '"); 38 | 39 | if manager.get_database_backend() == DatabaseBackend::Postgres { 40 | // Create index concurrently for Postgres 41 | execute_sql( 42 | manager, 43 | &format!( 44 | "CREATE INDEX CONCURRENTLY IF NOT EXISTS solayer_account_index2 ON accounts (spent, owner, substring(data, 1, 32)) \ 45 | WHERE owner IN ('{}');", 46 | encoded_accounts 47 | ), 48 | ) 49 | .await?; 50 | } 51 | Ok(()) 52 | } 53 | 54 | async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { 55 | if manager.get_database_backend() == DatabaseBackend::Postgres { 56 | manager 57 | .drop_index( 58 | Index::drop() 59 | .name("solayer_account_index2") 60 | .table(Accounts::Table) 61 | .to_owned(), 62 | ) 63 | .await?; 64 | } 65 | 66 | Ok(()) 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/migration/migrations/custom/custom20252201_000001_init.rs: -------------------------------------------------------------------------------- 1 | use std::str::FromStr; 2 | 3 | use sea_orm_migration::prelude::*; 4 | use sea_orm_migration::sea_orm::{ConnectionTrait, DatabaseBackend, Statement}; 5 | use solana_sdk::pubkey::Pubkey; 6 | 7 | use crate::migration::model::table::Accounts; 8 | 9 | #[derive(DeriveMigrationName)] 10 | pub struct Migration; 11 | 12 | async fn execute_sql<'a>(manager: &SchemaManager<'_>, sql: &str) -> Result<(), DbErr> { 13 | manager 14 | .get_connection() 15 | .execute(Statement::from_string( 16 | manager.get_database_backend(), 17 | sql.to_string(), 18 | )) 19 | .await?; 20 | Ok(()) 21 | } 22 | 23 | #[async_trait::async_trait] 24 | impl MigrationTrait for Migration { 25 | async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { 26 | let solayer_accounts = vec![ 27 | "S1ay5sk6FVkvsNFZShMw2YK3nfgJZ8tpBBGuHWDZ266", 28 | "2sYfW81EENCMe415CPhE2XzBA5iQf4TXRs31W1KP63YT", 29 | ]; 30 | // Encode the accounts as hex strings 31 | let encoded_accounts = solayer_accounts 32 | .iter() 33 | .map(|account| { 34 | let pubkey = Pubkey::from_str(account).unwrap(); 35 | format!("\\x{}", hex::encode(pubkey.to_bytes())) 36 | }) 37 | .collect::>() 38 | .join("', '"); 39 | 40 | if manager.get_database_backend() == DatabaseBackend::Postgres { 41 | // Create index concurrently for Postgres 42 | execute_sql( 43 | manager, 44 | &format!( 45 | "CREATE INDEX CONCURRENTLY IF NOT EXISTS solayer_account_index ON accounts (spent, owner, substring(data, 1, 32)) \ 46 | WHERE owner IN ('{}');", 47 | encoded_accounts 48 | ), 49 | ) 50 | .await?; 51 | } 52 | Ok(()) 53 | } 54 | 55 | async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { 56 | if manager.get_database_backend() == DatabaseBackend::Postgres { 57 | manager 58 | .drop_index( 59 | Index::drop() 60 | .name("solayer_account_index") 61 | .table(Accounts::Table) 62 | .to_owned(), 63 | ) 64 | .await?; 65 | } 66 | 67 | Ok(()) 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/migration/migrations/custom/mod.rs: -------------------------------------------------------------------------------- 1 | use sea_orm_migration::MigrationTrait; 2 | 3 | pub mod custom20250211_000002_solayer2; 4 | pub mod custom20252201_000001_init; 5 | 6 | pub fn get_custom_migrations() -> Vec> { 7 | vec![ 8 | Box::new(custom20252201_000001_init::Migration), 9 | Box::new(custom20250211_000002_solayer2::Migration), 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /src/migration/migrations/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod custom; 2 | pub mod standard; 3 | -------------------------------------------------------------------------------- /src/migration/migrations/standard/m20240623_000002_init.rs: -------------------------------------------------------------------------------- 1 | use sea_orm_migration::prelude::*; 2 | 3 | use crate::migration::model::table::TokenAccounts; 4 | 5 | #[derive(DeriveMigrationName)] 6 | pub struct Migration; 7 | 8 | #[async_trait::async_trait] 9 | impl MigrationTrait for Migration { 10 | async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { 11 | manager 12 | .alter_table( 13 | Table::alter() 14 | .table(TokenAccounts::Table) 15 | .add_column(ColumnDef::new(TokenAccounts::Tlv).binary().null()) 16 | .to_owned(), 17 | ) 18 | .await?; 19 | 20 | Ok(()) 21 | } 22 | 23 | async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { 24 | manager 25 | .alter_table( 26 | Table::alter() 27 | .table(TokenAccounts::Table) 28 | .drop_column(TokenAccounts::Tlv) 29 | .to_owned(), 30 | ) 31 | .await?; 32 | Ok(()) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/migration/migrations/standard/m20240624_000003_init.rs: -------------------------------------------------------------------------------- 1 | use sea_orm_migration::prelude::*; 2 | 3 | use super::super::super::model::table::Transactions; 4 | 5 | #[derive(DeriveMigrationName)] 6 | pub struct Migration; 7 | 8 | #[async_trait::async_trait] 9 | impl MigrationTrait for Migration { 10 | async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { 11 | manager 12 | .alter_table( 13 | Table::alter() 14 | .table(Transactions::Table) 15 | .add_column(ColumnDef::new(Transactions::Error).text().null()) 16 | .to_owned(), 17 | ) 18 | .await?; 19 | 20 | Ok(()) 21 | } 22 | 23 | async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { 24 | manager 25 | .alter_table( 26 | Table::alter() 27 | .table(Transactions::Table) 28 | .drop_column(Transactions::Error) 29 | .to_owned(), 30 | ) 31 | .await?; 32 | Ok(()) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/migration/migrations/standard/m20240807_000004_init.rs: -------------------------------------------------------------------------------- 1 | use sea_orm_migration::prelude::*; 2 | 3 | use super::super::super::model::table::StateTreeHistories; 4 | 5 | #[derive(DeriveMigrationName)] 6 | pub struct Migration; 7 | 8 | #[async_trait::async_trait] 9 | impl MigrationTrait for Migration { 10 | async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { 11 | manager 12 | .create_table( 13 | Table::create() 14 | .table(StateTreeHistories::Table) 15 | .if_not_exists() 16 | .col(ColumnDef::new(StateTreeHistories::Tree).binary().not_null()) 17 | .col( 18 | ColumnDef::new(StateTreeHistories::Seq) 19 | .big_integer() 20 | .not_null(), 21 | ) 22 | .col( 23 | ColumnDef::new(StateTreeHistories::LeafIdx) 24 | .big_integer() 25 | .not_null(), 26 | ) 27 | .col( 28 | ColumnDef::new(StateTreeHistories::TransactionSignature) 29 | .binary() 30 | .not_null(), 31 | ) 32 | .primary_key( 33 | Index::create() 34 | .name("pk_state_tree_histories") 35 | .col(StateTreeHistories::Tree) 36 | .col(StateTreeHistories::Seq), 37 | ) 38 | .to_owned(), 39 | ) 40 | .await?; 41 | 42 | Ok(()) 43 | } 44 | 45 | async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { 46 | manager 47 | .drop_table(Table::drop().table(StateTreeHistories::Table).to_owned()) 48 | .await?; 49 | Ok(()) 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/migration/migrations/standard/m20240914_000005_init.rs: -------------------------------------------------------------------------------- 1 | use sea_orm_migration::prelude::*; 2 | use sea_orm_migration::sea_orm::{ConnectionTrait, DatabaseBackend, Statement}; 3 | 4 | use crate::migration::model::table::AccountTransactions; 5 | 6 | #[derive(DeriveMigrationName)] 7 | pub struct Migration; 8 | 9 | async fn execute_sql<'a>(manager: &SchemaManager<'_>, sql: &str) -> Result<(), DbErr> { 10 | manager 11 | .get_connection() 12 | .execute(Statement::from_string( 13 | manager.get_database_backend(), 14 | sql.to_string(), 15 | )) 16 | .await?; 17 | Ok(()) 18 | } 19 | 20 | #[async_trait::async_trait] 21 | impl MigrationTrait for Migration { 22 | async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { 23 | if manager.get_database_backend() == DatabaseBackend::Postgres { 24 | // Create index concurrently for Postgres 25 | execute_sql( 26 | manager, 27 | "CREATE INDEX CONCURRENTLY IF NOT EXISTS account_transactions_signature_idx ON account_transactions (signature);", 28 | ) 29 | .await?; 30 | } else { 31 | // For other databases, create index normally 32 | manager 33 | .create_index( 34 | Index::create() 35 | .name("account_transactions_signature_idx") 36 | .table(AccountTransactions::Table) 37 | .col(AccountTransactions::Signature) 38 | .to_owned(), 39 | ) 40 | .await?; 41 | } 42 | 43 | Ok(()) 44 | } 45 | 46 | async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { 47 | manager 48 | .drop_index( 49 | Index::drop() 50 | .name("account_transactions_signature_idx") 51 | .table(AccountTransactions::Table) 52 | .to_owned(), 53 | ) 54 | .await?; 55 | 56 | Ok(()) 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/migration/migrations/standard/m20241008_000006_init.rs: -------------------------------------------------------------------------------- 1 | use sea_orm_migration::prelude::*; 2 | use sea_orm_migration::sea_orm::{ConnectionTrait, DatabaseBackend, Statement}; 3 | 4 | use crate::migration::model::table::TokenOwnerBalances; 5 | 6 | #[derive(DeriveMigrationName)] 7 | pub struct Migration; 8 | 9 | async fn execute_sql<'a>(manager: &SchemaManager<'_>, sql: &str) -> Result<(), DbErr> { 10 | manager 11 | .get_connection() 12 | .execute(Statement::from_string( 13 | manager.get_database_backend(), 14 | sql.to_string(), 15 | )) 16 | .await?; 17 | Ok(()) 18 | } 19 | 20 | #[async_trait::async_trait] 21 | impl MigrationTrait for Migration { 22 | async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { 23 | if manager.get_database_backend() == DatabaseBackend::Postgres { 24 | // Create index concurrently for Postgres 25 | execute_sql( 26 | manager, 27 | "CREATE INDEX CONCURRENTLY IF NOT EXISTS token_holder_mint_balance_owner_idx ON token_owner_balances (mint, amount, owner);", 28 | ) 29 | .await?; 30 | } else { 31 | // For other databases, create index normally 32 | execute_sql( 33 | manager, 34 | "CREATE INDEX IF NOT EXISTS token_holder_mint_balance_owner_idx ON token_owner_balances (mint, amount, owner);", 35 | ) 36 | .await?; 37 | } 38 | 39 | Ok(()) 40 | } 41 | 42 | async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { 43 | manager 44 | .drop_index( 45 | Index::drop() 46 | .name("token_holder_mint_balance_owner_idx") 47 | .table(TokenOwnerBalances::Table) 48 | .to_owned(), 49 | ) 50 | .await?; 51 | 52 | Ok(()) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/migration/migrations/standard/m20250314_000008_init.rs: -------------------------------------------------------------------------------- 1 | use crate::migration::model::table::AddressQueues; 2 | use sea_orm_migration::prelude::*; 3 | 4 | #[derive(DeriveMigrationName)] 5 | pub struct Migration; 6 | 7 | #[async_trait::async_trait] 8 | impl MigrationTrait for Migration { 9 | async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { 10 | manager 11 | .create_table( 12 | Table::create() 13 | .table(AddressQueues::Table) 14 | .if_not_exists() 15 | .col(ColumnDef::new(AddressQueues::Tree).binary().not_null()) 16 | .col(ColumnDef::new(AddressQueues::Address).binary().not_null()) 17 | .col( 18 | ColumnDef::new(AddressQueues::QueueIndex) 19 | .big_integer() 20 | .not_null(), 21 | ) 22 | .primary_key( 23 | Index::create() 24 | .name("pk_address_queue_elements") 25 | .col(AddressQueues::Address), 26 | ) 27 | .to_owned(), 28 | ) 29 | .await?; 30 | 31 | manager 32 | .create_index( 33 | Index::create() 34 | .name("address_queue_elements_tree_value_idx") 35 | .table(AddressQueues::Table) 36 | .col(AddressQueues::Tree) 37 | .col(AddressQueues::Address) 38 | .unique() 39 | .to_owned(), 40 | ) 41 | .await?; 42 | 43 | Ok(()) 44 | } 45 | 46 | async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { 47 | manager 48 | .drop_table(Table::drop().table(AddressQueues::Table).to_owned()) 49 | .await?; 50 | 51 | Ok(()) 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/migration/migrations/standard/mod.rs: -------------------------------------------------------------------------------- 1 | use sea_orm_migration::MigrationTrait; 2 | 3 | pub mod m20220101_000001_init; 4 | pub mod m20240623_000002_init; 5 | pub mod m20240624_000003_init; 6 | pub mod m20240807_000004_init; 7 | pub mod m20240914_000005_init; 8 | pub mod m20241008_000006_init; 9 | pub mod m20250206_000007_init; 10 | pub mod m20250314_000008_init; 11 | 12 | pub fn get_standard_migrations() -> Vec> { 13 | vec![ 14 | Box::new(m20220101_000001_init::Migration), 15 | Box::new(m20240623_000002_init::Migration), 16 | Box::new(m20240624_000003_init::Migration), 17 | Box::new(m20240807_000004_init::Migration), 18 | Box::new(m20240914_000005_init::Migration), 19 | Box::new(m20241008_000006_init::Migration), 20 | Box::new(m20250206_000007_init::Migration), 21 | Box::new(m20250314_000008_init::Migration), 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /src/migration/mod.rs: -------------------------------------------------------------------------------- 1 | use migrations::{custom::get_custom_migrations, standard::get_standard_migrations}; 2 | 3 | pub use sea_orm_migration::prelude::*; 4 | 5 | mod migrations; 6 | mod model; 7 | 8 | pub struct Migrator; 9 | 10 | #[async_trait::async_trait] 11 | impl MigratorTrait for Migrator { 12 | fn migrations() -> Vec> { 13 | get_standard_migrations() 14 | } 15 | } 16 | 17 | pub struct MigractorWithCustomMigrations; 18 | 19 | #[async_trait::async_trait] 20 | impl MigratorTrait for MigractorWithCustomMigrations { 21 | fn migrations() -> Vec> { 22 | get_standard_migrations() 23 | .into_iter() 24 | .chain(get_custom_migrations()) 25 | .collect() 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/migration/model/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod table; 2 | -------------------------------------------------------------------------------- /src/migration/model/table.rs: -------------------------------------------------------------------------------- 1 | use sea_orm_migration::prelude::*; 2 | 3 | #[derive(Copy, Clone, Iden)] 4 | pub enum StateTrees { 5 | Table, 6 | Tree, 7 | NodeIdx, 8 | LeafIdx, 9 | Level, 10 | Hash, 11 | Seq, 12 | } 13 | 14 | #[derive(Copy, Clone, Iden)] 15 | pub enum Accounts { 16 | Table, 17 | Hash, 18 | Address, 19 | Data, 20 | DataHash, 21 | Owner, 22 | Tree, 23 | LeafIndex, 24 | InOutputQueue, 25 | NullifierQueueIndex, 26 | NullifiedInTree, 27 | TreeType, 28 | Queue, 29 | Nullifier, 30 | TxHash, 31 | Spent, 32 | PrevSpent, 33 | Seq, 34 | SlotCreated, 35 | } 36 | 37 | #[derive(Copy, Clone, Iden)] 38 | pub enum TokenAccounts { 39 | Table, 40 | Hash, 41 | Owner, 42 | Mint, 43 | Delegate, 44 | State, 45 | Tlv, 46 | Spent, 47 | PrevSpent, 48 | } 49 | 50 | #[derive(Copy, Clone, Iden)] 51 | pub enum Blocks { 52 | Table, 53 | Slot, 54 | ParentSlot, 55 | Blockhash, 56 | ParentBlockhash, 57 | BlockHeight, 58 | BlockTime, 59 | } 60 | 61 | #[derive(Copy, Clone, Iden)] 62 | pub enum Transactions { 63 | Table, 64 | Signature, 65 | Slot, 66 | UsesCompression, 67 | Error, 68 | } 69 | 70 | #[derive(Copy, Clone, Iden)] 71 | pub enum AccountTransactions { 72 | Table, 73 | Hash, 74 | Signature, 75 | } 76 | 77 | #[derive(Copy, Clone, Iden)] 78 | pub enum OwnerBalances { 79 | Table, 80 | Owner, 81 | } 82 | 83 | #[derive(Copy, Clone, Iden)] 84 | pub enum TokenOwnerBalances { 85 | Table, 86 | Owner, 87 | Mint, 88 | } 89 | 90 | #[derive(Copy, Clone, Iden)] 91 | pub enum IndexedTrees { 92 | Table, 93 | Tree, 94 | LeafIndex, 95 | Value, 96 | NextIndex, 97 | NextValue, 98 | Seq, 99 | } 100 | 101 | #[derive(Copy, Clone, Iden)] 102 | pub enum StateTreeHistories { 103 | Table, 104 | Tree, 105 | Seq, 106 | TransactionSignature, 107 | LeafIdx, 108 | } 109 | 110 | #[derive(Copy, Clone, Iden)] 111 | pub enum AddressQueues { 112 | Table, 113 | Tree, 114 | Address, 115 | QueueIndex, 116 | } 117 | -------------------------------------------------------------------------------- /src/openapi/main.rs: -------------------------------------------------------------------------------- 1 | use photon_indexer::openapi::update_docs; 2 | 3 | fn main() { 4 | update_docs(false); 5 | } 6 | -------------------------------------------------------------------------------- /src/openapi/specs/getIndexerHealth.yaml: -------------------------------------------------------------------------------- 1 | openapi: 3.0.3 2 | info: 3 | title: photon-indexer 4 | description: Solana indexer for general compression 5 | license: 6 | name: Apache-2.0 7 | version: 0.50.0 8 | servers: 9 | - url: https://mainnet.helius-rpc.com?api-key= 10 | paths: 11 | /: 12 | summary: getIndexerHealth 13 | post: 14 | requestBody: 15 | content: 16 | application/json: 17 | schema: 18 | type: object 19 | required: 20 | - jsonrpc 21 | - id 22 | - method 23 | properties: 24 | id: 25 | type: string 26 | description: An ID to identify the request. 27 | enum: 28 | - test-account 29 | jsonrpc: 30 | type: string 31 | description: The version of the JSON-RPC protocol. 32 | enum: 33 | - '2.0' 34 | method: 35 | type: string 36 | description: The name of the method to invoke. 37 | enum: 38 | - getIndexerHealth 39 | required: true 40 | responses: 41 | '200': 42 | description: '' 43 | content: 44 | application/json: 45 | schema: 46 | type: string 47 | description: ok if healthy 48 | default: ok 49 | enum: 50 | - ok 51 | '429': 52 | description: Exceeded rate limit. 53 | content: 54 | application/json: 55 | schema: 56 | type: object 57 | properties: 58 | error: 59 | type: string 60 | '500': 61 | description: The server encountered an unexpected condition that prevented it from fulfilling the request. 62 | content: 63 | application/json: 64 | schema: 65 | type: object 66 | properties: 67 | error: 68 | type: string 69 | components: {} 70 | -------------------------------------------------------------------------------- /src/openapi/specs/getIndexerSlot.yaml: -------------------------------------------------------------------------------- 1 | openapi: 3.0.3 2 | info: 3 | title: photon-indexer 4 | description: Solana indexer for general compression 5 | license: 6 | name: Apache-2.0 7 | version: 0.50.0 8 | servers: 9 | - url: https://mainnet.helius-rpc.com?api-key= 10 | paths: 11 | /: 12 | summary: getIndexerSlot 13 | post: 14 | requestBody: 15 | content: 16 | application/json: 17 | schema: 18 | type: object 19 | required: 20 | - jsonrpc 21 | - id 22 | - method 23 | properties: 24 | id: 25 | type: string 26 | description: An ID to identify the request. 27 | enum: 28 | - test-account 29 | jsonrpc: 30 | type: string 31 | description: The version of the JSON-RPC protocol. 32 | enum: 33 | - '2.0' 34 | method: 35 | type: string 36 | description: The name of the method to invoke. 37 | enum: 38 | - getIndexerSlot 39 | required: true 40 | responses: 41 | '200': 42 | description: '' 43 | content: 44 | application/json: 45 | schema: 46 | type: integer 47 | default: 100 48 | example: 100 49 | '429': 50 | description: Exceeded rate limit. 51 | content: 52 | application/json: 53 | schema: 54 | type: object 55 | properties: 56 | error: 57 | type: string 58 | '500': 59 | description: The server encountered an unexpected condition that prevented it from fulfilling the request. 60 | content: 61 | application/json: 62 | schema: 63 | type: object 64 | properties: 65 | error: 66 | type: string 67 | components: {} 68 | -------------------------------------------------------------------------------- /src/openapi/specs/openapitools.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", 3 | "spaces": 2, 4 | "generator-cli": { 5 | "version": "7.5.0" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/snapshot/loader/main.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Context; 2 | use clap::Parser; 3 | use futures::StreamExt; 4 | use log::error; 5 | use photon_indexer::common::{setup_logging, LoggingFormat}; 6 | use photon_indexer::snapshot::{create_snapshot_from_byte_stream, DirectoryAdapter}; 7 | use std::path::Path; 8 | 9 | /// Photon Loader: a utility to load snapshots from a snapshot server 10 | #[derive(Parser, Debug)] 11 | #[command(version, about)] 12 | struct Args { 13 | /// Snapshot url 14 | #[arg(short, long)] 15 | snapshot_server_url: String, 16 | 17 | /// Snapshot directory 18 | #[arg(long)] 19 | snapshot_dir: String, 20 | 21 | /// Logging format 22 | #[arg(short, long, default_value_t = LoggingFormat::Standard)] 23 | logging_format: LoggingFormat, 24 | } 25 | 26 | #[tokio::main] 27 | async fn main() -> anyhow::Result<()> { 28 | let args = Args::parse(); 29 | setup_logging(args.logging_format); 30 | 31 | // Create snapshot directory if it doesn't exist 32 | if !Path::new(&args.snapshot_dir).exists() { 33 | std::fs::create_dir_all(&args.snapshot_dir).unwrap(); 34 | } 35 | 36 | let http_client = reqwest::Client::new(); 37 | // Call the download snapshot endpoint 38 | let response = http_client 39 | .get(&format!("{}/download", args.snapshot_server_url)) 40 | .send() 41 | .await 42 | .unwrap(); 43 | // Check if the response status is OK 44 | if !response.status().is_success() { 45 | error!("Failed to download snapshot: HTTP {}", response.status()); 46 | return Err(anyhow::anyhow!( 47 | "HTTP request failed with status {}", 48 | response.status() 49 | )); 50 | } 51 | 52 | // Stream the response body to the file 53 | let stream = response 54 | .bytes_stream() 55 | .map(|byte| byte.with_context(|| "Failed to read byte stream from response body")); 56 | let directory_adapter = DirectoryAdapter::from_local_directory(args.snapshot_dir.clone()); 57 | create_snapshot_from_byte_stream(stream, &directory_adapter).await?; 58 | 59 | Ok(()) 60 | } 61 | -------------------------------------------------------------------------------- /src/snapshot/s3_utils/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod multipart_upload; 2 | -------------------------------------------------------------------------------- /src/tools/tree_validator/README.md: -------------------------------------------------------------------------------- 1 | ## Tree Validator 2 | 3 | The tree validator is a tool that validates the tree structure of the compressed accounts in the database. It is used to ensure that the tree structure is correct and that the accounts are stored in the correct format. 4 | 5 | ### Usage 6 | 7 | ```bash 8 | cargo run --bin photon-tree-validator -- --db-url --tree-address 9 | ``` 10 | -------------------------------------------------------------------------------- /src/tools/tree_validator/main.rs: -------------------------------------------------------------------------------- 1 | use clap::Parser; 2 | use log::info; 3 | use photon_indexer::{ 4 | common::{ 5 | setup_logging, setup_pg_connection, typedefs::serializable_pubkey::SerializablePubkey, 6 | LoggingFormat, 7 | }, 8 | ingester::persist::persisted_indexed_merkle_tree::validate_tree, 9 | }; 10 | use solana_pubkey::Pubkey; 11 | use std::str::FromStr; 12 | use tokio; 13 | 14 | #[derive(Parser)] 15 | struct Args { 16 | #[arg(short, long)] 17 | db_url: String, 18 | #[arg(short, long)] 19 | tree_address: String, 20 | } 21 | 22 | #[tokio::main] 23 | async fn main() { 24 | setup_logging(LoggingFormat::Standard); 25 | 26 | let args = Args::parse(); 27 | let max_connections = 1; 28 | let db = setup_pg_connection(&args.db_url, max_connections).await; 29 | let tree_address = SerializablePubkey::from(Pubkey::from_str(&args.tree_address).unwrap()); 30 | info!("Validating tree {:?}", tree_address); 31 | 32 | validate_tree(&db, tree_address).await; 33 | } 34 | -------------------------------------------------------------------------------- /tests/data/transactions/incorrect_root_bug/24sss1cU9KtZfsp3ozPPP6xUNV3ChmJZBMCLuMx1HosXwoUnf5UiKHHrGJXS6GipYCdzZdjviT3qC93ZKTYP2M8z: -------------------------------------------------------------------------------- 1 | {"slot":310810040,"transaction":["ATVcTEIXa7SvwoOmaOdtxQ/uS/J7E0frmNCmFB0p8wsP0hrcqx0P6DmTUvJa0/T8ALJ4HlxrXXCkxzoYdE4jbAeAAQAHCmyoSXlEYY/LCNRyQa7Vg8jwWAFwIKbRNY1C7q/CQsZoVHSgCu6iOzmro5S2SOYWM4cgIkl19q3N4fsCtCfH3+dETX0gTIA9tAHPRSx5dpkRs7dzIqN/ZtYBV6+xXzFBRQMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAA7voj2KNaUkin0cTj0q1Z/44Ux5aQ1z2kIi+15OKZ0BGRztReLnt+nj47yoUP9fm1l0bivowD4TosobItWBI4uQu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh8lCWvvfwASSVnnP89WLXftLWNrrsoc8ReluW2ZFUpbPisVtUX5WmGYbaZQ2U59jqgDx7lLHvCkkzhz6x5BdpyhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlh0Xv5HbHQ8/vU3iZ5cMGlCvCDnWreLPXegydapvY0oCAwAFAkBCDwAECgAABQYHCAEECQJPGhCpBxXK8hlDAAAAAAAAAAABAAAAcI+Me9oaeBSPD2UZEqXWrPyA0Dm426cOMteUDvVOwLQA4fUFAAAAAAAAAAAAAAAAAQDh9QUAAAAAAQA=","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":5000,"preBalances":[1000000000,0,9496056960,1,1141440,1392000,1141440,0,1141440,1],"postBalances":[899994700,100000000,9496057260,1,1141440,1392000,1141440,0,1141440,1],"innerInstructions":[{"index":1,"instructions":[{"programIdIndex":9,"accounts":[0,1],"data":"3Bxs411Dtc7pkFQj","stackHeight":2},{"programIdIndex":8,"accounts":[0,7,5,9,2],"data":"5wPdbtbk7M4b3JSHrvzpY78ZXE6Y4Wa38QFYHwAUEjg5UHpWZmM46DD8aLzbj3","stackHeight":2},{"programIdIndex":9,"accounts":[0,2],"data":"3Bxs48DZ3Zx6m4mD","stackHeight":3},{"programIdIndex":6,"accounts":[],"data":"1111AKhozNdr7DUw6hAWhpj5uqWY1gcMqDGnoRyqyVsb68KDWp6NAeuCZ4vVvqKwgGiNZQ3ZZ9E7hLgCMbfdLWTvCvrsEnRM5c8JMbDq4XdQn3CEiV5fCWDn8hpMMnKUp6J8QwL4rFYu6bftAJupxc93MQrxiBaG4N8j9HTxGvJMP9nkaXiuhQzm5PKcjoXs6JhFWiAR3HfV1rgBcTkax7911FmWLNsqDiPdnpx16GmBEXcsq1dppqCNw4Gd5","stackHeight":2}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN invoke [1]","Program log: Instruction: Invoke","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK invoke [2]","Program log: Instruction: AppendLeavesToMerkleTrees","Program 11111111111111111111111111111111 invoke [3]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK consumed 41865 of 959004 compute units","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK success","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV invoke [2]","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV consumed 97 of 915042 compute units","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN consumed 85377 of 999850 compute units","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN success"],"preTokenBalances":[],"postTokenBalances":[],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":85527},"version":0,"blockTime":1720660080} -------------------------------------------------------------------------------- /tests/data/transactions/incorrect_root_bug/2FiBHVWnfLzEjaL52Eer5HLYQrNgYeSXdK9BPS1tD8pUnJJn5AHBmamELw3jJ1k5hppuGS5b9dYk58aXasXaJt2n: -------------------------------------------------------------------------------- 1 | {"slot":313514436,"transaction":["AT6zyjOn0tVcu2j6R7xDxeb1b/n5QwjAzXz0y/PuDfegUVAJUEZfUPDY2UnA6RZSgh7gtr66oeoJepYGQLn3CguAAQAHCr+Bl+npgRX/ZaMw1NpShiQduR7Xt/L03ggKntZj7X4JVHSgCu6iOzmro5S2SOYWM4cgIkl19q3N4fsCtCfH3+dETX0gTIA9tAHPRSx5dpkRs7dzIqN/ZtYBV6+xXzFBRQMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAA7voj2KNaUkin0cTj0q1Z/44Ux5aQ1z2kIi+15OKZ0BGRztReLnt+nj47yoUP9fm1l0bivowD4TosobItWBI4uQu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh8lCWvvfwASSVnnP89WLXftLWNrrsoc8ReluW2ZFUpbPisVtUX5WmGYbaZQ2U59jqgDx7lLHvCkkzhz6x5BdpyhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUliUg1xWUlRMHEtIaKUG4xjJZeTuBALhDfQ3gN86n6gCAwAFAkBCDwAECgAABQYHCAEECQJPGhCpBxXK8hlDAAAAAAAAAAABAAAAv4GX6emBFf9lozDU2lKGJB25Hte38vTeCAqe1mPtfgmAlpgAAAAAAAAAAAAAAAAAAYCWmAAAAAAAAQA=","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":5000,"preBalances":[879701176,6120000030,9496077960,1,1141440,1392000,1141440,0,1141440,1],"postBalances":[869695876,6130000030,9496078260,1,1141440,1392000,1141440,0,1141440,1],"innerInstructions":[{"index":1,"instructions":[{"programIdIndex":9,"accounts":[0,1],"data":"3Bxs4NN8M2Yn4TLb","stackHeight":2},{"programIdIndex":8,"accounts":[0,7,5,9,2],"data":"5wPdbtbk7M4b3JSHrw1MYWsv4MwBJRJmMhzmKVEijgCDUPD8Foazm3po3r4Cxd","stackHeight":2},{"programIdIndex":9,"accounts":[0,2],"data":"3Bxs48DZ3Zx6m4mD","stackHeight":3},{"programIdIndex":6,"accounts":[],"data":"1111AKhozZxCX7gPf3jTrT19qqg1cByv91JMs3qkpGMx64jjHvsUikEMhpzfRMG2PZyjraaUXuGmpopCRuJSM1j1GNHii5zp8r6ajM38amuezZs3QZqVXY385y52shknsJ7GcT9XYHNKh2gtvaZ4dr91ueEome8gp7zjjjm3n7bjW2CFwJU6ctSrjUR3Rqz7H9hjNGy3CGs8r4Gx3Q5ij9obvvryThdoyxozoezQK8vd2ZzpRDrJ3KXjmuEVu","stackHeight":2}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN invoke [1]","Program log: Instruction: Invoke","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK invoke [2]","Program log: Instruction: AppendLeavesToMerkleTrees","Program 11111111111111111111111111111111 invoke [3]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK consumed 41793 of 958998 compute units","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK success","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV invoke [2]","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV consumed 97 of 915108 compute units","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN consumed 85311 of 999850 compute units","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN success"],"preTokenBalances":[],"postTokenBalances":[],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":85461},"version":0,"blockTime":1721676224} -------------------------------------------------------------------------------- /tests/data/transactions/incorrect_root_bug/2Yk8JqfmhUrCfTh8RmGqwf8WM3NELB9bQwmtvL88fCNwbkoYaecVSh3WjpZ4Zdb5hPw46rk3o1gjTazt9e9nTGtw: -------------------------------------------------------------------------------- 1 | {"slot":313502212,"transaction":["AU1kNOjA4q756k/Y+xMIIZCJ8/XBtjNgYa3magmHDmEMSYLWrIky4ZbVIhd5XDKlMFnjqpbjsNrkdZUrUnZdngCAAQAHCr+Bl+npgRX/ZaMw1NpShiQduR7Xt/L03ggKntZj7X4JVHSgCu6iOzmro5S2SOYWM4cgIkl19q3N4fsCtCfH3+dETX0gTIA9tAHPRSx5dpkRs7dzIqN/ZtYBV6+xXzFBRQMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAA7voj2KNaUkin0cTj0q1Z/44Ux5aQ1z2kIi+15OKZ0BGRztReLnt+nj47yoUP9fm1l0bivowD4TosobItWBI4uQu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh8lCWvvfwASSVnnP89WLXftLWNrrsoc8ReluW2ZFUpbPisVtUX5WmGYbaZQ2U59jqgDx7lLHvCkkzhz6x5BdpyhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTrmLxWJ/JLs2uSAuJv6DIiZLPIrkLdNQeDhy5NhRS0CAwAFAkBCDwAECgAABQYHCAEECQJPGhCpBxXK8hlDAAAAAAAAAAABAAAAv4GX6emBFf9lozDU2lKGJB25Hte38vTeCAqe1mPtfgmAlpgAAAAAAAAAAAAAAAAAAYCWmAAAAAAAAQA=","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":5000,"preBalances":[989994700,6010000030,9496068060,1,1141440,1392000,1141440,0,1141440,1],"postBalances":[979989400,6020000030,9496068360,1,1141440,1392000,1141440,0,1141440,1],"innerInstructions":[{"index":1,"instructions":[{"programIdIndex":9,"accounts":[0,1],"data":"3Bxs4NN8M2Yn4TLb","stackHeight":2},{"programIdIndex":8,"accounts":[0,7,5,9,2],"data":"5wPdbtbk7M4b3JSHrvxnAN8Zn4djffSGTNL6TrHMXLNQGoiMHTM3aCdbtsPPHP","stackHeight":2},{"programIdIndex":9,"accounts":[0,2],"data":"3Bxs48DZ3Zx6m4mD","stackHeight":3},{"programIdIndex":6,"accounts":[],"data":"1111AKhoydS7K4CYGDSuR5UNN5xXKYNodbsYjMoffp4CfQzaeFKzGoKhKHjC7ixa1bUcdrusthHzgAKMtdzNzdgNKpsUaosa5YawaLZrDpk1vVcuJUdsPgkwmwJcCXnCTMuvjKJfWcevJ12xrhL12jA3Ygh5bd8GRUqdpEZaQMEGEPF3gixwGVsomdCndjrcmUpVXe8j6FNKmw4E2hG4pQTtZYdkzwPdUf9SMfV7mCCVdMPwwrzdkMe3meNXy","stackHeight":2}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN invoke [1]","Program log: Instruction: Invoke","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK invoke [2]","Program log: Instruction: AppendLeavesToMerkleTrees","Program 11111111111111111111111111111111 invoke [3]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK consumed 41793 of 958998 compute units","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK success","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV invoke [2]","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV consumed 97 of 915108 compute units","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN consumed 85311 of 999850 compute units","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN success"],"preTokenBalances":[],"postTokenBalances":[],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":85461},"version":0,"blockTime":1721671569} -------------------------------------------------------------------------------- /tests/data/transactions/incorrect_root_bug/2rFKQDye3Bp6jQheTLz1RnwQtXGcSJTfkwxaZQWL1wuJ43SEFgoT5bLUpc9yPrecWS8EkMLViEWwwBpmLiynrPS7: -------------------------------------------------------------------------------- 1 | {"slot":313486272,"transaction":["AVx8UQxk2IXJ83mwY1cYh04iBsLnTjX3LP+m0JM9gvK1oMBQqCcfPD0u0opGldetS4DJ7LgBhD3WWr37uhjRIQCAAQAHCoI8avsY4MBsRjtv+7oyF2dq6XGUOb6eb6McnS/JKfk7VHSgCu6iOzmro5S2SOYWM4cgIkl19q3N4fsCtCfH3+dETX0gTIA9tAHPRSx5dpkRs7dzIqN/ZtYBV6+xXzFBRQMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAA7voj2KNaUkin0cTj0q1Z/44Ux5aQ1z2kIi+15OKZ0BGRztReLnt+nj47yoUP9fm1l0bivowD4TosobItWBI4uQu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh8lCWvvfwASSVnnP89WLXftLWNrrsoc8ReluW2ZFUpbPisVtUX5WmGYbaZQ2U59jqgDx7lLHvCkkzhz6x5BdpyhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8uo5Fz9sHkFmd3/HKD1ypBSF9vHuoVNNf097GBygAjkCAwAFAkBCDwAECgAABQYHCAEECQJPGhCpBxXK8hlDAAAAAAAAAAABAAAAgjxq+xjgwGxGO2/7ujIXZ2rpcZQ5vp5voxydL8kp+TsA4fUFAAAAAAAAAAAAAAAAAQDh9QUAAAAAAQA=","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":5000,"preBalances":[1299962900,4800000030,9496063860,1,1141440,1392000,1141440,0,1141440,1],"postBalances":[1199957600,4900000030,9496064160,1,1141440,1392000,1141440,0,1141440,1],"innerInstructions":[{"index":1,"instructions":[{"programIdIndex":9,"accounts":[0,1],"data":"3Bxs411Dtc7pkFQj","stackHeight":2},{"programIdIndex":8,"accounts":[0,7,5,9,2],"data":"5wPdbtbk7M4b3JSHrw1MntZuitrpiyw5dbLhFTgZKxGhrs6LHoBYvbAsRqR53x","stackHeight":2},{"programIdIndex":9,"accounts":[0,2],"data":"3Bxs48DZ3Zx6m4mD","stackHeight":3},{"programIdIndex":6,"accounts":[],"data":"1111AKhoza3SnWTHSEPrc9wseGZZAB6zz4T73yYG8mEELc4Dg8PbaWjxcNevjGNp1dYPWYhFv7kxrZ5W9owmxcsmXoYKtoNsY5eqQSndUnxKWiwuufSDfR9VGN5d7qeJ5ibpSunSie4r9Vesb5HcR6u5pHevK1VdRFmUMiY3pi1Hp6hyFvngkXvqkZj84JwFd248ArLdcd4WQPY2AVuGRRZdJDVQJdNetywT5d5q5xePNt2hfUe1NmhhndFjM","stackHeight":2}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN invoke [1]","Program log: Instruction: Invoke","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK invoke [2]","Program log: Instruction: AppendLeavesToMerkleTrees","Program 11111111111111111111111111111111 invoke [3]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK consumed 41769 of 958998 compute units","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK success","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV invoke [2]","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV consumed 97 of 915132 compute units","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN consumed 85287 of 999850 compute units","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN success"],"preTokenBalances":[],"postTokenBalances":[],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":85437},"version":0,"blockTime":1721665523} -------------------------------------------------------------------------------- /tests/data/transactions/incorrect_root_bug/FWAN6WFdhL63uhCLZ2wan6i7Gi7WZgDxLHbnYvsyevwovRW8UdaVU1R1X5eG55w5SXZtxmqAGKqpYBCyWRs7xkz: -------------------------------------------------------------------------------- 1 | {"slot":313496854,"transaction":["AQyBs9A10kL81Y+hK6Xd1f8VmcIkgDrV3JKd5KykSyqIIkeW077dFu3TXq1wXMFo95nLTAuJHr7/dIrC29qSkgOAAQAHCoI8avsY4MBsRjtv+7oyF2dq6XGUOb6eb6McnS/JKfk7VHSgCu6iOzmro5S2SOYWM4cgIkl19q3N4fsCtCfH3+dETX0gTIA9tAHPRSx5dpkRs7dzIqN/ZtYBV6+xXzFBRQMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAA7voj2KNaUkin0cTj0q1Z/44Ux5aQ1z2kIi+15OKZ0BGRztReLnt+nj47yoUP9fm1l0bivowD4TosobItWBI4uQu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh8lCWvvfwASSVnnP89WLXftLWNrrsoc8ReluW2ZFUpbPisVtUX5WmGYbaZQ2U59jqgDx7lLHvCkkzhz6x5BdpyhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+zWBAA8WjfUEgzh8mZuAFEDl0QxQxurmsd6gNMQM60sCAwAFAkBCDwAECgAABQYHCAEECQJPGhCpBxXK8hlDAAAAAAAAAAABAAAAgjxq+xjgwGxGO2/7ujIXZ2rpcZQ5vp5voxydL8kp+TsAypo7AAAAAAAAAAAAAAAAAQDKmjsAAAAAAQA=","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":5000,"preBalances":[1099845380,5000000030,9496067460,1,1141440,1392000,1141440,0,1141440,1],"postBalances":[99840080,6000000030,9496067760,1,1141440,1392000,1141440,0,1141440,1],"innerInstructions":[{"index":1,"instructions":[{"programIdIndex":9,"accounts":[0,1],"data":"3Bxs3zzLZLuLQEYX","stackHeight":2},{"programIdIndex":8,"accounts":[0,7,5,9,2],"data":"5wPdbtbk7M4b3JSHrw1KxQJsLW3VVs6zii1FxjdR4gaCqb2fLHq2c11JKraovA","stackHeight":2},{"programIdIndex":9,"accounts":[0,2],"data":"3Bxs48DZ3Zx6m4mD","stackHeight":3},{"programIdIndex":6,"accounts":[],"data":"1111AKhozZNagYeccn3f4vXtoD77wcG3nCeVSxCRf6CvVGka9EJBwwP9128duAHcuvu9xVZM9ZfsphE7ezJ3icGi3CZ4rzBDnYVegn6qsdxeaDjzwueb17MZ8GNBRFSXrKu6HdtNQB2P9hdBB8e8XhSJDkdC9AhZqs2yJAguJiAiYjUyAgYjW9cnrQ1YDSZBvtyQsyqeB4pByCS4grrHf2RYDRsvHUxaiDpoDBSzqDh1ef5wz6phrbZ6bhZ11","stackHeight":2}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN invoke [1]","Program log: Instruction: Invoke","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK invoke [2]","Program log: Instruction: AppendLeavesToMerkleTrees","Program 11111111111111111111111111111111 invoke [3]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK consumed 41793 of 958998 compute units","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK success","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV invoke [2]","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV consumed 97 of 915108 compute units","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN consumed 85311 of 999850 compute units","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN success"],"preTokenBalances":[],"postTokenBalances":[],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":85461},"version":0,"blockTime":1721669543} -------------------------------------------------------------------------------- /tests/data/transactions/incorrect_root_bug/KCjYBJqjGFyWLxwjt7k2i3ZXmUJxSz1uQ7wTVj4h6kS2TQhL87rXpnaBico6exSmgxgMoLFHLULLp9ke4CFPZqx: -------------------------------------------------------------------------------- 1 | {"slot":313506480,"transaction":["AQ+ybM0GHOg7/nZadHkPjE90W0jJghoBx+oBw2enVK9NtpKaLelYODsU3WDRNVADLk0u0Nox7WVyzrZZQO/DygeAAQAHCr+Bl+npgRX/ZaMw1NpShiQduR7Xt/L03ggKntZj7X4JVHSgCu6iOzmro5S2SOYWM4cgIkl19q3N4fsCtCfH3+dETX0gTIA9tAHPRSx5dpkRs7dzIqN/ZtYBV6+xXzFBRQMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAA7voj2KNaUkin0cTj0q1Z/44Ux5aQ1z2kIi+15OKZ0BGRztReLnt+nj47yoUP9fm1l0bivowD4TosobItWBI4uQu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh8lCWvvfwASSVnnP89WLXftLWNrrsoc8ReluW2ZFUpbPisVtUX5WmGYbaZQ2U59jqgDx7lLHvCkkzhz6x5BdpyhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjr2azUMNZ2+ab9vIm5O+VLiFAWhLatrpPhiOu2MbScUCAwAFAkBCDwAECgAABQYHCAEECQJPGhCpBxXK8hlDAAAAAAAAAAABAAAAv4GX6emBFf9lozDU2lKGJB25Hte38vTeCAqe1mPtfgmAlpgAAAAAAAAAAAAAAAAAAYCWmAAAAAAAAQA=","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":5000,"preBalances":[919861372,6080000030,9496072860,1,1141440,1392000,1141440,0,1141440,1],"postBalances":[909856072,6090000030,9496073160,1,1141440,1392000,1141440,0,1141440,1],"innerInstructions":[{"index":1,"instructions":[{"programIdIndex":9,"accounts":[0,1],"data":"3Bxs4NN8M2Yn4TLb","stackHeight":2},{"programIdIndex":8,"accounts":[0,7,5,9,2],"data":"5wPdbtbk7M4b3JSHrvyT34o5PVMoRQHvGTutfRCM6uJZxy14ehyJGaY3cxuZwJ","stackHeight":2},{"programIdIndex":9,"accounts":[0,2],"data":"3Bxs48DZ3Zx6m4mD","stackHeight":3},{"programIdIndex":6,"accounts":[],"data":"1111AKhoysczRcc61SrxtREEEQGdXVc4vqq5ZGfx65nxeguPh9dacM1rJy99zAPfXn8ga1ZavSTg5FZ4UDRqnRNZzaZNbxL3WZeNtxJoHseepGwfaq5F7GwpwYPFMMhH57Q8diAYvoo1TJW6sJC8kF6WZ4GAX8TjLfy2UfEr57sc9EJsCyUtjkS93nJs3Q2eEkUFBwftt2v4kM7aL4DF3EH8timy8Au5t57Tq2fpswF9anhcqnC1mTJLcmtf9","stackHeight":2}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN invoke [1]","Program log: Instruction: Invoke","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK invoke [2]","Program log: Instruction: AppendLeavesToMerkleTrees","Program 11111111111111111111111111111111 invoke [3]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK consumed 41769 of 958998 compute units","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK success","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV invoke [2]","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV consumed 97 of 915132 compute units","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN consumed 85287 of 999850 compute units","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN success"],"preTokenBalances":[],"postTokenBalances":[],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":85437},"version":0,"blockTime":1721673194} -------------------------------------------------------------------------------- /tests/data/transactions/incorrect_root_bug/QYVdkhAQWRqwy9MVDQH8vkC1xfteGqDZKNYC9Qn9qD6PDxGTRWx2n4ZxQR9r6LRjxipNGF6bNcPQ1QoRh9PiVUn: -------------------------------------------------------------------------------- 1 | {"slot":313502572,"transaction":["ARRNdjMp4wZTtB5Q3ShQZmw84eLIx9Fajtk9eMIzHKTegDgt3YrE19WijMcp8eFaYdGw1BI/nnHlbOxPnJioBQOAAQAHCr+Bl+npgRX/ZaMw1NpShiQduR7Xt/L03ggKntZj7X4JVHSgCu6iOzmro5S2SOYWM4cgIkl19q3N4fsCtCfH3+dETX0gTIA9tAHPRSx5dpkRs7dzIqN/ZtYBV6+xXzFBRQMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAA7voj2KNaUkin0cTj0q1Z/44Ux5aQ1z2kIi+15OKZ0BGRztReLnt+nj47yoUP9fm1l0bivowD4TosobItWBI4uQu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh8lCWvvfwASSVnnP89WLXftLWNrrsoc8ReluW2ZFUpbPisVtUX5WmGYbaZQ2U59jqgDx7lLHvCkkzhz6x5BdpyhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoFcLoNqo4xeLTSbLsfzDgDeuuFmW9MKBIMnukD1AVBsCAwAFAkBCDwAECgAABQYHCAEECQJPGhCpBxXK8hlDAAAAAAAAAAABAAAAv4GX6emBFf9lozDU2lKGJB25Hte38vTeCAqe1mPtfgmAlpgAAAAAAAAAAAAAAAAAAYCWmAAAAAAAAQA=","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":5000,"preBalances":[979989400,6020000030,9496068360,1,1141440,1392000,1141440,0,1141440,1],"postBalances":[969984100,6030000030,9496068660,1,1141440,1392000,1141440,0,1141440,1],"innerInstructions":[{"index":1,"instructions":[{"programIdIndex":9,"accounts":[0,1],"data":"3Bxs4NN8M2Yn4TLb","stackHeight":2},{"programIdIndex":8,"accounts":[0,7,5,9,2],"data":"5wPdbtbk7M4b3JSHrvzyFoNRATiBJDGVYpfmZgDy6G3fB76uVkZefshVFnoWsx","stackHeight":2},{"programIdIndex":9,"accounts":[0,2],"data":"3Bxs48DZ3Zx6m4mD","stackHeight":3},{"programIdIndex":6,"accounts":[],"data":"1111AKhozRpQYWcBvUx9f3Fopgr7YEggBfH8RSSZfUff2bzthnJstAndiJiSXvHHbJ23U6hrYdXEH4kBVz4qHhEo9qj26wYqCnjCD92mcre5Ga9ZHySnCPwpdEMdx83dzPZXTr84j7JANdKbRCLqQxFiBmhZKLAXuZSTbDcGzdSXah6yNjc7rx6BxcUmGTMqZJgn5XGVgHrLhapyjibUV7zuBRZwKp3zgwTYCPCnM47aTu87Q2KN9uKhh7LVD","stackHeight":2}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN invoke [1]","Program log: Instruction: Invoke","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK invoke [2]","Program log: Instruction: AppendLeavesToMerkleTrees","Program 11111111111111111111111111111111 invoke [3]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK consumed 41793 of 958998 compute units","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK success","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV invoke [2]","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV consumed 97 of 915108 compute units","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN consumed 85311 of 999850 compute units","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN success"],"preTokenBalances":[],"postTokenBalances":[],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":85461},"version":0,"blockTime":1721671706} -------------------------------------------------------------------------------- /tests/data/transactions/lamport_transfers/3XEuyoLXyxbaeoSFZmMDPN8Ua3gciDRny3tMVw3vmvrsF5aAda6WVWBN21Hnq6jE2wRvv1mMoPWy97uAEUue2prS: -------------------------------------------------------------------------------- 1 | {"slot":39,"transaction":["AX4cmij4RXJDkl9Epl7iuy9x3YxEyLDvrm5iOIVNEdVvpDDmVJMhVZfOie78bhJFRuDcDCnv1J/1gSDW+TMusQeAAQAHCkRV+vLCMzO5BPfXw3uk82DUoMP0MpSVbW3Ol429vjz9p55IOWxW4NVOP7mxA8WYXgvhjDmq6x139I1A8AZUolgNAckoq0XTZVlaNOh3F/uwAIoZ0i8FLJ2h+YjEfFfeOgMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAABqdV+CE5BU1EJLFa8MQwzy9Lf5h5OtoSUtSPNmbGy84e68SM+zJku8NL9cWlqDT8Z1AAbymG2W8jW8iHXvTdRAu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh8+7ModRBcroW1tER2B+2/4UUnv7QjkRykBCO/0VJ6JnUJLDbsIvUXgwD9tEqqav/P8KRuHLxkHA4+0J2hO571CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYs8fAjIcFgwfUKdzsROOHl8G5qOY/UGIVYXI8FiiC7wCAwAFAkBCDwAECgAABQYHCAEECQJPGhCpBxXK8hlDAAAAAAAAAAABAAAARFX68sIzM7kE99fDe6TzYNSgw/QylJVtbc6Xjb2+PP0Aypo7AAAAAAAAAAAAAAAAAQDKmjsAAAAAAQA=","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":5000,"preBalances":[2000000000,0,9496335360,1,1141440,1392000,1141440,0,1141440,1],"postBalances":[999994700,1000000000,9496335660,1,1141440,1392000,1141440,0,1141440,1],"innerInstructions":[{"index":1,"instructions":[{"programIdIndex":9,"accounts":[0,1],"data":"3Bxs3zzLZLuLQEYX","stackHeight":2},{"programIdIndex":8,"accounts":[0,7,5,9,2],"data":"5wPdbtbk7M4b3JSHrvyTts74BzFocqeeHFyFobdFG2zAhQKFmb2eFfoKMH3Soi","stackHeight":2},{"programIdIndex":9,"accounts":[0,2],"data":"3Bxs48DZ3Zx6m4mD","stackHeight":3},{"programIdIndex":6,"accounts":[],"data":"1111AKhoyswAYr9veyqaaRrLrLmfJeg2kJpdVVmjMrmfj9TUtfGfqjdhva6Kw5yBFyeVypt9KxziKtpS2CMCymJJjwdUSX6qPP2tznJEmGTCX3ZxKT7Ye1guzn3zTJYi4JjvViVhpGcQktSGJMWz5bvoMJKbXybqXs5j4AkvCDLc5SsTVVrbvh13g8uWFpvehpKjY2ECKwhsHbFAJ5uhyDykrsqzEJdbiFsHdzuqEaBYFYaK1QQ5iythoL5ps","stackHeight":2}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program SySTEM1eSU2p4BGQfQpimFEWWSC1XDFeun3Nqzz3rT7 invoke [1]","Program log: Instruction: Invoke","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program compr6CUsB5m2jS4Y3831ztGSTnDpnKJTKS95d64XVq invoke [2]","Program log: Instruction: AppendLeavesToMerkleTrees","Program 11111111111111111111111111111111 invoke [3]","Program 11111111111111111111111111111111 success","Program compr6CUsB5m2jS4Y3831ztGSTnDpnKJTKS95d64XVq consumed 41970 of 973672 compute units","Program compr6CUsB5m2jS4Y3831ztGSTnDpnKJTKS95d64XVq success","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV invoke [2]","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV consumed 38 of 929595 compute units","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV success","Program SySTEM1eSU2p4BGQfQpimFEWWSC1XDFeun3Nqzz3rT7 consumed 70791 of 999850 compute units","Program SySTEM1eSU2p4BGQfQpimFEWWSC1XDFeun3Nqzz3rT7 success"],"preTokenBalances":[],"postTokenBalances":[],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":70941},"version":0,"blockTime":1724703486} -------------------------------------------------------------------------------- /tests/data/transactions/lamport_transfers/4dqYnWSm8qKxCyeADsc1eqQBSQQ7BneXbeNxmw8P6Fu5TVv26Roud4UwtvBfy4bV7NLFe1NK97ytqwPqwyGRGVT3: -------------------------------------------------------------------------------- 1 | {"slot":50,"transaction":["AbXRXvtF9qxoFloCEVIMn5HSrX1NSFq20babKIdM1XXLwbeAystjOcjOm2FiGWAXfbUqHiKmaf7ptdFRtFOkRQ6AAQAHCt8/IKVrMkt+idpUttXiunm3nO4mY7lZNclIjFIiyMfSVHSgCu6iOzmro5S2SOYWM4cgIkl19q3N4fsCtCfH3+dETX0gTIA9tAHPRSx5dpkRs7dzIqN/ZtYBV6+xXzFBRQMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAA7voj2KNaUkin0cTj0q1Z/44Ux5aQ1z2kIi+15OKZ0BGRztReLnt+nj47yoUP9fm1l0bivowD4TosobItWBI4uQu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh8lCWvvfwASSVnnP89WLXftLWNrrsoc8ReluW2ZFUpbPisVtUX5WmGYbaZQ2U59jqgDx7lLHvCkkzhz6x5BdpyhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIrmiatBOQtDn1T4OlVp1XPkmx8jIEnoZo41zO3gw5cCAwAFAkBCDwAECgAABQYHCAEECQJPGhCpBxXK8hlDAAAAAAAAAAABAAAA3z8gpWsyS36J2lS21eK6ebec7iZjuVk1yUiMUiLIx9IAypo7AAAAAAAAAAAAAAAAAQDKmjsAAAAAAQA=","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":5000,"preBalances":[2000000000,0,9496836480,1,1141440,1392000,1141440,0,1141440,1],"postBalances":[999994812,1000000000,9496836668,1,1141440,1392000,1141440,0,1141440,1],"innerInstructions":[{"index":1,"instructions":[{"programIdIndex":9,"accounts":[0,1],"data":"3Bxs3zzLZLuLQEYX","stackHeight":2},{"programIdIndex":8,"accounts":[0,7,5,9,2],"data":"5wPdbtbk7M4b3JSHrw1Rgama1aFN3mRcFF3Ro6wWKyDhYJGt55VRT2SEPMgTXF","stackHeight":2},{"programIdIndex":9,"accounts":[0,2],"data":"3Bxs4YJVi6KXxi8o","stackHeight":3},{"programIdIndex":6,"accounts":[],"data":"1111AKhozbTpDZb1s179NERKKYQFNXVLy64GHrBXiURQUg1SiCNuXvo7Tb5SFAqkXinMgeyhRGaahrAnymvSZcibDrUohPn5vecm15uxULHFHykXTLbQHvDvq8qkSsKDEXkeyuorbzPrg1Nappgx2RDRX33eHHftxE8kFmVAPLnFofQGJt5P3Ce53YRHEpH9NJhA749vJsRAStPL6aiUReK5r8mFcEf751q6tSrBLk5hWeHL3y3uF7H1izTJ7","stackHeight":2}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN invoke [1]","Program log: Instruction: Invoke","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK invoke [2]","Program log: Instruction: AppendLeavesToMerkleTrees","Program 11111111111111111111111111111111 invoke [3]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK consumed 46215 of 959152 compute units","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK success","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV invoke [2]","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV consumed 38 of 910838 compute units","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN consumed 89512 of 999850 compute units","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN success"],"preTokenBalances":[],"postTokenBalances":[],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":89662},"version":0,"blockTime":1717607954} -------------------------------------------------------------------------------- /tests/data/transactions/lamport_transfers/4hyshcVVLqy7AtnB2CdLixvHTEwHARNwZ69gqd2ij7u6bmPvK9nbR4CeYTCLDyXZJ8DPmH6GmZ26MpqiLSxkorEz: -------------------------------------------------------------------------------- 1 | {"slot":46,"transaction":["AblkHxQdERkF6PrZaNxi0y97p8itvaKSLxiEZXLc1L5feTcB840CuDp0l3qgze+yUDWDwl8oHpfX8sOTG0KMSg+AAQAHCm43okwob0xHu9DRRxD5ZLmEgXjGnpsfbiHCnIhRIlXisW59Lug0r1wz/S3TSnQmOY2O4L36K6YLXevV+QUv5zlETX0gTIA9tAHPRSx5dpkRs7dzIqN/ZtYBV6+xXzFBRQMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAAUWwytQBJW8Xd12pFBWuS/CX8e68+yKjmbwbZR2y6uFMOk0MhnnnW7qJcTxu17COx851pv2IOd4Bl3jlDcCIw6wu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh81/rcnOkzRlVEOWGXY+St8XrqvZsYR5GQUT0IMZiUTD9BbD2wNHXqhcavQ6sML4++KFWFi/g/4Gcx30CKXBmgHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiuUSKxET+jtkBioMMFLQBE83PIV+UF1+vpNiPu391qcCAwAFAkBCDwAECgAABQYHCAEECQJPGhCpBxXK8hlDAAAAAAAAAAABAAAAbjeiTChvTEe70NFHEPlkuYSBeMaemx9uIcKciFEiVeIAypo7AAAAAAAAAAAAAAAAAQDKmjsAAAAAAQA=","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":5000,"preBalances":[2000000000,0,9496836480,1,1141440,1169280,1141440,0,1141440,1],"postBalances":[999994819,1000000000,9496836661,1,1141440,1169280,1141440,0,1141440,1],"innerInstructions":[{"index":1,"instructions":[{"programIdIndex":9,"accounts":[0,1],"data":"3Bxs3zzLZLuLQEYX","stackHeight":2},{"programIdIndex":8,"accounts":[0,7,5,6,9,2],"data":"5wPdbtbk7M4b3JSHrvxuQJqjTWqbBwF4B2bSQa6jwqtMf4bQibp8s4YG32PmwQ","stackHeight":2},{"programIdIndex":9,"accounts":[0,2],"data":"3Bxs4X8azzfoWTGB","stackHeight":3},{"programIdIndex":6,"accounts":[],"data":"1111AKhoyg5NbZwsYGo8DCnfeGp988oQV9D5HVbVQFiChbv8ZTkCAFbYLE5pLhe3xBMvymH9TkZL8T9tSVJJNYqAtRvkJCEvFBq3ErNW52K1ETgpa1iP2oazcffXMmQejJi7AquPPc2BajW7Tvp3ecrt66XVdZJahy28Kqx9hjPyWk1s4qjFfmkuuV3ywwAahKsfndMKskgdpcHWmi5uNnyHaN3PQwKN6879GU5f36XkaegeBvqP75EnJAZMZ","stackHeight":2}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program 6UqiSPd2mRCTTwkzhcs1M6DGYsqHWd5jiPueX3LwDMXQ invoke [1]","Program log: Instruction: Invoke","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program 5QPEJ5zDsVou9FQS3KCauKswM3VwBEBu4dpL9xTqkWwN invoke [2]","Program log: Instruction: AppendLeavesToMerkleTrees","Program 11111111111111111111111111111111 invoke [3]","Program 11111111111111111111111111111111 success","Program 5QPEJ5zDsVou9FQS3KCauKswM3VwBEBu4dpL9xTqkWwN consumed 47368 of 972887 compute units","Program 5QPEJ5zDsVou9FQS3KCauKswM3VwBEBu4dpL9xTqkWwN success","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV invoke [2]","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV consumed 38 of 923277 compute units","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV success","Program 6UqiSPd2mRCTTwkzhcs1M6DGYsqHWd5jiPueX3LwDMXQ consumed 77082 of 999850 compute units","Program 6UqiSPd2mRCTTwkzhcs1M6DGYsqHWd5jiPueX3LwDMXQ success"],"preTokenBalances":[],"postTokenBalances":[],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":77232},"version":0,"blockTime":1717014984} -------------------------------------------------------------------------------- /tests/data/transactions/lamport_transfers/5NLdbqznXqmTPTN8JBLquriDggb9qaRszVGLSvt6t5esy2Q8Z1iqAuXF4qoLK7HM6oGLySUNUkzhnSocwArpAqmV: -------------------------------------------------------------------------------- 1 | {"slot":39,"transaction":["Adp4L6O9DspO/0hzNm03xy1TN3Nm3WCkycVcjClqPFpxoqOJpq9XbkGwr4C68bzF+f+Mb5UV8uJzEQ4ijWMnAAyAAQAHCv39fLDhuL+Vx0QukPGgmSPxMPi6s6VTFsDUzNvSjXPIp55IOWxW4NVOP7mxA8WYXgvhjDmq6x139I1A8AZUolgNAckoq0XTZVlaNOh3F/uwAIoZ0i8FLJ2h+YjEfFfeOgMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAABqdV+CE5BU1EJLFa8MQwzy9Lf5h5OtoSUtSPNmbGy84e68SM+zJku8NL9cWlqDT8Z1AAbymG2W8jW8iHXvTdRAu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh8+7ModRBcroW1tER2B+2/4UUnv7QjkRykBCO/0VJ6JnUJLDbsIvUXgwD9tEqqav/P8KRuHLxkHA4+0J2hO571CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKnkwOHD/nE0C2mWpQxKrC28GdV3Z/7+l05LOwfLOC/QCAwAFAkBCDwAECgAABQYHCAEECQJPGhCpBxXK8hlDAAAAAAAAAAABAAAA/f18sOG4v5XHRC6Q8aCZI/Ew+LqzpVMWwNTM29KNc8gAypo7AAAAAAAAAAAAAAAAAQDKmjsAAAAAAQA=","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":5000,"preBalances":[2000000000,0,9496335360,1,1141440,1392000,1141440,0,1141440,1],"postBalances":[999994700,1000000000,9496335660,1,1141440,1392000,1141440,0,1141440,1],"innerInstructions":[{"index":1,"instructions":[{"programIdIndex":9,"accounts":[0,1],"data":"3Bxs3zzLZLuLQEYX","stackHeight":2},{"programIdIndex":8,"accounts":[0,7,5,9,2],"data":"5wPdbtbk7M4b3JSHrvyeByANePMDMuSsq6G6ajuPRWHTV7WoUXvk1QZWwxpfY3","stackHeight":2},{"programIdIndex":9,"accounts":[0,2],"data":"3Bxs48DZ3Zx6m4mD","stackHeight":3},{"programIdIndex":6,"accounts":[],"data":"1111AKhoywh5x6NRRDfVhASX1JDFzcjTqhP4LBwtvkAgmmJ6jzmFdnhU6C1PG1D8dCHPW6bWMWhZXi7d5Vnyfp4gAyVN3Fo48mcp18HPqWS919YPL4FuffAAnaQmECifUx5ymqQinkAQqanhzR8hUNbskSvNtxBAF5peVWfETRzSetE6eGr7Vcw2bSCWV9JaE7998uQJiVVtsXUELDaAL3w3qt3BW87BHiSwSSCHaSx4AoGf2Ni8WYbcQewBD","stackHeight":2}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program SySTEM1eSU2p4BGQfQpimFEWWSC1XDFeun3Nqzz3rT7 invoke [1]","Program log: Instruction: Invoke","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program compr6CUsB5m2jS4Y3831ztGSTnDpnKJTKS95d64XVq invoke [2]","Program log: Instruction: AppendLeavesToMerkleTrees","Program 11111111111111111111111111111111 invoke [3]","Program 11111111111111111111111111111111 success","Program compr6CUsB5m2jS4Y3831ztGSTnDpnKJTKS95d64XVq consumed 41970 of 973672 compute units","Program compr6CUsB5m2jS4Y3831ztGSTnDpnKJTKS95d64XVq success","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV invoke [2]","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV consumed 38 of 929595 compute units","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV success","Program SySTEM1eSU2p4BGQfQpimFEWWSC1XDFeun3Nqzz3rT7 consumed 70791 of 999850 compute units","Program SySTEM1eSU2p4BGQfQpimFEWWSC1XDFeun3Nqzz3rT7 success"],"preTokenBalances":[],"postTokenBalances":[],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":70941},"version":0,"blockTime":1724707466} -------------------------------------------------------------------------------- /tests/data/transactions/nullifier_queue/3z5aGksRbQCFvNvutWcz1qAnC1fzTAsa6Mz6NpbveKZfVcAuQ1xE1vkoFYoJLwEjRbgv5CwLrDPEP1KmVTpJ9skD: -------------------------------------------------------------------------------- 1 | {"slot":60,"transaction":["AZVBst4SXrDkxpNh8Q880ptCAptnJLDmF7AqKi9QCZ654XkMsJpZql12eSxdrRtZooGxtwBVgb4gqknmIHTBCwIBAAcKQej94TKtZw5TTNiyddLNfux3czxm+NtIocraf6v8RVVETX0gTIA9tAHPRSx5dpkRs7dzIqN/ZtYBV6+xXzFBRVR0oAruojs5q6OUtkjmFjOHICJJdfatzeH7ArQnx9/nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBkZv5SEXMv/srbpyw5vnvIzlu8X3EmssQ5s6QAAAAAu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh8kc7UXi57fp4+O8qFD/X5tZdG4r6MA+E6LKGyLVgSOLmUJa+9/ABJJWec/z1Ytd+0tY2uuyhzxF6W5bZkVSls+KxW1RflaYZhtplDZTn2OqAPHuUse8KSTOHPrHkF2nKG7voj2KNaUkin0cTj0q1Z/44Ux5aQ1z2kIi+15OKZ0BEiJCDbbz45SLaPQhZTN1k7EUIcvAF0EvjlIeQryhoLQQIEAAUCQEIPAAkKAAAGBQcIAgkDAU8aEKkHFcryGUMAAAAAAAAAAAEAAABB6P3hMq1nDlNM2LJ10s1+7HdzPGb420ihytp/q/xFVSN5gi8AAAAAAAAAAAAAAAABI3mCLwAAAAAB","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":5000,"preBalances":[50000000000,9496057145,0,1,1,1141440,1392000,0,1141440,1141440],"postBalances":[49202914972,9496057330,797079843,1,1,1141440,1392000,0,1141440,1141440],"innerInstructions":[{"index":1,"instructions":[{"programIdIndex":3,"accounts":[0,2],"data":"3Bxs46norw8SWX6o","stackHeight":2},{"programIdIndex":8,"accounts":[0,7,6,3,1],"data":"5wPdbtbk7M4b3JSHrw1UWNYRXp6oKiNckurRXVYT11Hp865aVoqpKZT3qv2fvL","stackHeight":2},{"programIdIndex":3,"accounts":[0,1],"data":"3Bxs4XoPh3u5UtLF","stackHeight":3},{"programIdIndex":5,"accounts":[],"data":"1111AKhozcVbH5bJxRFBwEaHQ33nsRBUBxxh1RZsqrTEnQtCcp37bgbYhQS4VJ8xC7sQT5a9w1uQNjrhMNZLSv1zkS5Pd6i1Rpzb1cqPYB6eXoDhTfU67DsE6k311hPCAu34mwCpbScwzjJnovGJudFLWvYY7Dhht7KAhvmiS8n3XcYF7if7ukjctLoVWmxUhTrQVumcLyMj4guByPfmNxoLP5JYG4NQZkxsQyBtKBvZcuHBCfYwhcqPEiudH","stackHeight":2}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN invoke [1]","Program log: Instruction: Invoke","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK invoke [2]","Program log: Instruction: AppendLeavesToMerkleTrees","Program 11111111111111111111111111111111 invoke [3]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK consumed 42480 of 958930 compute units","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK success","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV invoke [2]","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV consumed 38 of 914353 compute units","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN consumed 85996 of 999850 compute units","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN success"],"preTokenBalances":[],"postTokenBalances":[],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":86146},"version":"legacy","blockTime":1718726063} -------------------------------------------------------------------------------- /tests/data/transactions/nullifier_queue/qE2LpzJaLQygiQUwa2TQhVeRohA9mYq6fsifb2ujvsBuFbyau5SkQn5mURGQH2MHV6r4gGXh2vQDrKqNTruM6ru: -------------------------------------------------------------------------------- 1 | {"slot":60,"transaction":["ASmWRkmRhsv/bqHK+QGWOdGvLCsl25fi6H21L/rZVdydBy8C3TqtWbFkunvm7BKRomuTDCGzaVXI6y9GDFTr+gIBAAcKQej94TKtZw5TTNiyddLNfux3czxm+NtIocraf6v8RVVETX0gTIA9tAHPRSx5dpkRs7dzIqN/ZtYBV6+xXzFBRVR0oAruojs5q6OUtkjmFjOHICJJdfatzeH7ArQnx9/nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBkZv5SEXMv/srbpyw5vnvIzlu8X3EmssQ5s6QAAAAAu8D8C7R8ovdMQRLpSrE8+jxjTl3BfqywPNGiPNfnh8kc7UXi57fp4+O8qFD/X5tZdG4r6MA+E6LKGyLVgSOLmUJa+9/ABJJWec/z1Ytd+0tY2uuyhzxF6W5bZkVSls+KxW1RflaYZhtplDZTn2OqAPHuUse8KSTOHPrHkF2nKG7voj2KNaUkin0cTj0q1Z/44Ux5aQ1z2kIi+15OKZ0BHuocsr+L4UfcmD14Dig7jV0aqX1pWjbtOodQRyX9zKFgIEAAUCQEIPAAkKAAAGBQcIAgkDAU8aEKkHFcryGUMAAAAAAAAAAAEAAABB6P3hMq1nDlNM2LJ10s1+7HdzPGb420ihytp/q/xFVSN5gi8AAAAAAAAAAAAAAAABI3mCLwAAAAAB","base64"],"meta":{"err":null,"status":{"Ok":null},"fee":5000,"preBalances":[50000000000,9496057145,0,1,1,1141440,1392000,0,1141440,1141440],"postBalances":[49202914972,9496057330,797079843,1,1,1141440,1392000,0,1141440,1141440],"innerInstructions":[{"index":1,"instructions":[{"programIdIndex":3,"accounts":[0,2],"data":"3Bxs46norw8SWX6o","stackHeight":2},{"programIdIndex":8,"accounts":[0,7,6,3,1],"data":"5wPdbtbk7M4b3JSHrw1UWNYRXp6oKiNckurRXVYT11Hp865aVoqpKZT3qv2fvL","stackHeight":2},{"programIdIndex":3,"accounts":[0,1],"data":"3Bxs4XoPh3u5UtLF","stackHeight":3},{"programIdIndex":5,"accounts":[],"data":"1111AKhozcVbH5bJxRFBwEaHQ33nsRBUBxxh1RZsqrTEnQtCcp37bgbYhQS4VJ8xC7sQT5a9w1uQNjrhMNZLSv1zkS5Pd6i1Rpzb1cqPYB6eXoDhTfU67DsE6k311hPCAu34mwCpbScwzjJnovGJudFLWvYY7Dhht7KAhvmiS8n3XcYF7if7ukjctLoVWmxUhTrQVumcLyMj4guByPfmNxoLP5JYG4NQZkxsQyBtKBvZcuHBCfYwhcqPEiudH","stackHeight":2}]}],"logMessages":["Program ComputeBudget111111111111111111111111111111 invoke [1]","Program ComputeBudget111111111111111111111111111111 success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN invoke [1]","Program log: Instruction: Invoke","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK invoke [2]","Program log: Instruction: AppendLeavesToMerkleTrees","Program 11111111111111111111111111111111 invoke [3]","Program 11111111111111111111111111111111 success","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK consumed 42480 of 958930 compute units","Program CbjvJc1SNx1aav8tU49dJGHu8EUdzQJSMtkjDmV8miqK success","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV invoke [2]","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV consumed 38 of 914353 compute units","Program noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV success","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN consumed 85996 of 999850 compute units","Program H5sFv8VwWmjxHYS2GB4fTDsK7uTtnRT4WiixtHrET3bN success"],"preTokenBalances":[],"postTokenBalances":[],"rewards":[],"loadedAddresses":{"writable":[],"readonly":[]},"computeUnitsConsumed":86146},"version":"legacy","blockTime":1718661947} -------------------------------------------------------------------------------- /tests/integration_tests/main.rs: -------------------------------------------------------------------------------- 1 | // We move all tests into a single tests/integration_tests directory so that we have a single test 2 | // binary. This has a number of benefits: 3 | // 1. Faster compile time since we only have 1 binary. 4 | // 2. The ability to add global locks on the DB to prevent tests from interfering with each other. 5 | mod batched_address_tree_tests; 6 | mod batched_state_tree_tests; 7 | mod e2e_tests; 8 | mod mock_tests; 9 | mod open_api_tests; 10 | mod prod_tests; 11 | mod snapshot_tests; 12 | mod utils; 13 | -------------------------------------------------------------------------------- /tests/integration_tests/open_api_tests.rs: -------------------------------------------------------------------------------- 1 | use photon_indexer::openapi::update_docs; 2 | 3 | #[test] 4 | pub fn test_documentation_generation() { 5 | update_docs(true); 6 | } 7 | -------------------------------------------------------------------------------- /tests/integration_tests/prod_tests.rs: -------------------------------------------------------------------------------- 1 | use std::sync::Arc; 2 | 3 | use function_name::named; 4 | use insta::assert_json_snapshot; 5 | use photon_indexer::{ 6 | api::{ 7 | api::PhotonApi, 8 | method::{ 9 | get_compressed_accounts_by_owner::GetCompressedAccountsByOwnerRequest, 10 | get_multiple_new_address_proofs::{AddressListWithTrees, AddressWithTree}, 11 | }, 12 | }, 13 | common::{get_rpc_client, typedefs::serializable_pubkey::SerializablePubkey}, 14 | }; 15 | 16 | use crate::utils::*; 17 | use sea_orm::SqlxPostgresConnector; 18 | use serial_test::serial; 19 | 20 | #[tokio::test] 21 | #[serial] 22 | #[ignore] 23 | #[named] 24 | async fn test_incorrect_root_bug() { 25 | let name = trim_test_name(function_name!()); 26 | 27 | let readonly_devnet_db_url = std::env::var("READONLY_DEVNET_DB_URL").unwrap(); 28 | let pool = setup_pg_pool(readonly_devnet_db_url.to_string()).await; 29 | let devnet_db = Arc::new(SqlxPostgresConnector::from_sqlx_postgres_pool(pool)); 30 | let rpc_client = get_rpc_client("https://api.devnet.solana.com"); 31 | let prover_url = "http://localhost:3001"; 32 | let api = PhotonApi::new(devnet_db.clone(), rpc_client, prover_url.to_string()); 33 | 34 | let response = api 35 | .get_compressed_accounts_by_owner(GetCompressedAccountsByOwnerRequest { 36 | owner: SerializablePubkey::try_from("11111116EPqoQskEM2Pddp8KTL9JdYEBZMGF3aq7V") 37 | .unwrap(), 38 | ..Default::default() 39 | }) 40 | .await 41 | .unwrap(); 42 | 43 | assert_json_snapshot!(name, response); 44 | } 45 | 46 | #[tokio::test] 47 | #[serial] 48 | #[ignore] 49 | #[named] 50 | async fn test_mainnet_fra_invalid_address_tree_bug() { 51 | let name = trim_test_name(function_name!()); 52 | 53 | let readonly_devnet_db_url = std::env::var("READONLY_MAINNET_FRA_DB_URL").unwrap(); 54 | let pool = setup_pg_pool(readonly_devnet_db_url.to_string()).await; 55 | let devnet_db = Arc::new(SqlxPostgresConnector::from_sqlx_postgres_pool(pool)); 56 | let rpc_client = get_rpc_client("https://api.mainnet-beta.solana.com"); 57 | let prover_url = "http://localhost:3001"; 58 | let api = PhotonApi::new(devnet_db.clone(), rpc_client, prover_url.to_string()); 59 | 60 | let response = api 61 | .get_multiple_new_address_proofs_v2(AddressListWithTrees(vec![AddressWithTree { 62 | address: SerializablePubkey::try_from("13VVFAQtRomFvVHw3cgcse2BJWtLFpf1gCQDDCD5JjNV") 63 | .unwrap(), 64 | tree: SerializablePubkey::try_from("amt1Ayt45jfbdw5YSo7iz6WZxUmnZsQTYXy82hVwyC2") 65 | .unwrap(), 66 | }])) 67 | .await 68 | .unwrap(); 69 | 70 | assert_json_snapshot!(name, response); 71 | } 72 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__address_with_nullifiers-proof.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: proof 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": [ 10 | { 11 | "root": "3FrGzyXtjqjnukHDS2M5oyVj8tMVcHSahcHpWBGR5MHY", 12 | "address": "1111111ogCyDbaRMvkdsHB3qfdyFYaG1WtRUAfdh", 13 | "lowerRangeAddress": "11111111111111111111111111111111", 14 | "higherRangeAddress": "14uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofL", 15 | "nextIndex": 1, 16 | "proof": [ 17 | "34cMT7MjFrs8hLp2zHMrPJHKkUxBDBwBTNck77wLjjcY", 18 | "3CFKteYSRSkp9EGFPzibgzCPtNuJ5HeZ31fAsBpgcHwZ", 19 | "274k4KPY5VhmU5pCwwJzyHaY4AH4m7SjnZnyj44UitJc", 20 | "2gQksfK543Jw196amPxXWceFzNTfRHiqb7x2edvupftT", 21 | "Y8pRoGMGXJPGZyb7m4sqkPsTSJvzZ7oSVnaybCcYbgd", 22 | "3w895nemtSxb1fEjFT3cXkVpW3y6f9uHQn43jEwu1RWc", 23 | "46JM2e72mdEAxkSeXc65b3aLWkAQpX6NF7mdyuXQKguu", 24 | "WKLyYL7wpK5zVsWoMU2rcUiMwRWp9PowG83GHHH1dqn", 25 | "4CztDUcRvGkTyFoVEXXcBwd5UwqJcJJWpdL8FFERrqkU", 26 | "yjDkqNqZtBwpG7iUwT3hqKNKZAP9CcBDyBBuGPNk2jQ", 27 | "2r8qWibedWpM7QkW6QvDDUEQAHT9isX629UKcUxbY8BT", 28 | "38Aoz1ZUAnRqSCxdQuEkLhzYMRi1Tu1rSBy1UymA8yfK", 29 | "3zBeAgo5EwPrgsXRLUV6DhQrsUUhwbmQXPnZkudhsnSD", 30 | "2Q5cDvZW6hTxFFDTHhAf129PH4z8EZLYA1meeZpPW76F", 31 | "2gnsMw1zhpqGeAakoQLarCXVUaeEGDHm5uma1Jznx7qD", 32 | "3MXZLrn3tnLMWJznkMombRHkgkfsiBTPru2wjHDd3kLh", 33 | "3rrDm8iED4sDyonpLs9J3TDoTP8U4jsvXCmoupoCvvKc", 34 | "48YJtP1G5pKWu7Jy1NRagdj29dwxVXFsySrBVw1nALhX", 35 | "22tjwuiv6VgeMDs8qXpkZ7cY5rcgrFrG5knp7swZ1wQ2", 36 | "2dS4UCZ6RJvwPBaWmcz1L7ips34xnbNMfK9D8UHdFJfT", 37 | "3EdF4zvu7uwW7xYdnaKUPzqDY5Msq9FfWn6HgEnRTkDB", 38 | "2jzv6Z8vEXSYRXQCFnVYvzgJ2RfyDN1QEjdHm6CBvJUg", 39 | "2fomPS2xUPwXxVF8hx5YtMpBHmQKSZKushUiWYsy9Eqx", 40 | "3Pi3nRu4fWpnW5rYDAoraX1Q2xDCRQ24Dq8TEY7gaSBn", 41 | "3dbMMyehykAriNZ8FMJgPc1N6YSzm9ZfV2HcW9sbaXzP", 42 | "4EE5KQnQ6Tvo78gGhTu8serpJV4srbRhYZ3rdvCiRa5e" 43 | ], 44 | "merkleTree": "amt1Ayt45jfbdw5YSo7iz6WZxUmnZsQTYXy82hVwyC2", 45 | "rootSeq": 3, 46 | "lowElementLeafIndex": 0 47 | } 48 | ] 49 | } 50 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__address_with_nullifiers-transactions.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: transactions 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "items": [], 11 | "cursor": null 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer-bob-accounts.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: accounts 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "items": [ 11 | { 12 | "account": { 13 | "hash": "JsiSYnfKzmaxKvU8vhqsM6PiuPEFVVVwAsNcPUtDo64", 14 | "address": null, 15 | "data": { 16 | "discriminator": 2, 17 | "data": "mZ+QWZx25QI8+mR2PO/K59UvYAZyEm5LTp8RQyc3Tgizn5x1igWDRQ8GV4TnasAbxo+GF63laN1NEE4fJJzOXWQAAAAAAAAAAAA=", 18 | "dataHash": "39M1yYviEYm5FLVKZepwkKgsqMWRU6emaRzXBRV2fRUw" 19 | }, 20 | "owner": "HXVfQ44ATEi9WBKLSCCwM54KokdkzqXci9xCQ7ST9SYN", 21 | "lamports": 0, 22 | "tree": "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W", 23 | "leafIndex": 3, 24 | "seq": 4, 25 | "slotCreated": 0 26 | }, 27 | "tokenData": { 28 | "mint": "BLgVpQXRRmUGBMztr3M8mRkrNEtjBGbnrTrfBPLv2QJT", 29 | "owner": "D6B941apqSHVU5TV2n7JevkpAVQ4sdhiT6g1fNoEMfYG", 30 | "amount": 100, 31 | "delegate": null, 32 | "state": "initialized", 33 | "tlv": null 34 | } 35 | }, 36 | { 37 | "account": { 38 | "hash": "2hXgiYUBfsVEreTuq8PKumwE1dUkkeACw4HVf9ZZoi1H", 39 | "address": null, 40 | "data": { 41 | "discriminator": 2, 42 | "data": "mZ+QWZx25QI8+mR2PO/K59UvYAZyEm5LTp8RQyc3Tgizn5x1igWDRQ8GV4TnasAbxo+GF63laN1NEE4fJJzOXQUAAAAAAAAAAAA=", 43 | "dataHash": "2bsXN5efScCLjuTBbZVLhfYN9j93iyxRmKt5xy37vX59" 44 | }, 45 | "owner": "HXVfQ44ATEi9WBKLSCCwM54KokdkzqXci9xCQ7ST9SYN", 46 | "lamports": 0, 47 | "tree": "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W", 48 | "leafIndex": 6, 49 | "seq": 7, 50 | "slotCreated": 0 51 | }, 52 | "tokenData": { 53 | "mint": "BLgVpQXRRmUGBMztr3M8mRkrNEtjBGbnrTrfBPLv2QJT", 54 | "owner": "D6B941apqSHVU5TV2n7JevkpAVQ4sdhiT6g1fNoEMfYG", 55 | "amount": 5, 56 | "delegate": null, 57 | "state": "initialized", 58 | "tlv": null 59 | } 60 | } 61 | ], 62 | "cursor": null 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer-bob-token-balances.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: token_balances 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "token_balances": [ 11 | { 12 | "mint": "BLgVpQXRRmUGBMztr3M8mRkrNEtjBGbnrTrfBPLv2QJT", 13 | "balance": 105 14 | } 15 | ], 16 | "cursor": null 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer-bob-token-signatures.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: signatures 4 | --- 5 | [ 6 | { 7 | "signature": "5Ea6iQQZ1JYfiDq8H6qMKYdFcut1cUfd9pstCGc3BsQztTbgKA4LhsEx6XKQ1bMhKp5KMyyw5BuuooxEcpGLyHFB", 8 | "slot": 0, 9 | "blockTime": 0 10 | }, 11 | { 12 | "signature": "4uLjV2xNmD6LD76XeSfDZoqxnjfY7bzcnpj7cqG4ZDAhVKqtUbAxajuvs4qSdJxLxbxcAjStvUnY5DhhSPgKQFcB", 13 | "slot": 0, 14 | "blockTime": 0 15 | }, 16 | { 17 | "signature": "4Ld9WjbPxzhDsiTfiPfkw1v9xoAXwEUHWLxnKR9sazxRxWeGCeWHgQHpvABwssQUb8srwdFfgFF2sUxn8Toq8hCM", 18 | "slot": 0, 19 | "blockTime": 0 20 | }, 21 | { 22 | "signature": "41rBbMrNtZveMdPXPrHJLaoEzZ9WvJdgTbvcDhLM39THw7v51FjbCdUyWYFNswr1k3pRYbKvAcYb84bft2NbWgP2", 23 | "slot": 0, 24 | "blockTime": 0 25 | } 26 | ] 27 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer-bob-validity-proof.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: validity_proof 4 | --- 5 | { 6 | "compressedProof": { 7 | "a": [], 8 | "b": [], 9 | "c": [] 10 | }, 11 | "roots": [ 12 | "jQKhAHpGbSTJLimk3bGSX7KLi7CsX6nkosS9YeCFfVs", 13 | "jQKhAHpGbSTJLimk3bGSX7KLi7CsX6nkosS9YeCFfVs" 14 | ], 15 | "rootIndices": [ 16 | 7, 17 | 7 18 | ], 19 | "leafIndices": [ 20 | 3, 21 | 6 22 | ], 23 | "leaves": [ 24 | "JsiSYnfKzmaxKvU8vhqsM6PiuPEFVVVwAsNcPUtDo64", 25 | "2hXgiYUBfsVEreTuq8PKumwE1dUkkeACw4HVf9ZZoi1H" 26 | ], 27 | "merkleTrees": [ 28 | "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W", 29 | "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W" 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer-charles-accounts.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: accounts 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "items": [ 11 | { 12 | "account": { 13 | "hash": "2uSjtTXvYYb544CrvmDsTJ98M8qdw8SFmZ5muEHnZET9", 14 | "address": null, 15 | "data": { 16 | "discriminator": 2, 17 | "data": "mZ+QWZx25QI8+mR2PO/K59UvYAZyEm5LTp8RQyc3TghvA4wFBYfy+S6vuRGYhZoKRfM2I0qyJs/Bx0oqjwUjgLcCAAAAAAAAAAA=", 18 | "dataHash": "3j3Jh9Y9YRVGBT54pHS4wHo9BFwtDqWKNBEUDSQxhKGd" 19 | }, 20 | "owner": "HXVfQ44ATEi9WBKLSCCwM54KokdkzqXci9xCQ7ST9SYN", 21 | "lamports": 0, 22 | "tree": "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W", 23 | "leafIndex": 5, 24 | "seq": 6, 25 | "slotCreated": 0 26 | }, 27 | "tokenData": { 28 | "mint": "BLgVpQXRRmUGBMztr3M8mRkrNEtjBGbnrTrfBPLv2QJT", 29 | "owner": "8UMPheZvcShkq7DwPpJN5NusYDKTwfx9FVTyZXnVLSaj", 30 | "amount": 695, 31 | "delegate": null, 32 | "state": "initialized", 33 | "tlv": null 34 | } 35 | }, 36 | { 37 | "account": { 38 | "hash": "3a6Rs5JJ66YWEHuYm4KQuhbHAFnUszWiL8kgzV4MHFZW", 39 | "address": null, 40 | "data": { 41 | "discriminator": 2, 42 | "data": "mZ+QWZx25QI8+mR2PO/K59UvYAZyEm5LTp8RQyc3TghvA4wFBYfy+S6vuRGYhZoKRfM2I0qyJs/Bx0oqjwUjgMgAAAAAAAAAAAA=", 43 | "dataHash": "3yVUqfTXdEbx45RFgswxpKBEwqBtKK8qRUcs7XEvYVbm" 44 | }, 45 | "owner": "HXVfQ44ATEi9WBKLSCCwM54KokdkzqXci9xCQ7ST9SYN", 46 | "lamports": 0, 47 | "tree": "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W", 48 | "leafIndex": 4, 49 | "seq": 5, 50 | "slotCreated": 0 51 | }, 52 | "tokenData": { 53 | "mint": "BLgVpQXRRmUGBMztr3M8mRkrNEtjBGbnrTrfBPLv2QJT", 54 | "owner": "8UMPheZvcShkq7DwPpJN5NusYDKTwfx9FVTyZXnVLSaj", 55 | "amount": 200, 56 | "delegate": null, 57 | "state": "initialized", 58 | "tlv": null 59 | } 60 | } 61 | ], 62 | "cursor": null 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer-charles-token-balances.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: token_balances 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "token_balances": [ 11 | { 12 | "mint": "BLgVpQXRRmUGBMztr3M8mRkrNEtjBGbnrTrfBPLv2QJT", 13 | "balance": 895 14 | } 15 | ], 16 | "cursor": null 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer-charles-token-signatures.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: signatures 4 | --- 5 | [ 6 | { 7 | "signature": "5Ea6iQQZ1JYfiDq8H6qMKYdFcut1cUfd9pstCGc3BsQztTbgKA4LhsEx6XKQ1bMhKp5KMyyw5BuuooxEcpGLyHFB", 8 | "slot": 0, 9 | "blockTime": 0 10 | }, 11 | { 12 | "signature": "4Ld9WjbPxzhDsiTfiPfkw1v9xoAXwEUHWLxnKR9sazxRxWeGCeWHgQHpvABwssQUb8srwdFfgFF2sUxn8Toq8hCM", 13 | "slot": 0, 14 | "blockTime": 0 15 | }, 16 | { 17 | "signature": "41rBbMrNtZveMdPXPrHJLaoEzZ9WvJdgTbvcDhLM39THw7v51FjbCdUyWYFNswr1k3pRYbKvAcYb84bft2NbWgP2", 18 | "slot": 0, 19 | "blockTime": 0 20 | } 21 | ] 22 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer-charles-validity-proof.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: validity_proof 4 | --- 5 | { 6 | "compressedProof": { 7 | "a": [], 8 | "b": [], 9 | "c": [] 10 | }, 11 | "roots": [ 12 | "jQKhAHpGbSTJLimk3bGSX7KLi7CsX6nkosS9YeCFfVs", 13 | "jQKhAHpGbSTJLimk3bGSX7KLi7CsX6nkosS9YeCFfVs" 14 | ], 15 | "rootIndices": [ 16 | 7, 17 | 7 18 | ], 19 | "leafIndices": [ 20 | 5, 21 | 4 22 | ], 23 | "leaves": [ 24 | "2uSjtTXvYYb544CrvmDsTJ98M8qdw8SFmZ5muEHnZET9", 25 | "3a6Rs5JJ66YWEHuYm4KQuhbHAFnUszWiL8kgzV4MHFZW" 26 | ], 27 | "merkleTrees": [ 28 | "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W", 29 | "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W" 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer-latest-signatures.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: signatures 4 | --- 5 | [ 6 | { 7 | "signature": "5Ea6iQQZ1JYfiDq8H6qMKYdFcut1cUfd9pstCGc3BsQztTbgKA4LhsEx6XKQ1bMhKp5KMyyw5BuuooxEcpGLyHFB", 8 | "slot": 0, 9 | "blockTime": 0 10 | }, 11 | { 12 | "signature": "4uLjV2xNmD6LD76XeSfDZoqxnjfY7bzcnpj7cqG4ZDAhVKqtUbAxajuvs4qSdJxLxbxcAjStvUnY5DhhSPgKQFcB", 13 | "slot": 0, 14 | "blockTime": 0 15 | }, 16 | { 17 | "signature": "4Ld9WjbPxzhDsiTfiPfkw1v9xoAXwEUHWLxnKR9sazxRxWeGCeWHgQHpvABwssQUb8srwdFfgFF2sUxn8Toq8hCM", 18 | "slot": 0, 19 | "blockTime": 0 20 | }, 21 | { 22 | "signature": "41rBbMrNtZveMdPXPrHJLaoEzZ9WvJdgTbvcDhLM39THw7v51FjbCdUyWYFNswr1k3pRYbKvAcYb84bft2NbWgP2", 23 | "slot": 0, 24 | "blockTime": 0 25 | } 26 | ] 27 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-bob-accounts.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: accounts 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "items": [], 11 | "cursor": null 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-bob-token-balances.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: token_balances 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "token_balances": [ 11 | { 12 | "mint": "BLgVpQXRRmUGBMztr3M8mRkrNEtjBGbnrTrfBPLv2QJT", 13 | "balance": 105 14 | } 15 | ], 16 | "cursor": null 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-bob-token-signatures.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: signatures 4 | --- 5 | [ 6 | { 7 | "signature": "5Ea6iQQZ1JYfiDq8H6qMKYdFcut1cUfd9pstCGc3BsQztTbgKA4LhsEx6XKQ1bMhKp5KMyyw5BuuooxEcpGLyHFB", 8 | "slot": 0, 9 | "blockTime": 0 10 | }, 11 | { 12 | "signature": "4uLjV2xNmD6LD76XeSfDZoqxnjfY7bzcnpj7cqG4ZDAhVKqtUbAxajuvs4qSdJxLxbxcAjStvUnY5DhhSPgKQFcB", 13 | "slot": 0, 14 | "blockTime": 0 15 | }, 16 | { 17 | "signature": "4Ld9WjbPxzhDsiTfiPfkw1v9xoAXwEUHWLxnKR9sazxRxWeGCeWHgQHpvABwssQUb8srwdFfgFF2sUxn8Toq8hCM", 18 | "slot": 0, 19 | "blockTime": 0 20 | }, 21 | { 22 | "signature": "41rBbMrNtZveMdPXPrHJLaoEzZ9WvJdgTbvcDhLM39THw7v51FjbCdUyWYFNswr1k3pRYbKvAcYb84bft2NbWgP2", 23 | "slot": 0, 24 | "blockTime": 0 25 | } 26 | ] 27 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-bob-validity-proof.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: validity_proof 4 | --- 5 | { 6 | "value": { 7 | "compressedProof": { 8 | "a": [], 9 | "b": [], 10 | "c": [] 11 | }, 12 | "roots": [ 13 | "jQKhAHpGbSTJLimk3bGSX7KLi7CsX6nkosS9YeCFfVs", 14 | "jQKhAHpGbSTJLimk3bGSX7KLi7CsX6nkosS9YeCFfVs" 15 | ], 16 | "rootIndices": [ 17 | 7, 18 | 7 19 | ], 20 | "leafIndices": [ 21 | 3, 22 | 6 23 | ], 24 | "leaves": [ 25 | "JsiSYnfKzmaxKvU8vhqsM6PiuPEFVVVwAsNcPUtDo64", 26 | "2hXgiYUBfsVEreTuq8PKumwE1dUkkeACw4HVf9ZZoi1H" 27 | ], 28 | "merkleTrees": [ 29 | "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W", 30 | "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W" 31 | ] 32 | }, 33 | "context": { 34 | "slot": 0 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-charles-accounts.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: accounts 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "items": [ 11 | { 12 | "account": { 13 | "hash": "2uSjtTXvYYb544CrvmDsTJ98M8qdw8SFmZ5muEHnZET9", 14 | "address": null, 15 | "data": { 16 | "discriminator": 2, 17 | "data": "mZ+QWZx25QI8+mR2PO/K59UvYAZyEm5LTp8RQyc3TghvA4wFBYfy+S6vuRGYhZoKRfM2I0qyJs/Bx0oqjwUjgLcCAAAAAAAAAAA=", 18 | "dataHash": "3j3Jh9Y9YRVGBT54pHS4wHo9BFwtDqWKNBEUDSQxhKGd" 19 | }, 20 | "owner": "HXVfQ44ATEi9WBKLSCCwM54KokdkzqXci9xCQ7ST9SYN", 21 | "lamports": 0, 22 | "tree": "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W", 23 | "leafIndex": 5, 24 | "seq": 6, 25 | "slotCreated": 0 26 | }, 27 | "tokenData": { 28 | "mint": "BLgVpQXRRmUGBMztr3M8mRkrNEtjBGbnrTrfBPLv2QJT", 29 | "owner": "8UMPheZvcShkq7DwPpJN5NusYDKTwfx9FVTyZXnVLSaj", 30 | "amount": 695, 31 | "delegate": null, 32 | "state": "initialized", 33 | "tlv": null 34 | } 35 | }, 36 | { 37 | "account": { 38 | "hash": "3a6Rs5JJ66YWEHuYm4KQuhbHAFnUszWiL8kgzV4MHFZW", 39 | "address": null, 40 | "data": { 41 | "discriminator": 2, 42 | "data": "mZ+QWZx25QI8+mR2PO/K59UvYAZyEm5LTp8RQyc3TghvA4wFBYfy+S6vuRGYhZoKRfM2I0qyJs/Bx0oqjwUjgMgAAAAAAAAAAAA=", 43 | "dataHash": "3yVUqfTXdEbx45RFgswxpKBEwqBtKK8qRUcs7XEvYVbm" 44 | }, 45 | "owner": "HXVfQ44ATEi9WBKLSCCwM54KokdkzqXci9xCQ7ST9SYN", 46 | "lamports": 0, 47 | "tree": "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W", 48 | "leafIndex": 4, 49 | "seq": 5, 50 | "slotCreated": 0 51 | }, 52 | "tokenData": { 53 | "mint": "BLgVpQXRRmUGBMztr3M8mRkrNEtjBGbnrTrfBPLv2QJT", 54 | "owner": "8UMPheZvcShkq7DwPpJN5NusYDKTwfx9FVTyZXnVLSaj", 55 | "amount": 200, 56 | "delegate": null, 57 | "state": "initialized", 58 | "tlv": null 59 | } 60 | } 61 | ], 62 | "cursor": null 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-charles-token-balances.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: token_balances 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "token_balances": [ 11 | { 12 | "mint": "BLgVpQXRRmUGBMztr3M8mRkrNEtjBGbnrTrfBPLv2QJT", 13 | "balance": 895 14 | } 15 | ], 16 | "cursor": null 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-charles-token-signatures.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: signatures 4 | --- 5 | [ 6 | { 7 | "signature": "5Ea6iQQZ1JYfiDq8H6qMKYdFcut1cUfd9pstCGc3BsQztTbgKA4LhsEx6XKQ1bMhKp5KMyyw5BuuooxEcpGLyHFB", 8 | "slot": 0, 9 | "blockTime": 0 10 | }, 11 | { 12 | "signature": "4Ld9WjbPxzhDsiTfiPfkw1v9xoAXwEUHWLxnKR9sazxRxWeGCeWHgQHpvABwssQUb8srwdFfgFF2sUxn8Toq8hCM", 13 | "slot": 0, 14 | "blockTime": 0 15 | }, 16 | { 17 | "signature": "41rBbMrNtZveMdPXPrHJLaoEzZ9WvJdgTbvcDhLM39THw7v51FjbCdUyWYFNswr1k3pRYbKvAcYb84bft2NbWgP2", 18 | "slot": 0, 19 | "blockTime": 0 20 | } 21 | ] 22 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-charles-validity-proof.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: validity_proof 4 | --- 5 | { 6 | "value": { 7 | "compressedProof": { 8 | "a": [], 9 | "b": [], 10 | "c": [] 11 | }, 12 | "roots": [ 13 | "jQKhAHpGbSTJLimk3bGSX7KLi7CsX6nkosS9YeCFfVs", 14 | "jQKhAHpGbSTJLimk3bGSX7KLi7CsX6nkosS9YeCFfVs" 15 | ], 16 | "rootIndices": [ 17 | 7, 18 | 7 19 | ], 20 | "leafIndices": [ 21 | 5, 22 | 4 23 | ], 24 | "leaves": [ 25 | "2uSjtTXvYYb544CrvmDsTJ98M8qdw8SFmZ5muEHnZET9", 26 | "3a6Rs5JJ66YWEHuYm4KQuhbHAFnUszWiL8kgzV4MHFZW" 27 | ], 28 | "merkleTrees": [ 29 | "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W", 30 | "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W" 31 | ] 32 | }, 33 | "context": { 34 | "slot": 0 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_legacy_transactions-latest-signatures.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: signatures 4 | --- 5 | [ 6 | { 7 | "signature": "5Ea6iQQZ1JYfiDq8H6qMKYdFcut1cUfd9pstCGc3BsQztTbgKA4LhsEx6XKQ1bMhKp5KMyyw5BuuooxEcpGLyHFB", 8 | "slot": 0, 9 | "blockTime": 0 10 | }, 11 | { 12 | "signature": "4uLjV2xNmD6LD76XeSfDZoqxnjfY7bzcnpj7cqG4ZDAhVKqtUbAxajuvs4qSdJxLxbxcAjStvUnY5DhhSPgKQFcB", 13 | "slot": 0, 14 | "blockTime": 0 15 | }, 16 | { 17 | "signature": "4Ld9WjbPxzhDsiTfiPfkw1v9xoAXwEUHWLxnKR9sazxRxWeGCeWHgQHpvABwssQUb8srwdFfgFF2sUxn8Toq8hCM", 18 | "slot": 0, 19 | "blockTime": 0 20 | }, 21 | { 22 | "signature": "41rBbMrNtZveMdPXPrHJLaoEzZ9WvJdgTbvcDhLM39THw7v51FjbCdUyWYFNswr1k3pRYbKvAcYb84bft2NbWgP2", 23 | "slot": 0, 24 | "blockTime": 0 25 | } 26 | ] 27 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-bob-accounts.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: accounts 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "items": [], 11 | "cursor": null 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-bob-token-balances.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: token_balances 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "token_balances": [ 11 | { 12 | "mint": "FeynqjiR2HGyqQX6ouv5jrRnGxEFYHHRvvnwGQ2HpfSX", 13 | "balance": 105 14 | } 15 | ], 16 | "cursor": null 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-bob-token-signatures.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: signatures 4 | --- 5 | [ 6 | { 7 | "signature": "5MqYh45rQf1x8D1EpeiWh4XXM7WBeDsE3MCpqvstTaCMQVBXuk3wMiUoQGY9Y2t83oGhBKoFG8zWUFoHpEB77C1g", 8 | "slot": 0, 9 | "blockTime": 0 10 | }, 11 | { 12 | "signature": "3xB9XfSrNHov4FDtgQdJMZtKvbDcqvhkpyXN72ZurXvRTKbGXpw4XbUGAnbtCuNiHixf7qoSDQskTcXdA6n412yW", 13 | "slot": 0, 14 | "blockTime": 0 15 | }, 16 | { 17 | "signature": "2M63FRn8tYUCDxuxo4fJLkwQfu7FQp5RecNVPK42TMdAbq45BiWjuz1P9nNy6uRrcMpXph63eAUW71GzQE1HmEGs", 18 | "slot": 0, 19 | "blockTime": 0 20 | }, 21 | { 22 | "signature": "P3NmVFAosVot31wa7oyJ3e4s4zFPeUwGnm6HhFmPukjXQ14xUQvrxJSuEy2VS8gutuejoRFzPPoga3ZeBRxDJFa", 23 | "slot": 0, 24 | "blockTime": 0 25 | } 26 | ] 27 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-bob-validity-proof.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: validity_proof 4 | --- 5 | { 6 | "value": { 7 | "compressedProof": { 8 | "a": [], 9 | "b": [], 10 | "c": [] 11 | }, 12 | "roots": [ 13 | "ZMg67iuQAyRUALR4TmAMyWGVEXV2e8yCpRSqdnR8Y1n", 14 | "ZMg67iuQAyRUALR4TmAMyWGVEXV2e8yCpRSqdnR8Y1n" 15 | ], 16 | "rootIndices": [ 17 | 7, 18 | 7 19 | ], 20 | "leafIndices": [ 21 | 6, 22 | 3 23 | ], 24 | "leaves": [ 25 | "2WfNf8qZoMNGR4mAPX8toADTdRpcKYTX1KUUAEHMi7dJ", 26 | "36ewgEJTqSu4enYGWUcxm4CYezR3kgfHBeV29WiEgKaY" 27 | ], 28 | "merkleTrees": [ 29 | "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W", 30 | "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W" 31 | ] 32 | }, 33 | "context": { 34 | "slot": 0 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-charles-accounts.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: accounts 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "items": [ 11 | { 12 | "account": { 13 | "hash": "21a33JmBirKxeMq88LfBKfZy5VM5Gb8Jf2H6RV4zN7Xy", 14 | "address": null, 15 | "data": { 16 | "discriminator": 2, 17 | "data": "2b5R6MH0bIdXCz0nKe2kPJpKHK5c9CbvbTEjJbkj/lg/d0l2Se25bBAx93z7Rez3HcuQM54KQcR17MLzBpll5sgAAAAAAAAAAAAA", 18 | "dataHash": "44ngMxchW1yH2PEwQoMiH9qNDZsiDjiw5o8PbwmCM7bo" 19 | }, 20 | "owner": "HXVfQ44ATEi9WBKLSCCwM54KokdkzqXci9xCQ7ST9SYN", 21 | "lamports": 0, 22 | "tree": "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W", 23 | "leafIndex": 4, 24 | "seq": 5, 25 | "slotCreated": 0 26 | }, 27 | "tokenData": { 28 | "mint": "FeynqjiR2HGyqQX6ouv5jrRnGxEFYHHRvvnwGQ2HpfSX", 29 | "owner": "5GkBcTAGLJ2nU7WEbaecndeV5HXzp8LicqkGf6DKKR97", 30 | "amount": 200, 31 | "delegate": null, 32 | "state": "initialized", 33 | "tlv": null 34 | } 35 | }, 36 | { 37 | "account": { 38 | "hash": "3gX31m9xhLEs2r4DR1f1gePqJyUEA3Qk38WLiYbGkonm", 39 | "address": null, 40 | "data": { 41 | "discriminator": 2, 42 | "data": "2b5R6MH0bIdXCz0nKe2kPJpKHK5c9CbvbTEjJbkj/lg/d0l2Se25bBAx93z7Rez3HcuQM54KQcR17MLzBpll5rcCAAAAAAAAAAAA", 43 | "dataHash": "2zF7zfkSL95uwUk3r2LPoTbid1LVBGoNNvZBMEBi1XCC" 44 | }, 45 | "owner": "HXVfQ44ATEi9WBKLSCCwM54KokdkzqXci9xCQ7ST9SYN", 46 | "lamports": 0, 47 | "tree": "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W", 48 | "leafIndex": 5, 49 | "seq": 6, 50 | "slotCreated": 0 51 | }, 52 | "tokenData": { 53 | "mint": "FeynqjiR2HGyqQX6ouv5jrRnGxEFYHHRvvnwGQ2HpfSX", 54 | "owner": "5GkBcTAGLJ2nU7WEbaecndeV5HXzp8LicqkGf6DKKR97", 55 | "amount": 695, 56 | "delegate": null, 57 | "state": "initialized", 58 | "tlv": null 59 | } 60 | } 61 | ], 62 | "cursor": null 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-charles-token-balances.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: token_balances 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "token_balances": [ 11 | { 12 | "mint": "FeynqjiR2HGyqQX6ouv5jrRnGxEFYHHRvvnwGQ2HpfSX", 13 | "balance": 895 14 | } 15 | ], 16 | "cursor": null 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-charles-token-signatures.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: signatures 4 | --- 5 | [ 6 | { 7 | "signature": "5MqYh45rQf1x8D1EpeiWh4XXM7WBeDsE3MCpqvstTaCMQVBXuk3wMiUoQGY9Y2t83oGhBKoFG8zWUFoHpEB77C1g", 8 | "slot": 0, 9 | "blockTime": 0 10 | }, 11 | { 12 | "signature": "3xB9XfSrNHov4FDtgQdJMZtKvbDcqvhkpyXN72ZurXvRTKbGXpw4XbUGAnbtCuNiHixf7qoSDQskTcXdA6n412yW", 13 | "slot": 0, 14 | "blockTime": 0 15 | }, 16 | { 17 | "signature": "P3NmVFAosVot31wa7oyJ3e4s4zFPeUwGnm6HhFmPukjXQ14xUQvrxJSuEy2VS8gutuejoRFzPPoga3ZeBRxDJFa", 18 | "slot": 0, 19 | "blockTime": 0 20 | } 21 | ] 22 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-charles-validity-proof.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: validity_proof 4 | --- 5 | { 6 | "value": { 7 | "compressedProof": { 8 | "a": [], 9 | "b": [], 10 | "c": [] 11 | }, 12 | "roots": [ 13 | "ZMg67iuQAyRUALR4TmAMyWGVEXV2e8yCpRSqdnR8Y1n", 14 | "ZMg67iuQAyRUALR4TmAMyWGVEXV2e8yCpRSqdnR8Y1n" 15 | ], 16 | "rootIndices": [ 17 | 7, 18 | 7 19 | ], 20 | "leafIndices": [ 21 | 4, 22 | 5 23 | ], 24 | "leaves": [ 25 | "21a33JmBirKxeMq88LfBKfZy5VM5Gb8Jf2H6RV4zN7Xy", 26 | "3gX31m9xhLEs2r4DR1f1gePqJyUEA3Qk38WLiYbGkonm" 27 | ], 28 | "merkleTrees": [ 29 | "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W", 30 | "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W" 31 | ] 32 | }, 33 | "context": { 34 | "slot": 0 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_new_transactions-latest-signatures.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: signatures 4 | --- 5 | [ 6 | { 7 | "signature": "5MqYh45rQf1x8D1EpeiWh4XXM7WBeDsE3MCpqvstTaCMQVBXuk3wMiUoQGY9Y2t83oGhBKoFG8zWUFoHpEB77C1g", 8 | "slot": 0, 9 | "blockTime": 0 10 | }, 11 | { 12 | "signature": "3xB9XfSrNHov4FDtgQdJMZtKvbDcqvhkpyXN72ZurXvRTKbGXpw4XbUGAnbtCuNiHixf7qoSDQskTcXdA6n412yW", 13 | "slot": 0, 14 | "blockTime": 0 15 | }, 16 | { 17 | "signature": "2M63FRn8tYUCDxuxo4fJLkwQfu7FQp5RecNVPK42TMdAbq45BiWjuz1P9nNy6uRrcMpXph63eAUW71GzQE1HmEGs", 18 | "slot": 0, 19 | "blockTime": 0 20 | }, 21 | { 22 | "signature": "P3NmVFAosVot31wa7oyJ3e4s4zFPeUwGnm6HhFmPukjXQ14xUQvrxJSuEy2VS8gutuejoRFzPPoga3ZeBRxDJFa", 23 | "slot": 0, 24 | "blockTime": 0 25 | } 26 | ] 27 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-bob-accounts-v2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | assertion_line: 165 4 | expression: accounts_v2 5 | --- 6 | { 7 | "context": { 8 | "slot": 0 9 | }, 10 | "value": { 11 | "items": [ 12 | { 13 | "account": { 14 | "hash": "JReC6h68m3EdCKP7S35e7BE4pBPwQz1HfjUkboeQy9r", 15 | "address": null, 16 | "data": { 17 | "discriminator": 2, 18 | "data": "Fci4U9QOCVoeSJNu52uQTHTZkN+jGh5G5VqySLzUdo/IF0SuAAU/8W2JwQ9eoK7yn7i6O/dx7aXfmnaBmwIYnAUAAAAAAAAAAAAA", 19 | "dataHash": "4C8Wy6GxRZhiUfR6aSDejhYhnyixhtsNUFbKdPCUcNoq" 20 | }, 21 | "owner": "cTokenmWW8bLPjZEBAUgYy3zKxQZW6VKi7bqNFEVv3m", 22 | "lamports": 0, 23 | "leafIndex": 6, 24 | "seq": 7, 25 | "slotCreated": 0, 26 | "proveByIndex": false, 27 | "merkleContext": { 28 | "treeType": 1, 29 | "tree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 30 | "queue": "nfq1NvQDJ2GEgnS8zt9prAe8rjjpAW1zFkrvZoBR148", 31 | "cpiContext": null, 32 | "nextTreeContext": null 33 | } 34 | }, 35 | "tokenData": { 36 | "mint": "2U35cKS3Cj2xs5EBdByXYU7LaKAitqjSZc1Jnvu4iPf4", 37 | "owner": "EU57rQxcmFhJ24ApVdUy3y4MxFXcTUN3uiVeWvGgtWXu", 38 | "amount": 5, 39 | "delegate": null, 40 | "state": "initialized", 41 | "tlv": null 42 | } 43 | }, 44 | { 45 | "account": { 46 | "hash": "2R46QL8CSripTWvEsESL39ccripkjs9MjGtwnbJMzJET", 47 | "address": null, 48 | "data": { 49 | "discriminator": 2, 50 | "data": "Fci4U9QOCVoeSJNu52uQTHTZkN+jGh5G5VqySLzUdo/IF0SuAAU/8W2JwQ9eoK7yn7i6O/dx7aXfmnaBmwIYnGQAAAAAAAAAAAAA", 51 | "dataHash": "RP7MSHC1TfribGPwba1Cs8LZYLhNNfiAeTxmcGQ5Cpk" 52 | }, 53 | "owner": "cTokenmWW8bLPjZEBAUgYy3zKxQZW6VKi7bqNFEVv3m", 54 | "lamports": 0, 55 | "leafIndex": 3, 56 | "seq": 4, 57 | "slotCreated": 0, 58 | "proveByIndex": false, 59 | "merkleContext": { 60 | "treeType": 1, 61 | "tree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 62 | "queue": "nfq1NvQDJ2GEgnS8zt9prAe8rjjpAW1zFkrvZoBR148", 63 | "cpiContext": null, 64 | "nextTreeContext": null 65 | } 66 | }, 67 | "tokenData": { 68 | "mint": "2U35cKS3Cj2xs5EBdByXYU7LaKAitqjSZc1Jnvu4iPf4", 69 | "owner": "EU57rQxcmFhJ24ApVdUy3y4MxFXcTUN3uiVeWvGgtWXu", 70 | "amount": 100, 71 | "delegate": null, 72 | "state": "initialized", 73 | "tlv": null 74 | } 75 | } 76 | ], 77 | "cursor": null 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-bob-accounts.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: accounts 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "items": [ 11 | { 12 | "account": { 13 | "hash": "JReC6h68m3EdCKP7S35e7BE4pBPwQz1HfjUkboeQy9r", 14 | "address": null, 15 | "data": { 16 | "discriminator": 2, 17 | "data": "Fci4U9QOCVoeSJNu52uQTHTZkN+jGh5G5VqySLzUdo/IF0SuAAU/8W2JwQ9eoK7yn7i6O/dx7aXfmnaBmwIYnAUAAAAAAAAAAAAA", 18 | "dataHash": "4C8Wy6GxRZhiUfR6aSDejhYhnyixhtsNUFbKdPCUcNoq" 19 | }, 20 | "owner": "cTokenmWW8bLPjZEBAUgYy3zKxQZW6VKi7bqNFEVv3m", 21 | "lamports": 0, 22 | "tree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 23 | "leafIndex": 6, 24 | "seq": 7, 25 | "slotCreated": 0 26 | }, 27 | "tokenData": { 28 | "mint": "2U35cKS3Cj2xs5EBdByXYU7LaKAitqjSZc1Jnvu4iPf4", 29 | "owner": "EU57rQxcmFhJ24ApVdUy3y4MxFXcTUN3uiVeWvGgtWXu", 30 | "amount": 5, 31 | "delegate": null, 32 | "state": "initialized", 33 | "tlv": null 34 | } 35 | }, 36 | { 37 | "account": { 38 | "hash": "2R46QL8CSripTWvEsESL39ccripkjs9MjGtwnbJMzJET", 39 | "address": null, 40 | "data": { 41 | "discriminator": 2, 42 | "data": "Fci4U9QOCVoeSJNu52uQTHTZkN+jGh5G5VqySLzUdo/IF0SuAAU/8W2JwQ9eoK7yn7i6O/dx7aXfmnaBmwIYnGQAAAAAAAAAAAAA", 43 | "dataHash": "RP7MSHC1TfribGPwba1Cs8LZYLhNNfiAeTxmcGQ5Cpk" 44 | }, 45 | "owner": "cTokenmWW8bLPjZEBAUgYy3zKxQZW6VKi7bqNFEVv3m", 46 | "lamports": 0, 47 | "tree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 48 | "leafIndex": 3, 49 | "seq": 4, 50 | "slotCreated": 0 51 | }, 52 | "tokenData": { 53 | "mint": "2U35cKS3Cj2xs5EBdByXYU7LaKAitqjSZc1Jnvu4iPf4", 54 | "owner": "EU57rQxcmFhJ24ApVdUy3y4MxFXcTUN3uiVeWvGgtWXu", 55 | "amount": 100, 56 | "delegate": null, 57 | "state": "initialized", 58 | "tlv": null 59 | } 60 | } 61 | ], 62 | "cursor": null 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-bob-token-balances.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: token_balances 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "token_balances": [ 11 | { 12 | "mint": "2U35cKS3Cj2xs5EBdByXYU7LaKAitqjSZc1Jnvu4iPf4", 13 | "balance": 105 14 | } 15 | ], 16 | "cursor": null 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-bob-token-signatures.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: signatures 4 | --- 5 | [ 6 | { 7 | "signature": "64jFxW4xxife8UqpEQyYdA589rzFKWx8rT4vun6soCpWXmDermr588UKX2261YYZ8ZSzcu2NUJY2aCfee64FvTW4", 8 | "slot": 0, 9 | "blockTime": 0 10 | }, 11 | { 12 | "signature": "5oTNJvc5WWJacEdpZLimVjGu1uGkXoMth8dNKaAymVKA7arwhccxeJPRWDuYEvQHNkGnkRNJcwUbtV4KnwebCKj5", 13 | "slot": 0, 14 | "blockTime": 0 15 | }, 16 | { 17 | "signature": "5UZuijpSnqBpgMpqnggxZ58bzZ8aJtqqVjtvzx2Pg2C58jXph1rdrXyHdTxJfsHawNJyr8syU4U1MEYccDUQeTSV", 18 | "slot": 0, 19 | "blockTime": 0 20 | }, 21 | { 22 | "signature": "2J9pSeLvXnyawUPKdks98ZibQWU8v38AEhmZp9g9P3WzY9dJSMQ3RmoUaGN1zVCF3tTQy6q2YbD94jq8uzSZsay7", 23 | "slot": 0, 24 | "blockTime": 0 25 | } 26 | ] 27 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-bob-validity-proof-v2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | assertion_line: 212 4 | expression: validity_proof_v2 5 | --- 6 | { 7 | "value": { 8 | "compressedProof": { 9 | "a": [], 10 | "b": [], 11 | "c": [] 12 | }, 13 | "accounts": [ 14 | { 15 | "hash": "JReC6h68m3EdCKP7S35e7BE4pBPwQz1HfjUkboeQy9r", 16 | "root": "2wBDKLscN4SBNzNdVsHq17PVXycvM8n4LNiKzJrebqZ7", 17 | "rootIndex": { 18 | "rootIndex": 7, 19 | "proveByIndex": false 20 | }, 21 | "leafIndex": 6, 22 | "merkleContext": { 23 | "treeType": 1, 24 | "tree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 25 | "queue": "nfq1NvQDJ2GEgnS8zt9prAe8rjjpAW1zFkrvZoBR148", 26 | "cpiContext": null, 27 | "nextTreeContext": null 28 | } 29 | }, 30 | { 31 | "hash": "2R46QL8CSripTWvEsESL39ccripkjs9MjGtwnbJMzJET", 32 | "root": "2wBDKLscN4SBNzNdVsHq17PVXycvM8n4LNiKzJrebqZ7", 33 | "rootIndex": { 34 | "rootIndex": 7, 35 | "proveByIndex": false 36 | }, 37 | "leafIndex": 3, 38 | "merkleContext": { 39 | "treeType": 1, 40 | "tree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 41 | "queue": "nfq1NvQDJ2GEgnS8zt9prAe8rjjpAW1zFkrvZoBR148", 42 | "cpiContext": null, 43 | "nextTreeContext": null 44 | } 45 | } 46 | ], 47 | "addresses": [] 48 | }, 49 | "context": { 50 | "slot": 0 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-bob-validity-proof.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: validity_proof 4 | --- 5 | { 6 | "value": { 7 | "compressedProof": { 8 | "a": [], 9 | "b": [], 10 | "c": [] 11 | }, 12 | "roots": [ 13 | "2wBDKLscN4SBNzNdVsHq17PVXycvM8n4LNiKzJrebqZ7", 14 | "2wBDKLscN4SBNzNdVsHq17PVXycvM8n4LNiKzJrebqZ7" 15 | ], 16 | "rootIndices": [ 17 | 7, 18 | 7 19 | ], 20 | "leafIndices": [ 21 | 6, 22 | 3 23 | ], 24 | "leaves": [ 25 | "JReC6h68m3EdCKP7S35e7BE4pBPwQz1HfjUkboeQy9r", 26 | "2R46QL8CSripTWvEsESL39ccripkjs9MjGtwnbJMzJET" 27 | ], 28 | "merkleTrees": [ 29 | "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 30 | "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT" 31 | ] 32 | }, 33 | "context": { 34 | "slot": 0 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-charles-accounts-v2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | assertion_line: 165 4 | expression: accounts_v2 5 | --- 6 | { 7 | "context": { 8 | "slot": 0 9 | }, 10 | "value": { 11 | "items": [ 12 | { 13 | "account": { 14 | "hash": "2TxrLe9HDTRDpVXmbkXUgXNksCZ7RdU4Tc2Ea1B8ADs2", 15 | "address": null, 16 | "data": { 17 | "discriminator": 2, 18 | "data": "Fci4U9QOCVoeSJNu52uQTHTZkN+jGh5G5VqySLzUdo+nxtjG3Di8aQSbzY12Qevlz6m4DW8xABfetteH8ywAxsgAAAAAAAAAAAAA", 19 | "dataHash": "3mCzppQKSYcGTuLb4VPKnMohtVkoEnsFYK7yYB5Rf1Pg" 20 | }, 21 | "owner": "cTokenmWW8bLPjZEBAUgYy3zKxQZW6VKi7bqNFEVv3m", 22 | "lamports": 0, 23 | "leafIndex": 4, 24 | "seq": 5, 25 | "slotCreated": 0, 26 | "proveByIndex": false, 27 | "merkleContext": { 28 | "treeType": 1, 29 | "tree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 30 | "queue": "nfq1NvQDJ2GEgnS8zt9prAe8rjjpAW1zFkrvZoBR148", 31 | "cpiContext": null, 32 | "nextTreeContext": null 33 | } 34 | }, 35 | "tokenData": { 36 | "mint": "2U35cKS3Cj2xs5EBdByXYU7LaKAitqjSZc1Jnvu4iPf4", 37 | "owner": "CHvwuTvTiwRSNBwAnrCG14V8YTJ6wwhHQrifxdFzHzsX", 38 | "amount": 200, 39 | "delegate": null, 40 | "state": "initialized", 41 | "tlv": null 42 | } 43 | }, 44 | { 45 | "account": { 46 | "hash": "2o5puhnQbtqyyrcZrsow4DSs6kafmyUTYmgdwXfMMehS", 47 | "address": null, 48 | "data": { 49 | "discriminator": 2, 50 | "data": "Fci4U9QOCVoeSJNu52uQTHTZkN+jGh5G5VqySLzUdo+nxtjG3Di8aQSbzY12Qevlz6m4DW8xABfetteH8ywAxrcCAAAAAAAAAAAA", 51 | "dataHash": "2CHL3b2vQV4xoxMmwxHn3jYYBKNafmpmEWsAHNmFp6iP" 52 | }, 53 | "owner": "cTokenmWW8bLPjZEBAUgYy3zKxQZW6VKi7bqNFEVv3m", 54 | "lamports": 0, 55 | "leafIndex": 5, 56 | "seq": 6, 57 | "slotCreated": 0, 58 | "proveByIndex": false, 59 | "merkleContext": { 60 | "treeType": 1, 61 | "tree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 62 | "queue": "nfq1NvQDJ2GEgnS8zt9prAe8rjjpAW1zFkrvZoBR148", 63 | "cpiContext": null, 64 | "nextTreeContext": null 65 | } 66 | }, 67 | "tokenData": { 68 | "mint": "2U35cKS3Cj2xs5EBdByXYU7LaKAitqjSZc1Jnvu4iPf4", 69 | "owner": "CHvwuTvTiwRSNBwAnrCG14V8YTJ6wwhHQrifxdFzHzsX", 70 | "amount": 695, 71 | "delegate": null, 72 | "state": "initialized", 73 | "tlv": null 74 | } 75 | } 76 | ], 77 | "cursor": null 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-charles-accounts.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: accounts 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "items": [ 11 | { 12 | "account": { 13 | "hash": "2TxrLe9HDTRDpVXmbkXUgXNksCZ7RdU4Tc2Ea1B8ADs2", 14 | "address": null, 15 | "data": { 16 | "discriminator": 2, 17 | "data": "Fci4U9QOCVoeSJNu52uQTHTZkN+jGh5G5VqySLzUdo+nxtjG3Di8aQSbzY12Qevlz6m4DW8xABfetteH8ywAxsgAAAAAAAAAAAAA", 18 | "dataHash": "3mCzppQKSYcGTuLb4VPKnMohtVkoEnsFYK7yYB5Rf1Pg" 19 | }, 20 | "owner": "cTokenmWW8bLPjZEBAUgYy3zKxQZW6VKi7bqNFEVv3m", 21 | "lamports": 0, 22 | "tree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 23 | "leafIndex": 4, 24 | "seq": 5, 25 | "slotCreated": 0 26 | }, 27 | "tokenData": { 28 | "mint": "2U35cKS3Cj2xs5EBdByXYU7LaKAitqjSZc1Jnvu4iPf4", 29 | "owner": "CHvwuTvTiwRSNBwAnrCG14V8YTJ6wwhHQrifxdFzHzsX", 30 | "amount": 200, 31 | "delegate": null, 32 | "state": "initialized", 33 | "tlv": null 34 | } 35 | }, 36 | { 37 | "account": { 38 | "hash": "2o5puhnQbtqyyrcZrsow4DSs6kafmyUTYmgdwXfMMehS", 39 | "address": null, 40 | "data": { 41 | "discriminator": 2, 42 | "data": "Fci4U9QOCVoeSJNu52uQTHTZkN+jGh5G5VqySLzUdo+nxtjG3Di8aQSbzY12Qevlz6m4DW8xABfetteH8ywAxrcCAAAAAAAAAAAA", 43 | "dataHash": "2CHL3b2vQV4xoxMmwxHn3jYYBKNafmpmEWsAHNmFp6iP" 44 | }, 45 | "owner": "cTokenmWW8bLPjZEBAUgYy3zKxQZW6VKi7bqNFEVv3m", 46 | "lamports": 0, 47 | "tree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 48 | "leafIndex": 5, 49 | "seq": 6, 50 | "slotCreated": 0 51 | }, 52 | "tokenData": { 53 | "mint": "2U35cKS3Cj2xs5EBdByXYU7LaKAitqjSZc1Jnvu4iPf4", 54 | "owner": "CHvwuTvTiwRSNBwAnrCG14V8YTJ6wwhHQrifxdFzHzsX", 55 | "amount": 695, 56 | "delegate": null, 57 | "state": "initialized", 58 | "tlv": null 59 | } 60 | } 61 | ], 62 | "cursor": null 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-charles-token-balances.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: token_balances 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "token_balances": [ 11 | { 12 | "mint": "2U35cKS3Cj2xs5EBdByXYU7LaKAitqjSZc1Jnvu4iPf4", 13 | "balance": 895 14 | } 15 | ], 16 | "cursor": null 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-charles-token-signatures.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: signatures 4 | --- 5 | [ 6 | { 7 | "signature": "5oTNJvc5WWJacEdpZLimVjGu1uGkXoMth8dNKaAymVKA7arwhccxeJPRWDuYEvQHNkGnkRNJcwUbtV4KnwebCKj5", 8 | "slot": 0, 9 | "blockTime": 0 10 | }, 11 | { 12 | "signature": "5UZuijpSnqBpgMpqnggxZ58bzZ8aJtqqVjtvzx2Pg2C58jXph1rdrXyHdTxJfsHawNJyr8syU4U1MEYccDUQeTSV", 13 | "slot": 0, 14 | "blockTime": 0 15 | }, 16 | { 17 | "signature": "2J9pSeLvXnyawUPKdks98ZibQWU8v38AEhmZp9g9P3WzY9dJSMQ3RmoUaGN1zVCF3tTQy6q2YbD94jq8uzSZsay7", 18 | "slot": 0, 19 | "blockTime": 0 20 | } 21 | ] 22 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-charles-validity-proof-v2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | assertion_line: 212 4 | expression: validity_proof_v2 5 | --- 6 | { 7 | "value": { 8 | "compressedProof": { 9 | "a": [], 10 | "b": [], 11 | "c": [] 12 | }, 13 | "accounts": [ 14 | { 15 | "hash": "2TxrLe9HDTRDpVXmbkXUgXNksCZ7RdU4Tc2Ea1B8ADs2", 16 | "root": "2wBDKLscN4SBNzNdVsHq17PVXycvM8n4LNiKzJrebqZ7", 17 | "rootIndex": { 18 | "rootIndex": 7, 19 | "proveByIndex": false 20 | }, 21 | "leafIndex": 4, 22 | "merkleContext": { 23 | "treeType": 1, 24 | "tree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 25 | "queue": "nfq1NvQDJ2GEgnS8zt9prAe8rjjpAW1zFkrvZoBR148", 26 | "cpiContext": null, 27 | "nextTreeContext": null 28 | } 29 | }, 30 | { 31 | "hash": "2o5puhnQbtqyyrcZrsow4DSs6kafmyUTYmgdwXfMMehS", 32 | "root": "2wBDKLscN4SBNzNdVsHq17PVXycvM8n4LNiKzJrebqZ7", 33 | "rootIndex": { 34 | "rootIndex": 7, 35 | "proveByIndex": false 36 | }, 37 | "leafIndex": 5, 38 | "merkleContext": { 39 | "treeType": 1, 40 | "tree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 41 | "queue": "nfq1NvQDJ2GEgnS8zt9prAe8rjjpAW1zFkrvZoBR148", 42 | "cpiContext": null, 43 | "nextTreeContext": null 44 | } 45 | } 46 | ], 47 | "addresses": [] 48 | }, 49 | "context": { 50 | "slot": 0 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-charles-validity-proof.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: validity_proof 4 | --- 5 | { 6 | "value": { 7 | "compressedProof": { 8 | "a": [], 9 | "b": [], 10 | "c": [] 11 | }, 12 | "roots": [ 13 | "2wBDKLscN4SBNzNdVsHq17PVXycvM8n4LNiKzJrebqZ7", 14 | "2wBDKLscN4SBNzNdVsHq17PVXycvM8n4LNiKzJrebqZ7" 15 | ], 16 | "rootIndices": [ 17 | 7, 18 | 7 19 | ], 20 | "leafIndices": [ 21 | 4, 22 | 5 23 | ], 24 | "leaves": [ 25 | "2TxrLe9HDTRDpVXmbkXUgXNksCZ7RdU4Tc2Ea1B8ADs2", 26 | "2o5puhnQbtqyyrcZrsow4DSs6kafmyUTYmgdwXfMMehS" 27 | ], 28 | "merkleTrees": [ 29 | "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 30 | "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT" 31 | ] 32 | }, 33 | "context": { 34 | "slot": 0 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__e2e_mint_and_transfer_transactions-latest-signatures.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: signatures 4 | --- 5 | [ 6 | { 7 | "signature": "64jFxW4xxife8UqpEQyYdA589rzFKWx8rT4vun6soCpWXmDermr588UKX2261YYZ8ZSzcu2NUJY2aCfee64FvTW4", 8 | "slot": 0, 9 | "blockTime": 0 10 | }, 11 | { 12 | "signature": "5oTNJvc5WWJacEdpZLimVjGu1uGkXoMth8dNKaAymVKA7arwhccxeJPRWDuYEvQHNkGnkRNJcwUbtV4KnwebCKj5", 13 | "slot": 0, 14 | "blockTime": 0 15 | }, 16 | { 17 | "signature": "5UZuijpSnqBpgMpqnggxZ58bzZ8aJtqqVjtvzx2Pg2C58jXph1rdrXyHdTxJfsHawNJyr8syU4U1MEYccDUQeTSV", 18 | "slot": 0, 19 | "blockTime": 0 20 | }, 21 | { 22 | "signature": "2J9pSeLvXnyawUPKdks98ZibQWU8v38AEhmZp9g9P3WzY9dJSMQ3RmoUaGN1zVCF3tTQy6q2YbD94jq8uzSZsay7", 23 | "slot": 0, 24 | "blockTime": 0 25 | } 26 | ] 27 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__indexing_bug-proof.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: proof 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": [ 10 | { 11 | "root": "3BfdXNR58eq1CqZ66dWorjXrq2KBQpM2hVbguQqFnV7y", 12 | "address": "12prJNGB6sfTMrZM1Udv2Aamv9fLzpm5YfMqssTmGrWy", 13 | "lowerRangeAddress": "1nufU4kaMYUM4zhLPp8MGeUd9TCwZejvmP5XRzm1bK9", 14 | "higherRangeAddress": "13cnSR7HKjcPLH3BKByi1rX2qJnYu2ciHixHRgEWrnfB", 15 | "nextIndex": 2, 16 | "proof": [ 17 | "25D2cs6h29NZgmDepVqc7bLLSWcNJnMvGoxeTpyZjF3u", 18 | "35Hb8juF8emLw62UaissKgcBfsyFVAo511eyb2fZkY92", 19 | "xsj84LeTp1s1DiBvznSUgxVk5jyVtYvNsGqU2PTta7y", 20 | "2gQksfK543Jw196amPxXWceFzNTfRHiqb7x2edvupftT", 21 | "Y8pRoGMGXJPGZyb7m4sqkPsTSJvzZ7oSVnaybCcYbgd", 22 | "3w895nemtSxb1fEjFT3cXkVpW3y6f9uHQn43jEwu1RWc", 23 | "46JM2e72mdEAxkSeXc65b3aLWkAQpX6NF7mdyuXQKguu", 24 | "WKLyYL7wpK5zVsWoMU2rcUiMwRWp9PowG83GHHH1dqn", 25 | "4CztDUcRvGkTyFoVEXXcBwd5UwqJcJJWpdL8FFERrqkU", 26 | "yjDkqNqZtBwpG7iUwT3hqKNKZAP9CcBDyBBuGPNk2jQ", 27 | "2r8qWibedWpM7QkW6QvDDUEQAHT9isX629UKcUxbY8BT", 28 | "38Aoz1ZUAnRqSCxdQuEkLhzYMRi1Tu1rSBy1UymA8yfK", 29 | "3zBeAgo5EwPrgsXRLUV6DhQrsUUhwbmQXPnZkudhsnSD", 30 | "2Q5cDvZW6hTxFFDTHhAf129PH4z8EZLYA1meeZpPW76F", 31 | "2gnsMw1zhpqGeAakoQLarCXVUaeEGDHm5uma1Jznx7qD", 32 | "3MXZLrn3tnLMWJznkMombRHkgkfsiBTPru2wjHDd3kLh", 33 | "3rrDm8iED4sDyonpLs9J3TDoTP8U4jsvXCmoupoCvvKc", 34 | "48YJtP1G5pKWu7Jy1NRagdj29dwxVXFsySrBVw1nALhX", 35 | "22tjwuiv6VgeMDs8qXpkZ7cY5rcgrFrG5knp7swZ1wQ2", 36 | "2dS4UCZ6RJvwPBaWmcz1L7ips34xnbNMfK9D8UHdFJfT", 37 | "3EdF4zvu7uwW7xYdnaKUPzqDY5Msq9FfWn6HgEnRTkDB", 38 | "2jzv6Z8vEXSYRXQCFnVYvzgJ2RfyDN1QEjdHm6CBvJUg", 39 | "2fomPS2xUPwXxVF8hx5YtMpBHmQKSZKushUiWYsy9Eqx", 40 | "3Pi3nRu4fWpnW5rYDAoraX1Q2xDCRQ24Dq8TEY7gaSBn", 41 | "3dbMMyehykAriNZ8FMJgPc1N6YSzm9ZfV2HcW9sbaXzP", 42 | "4EE5KQnQ6Tvo78gGhTu8serpJV4srbRhYZ3rdvCiRa5e" 43 | ], 44 | "merkleTree": "C83cpRN6oaafjNgMQJvaYgAz592EP5wunKvbokeTKPLn", 45 | "rootSeq": 11, 46 | "lowElementLeafIndex": 3 47 | } 48 | ] 49 | } 50 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__lamport_transfers-payer-accounts.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: accounts 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "items": [ 11 | { 12 | "hash": "2veKUPKieajFG7yzPNGARHq7jYS1FiXcXG8P9Txhvhcn", 13 | "address": null, 14 | "data": null, 15 | "owner": "J6ULJViDpQTRntYTmfkpUZZ71KTVkZNJFSDcQhFCo5Ef", 16 | "lamports": 999998000, 17 | "tree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 18 | "leafIndex": 3, 19 | "seq": 4, 20 | "slotCreated": 0 21 | } 22 | ], 23 | "cursor": null 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__lamport_transfers-payer-proofs.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: proofs 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": [ 10 | { 11 | "proof": [ 12 | "3q5dSVJCK4Tk2VU9C4MaPPw4TdzKdtp1M5Dug3zERSx4", 13 | "3ty9eaQ1hvD7y1gFkDUaBeMj6F9LhxK4rwTcaiJRnw6p", 14 | "2yubnov8tB2zqryTMjPJj41vncMPmFR51VK6SQTpknAU", 15 | "2gQksfK543Jw196amPxXWceFzNTfRHiqb7x2edvupftT", 16 | "Y8pRoGMGXJPGZyb7m4sqkPsTSJvzZ7oSVnaybCcYbgd", 17 | "3w895nemtSxb1fEjFT3cXkVpW3y6f9uHQn43jEwu1RWc", 18 | "46JM2e72mdEAxkSeXc65b3aLWkAQpX6NF7mdyuXQKguu", 19 | "WKLyYL7wpK5zVsWoMU2rcUiMwRWp9PowG83GHHH1dqn", 20 | "4CztDUcRvGkTyFoVEXXcBwd5UwqJcJJWpdL8FFERrqkU", 21 | "yjDkqNqZtBwpG7iUwT3hqKNKZAP9CcBDyBBuGPNk2jQ", 22 | "2r8qWibedWpM7QkW6QvDDUEQAHT9isX629UKcUxbY8BT", 23 | "38Aoz1ZUAnRqSCxdQuEkLhzYMRi1Tu1rSBy1UymA8yfK", 24 | "3zBeAgo5EwPrgsXRLUV6DhQrsUUhwbmQXPnZkudhsnSD", 25 | "2Q5cDvZW6hTxFFDTHhAf129PH4z8EZLYA1meeZpPW76F", 26 | "2gnsMw1zhpqGeAakoQLarCXVUaeEGDHm5uma1Jznx7qD", 27 | "3MXZLrn3tnLMWJznkMombRHkgkfsiBTPru2wjHDd3kLh", 28 | "3rrDm8iED4sDyonpLs9J3TDoTP8U4jsvXCmoupoCvvKc", 29 | "48YJtP1G5pKWu7Jy1NRagdj29dwxVXFsySrBVw1nALhX", 30 | "22tjwuiv6VgeMDs8qXpkZ7cY5rcgrFrG5knp7swZ1wQ2", 31 | "2dS4UCZ6RJvwPBaWmcz1L7ips34xnbNMfK9D8UHdFJfT", 32 | "3EdF4zvu7uwW7xYdnaKUPzqDY5Msq9FfWn6HgEnRTkDB", 33 | "2jzv6Z8vEXSYRXQCFnVYvzgJ2RfyDN1QEjdHm6CBvJUg", 34 | "2fomPS2xUPwXxVF8hx5YtMpBHmQKSZKushUiWYsy9Eqx", 35 | "3Pi3nRu4fWpnW5rYDAoraX1Q2xDCRQ24Dq8TEY7gaSBn", 36 | "3dbMMyehykAriNZ8FMJgPc1N6YSzm9ZfV2HcW9sbaXzP", 37 | "4EE5KQnQ6Tvo78gGhTu8serpJV4srbRhYZ3rdvCiRa5e" 38 | ], 39 | "root": "DQ366kMe5qRsNQecusoD3tzJk79CT88MuPpRhx3nSzz", 40 | "leafIndex": 3, 41 | "hash": "2veKUPKieajFG7yzPNGARHq7jYS1FiXcXG8P9Txhvhcn", 42 | "merkleTree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 43 | "rootSeq": 5 44 | } 45 | ] 46 | } 47 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__lamport_transfers-payer-validity-proof.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: validity_proof 4 | --- 5 | { 6 | "value": { 7 | "compressedProof": { 8 | "a": [], 9 | "b": [], 10 | "c": [] 11 | }, 12 | "roots": [ 13 | "DQ366kMe5qRsNQecusoD3tzJk79CT88MuPpRhx3nSzz" 14 | ], 15 | "rootIndices": [ 16 | 5 17 | ], 18 | "leafIndices": [ 19 | 3 20 | ], 21 | "leaves": [ 22 | "2veKUPKieajFG7yzPNGARHq7jYS1FiXcXG8P9Txhvhcn" 23 | ], 24 | "merkleTrees": [ 25 | "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT" 26 | ] 27 | }, 28 | "context": { 29 | "slot": 0 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__lamport_transfers-receiver-accounts.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | assertion_line: 380 4 | expression: accounts 5 | --- 6 | { 7 | "context": { 8 | "slot": 0 9 | }, 10 | "value": { 11 | "items": [ 12 | { 13 | "hash": "3q5dSVJCK4Tk2VU9C4MaPPw4TdzKdtp1M5Dug3zERSx4", 14 | "address": null, 15 | "data": null, 16 | "owner": "FLkMEA7eA82Cvp7MqamqFKsRN3E2Vfg3Xa8NRyVARq5n", 17 | "lamports": 1000, 18 | "tree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 19 | "leafIndex": 2, 20 | "seq": 3, 21 | "slotCreated": 0 22 | }, 23 | { 24 | "hash": "2eoEsJByEcWpLTdaEwr1DB6cwXkFxqAVZnbvWoQSDm4V", 25 | "address": null, 26 | "data": null, 27 | "owner": "FLkMEA7eA82Cvp7MqamqFKsRN3E2Vfg3Xa8NRyVARq5n", 28 | "lamports": 1000, 29 | "tree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 30 | "leafIndex": 4, 31 | "seq": 5, 32 | "slotCreated": 0 33 | } 34 | ], 35 | "cursor": null 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__lamport_transfers-receiver-validity-proof.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | assertion_line: 417 4 | expression: validity_proof 5 | --- 6 | { 7 | "value": { 8 | "compressedProof": { 9 | "a": [], 10 | "b": [], 11 | "c": [] 12 | }, 13 | "roots": [ 14 | "DQ366kMe5qRsNQecusoD3tzJk79CT88MuPpRhx3nSzz", 15 | "DQ366kMe5qRsNQecusoD3tzJk79CT88MuPpRhx3nSzz" 16 | ], 17 | "rootIndices": [ 18 | 5, 19 | 5 20 | ], 21 | "leafIndices": [ 22 | 2, 23 | 4 24 | ], 25 | "leaves": [ 26 | "3q5dSVJCK4Tk2VU9C4MaPPw4TdzKdtp1M5Dug3zERSx4", 27 | "2eoEsJByEcWpLTdaEwr1DB6cwXkFxqAVZnbvWoQSDm4V" 28 | ], 29 | "merkleTrees": [ 30 | "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 31 | "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT" 32 | ] 33 | }, 34 | "context": { 35 | "slot": 0 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__nullfiier_and_address_queue_transactions-accounts.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: accounts 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "items": [ 11 | { 12 | "hash": "i49LfvzUcYoR1pookvJAnNmaWEW7yncty3UwWQjy6Nk", 13 | "address": null, 14 | "data": null, 15 | "owner": "Ecs89dz8NsNoSxyUtp54G2HPbmvJr8qZnxnWUqiLT92r", 16 | "lamports": 555289324, 17 | "tree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 18 | "leafIndex": 2, 19 | "seq": 3, 20 | "slotCreated": 0 21 | } 22 | ], 23 | "cursor": null 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__nullfiier_and_address_queue_transactions-proof-address.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | assertion_line: 686 4 | expression: proof_v1 5 | --- 6 | { 7 | "context": { 8 | "slot": 0 9 | }, 10 | "value": [ 11 | { 12 | "root": "21SAoPAaCduuzL7Hrc37eWgE1fwDruxcEbUBLgAnAg4E", 13 | "address": "1111111ogCyDbaRMvkdsHB3qfdyFYaG1WtRUAfdh", 14 | "lowerRangeAddress": "11111111111111111111111111111111", 15 | "higherRangeAddress": "143oE544fmAqpnwRQYAmNCKFaweMsg7wSbGfihU8RdU5", 16 | "nextIndex": 2, 17 | "proof": [ 18 | "11111111111111111111111111111111", 19 | "3NsrDVjX6esWviMzLrRNkvZ9RguhuMqRwyviKQ3Kr2Ni", 20 | "274k4KPY5VhmU5pCwwJzyHaY4AH4m7SjnZnyj44UitJc", 21 | "2gQksfK543Jw196amPxXWceFzNTfRHiqb7x2edvupftT", 22 | "Y8pRoGMGXJPGZyb7m4sqkPsTSJvzZ7oSVnaybCcYbgd", 23 | "3w895nemtSxb1fEjFT3cXkVpW3y6f9uHQn43jEwu1RWc", 24 | "46JM2e72mdEAxkSeXc65b3aLWkAQpX6NF7mdyuXQKguu", 25 | "WKLyYL7wpK5zVsWoMU2rcUiMwRWp9PowG83GHHH1dqn", 26 | "4CztDUcRvGkTyFoVEXXcBwd5UwqJcJJWpdL8FFERrqkU", 27 | "yjDkqNqZtBwpG7iUwT3hqKNKZAP9CcBDyBBuGPNk2jQ", 28 | "2r8qWibedWpM7QkW6QvDDUEQAHT9isX629UKcUxbY8BT", 29 | "38Aoz1ZUAnRqSCxdQuEkLhzYMRi1Tu1rSBy1UymA8yfK", 30 | "3zBeAgo5EwPrgsXRLUV6DhQrsUUhwbmQXPnZkudhsnSD", 31 | "2Q5cDvZW6hTxFFDTHhAf129PH4z8EZLYA1meeZpPW76F", 32 | "2gnsMw1zhpqGeAakoQLarCXVUaeEGDHm5uma1Jznx7qD", 33 | "3MXZLrn3tnLMWJznkMombRHkgkfsiBTPru2wjHDd3kLh", 34 | "3rrDm8iED4sDyonpLs9J3TDoTP8U4jsvXCmoupoCvvKc", 35 | "48YJtP1G5pKWu7Jy1NRagdj29dwxVXFsySrBVw1nALhX", 36 | "22tjwuiv6VgeMDs8qXpkZ7cY5rcgrFrG5knp7swZ1wQ2", 37 | "2dS4UCZ6RJvwPBaWmcz1L7ips34xnbNMfK9D8UHdFJfT", 38 | "3EdF4zvu7uwW7xYdnaKUPzqDY5Msq9FfWn6HgEnRTkDB", 39 | "2jzv6Z8vEXSYRXQCFnVYvzgJ2RfyDN1QEjdHm6CBvJUg", 40 | "2fomPS2xUPwXxVF8hx5YtMpBHmQKSZKushUiWYsy9Eqx", 41 | "3Pi3nRu4fWpnW5rYDAoraX1Q2xDCRQ24Dq8TEY7gaSBn", 42 | "3dbMMyehykAriNZ8FMJgPc1N6YSzm9ZfV2HcW9sbaXzP", 43 | "4EE5KQnQ6Tvo78gGhTu8serpJV4srbRhYZ3rdvCiRa5e" 44 | ], 45 | "merkleTree": "amt1Ayt45jfbdw5YSo7iz6WZxUmnZsQTYXy82hVwyC2", 46 | "rootSeq": 5, 47 | "lowElementLeafIndex": 0 48 | } 49 | ] 50 | } 51 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__nullfiier_and_address_queue_transactions-proofs.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: proofs 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": [ 10 | { 11 | "proof": [ 12 | "11111111111111111111111111111111", 13 | "3CFKteYSRSkp9EGFPzibgzCPtNuJ5HeZ31fAsBpgcHwZ", 14 | "274k4KPY5VhmU5pCwwJzyHaY4AH4m7SjnZnyj44UitJc", 15 | "2gQksfK543Jw196amPxXWceFzNTfRHiqb7x2edvupftT", 16 | "Y8pRoGMGXJPGZyb7m4sqkPsTSJvzZ7oSVnaybCcYbgd", 17 | "3w895nemtSxb1fEjFT3cXkVpW3y6f9uHQn43jEwu1RWc", 18 | "46JM2e72mdEAxkSeXc65b3aLWkAQpX6NF7mdyuXQKguu", 19 | "WKLyYL7wpK5zVsWoMU2rcUiMwRWp9PowG83GHHH1dqn", 20 | "4CztDUcRvGkTyFoVEXXcBwd5UwqJcJJWpdL8FFERrqkU", 21 | "yjDkqNqZtBwpG7iUwT3hqKNKZAP9CcBDyBBuGPNk2jQ", 22 | "2r8qWibedWpM7QkW6QvDDUEQAHT9isX629UKcUxbY8BT", 23 | "38Aoz1ZUAnRqSCxdQuEkLhzYMRi1Tu1rSBy1UymA8yfK", 24 | "3zBeAgo5EwPrgsXRLUV6DhQrsUUhwbmQXPnZkudhsnSD", 25 | "2Q5cDvZW6hTxFFDTHhAf129PH4z8EZLYA1meeZpPW76F", 26 | "2gnsMw1zhpqGeAakoQLarCXVUaeEGDHm5uma1Jznx7qD", 27 | "3MXZLrn3tnLMWJznkMombRHkgkfsiBTPru2wjHDd3kLh", 28 | "3rrDm8iED4sDyonpLs9J3TDoTP8U4jsvXCmoupoCvvKc", 29 | "48YJtP1G5pKWu7Jy1NRagdj29dwxVXFsySrBVw1nALhX", 30 | "22tjwuiv6VgeMDs8qXpkZ7cY5rcgrFrG5knp7swZ1wQ2", 31 | "2dS4UCZ6RJvwPBaWmcz1L7ips34xnbNMfK9D8UHdFJfT", 32 | "3EdF4zvu7uwW7xYdnaKUPzqDY5Msq9FfWn6HgEnRTkDB", 33 | "2jzv6Z8vEXSYRXQCFnVYvzgJ2RfyDN1QEjdHm6CBvJUg", 34 | "2fomPS2xUPwXxVF8hx5YtMpBHmQKSZKushUiWYsy9Eqx", 35 | "3Pi3nRu4fWpnW5rYDAoraX1Q2xDCRQ24Dq8TEY7gaSBn", 36 | "3dbMMyehykAriNZ8FMJgPc1N6YSzm9ZfV2HcW9sbaXzP", 37 | "4EE5KQnQ6Tvo78gGhTu8serpJV4srbRhYZ3rdvCiRa5e" 38 | ], 39 | "root": "45u9rUQmAfgk5aTfjetBvqz63cRXmcmm4bupSE7d2zEm", 40 | "leafIndex": 2, 41 | "hash": "i49LfvzUcYoR1pookvJAnNmaWEW7yncty3UwWQjy6Nk", 42 | "merkleTree": "smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT", 43 | "rootSeq": 5 44 | } 45 | ] 46 | } 47 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__nullifier_queue-accounts.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: accounts 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "items": [], 11 | "cursor": null 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__nullifier_queue-proofs.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: proofs 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": [ 10 | { 11 | "proof": [ 12 | "11111111111111111111111111111111", 13 | "3CFKteYSRSkp9EGFPzibgzCPtNuJ5HeZ31fAsBpgcHwZ", 14 | "274k4KPY5VhmU5pCwwJzyHaY4AH4m7SjnZnyj44UitJc", 15 | "2gQksfK543Jw196amPxXWceFzNTfRHiqb7x2edvupftT", 16 | "Y8pRoGMGXJPGZyb7m4sqkPsTSJvzZ7oSVnaybCcYbgd", 17 | "3w895nemtSxb1fEjFT3cXkVpW3y6f9uHQn43jEwu1RWc", 18 | "46JM2e72mdEAxkSeXc65b3aLWkAQpX6NF7mdyuXQKguu", 19 | "WKLyYL7wpK5zVsWoMU2rcUiMwRWp9PowG83GHHH1dqn", 20 | "4CztDUcRvGkTyFoVEXXcBwd5UwqJcJJWpdL8FFERrqkU", 21 | "yjDkqNqZtBwpG7iUwT3hqKNKZAP9CcBDyBBuGPNk2jQ", 22 | "2r8qWibedWpM7QkW6QvDDUEQAHT9isX629UKcUxbY8BT", 23 | "38Aoz1ZUAnRqSCxdQuEkLhzYMRi1Tu1rSBy1UymA8yfK", 24 | "3zBeAgo5EwPrgsXRLUV6DhQrsUUhwbmQXPnZkudhsnSD", 25 | "2Q5cDvZW6hTxFFDTHhAf129PH4z8EZLYA1meeZpPW76F", 26 | "2gnsMw1zhpqGeAakoQLarCXVUaeEGDHm5uma1Jznx7qD", 27 | "3MXZLrn3tnLMWJznkMombRHkgkfsiBTPru2wjHDd3kLh", 28 | "3rrDm8iED4sDyonpLs9J3TDoTP8U4jsvXCmoupoCvvKc", 29 | "48YJtP1G5pKWu7Jy1NRagdj29dwxVXFsySrBVw1nALhX", 30 | "22tjwuiv6VgeMDs8qXpkZ7cY5rcgrFrG5knp7swZ1wQ2", 31 | "2dS4UCZ6RJvwPBaWmcz1L7ips34xnbNMfK9D8UHdFJfT", 32 | "3EdF4zvu7uwW7xYdnaKUPzqDY5Msq9FfWn6HgEnRTkDB", 33 | "2jzv6Z8vEXSYRXQCFnVYvzgJ2RfyDN1QEjdHm6CBvJUg", 34 | "2fomPS2xUPwXxVF8hx5YtMpBHmQKSZKushUiWYsy9Eqx", 35 | "3Pi3nRu4fWpnW5rYDAoraX1Q2xDCRQ24Dq8TEY7gaSBn", 36 | "3dbMMyehykAriNZ8FMJgPc1N6YSzm9ZfV2HcW9sbaXzP", 37 | "4EE5KQnQ6Tvo78gGhTu8serpJV4srbRhYZ3rdvCiRa5e" 38 | ], 39 | "root": "3zW9Gafh2Y9B1XKE13Vr3msqRVMcWFcwi1e2n4TxVDjT", 40 | "leafIndex": 2, 41 | "hash": "2obBYpkEzCJguKrspYFr94QPan2echSVQjWC2D68vEAZ", 42 | "merkleTree": "5bdFnXU47QjzGpzHfXnxcEi5WXyxzEAZzd1vrE39bf1W", 43 | "rootSeq": 4 44 | } 45 | ] 46 | } 47 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__payer-lamport_transfers-signatures.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: signatures 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "items": [ 11 | { 12 | "signature": "5NLdbqznXqmTPTN8JBLquriDggb9qaRszVGLSvt6t5esy2Q8Z1iqAuXF4qoLK7HM6oGLySUNUkzhnSocwArpAqmV", 13 | "slot": 0, 14 | "blockTime": 0 15 | }, 16 | { 17 | "signature": "4TFBPyvatWgjTdNesfaTo3YkbP2spvGmgZgLn6CvTeqRZSi1ZuPCkK7fLaDbPKskMSF4Azge6QPvtZt9VUV7KBF8", 18 | "slot": 0, 19 | "blockTime": 0 20 | }, 21 | { 22 | "signature": "QBrbAZFq12LCbnv5dByn8vB8Znam4ieGQVzybapgPL5LCa9KHfuYZKV6Nah6UGsa6FUptmT6tSpexWZDrbp82iP", 23 | "slot": 0, 24 | "blockTime": 0 25 | } 26 | ], 27 | "cursor": null 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__e2e_tests__receiver-lamport_transfers-signatures.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/e2e_tests.rs 3 | expression: signatures 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": { 10 | "items": [ 11 | { 12 | "signature": "4TFBPyvatWgjTdNesfaTo3YkbP2spvGmgZgLn6CvTeqRZSi1ZuPCkK7fLaDbPKskMSF4Azge6QPvtZt9VUV7KBF8", 13 | "slot": 0, 14 | "blockTime": 0 15 | }, 16 | { 17 | "signature": "QBrbAZFq12LCbnv5dByn8vB8Znam4ieGQVzybapgPL5LCa9KHfuYZKV6Nah6UGsa6FUptmT6tSpexWZDrbp82iP", 18 | "slot": 0, 19 | "blockTime": 0 20 | } 21 | ], 22 | "cursor": null 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__mock_tests__get_multiple_new_address_proofs_interop-validity-proof-v2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/mock_tests.rs 3 | assertion_line: 1175 4 | expression: validity_proof_v2 5 | --- 6 | { 7 | "value": { 8 | "compressedProof": { 9 | "a": [], 10 | "b": [], 11 | "c": [] 12 | }, 13 | "accounts": [], 14 | "addresses": [ 15 | { 16 | "address": "12nCKqGG85jHxbTeA8i2Z7D4vnNUUrQ4r5e8dv2o16X", 17 | "root": "3FrGzyXtjqjnukHDS2M5oyVj8tMVcHSahcHpWBGR5MHY", 18 | "rootIndex": 3, 19 | "merkleContext": { 20 | "treeType": 2, 21 | "tree": "amt1Ayt45jfbdw5YSo7iz6WZxUmnZsQTYXy82hVwyC2", 22 | "queue": "aq1S9z4reTSQAdgWHGD2zDaS39sjGrAxbR31vxJ2F4F", 23 | "cpiContext": null, 24 | "nextTreeContext": null 25 | } 26 | } 27 | ] 28 | }, 29 | "context": { 30 | "slot": 0 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__mock_tests__get_multiple_new_address_proofs_interop-validity-proof.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/mock_tests.rs 3 | assertion_line: 1124 4 | expression: validity_proof 5 | --- 6 | { 7 | "value": { 8 | "compressedProof": { 9 | "a": [], 10 | "b": [], 11 | "c": [] 12 | }, 13 | "roots": [ 14 | "3FrGzyXtjqjnukHDS2M5oyVj8tMVcHSahcHpWBGR5MHY" 15 | ], 16 | "rootIndices": [ 17 | 3 18 | ], 19 | "leafIndices": [ 20 | 0 21 | ], 22 | "leaves": [ 23 | "12nCKqGG85jHxbTeA8i2Z7D4vnNUUrQ4r5e8dv2o16X" 24 | ], 25 | "merkleTrees": [ 26 | "amt1Ayt45jfbdw5YSo7iz6WZxUmnZsQTYXy82hVwyC2" 27 | ] 28 | }, 29 | "context": { 30 | "slot": 0 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__mock_tests__get_multiple_new_address_proofs_interop.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/mock_tests.rs 3 | expression: proof 4 | --- 5 | { 6 | "context": { 7 | "slot": 0 8 | }, 9 | "value": [ 10 | { 11 | "root": "3FrGzyXtjqjnukHDS2M5oyVj8tMVcHSahcHpWBGR5MHY", 12 | "address": "12nCKqGG85jHxbTeA8i2Z7D4vnNUUrQ4r5e8dv2o16X", 13 | "lowerRangeAddress": "11111111111111111111111111111111", 14 | "higherRangeAddress": "14uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofL", 15 | "nextIndex": 1, 16 | "proof": [ 17 | "34cMT7MjFrs8hLp2zHMrPJHKkUxBDBwBTNck77wLjjcY", 18 | "3CFKteYSRSkp9EGFPzibgzCPtNuJ5HeZ31fAsBpgcHwZ", 19 | "274k4KPY5VhmU5pCwwJzyHaY4AH4m7SjnZnyj44UitJc", 20 | "2gQksfK543Jw196amPxXWceFzNTfRHiqb7x2edvupftT", 21 | "Y8pRoGMGXJPGZyb7m4sqkPsTSJvzZ7oSVnaybCcYbgd", 22 | "3w895nemtSxb1fEjFT3cXkVpW3y6f9uHQn43jEwu1RWc", 23 | "46JM2e72mdEAxkSeXc65b3aLWkAQpX6NF7mdyuXQKguu", 24 | "WKLyYL7wpK5zVsWoMU2rcUiMwRWp9PowG83GHHH1dqn", 25 | "4CztDUcRvGkTyFoVEXXcBwd5UwqJcJJWpdL8FFERrqkU", 26 | "yjDkqNqZtBwpG7iUwT3hqKNKZAP9CcBDyBBuGPNk2jQ", 27 | "2r8qWibedWpM7QkW6QvDDUEQAHT9isX629UKcUxbY8BT", 28 | "38Aoz1ZUAnRqSCxdQuEkLhzYMRi1Tu1rSBy1UymA8yfK", 29 | "3zBeAgo5EwPrgsXRLUV6DhQrsUUhwbmQXPnZkudhsnSD", 30 | "2Q5cDvZW6hTxFFDTHhAf129PH4z8EZLYA1meeZpPW76F", 31 | "2gnsMw1zhpqGeAakoQLarCXVUaeEGDHm5uma1Jznx7qD", 32 | "3MXZLrn3tnLMWJznkMombRHkgkfsiBTPru2wjHDd3kLh", 33 | "3rrDm8iED4sDyonpLs9J3TDoTP8U4jsvXCmoupoCvvKc", 34 | "48YJtP1G5pKWu7Jy1NRagdj29dwxVXFsySrBVw1nALhX", 35 | "22tjwuiv6VgeMDs8qXpkZ7cY5rcgrFrG5knp7swZ1wQ2", 36 | "2dS4UCZ6RJvwPBaWmcz1L7ips34xnbNMfK9D8UHdFJfT", 37 | "3EdF4zvu7uwW7xYdnaKUPzqDY5Msq9FfWn6HgEnRTkDB", 38 | "2jzv6Z8vEXSYRXQCFnVYvzgJ2RfyDN1QEjdHm6CBvJUg", 39 | "2fomPS2xUPwXxVF8hx5YtMpBHmQKSZKushUiWYsy9Eqx", 40 | "3Pi3nRu4fWpnW5rYDAoraX1Q2xDCRQ24Dq8TEY7gaSBn", 41 | "3dbMMyehykAriNZ8FMJgPc1N6YSzm9ZfV2HcW9sbaXzP", 42 | "4EE5KQnQ6Tvo78gGhTu8serpJV4srbRhYZ3rdvCiRa5e" 43 | ], 44 | "merkleTree": "amt1Ayt45jfbdw5YSo7iz6WZxUmnZsQTYXy82hVwyC2", 45 | "rootSeq": 3, 46 | "lowElementLeafIndex": 0 47 | } 48 | ] 49 | } 50 | -------------------------------------------------------------------------------- /tests/integration_tests/snapshots/integration_tests__prod_tests__incorrect_root_bug.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: tests/integration_tests/prod_tests.rs 3 | expression: response 4 | --- 5 | { 6 | "context": { 7 | "slot": 320879219 8 | }, 9 | "value": { 10 | "items": [], 11 | "cursor": null 12 | } 13 | } 14 | --------------------------------------------------------------------------------